/***************************************************************************
程序名称: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后,依然还是初始状态
你代码应该在delay1s()有问题,建议梳理一下这部分代码逻辑
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632
非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!
速戳参与调研>>>https://t.csdnimg.cn/Kf0y