当前位置: 首页 > news >正文

【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经典实战】定时器控制交通灯指示灯——古月居可查看全文

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Eureka: 微服务架构中的服务发现与注册实践
  • Python 潮流周刊#61:PyPI 管理员密钥泄露事件(摘要)
  • 【面试题】手撕缓存LRU
  • 开放开源开先河(三)
  • python需要掌握那些语法
  • 【Mysql关于读已提交和可重复读(Read Committed)隔离级别下解决幻读的方案】
  • python--实验15 数据分析与可视化
  • Python爬虫——1爬虫基础(一步一步慢慢来)
  • 【golang-ent】go-zero框架 整合 ent orm框架 | 解决left join未关联报错的问题
  • window11 部署llama.cpp并运行Qwen2-0.5B-Instruct-GGUF
  • python实现插入排序、快速排序
  • 陪玩系统小程序模式APP小程序H5系统搭建开发
  • 微信小程序-组件通信
  • DETR算法解读——Transformer在目标检测任务的首次应用
  • <数据集>铁轨缺陷检测数据集<目标检测>
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • Python - 闭包Closure
  • scrapy学习之路4(itemloder的使用)
  • Spring Boot MyBatis配置多种数据库
  • Vue 重置组件到初始状态
  • Vue学习第二天
  • 跨域
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 容器服务kubernetes弹性伸缩高级用法
  • 如何优雅地使用 Sublime Text
  • 跳前端坑前,先看看这个!!
  • 一个完整Java Web项目背后的密码
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • 通过调用文摘列表API获取文摘
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • #大学#套接字
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (1)无线电失控保护(二)
  • (26)4.7 字符函数和字符串函数
  • (C语言)二分查找 超详细
  • (二)换源+apt-get基础配置+搜狗拼音
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (每日一问)计算机网络:浏览器输入一个地址到跳出网页这个过程中发生了哪些事情?(废话少说版)
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (一)项目实践-利用Appdesigner制作目标跟踪仿真软件
  • (译)2019年前端性能优化清单 — 下篇
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .netcore 获取appsettings
  • .NET学习教程二——.net基础定义+VS常用设置
  • @Autowired @Resource @Qualifier的区别
  • [ 数据结构 - C++]红黑树RBTree
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • [100天算法】-不同路径 III(day 73)