【proteus经典实战】定时器控制交通灯指示灯

一、简介

基于8051系列单片机实现,旨在模拟一个简单的交通灯系统,实现红、黄、绿灯的交替亮灭。使用了特殊功能寄存器(SFR)和位操作来控制硬件,使用定时器0的中断功能来控制交通灯信号的切换。通过软件控制,实现交通灯的红、黄、绿灯的亮灭和闪烁。

二、头文件选择,变量定义

在8051微控制器上基于嵌入式C语言的程序片段。定义一系列的宏定义、全局变量和特殊功能位(sbit),用于简化寄存器操作和提高代码可读性。

2.1头文件:

头文件:包含了针对8051微控制器的头文件REG52.H。

2.2宏定义:

uint 和 uchar 分别定义为 unsigned int 和 unsigned char,用于简化代码中的类型声明。

2.3全局变量:

定义了 Time_Count、Flash_Count 和 Operation_Type 三个无符号字符变量,用于控制交通灯的计时和操作类型。

2.4特殊功能位定义:

使用 sbit 关键字定义了6个特殊功能位,分别对应两个交通灯的红、黄、绿灯。

2.5主要引脚口定义:

P0 的 0~5引脚连接红绿灯,由于同方向的灯显示方式相同。

P0.0 ~ P0.2: 分别对应横向的红灯,黄灯,绿灯
P0.3 ~ P0.5: 分别对应纵向的红灯,黄灯,绿灯

三、中断函数说明

T0_INT 用于处理定时器0(Timer 0)的中断。这个中断服务程序是交通灯信号控制逻辑的核心部分,负责根据预设的时间间隔改变交通灯的状态。

3.1中断标识:

interrupt 1 表示这是一个响应定时器0中断的服务程序。数字 1 是定时器0中断的标识符。

3.2定时器重新加载:

TH0 = -50000/256; 和 TL0 = -50000%256; 这两行代码重新加载定时器0的高八位(TH0)和低八位(TL0)寄存器。这里通过计算 -50000 的高八位和低八位,设置定时器的溢出时间。这决定了交通灯状态切换的时间间隔。

3.3状态机逻辑:

使用 switch 语句根据 Operation_Type 的值来决定当前应该执行哪个操作。Operation_Type 是一个全局变量,用于跟踪交通灯的当前状态。

3.4交通灯状态控制:

在每个 case 语句中,根据当前的 Operation_Type,设置相应的交通灯信号位(RED_A, YELLOW_A, GREEN_A, RED_B, YELLOW_B, GREEN_B)。这些位与硬件上的LED灯相连,控制灯的亮灭。

3.5时间计数和状态切换:

Time_Count 用于跟踪当前状态持续的时间。当达到预设的时间(例如100个中断周期)后,Time_Count 被重置,Operation_Type 更新为下一个状态。

3.6闪烁控制:

对于黄灯闪烁的状态(Operation_Type 为2和4),使用 Flash_Count 来跟踪闪烁的次数。当黄灯闪烁了预设的次数(例如10次)后,Flash_Count 被重置,Operation_Type 更新为下一个状态。

3.7状态循环:

状态机的设计使得交通灯的状态在四个状态之间循环:红灯亮、黄灯闪烁、绿灯亮、黄灯闪烁。

3.8代码展示:

void T0_INT() interrupt 1
{
    TH0 = -50000/256;
    TL0 = -50000%256;
    switch(Operation_Type)
    {
        case 1:
            RED_A=0; YELLOW_A=0; GREEN_A=1;
            RED_B=1; YELLOW_B=0; GREEN_B=0;
            if(++Time_Count != 100) return;
            Time_Count=0;
            Operation_Type = 2;
            break;
        case 2:
            if(++Time_Count != 8) return;
            Time_Count=0;
            YELLOW_A=!YELLOW_A;
            GREEN_A=0;
            if(++Flash_Count != 10) return;
            Flash_Count=0;
            Operation_Type = 3;
            break;
        case 3:
            RED_A=1; YELLOW_A=0; GREEN_A=0;
            RED_B=0; YELLOW_B=0; GREEN_B=1;
            if(++Time_Count != 100) return;
            Time_Count=0;
            Operation_Type = 4;
            break;
        case 4:
            if(++Time_Count != 8) return;
            Time_Count=0;
            YELLOW_B=!YELLOW_B;
            GREEN_B=0;
            if(++Flash_Count !=10) 
                return;
            Flash_Count=0;
            Operation_Type = 1;
            break;
    }
}

四、主函数说明

main 函数是程序的入口点,负责初始化微控制器的定时器和中断系统,以便能够周期性地改变交通灯的状态。

4.1定时器模式设置:

TMOD = 0x01; 

这行代码设置了定时器模式寄存器(TMOD)。值 0x01 表示定时器0被设置为模式1,这是一个16位的定时器/计数器模式,适用于精确的时间延迟和事件计数。

4.2中断使能设置:

IE = 0x82;

这行代码设置了中断使能寄存器(IE)。值 0x82 表示允许定时器0的中断(TCON.IT0 = 1,允许定时器0的中断)和全局中断(IE.EA = 1,允许所有中断)。

4.3定时器启动:

TR0 = 1;

这行代码启动了定时器0。一旦定时器启动,它将根据系统时钟的频率计数,直到溢出并触发中断。

4.4无限循环:

点击【proteus经典实战】定时器控制交通灯指示灯——古月居可查看全文

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值