|
自己参照了教程例子,用串口调试助手完成了发送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);
- }
- }
- }
- }
复制代码 |
|