用3个开关模拟汽车的左转向灯、右转向灯、刹车灯。
左转:实现P3.0口作输入,控制P2.0口的一个LED灯同时输出内容随开关SW2接通P3.0口,则LED灯亮灭闪烁,不接通则LED灯灭。
右转:实现P3.1口作输入,控制P2.1口的一个LED灯同时输出内容随开关SW2接通P3.1口,则LED灯亮灭闪烁,不接通则LED灯灭。
刹车:实现P3.2口作输入,控制P2.0、P2.1口的2个LED灯同时输出内容随刹车开关接通P3.2口,则2个LED灯同时亮灭闪烁,不接通则LED灯灭。
单片机源程序如下:
- #include <REG52.H>
- typedef unsigned char uchar;
- sbit keyL=P3^0;
- sbit keyR=P3^1;
- sbit keyS=P3^2;
- sbit keyled=P3^3;
- sbit ledL=P2^0;
- sbit ledR=P2^1;
- sbit led1=P2^2;
- sbit led2=P2^3;
- sbit led3=P2^4;
- void delayms(unsigned int del)
- {
- unsigned int i,j;//0--65535
- for(j=0;j<del;j++)//
- {
- for(i=0;i<124;i++);//1ms
- }
- }
- void main(void)
- {
- uchar flag=0;
- while(1)
- {
- if( keyL==0 && keyS==1)
- {
- ledL=~ledL;
- delayms(200);
- }
- else if( keyL==1 && keyS==1)
- {
- ledL=1;
- }
-
- if( keyR==0 && keyS==1)
- {
- ledR=~ledR;
- delayms(200);
- }
- else if( keyR==1 && keyS==1)
- {
- ledR=1;
- }
-
- if( keyS==0 && keyL==1 && keyR==1 )
- {
- ledR=~ledR;
- ledL=~ledL;
- delayms(200);
- }
- else if( keyS==1 && keyL==1 && keyR==1 )
- {
- ledR=1;
- ledL=1;
- }
-
- ////////////////////////////////////////////////
-
- if(keyled==0)
- {
- delayms(50);
- if(keyled==0)
- {
- flag=flag+1;
- if(flag>=4)flag=0;
- }
- while(keyled==0);
- }
- switch (flag)
- {
- case 0:
- led1=1;led2=1;led3=1;
- break;
- case 1:
- led1=0;led2=1;led3=1;
- break;
- case 2:
- led1=0;led2=0;led3=1;
- break;
- case 3:
- led1=0;led2=0;led3=0;
- break;
- default:
- break;
- }
-
- }
- }
复制代码
可以考虑多种情况的组合:
如有左转+刹车的操作组合,LED灯如何亮,可左灯闪烁,右灯常亮。
如有右转+刹车的操作组合,LED灯如何亮。可右灯闪烁,左灯常亮。 |