赞助论坛
  • 4823阅读
  • 0回复

51单片机编程基础之四[十字路口的交通灯] [复制链接]

楼层直达
rkvclu  
发帖
17
精华
0
金币
65
威望
3
贡献
0
好评
0
注册
2008-06-14
楼主    rkvclu 发表于: 2008-06-16 15:16:09 
十字路口的交通灯
如果一个单位时间为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 );  
}  
}