以下是我编写的一个程序,目的是让单片机一个按键按一下,然后串口显示01,再按下为02,但是我写的这个程烧录到单片机上的时候一直按那个按键,单片机串口一直都显示01,从来都不变,有没有大佬帮忙看一下为什么呀
单片机代码:
- #include"reg52.h"
- #define uchar unsigned char
- #define uint unsigned int
- sbit key=P3^1;
- uchar key_count;
- //串口初始化
- void UARTInit()
- {
- EA = 1; //打开总中断
- ES = 1; //打开串口中断
- SM0 = 0;
- SM1 = 1;//串口工作方式1,8位UART波特率可变
- REN = 1;//串口允许接收
- TR1 = 1;//启动定时器1
- TMOD |= 0x20;//定时器1,工作模式2 8位自动重装
- TH1 = 0xfd;
- TL1 = 0xfd;//设置比特率9600
- }
- uchar code duan[]={
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
- 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,
- 0x79,0x71};
- void delayms(uint xms)//此为延时函数,就是前面的延时都是需要调用这一个函数
- {
- uint i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
- void keyscan()
- {
- key=1;
- if(key==0)
- {
- delayms(50);
- if(key==0)
- {
- key_count++;
- if(key_count==10)
- key_count=0;
- while(!key);
- }
- }
- }
- void timer0Init()
- {
- EA = 1; //打开总中断
- ET0 = 1;//打开定时器0中断
- TR0 = 1; //启动定时器0
- REN = 1;//允许串口接收
- TMOD |= 0X01; //定时器工作模式1,16位定时模式
- TH0 = 0xED;
- TL0 = 0xFF; //定时5ms
- }
- void main()
- {
- timer0Init();//定时器0初始化
- UARTInit();//串口初始
- keyscan();
- while(1);
- }
- //定时器0中断函数
- void timer0() interrupt 1
- {
- TH0 = 0xED;
- TL0 = 0xFF; //定时5ms
-
- }
- //串口中断函数
- void UART() interrupt 4
- {
- uchar temp;
- if(RI)//判断接收是否完成
- {
- key_count = SBUF;//读SBUF,读出串口接收到的数据
- RI = 0;//软件清零接收标志位
- temp = key_count;//
- SBUF = ++temp;//写SBUF,把要发送的数据送给发送缓存器
- }
- if(TI)//判断是否发送完成
- TI = 0;//清零发送完成标志位
- }
复制代码
|