/***************************************************************************
程序名称:program4-3.c
程序功能:模拟交通信号灯的定时控制
****************************************************************************/
#include "reg51.h" //包含头文件reg51.h
unsigned char t,t1; //全局变量
/***************************************************************************
函数名称:delay1s
函数功能:用T0的模式1编写1s延时函数
形式参数:无
返回值:无
****************************************************************************/
void delay1s()
{
while(20)
{for(t=0;t<0x14;t++) // 变量t用作循环控制变量
{
TMOD=0X05;
TH0=0x3c; // 设置计数器初值
TL0=0xb0; //
TR0=1;// 启动T0
while(!TF0);// 查询计数器是否溢出,即定时50ms时间到
TF0=0; // 50ms定时时间到,溢出标志位TF0清零
}
}
}
/***************************************************************************
函数名称:delay_t1
函数功能:实现1秒~256秒延时函数
形式参数:unsigned char t2,控制循环次数
返回值:无
****************************************************************************/
void delay_t1(unsigned char t2)
{
for(t1=0;t1<t2; t1++) // 采用全局变量t1作为循环控制变量
delay1s(); //1s延时函数调用
}
/***************************************************************************
函数名称:main
函数功能:实现交通信号灯的定时控制
****************************************************************************/
void main( ) //主函数
{
//unsigned char k;
TMOD=0x01; // T0工作在模式1
while(1)
{
P1=0x33; // A线放行,B线禁行
delay_t1(25); //延时25秒
P1=0x35; // A线警告,B线禁行
delay_t1(5); //延时5秒
P1=0x1e; // A线禁行,B线放行
delay_t1(25); //延时25秒
P1=0x2e; // A线禁行,B线警告
delay_t1(5); //延时5秒
}
}
代码如上所示,
要实现的目的:
交通信号灯基本变化规律:
放行线:绿灯亮放行25s,黄灯亮警告5s,然后红灯亮禁止。
禁行线:红灯亮禁止30s,然后绿灯亮放行。
proteus图如下:
初始状态是红灯、绿灯亮;25s后切换到黄灯,到25s后,依然还是初始状态