|
自己參照了教程例子,用串口調試助手完成了發送1,2,3數據分別控制led亮,流水燈功能,呼吸燈功能.
然后我想再結合開發板按鍵上的控制上面三個功能的程序,整合到一起. 整合后發現只能實現串口調試助手發送數據(助手也能正常顯示接受數據),
按鍵部分就沒反應了. 下面程序, 不知道是我自己編寫邏輯有錯還是什么,望人指點一下.
- #include <reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit S1=P3^5;
- sbit S2=P3^4;
- sbit S3=P3^3;
- sbit S4=P3^2;
- sbit led1=P1^0;
- sbit led2=P1^1;
- sbit led3=P1^2;
- sbit led4=P1^3;
- uchar aa=0xfe,num = 0,a;
- uchar i = 0,j = 0,k = 0,t = 0;
- void delay(unsigned int t) ;
- void delay2(unsigned int z);
- void keyscan();
- void initial_com();
- void initial_com()
- {
- //SCON = 0x50;
- TMOD|= 0x20;
- TH1 = 0xfd;
- TL1 = 0xfd;
- TR1 = 1;
- REN = 1;
- SM0 = 0;
- SM1 = 1;
- EA = 1;
- ES = 0; //允許串口中斷
- SBUF = 0x01;
- while(!TI);
- TI = 0; //串口中斷
- ES = 1;
- }
- void keyscan() //掃描按鍵程序
- {
- if(S1==0)
- {
- delay(5);
- if(S1==0)
- {
- i++;
- }
- while(!S1);
- delay(5);
- while(!S1);
- }
-
- if(S2==0)
- {
- delay(5);
- if(S2==0)
- {
- j++;
- }
- while(!S2);
- delay(5);
- while(!S2);
- }
-
- if(S3==0)
- {
- delay(5);
- if(S3==0)
- {
- k++;
- }
- while(!S3);
- delay(5);
- while(!S3);
- }
-
- if(S4==0)
- {
- delay(5);
- if(S4==0)
- {
- t++;
- }
- while(!S4);
- delay(5);
- while(!S4);
- }
-
- }
- void delay(unsigned int t)
- {
- unsigned int x,y;
- for(x=t;x>0;x--)
- for(y=110;y>0;y--);
- }
- void delay2(unsigned int z)
- {
- while(--z);
- }
- void main()
- { //P1=0xff;
- unsigned int CYCLE=600,PWM_LOW=0;//定義周期(呼吸燈部分)
- // aa = 0xfe;
- initial_com();
- while(1)
- {
- if(num==1)
- {
- ES = 0;
- num = 0;
- SBUF = a;
- SBUF = i;
- while(!TI);
- TI = 0;
- ES = 1;
- }
- }
- }
- void ser() interrupt 4
- {
- unsigned int CYCLE=600,PWM_LOW=0;
- keyscan();
- RI=0;
- // P1=SBUF; //接收數據SBUF,即將計算機的數據接收。
- i = SBUF;
- a=SBUF;
- // ledoff=SBUF;
- num=1;
- //aa=0xfe;
- /*****************呼吸燈部分*******************/
- if(a == 0x03)
- {
- while (1) //主循環
- { //keyscan();
- //if(S1==0)
- // {
- // delay(5);
- // if(S1==0)
- // {
- led1=1;
- delay2(150000);
- for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++)//PWM_LOW表示低電平時間
- {
- led1=0; //點亮LED
- delay2(PWM_LOW)
- led1=1; //熄滅LED
- delay2(CYCLE-PWM_LOW)
- }
- //LED0=0;
- for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)
- led1=0;
- delay2(PWM_LOW);
- led1=1;
- delay2(CYCLE-PWM_LOW);
- }
- }
- }
- /*****控制燈******/
- if(a == 0x01)
- {
- P1 = aa;
- delay(100);
- aa = _crol_(aa,1);
- }
- if(a == 0x00)
- {
- P1 = 0xff;
- }
- /**************流水燈部分****************/
- if(a == 0x02) //偶數整除等于,按鍵在 偶次數才觸發流水燈
- {
- P1=aa;;
- delay(500);
- aa=_crol_(aa,1);
- }
- /*************按鍵控制部分,是不是我不應該寫在這個中斷里面???寫在主函數上也是沒反應***************/
- if(i==1)
- {
- delay(5);
- if(i==1)
- {
- led1= 0;
- }
- }
- if(i==2)
- {
- P1=aa;;
- delay(500);
- aa=_crol_(aa,1);
- }
- if(i==3)
- {
- while(1)
- {
- led1= 1;
- delay2(150000);
- for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++)
- {
- led1= 0;
- delay2(PWM_LOW);
- led1=1;
- delay2(CYCLE-PWM_LOW);
- }
- for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)
- { //與逐漸變亮相反的過程
- led1=0;
- delay2(PWM_LOW);
- led1=1;
- delay2(CYCLE-PWM_LOW);
- }
- }
- }
- }
復制代碼 |
|