第三节:十字路口交通灯
如果一个单位时间为1秒,这里设定的十字路口交通灯按如下方式四个步骤循环工作:
? 60个单位时间,南北红,东西绿;
? 10个单位时间,南北红,东西黄;
? 60个单位时间,南北绿,东西红;
? 10个单位时间,南北黄,东西红;
解:用P1端口的6个引脚控制交通灯,高电平灯亮,低电平灯灭。
- #include <at89x52.h>
- //sbit用来定义一个符号位地址,方便编程,提高可读性,和可移植性
- sbit SNRed =P1^0; //南北方向红灯
- sbit SNYellow =P1^1; //南北方向黄灯
- sbit SNGreen =P1^2; //南北方向绿灯
- sbit EWRed =P1^3; //东西方向红灯
- sbit EWYellow =P1^4; //东西方向黄灯
- sbit EWGreen =P1^5; //东西方向绿灯
- /* 用软件产生延时一个单位时间 */
- void Delay1Unit( void )
- {
- unsigned int i, j;
- for( i=0; i<1000; i++ )
- for( j<0; j<1000; j++ ); //通过实测,调整j循环次数,产生1ms延时
- //还可以通过生成汇编程序来计算指令周期数,结合晶体频率来调整j循环次数,接近1ms
- }
- /* 延时n个单位时间 */
- void Delay( unsigned int n )
- {
- for( ; n!=0; n-- )
- Delay1Unit();
- }
- void main( void )
- {
- while( 1 )
- {
- SNRed=0; SNYellow=0; SNGreen=1; EWRed=1; EWYellow=0; EWGreen=0; Delay( 60 );
- SNRed=0; SNYellow=1; SNGreen=0; EWRed=1; EWYellow=0; EWGreen=0; Delay( 10 );
- SNRed=1; SNYellow=0; SNGreen=0; EWRed=0; EWYellow=0; EWGreen=1; Delay( 60 );
- SNRed=1; SNYellow=0; SNGreen=0; EWRed=0; EWYellow=1; EWGreen=0; Delay( 10 );
- }
- }