- // 模拟交通信号灯的程序
- // 典型的51红绿灯程序,用89C51,S51, 分别定义了 P0.0,0.1,0.2 ,P0.4,0.5,0.6 接外部输出,会自动运行。
- #include <reg52.h>
- sbit RED1 =P0^0; // 南北交通信号灯
- sbit YELLOW1=P0^1;
- sbit GREEN1 =P0^2;
- sbit RED2 =P0^4; // 东西交通信号灯
- sbit YELLOW2=P0^5;
- sbit GREEN2 =P0^6;
- /*------------------------------------------------
- uS延时函数,含有输入参数 long dly,无返回值
- long 是定义无符号字符变量,其值的范围是
- -2147483648~+2147483647 这里使用晶振12M,精确延时请使用汇编,大致延时
- 长度如下 T=dly x 2 + 5 uS
- ------------------------------------------------*/
- void delay(long dly)
- {
- while(dly--);
- }
- void main()
- {
- int i,x,y,z;
- while(1)
- {
- RED1=0;YELLOW1=1;GREEN1=1;//南北红
- RED2=1;YELLOW2=1;GREEN2=0;//东西绿
- x=10,y=7,z=3;
- for(i=0;i<10;i++)
- { //2位的数码管模块 进行硬件译码
- P2=((x/10)<<4)+x%10; //nanbeihong 驱动数码管显示 要显示的数字的BCD码数组
- x--;
- if(y>0)
- { //2位的数码管模块 送入的 BCD译码器 转码
- P1=((y/10)<<4)+y%10; //dongxilv 驱动数码管显示
- y--;
- delay(15000); //大致延时30mS
- }
- else
- {
- RED2=1;YELLOW2=0;GREEN2=1; //dongxihuang
- P1=((z/10)<<4)+z%10; // 驱动数码管显示 要显示的数字的BCD码数组
- RED2=1;YELLOW2=0;GREEN2=1;
- delay(7500); //大致延时15mS
- RED2=1;YELLOW2=1;GREEN2=1;
- delay(7500); //大致延时15mS
- z--;
- }
- }
-
- RED1=1;YELLOW1=1;GREEN1=0;//南北绿
- RED2=0;YELLOW2=1;GREEN2=1;//东西红
- x=18,y=15,z=3;
- for(i=0;i<18;i++) //dongxihong
- {
- P1=((x/10)<<4)+x%10; //驱动数码管显示
- x--;
- if(y>0)
- {
- P2=((y/10)<<4)+y%10; //nanbeilv 驱动数码管显示
- y--;
- delay(15000); //大致延时30mS
- }
- //nanbeihuang
- else
- {
- RED1=1;YELLOW1=0;GREEN1=1;
- P2=((z/10)<<4)+z%10; // 驱动数码管显示
- RED1=1;YELLOW1=0;GREEN1=1;
- delay(7500); //大致延时15mS
- RED1=1;YELLOW1=1;GREEN1=1;
- delay(7500); //大致延时15mS
- z--;
- }
- }
-
- }
- }
复制代码 |