|
本帖最后由 AnRan_ 于 2022-2-19 21:16 編輯
剛學(xué)定時(shí)器和串口,項(xiàng)目要求是 按下key1之后led燈亮5s后熄滅(定時(shí)器定時(shí)),然后串口接收到6的時(shí)候led燈全部亮,然后按下key2之后讓前面亮起來(lái)的led燈熄滅,并且向串口發(fā)送 “Hello World!”。 這三部分每一部分單獨(dú)拿出來(lái)當(dāng)作一個(gè)小程序都沒(méi)有問(wèn)題,但是這三部分合起來(lái)寫(xiě)成一個(gè)程序就出現(xiàn)問(wèn)題了。 我寫(xiě)的這個(gè)程序運(yùn)行之后,第一部分按下key1之后led燈亮五秒鐘熄滅沒(méi)任何問(wèn)題; 第二部分串口接收到6的時(shí)候led燈也可以全亮,但是亮一段時(shí)間之后就會(huì)自動(dòng)熄滅,按照要求應(yīng)該是不讓他熄滅的;第三部分是按下key2之后第二部分亮起來(lái)的led燈可以正常熄滅,但是不會(huì)向串口發(fā)送“Hello World!”。
請(qǐng)幫我看一下是哪里有問(wèn)題。
單片機(jī)源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- #include <stdio.h>
- sbit key1=P3^0;
- sbit key2=P3^1;
- void delay(unsigned char z)//zms延時(shí)
- {
- 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;//打開(kāi)定時(shí)器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) ;//松手檢測(cè)
- 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;
- }
復(fù)制代碼
|
|