基于AT89C52单片机红绿灯设计程序
前言
本设计主要介绍十字路口红绿灯路口的单片机程序设计思路与电路设计
电路设计
交通灯的电路设计总体来说还是比较简单的,主要看设计者本人是否想要实现功能性比较多的智能交通灯,如果是简易的那只需要一个AT89C52单片机和相对应的LED灯和数码管显示模块。
本人所设计的这个简单的电路只用到了一个74LS138译码器,四个两位共阴极的八段数码管,分别显示四个方向的延时时间,一个共阴极的八段数码管,用来显示所选择的功能,红黄蓝LED灯各4个再加上一个AT89C52单片机。
电路最终实现的功能有十字路口正常通行,南北方向通行,东西方向通行,禁行通行四个功能。
电路设计图纸如下所示:
程序设计思路
此程序总体来说还比较简单的,主要可以分三个模块来写
1、数码管显示模块,显示模块通过74LS138译码器进行控制,也就是说只要写一个74LS138译码器的驱动程序即可。
2、LED灯的交替变化显示程序。
3、功能实现程序。这里用的是外部中断1来达到目的的。
工作原理
当系统上电后东西方向为绿灯25s,南北方向为红灯30s,东西方向绿灯25s后变为黄灯5s,东西方向黄灯5s后变换为东西方向红灯30s,南北方向绿灯25s,南北方向绿灯25s后变换为黄灯5s,然后循环回到东西方向绿灯25s,南北方向30s,依次进行循环。延时时间通过数码管进行显示。
功能选择:通过按键触发外部中断1改变中断变量实现相应的功能,中断变量为0的时候是正常显示,中断变量为1的时候只有南北通行,东西禁止通行,中断变量为2的时候只有东西通行,南北方向禁止通行,中断变量为3的时候东南西北四个方向都禁止通行,为保证安全在变换功能之前都要执行完正在执行的正常周期后才能进行变换。
程序编写
主程序
#include <reg52.h>
#include <intrins.h>typedef unsigned int uint;
typedef unsigned char uchar;
void dispaly_smg();
void Zhenchang();
//定义南北显示数码管I/O端口
#define smg P2
#define LED P0
//定义按键IO端口
sbit key=P3^3;
//定义74LS138译码器I/O段
sbit LSA=P1^4;
sbit LSB=P1^5;
sbit LSC=P1^6;uchar code smg_duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
//定义共阴极数码管的段码0~F
uchar key_num; //存储按键变量
uchar temp0; //中断计数变量
uchar temp1,temp2; //temp1东西方向时间显示,temp2南北方向时间显示
uchar flag0; //正常显示的变量
uchar flag1; //功能选择中断变量void delay(uint i) //软件延时子程序
{while(i--);
}void main() //主程序
{Time_Init(); //调用定时器和外部中断1初始化子程序while(1){if(flag1==0){smg=0x00;delay(50);Zhenchang(); //正常工作显示}else if(flag1==1){LED=0xf3; //南北通行dispaly_smg(); //数码管显示子程序}else if(flag1==2){LED=0xde; //东西通行dispaly_smg();}else if(flag1==3){LED=0xf6; //禁止通行dispaly_smg();}}
}
数码管显示子程序
void dispaly_smg() //数码管显示函数
{//74LS138译码器驱动uchar i;for(i=0;i<5;i++){switch(i){case 0:LSA=0;LSB=0;LSC=0;smg=smg_duan[temp1/10];break; //东西通行时间显示case 1:LSA=1;LSB=0;LSC=0;smg=smg_duan[temp1%10];break;case 2:LSA=0;LSB=1;LSC=0;smg=smg_duan[temp2/10];break; //南北通行时间显示case 3:LSA=1;LSB=1;LSC=0;smg=smg_duan[temp2%10];break;case 4:LSA=0;LSB=0;LSC=1;smg=smg_duan[flag1];break; //显示功能选择值}delay(50);smg=0x00; //数码管消隐delay(50);}
}
正常显示子程序
void Zhenchang()
{switch(flag0){case 0: temp1=25;temp2=30; //两个方向显示赋初始值LED=0xde; //东西绿,南北红while(temp1!=0){dispaly_smg(); //延时时间显示if(temp0==100) //判断定时器中断变量是否到100次,也就是计时1s{temp1--; //temp1,temp2数字减1,temp0清零temp2--;temp0=0;}}flag0++; //变量加一break;case 1:temp1=5; //东西方向黄灯显示赋值LED=0xee; //东西黄灯,南北红while(temp1!=0){dispaly_smg();if(temp0==100){temp1--;temp2--;temp0=0;}}flag0++;break;case 2: temp1=30;temp2=25;LED=0xf3; //东西红灯,南北绿灯while(temp2!=0){dispaly_smg();if(temp0==100){temp1--;temp2--;temp0=0;}}flag0++;break;case 3:temp2=5;LED=0xf5; //东西红灯,南北黄灯while(temp2!=0){dispaly_smg();if(temp0==100){temp1--;temp2--;temp0=0;}}flag0=0;break;}
}
定时器中断初始化与外部中断初始化子程序以及中断服务程序
void Time_Init() //定时器中断0与外部中断1初始化
{EA=1; //打开总中断TMOD=0x01; //选择定时器工作方式,工作方式为方式1ET0=1; //打开定时器0中断开关TR0=1; //打开定时器0进行东西TH0=0xdc; //装载初始值,初始值为10msTL0=0x00;IT1=1; //打开外部中断1EX1=1; //打开外部中断1的中断开关
}void time() interrupt 1 //定时器中断复位程序
{TH0=0xdc; //装载初始值TL0=0x00;temp0++; //定时器中断变量+1
}void Init() interrupt 2 //外部中断1服务程序
{P3=0xff; //P3口全部拉高if(key==0) //按键是否按下{delay(1000); //消抖if(key==0) //再次判断是否按下{while(!key); //判断按键是否松开flag1++; //改变功能选择变量if(flag1==4)flag1=0; //当变量等于4的时候清零,复位}}
}
以上就是所有红绿灯控制的所有基本程序,大家也可以更改上面的程序使其更加的完美,比如可以加上人行横道的红绿灯、黄灯闪烁提示人们时间快到了等等一系列的功能。学无止境,编程不难,难的是贵在坚持。多写多学,时刻要保证自己脑子有一个清晰的思维能力与理解能力。
基于AT89C52单片机红绿灯设计程序相关推荐
- 基于AT89C52单片机的温湿度检测设计
点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87704704 源码获取 主要内容: ...
- 基于AT89C52单片机的数字电压表设计
一.系统组成及工作原理 1.1 系统组成 该基于AT89C52单片机的数字电压表设计由AT89C51单片机,ADC0809芯片(A/D转换器),LED数码管显示电路以及蜂鸣器电路等几部分组成.(用到得 ...
- c语言数字植物管理系统,基于AT89C52单片机的智能浇花系统(包含程序代码)
内容简介: 基于AT89C52单片机的智能浇花系统,毕业论文,共50页,18022字,附程序代码.实物图等. 摘要 伴随着经济的快速发展,人们的物质生活水平得到了极大的提高,生活质量越来越为人们关注. ...
- 基于AT89C52单片机的1602液晶显示程序
基于AT89C52单片机的1602液晶显示程序 1602液晶显示 1.keyscan.c 2.boardinit.c 3.delay.c 4.clock.c 5.74hc595.c 6.1602led ...
- 基于at89c52单片机温湿度c语言,基于AT89C52单片机的温度监控报警系统的设计
本系统由无线发射与接收模块.语音播报.温度采集.自动报警以及显示模块组成.实现功能:温度实时显示:可设定温度的上限和下限,当温度超过设定域值时发出声光报警信号:测量温度值可通过语音播报:通过射频模块完 ...
- 基于AT89C52单片机的温度检测报警设计
点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87708680?spm=1001.20 ...
- 基于AT89C52单片机的万年历设计与仿真
点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87777668?spm=1001.20 ...
- 基于AT89C52单片机的无线温度监测设计
点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87848530?spm=1001.20 ...
- 基于AT89C52单片机的简易电子琴设计与仿真
点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87853299?spm=1001.20 ...
最新文章
- Altium designer关于铺铜的操作
- Silverlight3 导航属性,Entity属性 的疑问
- 算法提高课-搜索-双向广搜 AcWing 190. 字串变换:bfs、双向bfs、queue和unordered_map
- 被3整除的子序列(简单dp)
- 全局稳定性收敛平衡点为0吗_该平衡点处的小扰动稳定性判据是什?
- python转义引号的作用_python传到前端的数据,双引号被转义的问题
- windows安装Elasticsearch以及下载
- 2012北理机试题——已知中序和后序遍历序列,求先序
- mysql node 可视化_使用Prometheus进行Substrate节点可视化监控
- Qunee for HTML5图形组件
- 通过微软私有云MCSE认证
- 五. 服务的注册 DiscoveryClient 与 ServiceRegistry 服务的发现的简单介绍
- es6---Promise
- 计算机视觉:图像映射与全景拼接
- 思维模型 瓦伦达效应
- 大学计算机实践论文,大学计算机实践论文.docx
- 立足现实 与时俱进:C++ 1991-2006 reference
- 容器化技术与微服务结合---结合springcloud微服务框架进行部署(含切换成阿里云docker仓库)(五)
- 用python和matplotlib画双坐标系曲线
- 数据结构学习地址--上海交大acm试点班总教头俞勇老师讲的哦,还有其他课程地址,超全icourse