串口中断方式0使用(74LS164驱动数码管)
/* 串口使用时都需要设置波特率,而stc89c51里只能使用T1定时器设置波特率,对于12Mhz的晶振,波特率一般设为4800,在加倍之后为9600,相比直接使用9600,可,减小误差。
TI和RI为中断标志位,
接收数据时,XXX=SBUF,cpu会自动将串口接受寄存器中的数据取走送给XXX
发送数据时,SBUF=XXX;程序执行完一条语句便自动开始将串口发送寄存器的数据一位一位发送出去。
SBUF是共用一个地址的两个独立寄存器
下图为74ls164与数码管连接图
下图为方式0输出时序图
*/
uchar Shiftcode[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};//这是164移位寄存器发送给数码管专用的数码管表,0到10
uchar disp[4]={0xff,0xff,0xff,0xff};
bit flag;
void Usartinit()
{
TMOD|=0x10;//使用定时器1,方式1,定时模式
SCON=0X00;//方式0,一般用于扩展IO口
PCON=0x80;//波特率加倍
TH1=0XFF;//4800波特率*2
TL1=0XF3;
EA=1;//开总中断
// ET1=1;//不需要T1中断,注释掉
TR1=1;//开启定时器1
EX0=1;//允许外部中断0
IT0=1;//中断方式设置为下降沿触发
TI=0;//在TI=0时进行发送数据
}
//发送操作,cpu将数据移入SBUF后,RXD发出8位数据,TXD发送同步脉冲。数据发完后,TI由硬件置1,CPU响应中断后,需用软件使TI清零,在发送下一个字符。
void Display()
{
uchar i;
for(i=0;i<2;i++)//因为我用的数码管是两位的
{
SBUF=disp[i];//将需要传送的数码管段选数据发送至接收缓冲器中
while(!TI);//TI=1表示发送完成
TI=0;//中断标志位清0,才能继续发送数据,当TI=1时,cpu会响应中断,此时不能传送数据
}
}
/*如果传送来的数据为pulse,可以用disp[1]=Shiftcode[pulse/10],disp[0]=Shiftcode[pulse%10];这部分的数据需要自己处理
这里中断函数不写也可以