本帖最后由 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;
- }
復制代碼
|