通过使用串口中断和定时器中断,进行数据的收发,并将发送的数据通过数码管显示,如有不足,感谢指正
#include <REGX52.H>
#define uint unsigned int
#define uchar unsigned char
sbit DU =P2^6;//段选
sbit WE =P2^7;//位选
uchar num;//数码管显示的值
//共阴极数码管0-9
uchar code duanxuan[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
//位选前三个数码管
uchar code weixuan[] ={0xfe,0xfd,0xfb,0xf7};
//void delay(uint x) //@12.000MHz 延迟函数1毫秒 和上述的函数一样
//{
// unsigned char i, j;
// while(x--)
// {
// i = 2;
// j = 239;
// do
// {
// while (--j);
// } while (--i);
// }
//}
void display(uchar i) //数码管显示函数
{
static uchar wei;
uchar qian,bai, shi, ge;
qian =i/1000;
bai = i / 100%10;
shi = i /10%10;
ge = i % 10;
P0 = 0XFF;//清除断码
WE = 1; //位选打开
P0 = weixuan[wei];
WE = 0; //关闭位选寄存器
switch(wei)
{
case 0:DU = 1;P0 = duanxuan[qian];DU = 0;break;
case 1:DU = 1;P0 = duanxuan[bai];DU = 0;break;
case 2:DU = 1;P0 = duanxuan[shi];DU = 0;break;
case 3:DU = 1;P0 = duanxuan[ge];DU = 0;break;
}
wei++;
if(wei ==4)
wei =0;
}
void timer0Init() //定时器0初始化
{
EA =1;
ET0 =1;
TR0 =1;
REN =1;//允许串口接收
//TCON中的打开定时器
TMOD |=0x01; //TMOD不能位寻址 0000 0001中 0 01表示定时器模式 16位定时
TH0 =0xed; //(65535-46082)/256; //定时器 50ms 65536-50000/1.085/256 高8位
TL0 =0xff; //(65535-46082)%256; //低8位
}
//串口初始化
void UARTInit()
{
EA =1;//打开总中断
ES =1;//打开串口中断
SM0 =0;//工作方式为1 8位UART波特率可变
SM1 =1;
REN =1;//串口允许接收
TR1 =1;//定时器1产生波特率
TMOD |=0x20;//0010 0000 8位自动重装载定时器,当溢出时将TH1存放的值自动重装入TL1
//通过比特率的计算公式 9600 计算出TH1 TL1
TH1 =0XFD;
TL1 =0XFD;
}
//写串口中断程序
void UART() interrupt 4
{
uchar temp;
if(RI==1)//表示串口接收
{
num =SBUF;//读SBUF缓存其中的数据送给num
RI =0; //软件置零接收标志位
temp =num;
SBUF =++temp;//写SBUF,把要发送的数据送给缓存器
}
if(TI==1)//判断是否发送完成
TI =0; //清零发送完成标志位
}
void timer0() interrupt 1 //定时器0中断
{
TH0 =0xed;
TL0 =0xff;
display(num);
}
void main()
{
UARTInit();
timer0Init();
while(1)
{
}
}