本帖最后由 AnRan_ 于 2022-2-19 21:16 编辑
刚学定时器和串口,项目要求是 按下key1之后led灯亮5s后熄灭(定时器定时),然后串口接收到6的时候led灯全部亮,然后按下key2之后让前面亮起来的led灯熄灭,并且向串口发送 “Hello World!”。 这三部分每一部分单独拿出来当作一个小程序都没有问题,但是这三部分合起来写成一个程序就出现问题了。 我写的这个程序运行之后,第一部分按下key1之后led灯亮五秒钟熄灭没任何问题; 第二部分串口接收到6的时候led灯也可以全亮,但是亮一段时间之后就会自动熄灭,按照要求应该是不让他熄灭的;第三部分是按下key2之后第二部分亮起来的led灯可以正常熄灭,但是不会向串口发送“Hello World!”。
请帮我看一下是哪里有问题。
单片机源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- #include <stdio.h>
- sbit key1=P3^0;
- sbit key2=P3^1;
- void delay(unsigned char z)//zms延时
- {
- unsigned char i, j;
- while(z>0)
- {
- _nop_();
- i = 2;
- j = 199;
- do
- {
- while (--j);
- } while (--i);
- z--;
- }
- }
- void timer0Init() //50ms
- {
- TR0=1;
- TMOD|=0X01;
- TH0=(65535-46082)/256;
- TL0=(65535-46082)%256;
- }
- void UARTInit()
- {
- EA=1;
- ES=1;
- REN=1;
- SM0=0; SM1=1;
- TR1=1;//打开定时器1
- TMOD|=0X20;
- TH1=0XFD;
- TL1=0XFD;
- }
- void main()
- {
- unsigned char msec;
- while(1)
- {
- UARTInit();
- if(key1==0)
- {
- delay(20); //消抖
- if(key1==0)
- while(!key1) ;//松手检测
- P1=0x00;
- timer0Init();
- }
- if(TF0==1)
- {
- TF0=0;
- msec++;
- TH0=(65535-46082)/256;
- TL0=(65535-46082)%256;
- if(msec==100)
- {
- P1=0XFF;
- TR0=0;
- }
- }
- if(key2==0)
- {
- delay(20);
- if(key2==0)
- while(!key2) ;
- P1=0xff;
- TI=1;
- printf("Hello World!\n");
- while(!TI) ;
- TI=0;
- }
- }
- }
- void UART() interrupt 4
- {
- unsigned char temp;
- if(RI)
- {
- RI=0;
- temp=SBUF;
- if(temp==6)
- P1=0x00;
- }
- if(TI)
- TI=0;
- }
复制代码
|