51单片机C程序实验LED灯[5]模拟交通灯 定时中断控制双色灯交替闪烁

【51单片机C程序实验LED灯[5]模拟交通灯 定时中断控制双色灯交替闪烁】51单片机驱动LED灯模拟交通灯的核心方法是:利用定时器产生精确延时,通过I/O口输出高低电平,控制红、黄、绿三色LED按交通规则顺序点亮与熄灭。标准时序为:绿灯亮30秒→绿灯闪烁3秒(或直接转黄灯)→黄灯亮3秒→红灯亮30秒→重复。在C程序中,通常采用定时器中断方式实现非阻塞延时,主循环中通过状态机切换灯色;硬件上需将三个LED(红、黄、绿)分别连接到单片机I/O口,并串联限流电阻(约220Ω)至VCC(共阳极)或GND(共阴极)。以下完整代码以12MHz晶振、共阳极接法为例,使用定时器T0工作于模式1产生10ms基准中断,累计计数值实现各相位时长。

```c

include

sbit RED = P1^0;// 红灯

sbit YELLOW = P1^1; // 黄灯

sbit GREEN = P1^2;// 绿灯

unsigned char count_10ms = 0;

unsigned char state = 0; // 0:绿灯,1:黄灯,2:红灯

void Timer0_Init() {

TMOD |= 0x01; // 定时器0模式1

TH0 = 0xDC; // 10ms初值 (12MHz)

TL0 = 0x00;

ET0 = 1;

EA = 1;

TR0 = 1;

}

void Timer0_ISR() interrupt 1 {

TH0 = 0xDC;

TL0 = 0x00;

count_10ms++;

}

void delay_ms(unsigned int ms) {

unsigned int i;

for(i=0; i

// 使用空循环实现粗略延时,实际中应由定时器替代

unsigned char j = 120;

while(j--);

}

}

void main() {

Timer0_Init();

while(1) {

switch(state) {

case 0: // 绿灯30秒

GREEN = 0; YELLOW = 1; RED = 1;

if(count_10ms >= 3000) { count_10ms=0; state=1; }

break;

case 1: // 黄灯3秒

GREEN = 1; YELLOW = 0; RED = 1;

if(count_10ms >= 300) { count_10ms=0; state=2; }

break;

case 2: // 红灯30秒

GREEN = 1; YELLOW = 1; RED = 0;

if(count_10ms >= 3000) { count_10ms=0; state=0; }

break;

}

// 可添加绿灯闪烁逻辑(例如最后3秒闪烁)

if(state==0 && count_10ms>=2700) { // 最后3秒闪烁

if(count_10ms%100 < 50) GREEN=1;

else GREEN=0;

}

}

}

```

上述代码基于状态机实现基础交通灯控制,实际项目还需考虑按键调整时间、紧急通行、数码管倒计时显示等扩展功能。为确保系统可靠,建议在主循环中每次切换状态前关闭中断进行变量修改,或使用volatile修饰全局变量。

【常见问题】

问题1:如何实现黄灯单独闪烁而非常亮?

回答1:只需在黄灯状态下,利用定时器中断计数,每500ms切换一次黄灯I/O电平(例如取反),同时保持其他灯熄灭。注意闪烁周期通常为1Hz(亮0.5s,灭0.5s)。

问题2:晶振频率不同时,定时器初值如何计算?

回答2:定时器溢出时间 = (65536 - 初值) × 机器周期。机器周期 = 12 / 晶振频率(MHz)。例如12MHz晶振,机器周期1µs,需10ms中断则初值 = 65536 - 10000 = 55536 = 0xD8F0。实际需结合定时器模式与重装方式调整。

问题3:共阳极与共阴极LED接线对程序的影响?

回答3:共阳极时,I/O口输出低电平点亮LED,代码中应赋0;共阴极则输出高电平点亮,赋1。硬件设计需统一,程序中通过条件编译或宏定义可灵活适配。

问题4:如何增加紧急车辆优先通行功能?

回答4:在外部中断引脚(如INT0)接入按键,按下时触发中断,强制将所有灯置为红灯(或特定闪烁),并启动延时后恢复原状态。注意中断服务函数中应清除中断标志并保护现场。

【参考文献】

1、[2024-11-15](51单片机交通灯设计与仿真(基于定时器中断))CSDN

2、[2024-08-20](Keil C51实现交通灯状态机编程详解)电子工程世界

3、[2024-03-10](51单片机实验指导书:LED模拟交通灯)华成教育

4、[2023-12-05](基于Proteus的51交通灯仿真与C代码)21ic电子网

5、[2023-06-18](单片机定时器精确延时与交通灯时序分析)电子发烧友

本文来自作者[日常俗世观察]投稿,不代表万里行信息网立场,如若转载,请注明出处:https://www.wlx315.cn/shbk/202609/6271.html

赞 (47)

今日大家都在搜的词:

发表回复

本站作者后才能评论

评论列表(4条)

  • 日常俗世观察
    日常俗世观察 2026年09月14日

    我是万里行信息网的签约作者“日常俗世观察”!

  • 日常俗世观察
    日常俗世观察 2026年09月14日

    希望本篇文章《51单片机C程序实验LED灯[5]模拟交通灯 定时中断控制双色灯交替闪烁》能对你有所帮助!

  • 日常俗世观察
    日常俗世观察 2026年09月14日

    本站[万里行信息网]内容主要涵盖:生活百科,小常识,生活小窍门,知识分享

  • 日常俗世观察
    日常俗世观察 2026年09月14日

    本文概览:【51单片机C程序实验LED灯[5]模拟交通灯 定时中断控制双色灯交替闪烁】51单片机驱动LED灯模拟交通灯的核心方法是:利用定时器产生精确延时,通过I O口输出高低电平,控制红、黄、绿三色LED按交通规则顺序点亮与熄灭。标准时序为:绿灯亮30秒→绿灯闪烁3秒(或直接转黄灯)→黄灯亮3秒→红灯亮30秒→重复。在C程序中,通常采用定时器中断方式实现非阻塞延时,主循环中通过状态机切换灯色;硬件上需将三个LED(红、黄、绿)分别连接到单片机I O口,并串联限流电阻(约220Ω)至VCC(共阳极)或GND(共阴极)。以下完整代码以12MHz晶振、共阳极接法为例,使用定时器T0工作于模式1产生10ms基准中断,累计计数值实现各相位时长。

联系我们

联系:143 0457 151

工作时间:周一至周五,9:30-18:30,节假日休息

关注我们