资源描述
2基本输入输出实验(蜂鸣器控制程序)
/*******************************************************
名称: 基本输入输出(I/O)程序
说 明:
********************************************************/
#include<STC12c5A32s2.h> //包含头文件
#define uint unsigned int //宏定义
#define uchar unsigned char
sbit buzzer=P3^5;
sbit Keyadd=P2^0;
sbit Keydec=P2^1;
sbit Keycom=P2^2;
void Delay(uint z)
{ uint x;
uchar y;
for(x=z;x>0;x--) //延时
{
for(y=250;y>0;y--);
}
}
void main(void)
{ uchar voice;
voice=3;
while(1)
{
if(Keyadd==0) //按键被按下时为0
voice=1;
if(Keydec==0)
voice=2;
if(Keycom==0)
voice=3;
if(voice==1)
{buzzer=~buzzer;
Delay(1);
}
else if(voice==2)
{buzzer=~buzzer;
Delay(20);
}
else
buzzer=1;
}
}
3定时器中断实验
/*******************************************************
名称: 实验三作业
说 明:
********************************************************/
#include<STC12c5A32s2.h> //包含头文件
#define uint unsigned int //宏定义
#define uchar unsigned char
uchar counter;
uchar voice;
sbit buzzer=P3^5;
sbit Keyadd=P2^0;
sbit Keydec=P2^1;
sbit Keycom=P2^2;
sbit Keycan=P2^3;
//----------------计算计数器初值-----------------//
#define T0_TIME1 254 //定时时间us为单位
#define T0ReLoadL1 ((65536-(uint)(T0_TIME1*11.0592/12)) % 256)
#define T0ReLoadH1 ((65536-(uint)(T0_TIME1*11.0592/12)) / 256)
//----------------计算计数器初值-----------------//
#define T0_TIME2 1400 //定时时间us为单位
#define T0ReLoadL2 ((65536-(uint)(T0_TIME2*11.0592/12)) % 256)
#define T0ReLoadH2 ((65536-(uint)(T0_TIME2 *11.0592/12)) / 256)
/*********************************************************
名称: 主程序
说明:
**********************************************************/
void main(void)
{
//-----------------------------初始化TIMER0
TMOD|=0x01; //定时器T0方式1
TH0 =T0ReLoadH1; //装载计数器初值
TL0 =T0ReLoadL1;
TR0 =1; //启动Timer0
ET0 =1; //Timer0中断使能
EA =1; //总开关使能
//-----------------------------大循环
counter=0;
while(1)
{
if(Keyadd==0) //按键被按下时为0
voice=1;
if(Keydec==0)
voice=2;
if(Keycom==0)
voice=3;
}
}
/*********************************************************
名称:Timer0中断服务子程序
功能:产生10ms定时中断
**********************************************************/
void Timer0_Int(void) interrupt 1
{ if(voice==1)
{TH0=T0ReLoadH1; //重装载计数器初值
TL0=T0ReLoadL1;
buzzer=~buzzer;
}
if(voice==2)
{TH0=T0ReLoadH2;
TL0=T0ReLoadL2;
buzzer=~buzzer;
}
if(voice==3)
{
}
}
4 LED数码管动态扫描显示实验
#include<STC12c5A32s2.h>
#define uint unsigned int
#define uchar unsigned char
//------------LED显示代码-----------//
// bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
// dp G C D E F B A
uchar code seg[10]={ 0x3f,0x22,0x5b,0x73,0x66, //0,1,2,3,4
0x75,0x7d,0x23,0x7f,0x77,}; //5,6,7,8,9
uchar idata dis_buff_1[4]; //第一行 LED显示缓冲
uchar idata dis_buff_2[4]; //第二行 LED显示缓冲
uchar counter;
sbit U4_HC574_CP =P1^0; //S3 显示锁存74HC574脉冲
sbit U5_HC574_CP =P1^1; //S4 显示锁存74HC574脉冲
#define T0_TIME 10000 //定时时间us为单位
#define T0ReLoadL ((65536-(uint)(T0_TIME*11.0592/12)) % 256)
#define T0ReLoadH ((65536-(uint)(T0_TIME*11.0592/12)) / 256)
/*********************************************************
名称: 数码管显示驱动子程序
说明:
**********************************************************/
void Display(void)
{ uchar data i,j,k,temp00;
temp00=0x20;
for(i=0;i<4;i++)
{
P1 |= 0x3C; //关所有扫描位
P0=dis_buff_1[i];
U4_HC574_CP=0;
U4_HC574_CP=1; //S3显示锁存74HC574脉冲 上升沿
P0=dis_buff_2[i];
U5_HC574_CP=0;
U5_HC574_CP=1; //S4显示锁存74HC574脉冲 上升沿
P1 &= (~temp00); //送扫描位
for(j=0;j<20;j++) //延时
{ for(k=0;k<20;k++);
}
temp00>>=1; //扫描位移位
}
P1|=0x3C; //关所有扫描位
}
/*********************************************************
名称: 主程序
**********************************************************/
void main(void)
{
uchar data bai,shi,ge;
uint data Num;
uchar data temp00;
TMOD|=0x01; //定时器T0方式1
TH0 =T0ReLoadH; //装载计数器初值
TL0 =T0ReLoadL;
TR0 =1; //启动Timer0
ET0 =1; //Timer0中断使能
EA =1; //总开关使能
counter=0;
Num=999;
for(;;)
{ bai=Num/100;
temp00=Num-bai*100;
shi=temp00/10;
ge =temp00-shi*10;
dis_buff_1[0]=0;
dis_buff_1[1]=0;
dis_buff_1[2]=0;
dis_buff_1[3]=0;
dis_buff_2[0]=0;
dis_buff_2[1]=seg[bai];
dis_buff_2[2]=seg[shi];
dis_buff_2[3]=seg[ge];
if(counter==100)
{
counter=0;
Num--;
}
if(Num==0)
Num=999;
Display(); //调用LED数码管显示子程序
}
}
void Timer0_Int(void) interrupt 1
{
TH0=T0ReLoadH; //重装载计数器初值
TL0=T0ReLoadL;
counter++;
}
5实时时钟与温度传感器实验(只需main()部分代码)
void main(void)
{
uchar Hour,Min,Sec;
//-----------------------------初始化TIMER0
TMOD|=0x01; //定时器T0方式1
TH0 =T0ReLoadH; //装载计数器初值
TL0 =T0ReLoadL;
TR0 =1; //启动Timer0
ET0 =1; //Timer0中断使能
EA =1; //总开关使能
counter=0;
//-----------------------------大循环
WR_DS1302(0x8e,0X00);
WR_DS1302(0x84,0X14);
WR_DS1302(0x82,0X43);
WR_DS1302(0x80,0X00);
WR_DS1302(0x8e,0X80);
for(;;)
{
Hour=RD_DS1302(0x85);
Min=RD_DS1302(0x83);
Sec=RD_DS1302(0x81);
dis_buff_1[0]=seg[Hour>>4];
if(counter<=49)
dis_buff_1[1]=seg[Hour&0x0f]|0x80;
else if(counter<=99)
dis_buff_1[1]=seg[Hour&0x0f];
else if(counter==100)
counter=0;
dis_buff_1[2]=seg[Min>>4];
dis_buff_1[3]=seg[Min&0x0f];
dis_buff_2[0]=0;
dis_buff_2[1]=0;
dis_buff_2[2]=seg[Sec>>4];
dis_buff_2[3]=seg[Sec&0x0f];
Display();
}
}
6 74HC595串行输入实验
#include <intrins.h> // use _nop_() function
#include<STC12c5A32s2.h>
#define uint unsigned int
#define uchar unsigned char
uchar counter;
//----------------计算计数器初值-----------------//
#define T0_TIME 10000 //定时时间us为单位
#define T0ReLoadL ((65536-(uint)(T0_TIME*11.0592/12)) % 256)
#define T0ReLoadH ((65536-(uint)(T0_TIME*11.0592/12)) / 256)
uchar bdata HC595_buff[2]; //交通灯控制1的位寻址变量
sbit HC595RegCLK =P2^5; //4hc595锁存时钟 输出
sbit HC595S_Data =P2^6; //74hc595串行数据 输出
sbit HC595ShiftCLK =P2^7; //74hc595串行移位时钟 输出
/*********************************************************
名称:WR_74HC595
说明:向2片74HC595写入2字节数据(HC595_buff)
**********************************************************/
void WR_74HC595(void)
{
uchar i,j,k,temp00;
HC595RegCLK = 0; //锁存线置“低”
HC595ShiftCLK = 0; //HC595.CLK =0
for(i=0;i<2;i++)
{
k=0X80;
temp00=HC595_buff[1-i];
for(j=0;j<8;j++)
{
if(temp00 & k)
HC595S_Data = 1; //HC595.SDA
else
HC595S_Data = 0;
HC595ShiftCLK = 1; //产生上升沿,移入数据
k >>= 1; //k右移一位
HC595ShiftCLK = 0; //HC595.CLK
}
}
HC595RegCLK = 1; //产生上升沿,锁存数据
}
void Timer0_Int(void) interrupt 1
{
TH0=T0ReLoadH; //重装载计数器初值
TL0=T0ReLoadL;
counter++;
}
/*********************************************************
名称:主程序
说明:main主函数放在所有子程序的后面,自称无需声明定义
**********************************************************/
void main(void)
{ uchar CN,i;
CN=0;
HC595_buff[0]=0x00;
HC595_buff[1]=0x00;
//-----------------------------初始化TIMER0
TMOD|=0x01; //定时器T0方式1
TH0 =T0ReLoadH; //装载计数器初值
TL0 =T0ReLoadL;
TR0 =1; //启动Timer0
ET0 =1; //Timer0中断使能
EA =1; //总开关使能
counter=0;
for(;;)
{ if(CN<10)
{
if(counter==50)
{counter=0;
HC595_buff[0]=~HC595_buff[0];
HC595_buff[1]=~HC595_buff[1];
CN++;
counter=0;
i=0;
}
if(CN==10)
{HC595_buff[0]=0x00;
HC595_buff[1]=0x08;}
}
else if(CN==10)
{
if(counter==10)
{ i++;
counter=0;
if(i<4)
{ HC595_buff[1]>>=1;
}
else if (i==4)
{ HC595_buff[0]=0x80;
HC595_buff[1]=0x00;
}
else if(i<12)
{ HC595_buff[0]>>=1;
}
else if(i==12)
{ i=0;
HC595_buff[0]=0x00;
HC595_buff[1]=0x08;
}
}
}
WR_74HC595();
}
}
7交通信号灯控制实验(仅需TraficLighter_ctrl()子程序部分代码)
void TraficLighter_ctrl(void)
{
switch(TraficLighter_state)
{
case 0: //初始化状态,两个方向都为红灯5秒钟
{ if(timer_count1==50)
{
timer_count1=0;
HC595_buff[0]=~HC595_buff[0];
HC595_buff[1]=~HC595_buff[1];
}
if (timer_count0==0)
{
TraficLighter_state=1;
timer_count0=30;
HC595_buff[0]=0;
HC595_buff[1]=0;
}
}break;
case 1: //状态1,南北方向红灯,东西绿灯
{
East_Green=1;
West_Green=1;
North_Red=1;
South_Red=1;
if(timer_count0==0)
{
TraficLighter_state=2;
timer_count0=5;
HC595_buff[0]=0;
HC595_buff[1]=0;
}
}break;
case 2: //状态2,南北方向红,东西黄灯闪烁
{
South_Red=1;
North_Red=1;
if(timer_count1==50)
{
timer_count1=0;
East_Yellow=~East_Yellow;
West_Yellow=~West_Yellow;
}
if(timer_count0==0)
{
TraficLighter_state=3;
timer_count0=50;
HC595_buff[0]=0;
HC595_buff[1]=0;
}
}break;
case 3: //状态3,南北方向绿灯,东西红灯
{ East_Red=1;
West_Red=1;
North_Green=1;
South_Green=1;
if(timer_count0==0)
{
TraficLighter_state=4;
timer_count0=5;
HC595_buff[0]=0;
HC595_buff[1]=0;
}
}break;
case 4: //状态4,东西方向红,南北黄灯闪烁
{ East_Red=1;
West_Red=1;
if(timer_count1==50)
{
timer_count1=0;
South_Yellow=~South_Yellow;
North_Yellow=~North_Yellow;
}
if(timer_count0==0)
{
TraficLighter_state=1;
timer_count0=5;
HC595_buff[0]=0;
HC595_buff[1]=0;
}
}break;
}
}
8 UART串口通讯实验
#include<STC12c5A32s2.h> //包含头文件
#define uint unsigned int //宏定义
#define uchar unsigned char
uchar Rec_No;
uchar Rec_Data;
uchar Rec_Addr;
uchar Send_ok;
uchar Rec_order;
uchar Self_Addr;
sbit relay=P3^7;
/*********************************************************
名称: 主程序
说明:
**********************************************************/
void main(void)
{
//-----------------------------UART串口初始化
SM0 =0;
SM1 =1; //串口方式1
REN =1; //允许接收
TMOD |=0x20; //定时器T1方式2
TH1 =0xfd; //装载计数器初值
TL1 =0xfd;
TR1 =1; //启动Timer1
PCON &=0x7f; //SMOD=0,BRT=9600bps;SMOD=1,BRT=19200bps;
Send_ok=0;
Self_Addr=0x02;
ES =1; //打开串口中断
EA =1; //总开关使能
//-----------------------------大循环
while(1)
{
}
}
/*********************************************************
名称:串口中断服务子程序
功能:
**********************************************************/
void UART0(void) interrupt 4
{ uchar Temp0;
if(RI==1) //接收到数据
{ Rec_No++;
Temp0=SBUF;
RI=0;
if(Rec_No==1)
{ Rec_Addr=Temp0;
} //必须软件清零标志
else if(Rec_No==2)
{ Rec_order=Temp0;
Rec_No=0;
if(Rec_Addr==Self_Addr)
{
if(Rec_order==0x21)
relay=0;
if(Rec_order==0x22)
relay=1;
if(Rec_order==0x20)
{ SBUF=Rec_No;
Send_ok=0;
}
}
}
}
if(TI==1) //发送数据完毕
{
TI=0;
if(Send_ok==0)
{SBUF=35;
Send_ok=1;
} //必须软件清零标志
}
}
展开阅读全文