单片机(ISIS 7 Professional):交通灯代码项目
这一篇文章主要介绍用C语言制作一个按钮控制的多功能十字路口交通灯。
设计思路:代码有很多,因为功能很杂,有些地方有不懂的可以看我之前写的简易项目,都是分散开来然后拼接而成的,代码都标上了注释,还是希望能有点基础的再来看这篇文章,因为作者本身的基础也不是很好。
基本电路图如下:
使用的代码如下:
#include <reg51.h> //头文件
#define uchar unsigned char
#define uint unsigned int //宏定义uchar data buf[4]; //秒显示的变量
uchar data sec_dx=30; //东西数默认
uchar data sec_nb=30; //南北默认值
uchar data set_timedx=25; //设置东西方向的时间
uchar data set_timenb=30; //设置南北方向的时间
int n;
uchar data countt0,countt1;//定时器0中断次数
//定义6组开关
sbit k4=P1^5; //切换方向
sbit k1=P1^1; //时间加
sbit k2=P1^2; //时间减
sbit k3=P1^3; //确认
sbit k5=P1^4; //禁止
sbit k6=P1^0; //夜间模式 sbit Red_nb=P2^2; //南北红灯标志
sbit Yellow_nb=P2^1; //南北黄灯标志
sbit Green_nb=P2^0; //南北绿灯标志sbit Red_dx=P2^5; //东西红灯标志
sbit Yellow_dx=P2^4; //东西黄灯标志
sbit Green_dx=P2^3; //东西绿灯标志sbit green=P2^6;
sbit red=P2^7;bit set=0; //调时方向切换键标志 =1时,南北,=0时,东西
bit dx_nb=0; //东西南北控制位
bit shanruo=0; //闪烁标志位
bit yejian=0; //夜间黄灯闪烁标志位uchar code table[11]={ //共阴极字型码0x3f, //--00x06, //--10x5b, //--20x4f, //--30x66, //--40x6d, //--50x7d, //--60x07, //--70x7f, //--80x6f, //--90x00 //--NULL
};//函数的声明部分
void delay(int ms); //延时子程序
void key(); //按键扫描子程序
void display(); //显示子程序
void logo(); //开机LOGO
void Buzzer();
//主程序
void main()
{TMOD=0X11; //定时器设置TH1=0X3C; TL1=0XB0;TH0=0X3C; //定时器0置初值 0.05STL0=0XB0;EA=1; //开总中断ET0=1; //定时器0中断开启ET1=1; //定时器1中断开启TR0=1; //启动定时0TR1=0; //关闭定时1logo(); //开机初始化P2=0Xc3; // 开始默认状态,东西绿灯,南北黄灯 sec_nb=sec_dx; //默认南北通行时间比东西多5秒while(1) //主循环{ key(); //调用按键扫描程序display(); //调用显示程序}
}
//函数的定义部分
void key(void) //按键扫描子程序
{ if(k1!=1) //当K1(时间加)按下时{display(); //调用显示,用于延时消抖if(k1!=1) //如果确定按下{TR0=0; //关定时器 shanruo=0; //闪烁标志位关P2=0x00; //灭显示TR1=0; //启动定时1if(set==0) //设置键按下set_timedx++; //南北加1Selseset_timenb++; //东西加1Sif(set_timenb==100)set_timenb=1;if( set_timedx==100)set_timedx=1; //加到100置1sec_nb=set_timenb ; //设置的数值赋给东西南北sec_dx=set_timedx; do{display(); //调用显示,用于延时}while(k1!=1); //等待按键释放}}if(k2!=1) //当K2(时间减)按键按下时{ display(); //调用显示,用于延时消抖 if(k2!=1) //如果确定按下{ TR0=0; //关定时器0 shanruo=0; //闪烁标志位关P2=0x00; //灭显示TR1=0; //关定时器1 if(set==0)set_timedx--; //南北减1Selseset_timenb--; //东西减1Sif(set_timenb==0)set_timenb=99; if( set_timedx==0 )set_timedx=99; //减到1重置99sec_nb=set_timenb ; //设置的数值赋给东西南北sec_dx=set_timedx;do {display(); //调用显示,用于延时}while(k2!=1); //等待按键释放}}if(k3!=1) //当K3(确认)键按下时{ display(); //调用显示,用于延时消抖if(k3!=1) //如果确定按下{TR0=1; //启动定时器0sec_nb=set_timenb; //从中断回复,仍显示设置过的数值sec_dx=set_timedx; //显示设置过的时间TR1=0; //关定时器1 if(set==0) //时间倒时到0时{P2=0X00; //灭显示 Green_dx=1; //东西绿灯亮 Red_nb=1; //南北红灯亮 sec_nb=sec_dx; //回到初值 }else{P2=0x00; //南北绿灯,东西红灯 Green_nb=1;Red_dx=1;sec_dx=sec_nb;}}}if(k4!=1) //当K4(切换)键按下{display(); //调用显示,用于延时消抖if(k4!=1) //如果确定按下{ TR0=0; //关定时器0 set=!set; //取反set标志位,以切换调节方向TR1=0; //关定时器1dx_nb=set;do{display(); //调用显示,用于延时} while(k4!=1); //等待按键释放}} if(k5!=1) //当K5(禁止)键按下时{display(); //调用显示,用于延时消抖if(k5!=1) //如果确定按下{ TR0=0; //关定时器P2=0x00; //灭显示Red_dx=1;Red_nb=1; //全部置红灯TR1=0;sec_dx=00; //四个方向的时间都为00sec_nb=00;do{display(); //调用显示,用于延时} while(k5!=1); //等待按键释放 }}if(k6!=1) //当K6(夜间模式)按下{display(); //调用显示,用于延时消抖if(k6!=1) //如果确定按下{ TR0=0; //关定时器P2=0x00;TR1=1;sec_dx=00; //四个方向的时间都为00sec_nb=00;do{display(); //调用显示,用于延时} while(k6!=1); //等待按键释放 }}
}
void display(void) //显示子程序
{ buf[1]=sec_nb/10; //第1位 东西秒十位buf[2]=sec_nb%10; //第2位 东西秒个位buf[3]=sec_dx/10; //第3位 南北秒十位buf[0]=sec_dx%10; //第4位 南北秒个位 P3=0xff; // 初始灯为灭的 P0=0x00; 灭显示P3=0xef; //片选LED1P0=table[buf[1]]; //送东西时间十位的数码管编码 delay(1); //延时P3=0xff; //关显示P0=0x00; //灭显示P3=0xdf; //片选LED2P0=table[buf[2]]; //送东西时间个位的数码管编码delay(1); //延时P3=0xff; //关显示P0=0x00; //关显示P3=0Xbf; //片选LED3P0=table[buf[3]]; //送南北时间十位的数码管编码delay(1); //延时P3=0xff; //关显示P0=0x00; //关显示P3=0X7f; //片选LED4 P0=table[buf[0]]; //送南北时间个位的数码管编码delay(1); //延时
}void time0(void) interrupt 1 using 1 //定时中断子程序
{TH0=0X3C; //重赋初值TL0=0XB0; //12m晶振50ms//重赋初值TR0=1; //重新启动定时器countt0++; //软件计数加1if(countt0==10) //加到10也就是半秒{if((sec_nb<=4)&&(shanruo==1)) //东西黄灯闪 {Green_dx=0;Yellow_dx=0;} if((sec_dx<=4)&&(shanruo==1)) //南北黄灯闪 { Green_nb=0;Yellow_nb=0;} }if(countt0==20) // 定时器中断次数=20时(即1秒时){ countt0=0; //清零计数器 sec_dx--; //东西时间减1 sec_nb--; //南北时间减1 if((sec_nb<=4)&&(shanruo==1)) //东西黄灯闪 {Green_dx=0;Red_dx=0;Yellow_dx=1;} if((sec_dx<=4)&&(shanruo==1)) //南北黄灯闪 { Green_nb=0;Red_nb=0;Yellow_nb=1;} if(sec_dx==4&&sec_nb==4) //当东西倒计时到0时,重置5秒,用于黄灯闪烁时间 {shanruo=1;}if(sec_nb==4&&sec_dx==4) //当南北倒计时到0时,重置5秒,用于黄灯闪烁时间 {shanruo=1;}if(dx_nb==0&&sec_nb==0) //当黄灯闪烁时间倒计时到0时,{P2=0x00; //重置东西南背方向的红绿灯 Green_nb=1;Red_dx=1;green=1;red=0;dx_nb=!dx_nb;shanruo=0;sec_nb=set_timenb; //重赋南北方向的起始值 sec_dx=set_timenb; //重赋东西方向的起始值 } if(dx_nb==1&&sec_dx==0) //当黄灯闪烁时间到 {P2=0X00; //重置东西南北的红绿灯状态 Green_dx=1; //东西绿灯亮 Red_nb=1; //南北红灯亮 green=0;red=1;dx_nb=!dx_nb; //取反 shanruo=0; //闪烁 sec_dx=set_timedx; //重赋东西方向的起始值 sec_nb=set_timedx; //重赋南北方向的起始值 }}
}
void time1(void) interrupt 3 //定时中断子程序
{TH1=0X3C; //重赋初值TL1=0XB0; //12m晶振50ms//重赋初值countt1++; //软件计数加1if(countt1==10) // 定时器中断次数=10时(即0.5秒){Yellow_nb=0; //南北黄灯灭 Yellow_dx=0; //东西黄灯灭 }if(countt1==20) // 定时器中断次数=20时(即1秒时){ countt1=0; //清零计数器 Yellow_nb=1; //南北黄灯亮 Yellow_dx=1; //东西黄灯亮 }
}void logo()//开机的Logo "- - - -"
{for(n=0;n<50;n++) //循环显示----50次{P0=0x40; //送形“-”P1=0xfe; //第一位显示 delay(1); //延时P1=0xfd; //第二位显示 delay(1); //延时 P1=0Xfb; //第三位显示 delay(1); //延时P1=0Xf7; //第四位显示 delay(1); //延时P1 = 0xff; //灭显示 }
}void delay(int ms) //延时子程序
{uint j,k;for(j=0;j<ms;j++) //延时msfor(k=0;k<124;k++); //大约1毫秒的延时
}
/*仅供学习参考*/
单片机(ISIS 7 Professional):交通灯代码项目相关推荐
- 带注释的c51汇编语言,51单片机汇编语言实现交通灯 代码有详细注释
ORG 0000H;程序起始地址 LJMP START;初始化标号 ORG 0003H;外部中断地址--东西紧急按钮触发 LJMP DXJJ;东西紧急标号 ORG 0013H;外部中断地址--南北紧急 ...
- 51单片机的仿真实验——交通灯(十字路口演示)
学习目标: 1.了解交通灯的基本工作原理: 2.用multisim模拟实现交通灯控制: 3.用Keil C51编程实现上述功能: 4.用Keil与multisim联调 学习内容: 通过AT89C51实 ...
- 单片机交通灯数码管c语言程序,51单片机C语言实现交通灯(红绿灯)源程序.doc
51单片机用C语言实现交通灯(红绿灯)源程序 2009-10-29 23:00 交通灯,红黄绿灯交替亮,怎样实现呢?其实就是根据单片机定时器及倒计时的程序修改. 源程序如下: /*1.程序目的:使用定 ...
- c51倒计时程序汇编语言,51单片机汇编程序:倒计时交通灯
一个51单片机汇编语言的程序,要求就是红灯25秒,绿灯20秒,黄灯闪烁5秒. 很简单的要求,用下图电路即可实现: 全部程序如下: ;倒计时交通灯 ;四位共阳数码管 ;P0 接段码 ;P2.0123 接 ...
- 单片机设计一个十字路口交通灯模拟控制系统(51单片机实训)
1.东西.南北两个方向都通行25s(绿灯亮),警告5s(黄灯亮),禁行30s(红灯亮),用LED模拟交通灯 2.各个方向用数码管显示剩余时间 3.考虑到异常状态 东西发生异常时,东西通行,南北禁止,东 ...
- 基于51单片机六车道智能交通灯设计(仿真+源程序+PCB+论文)
资料编号:204 功能介绍:(全套毕设资料齐全) 本设计的交通灯以十字路口为模型,在实现基本的功能前提下增加了时间及温度的液晶显示.从而还增加了路口高峰期的智能化人工管理机制. 实际生活中交通信号灯的 ...
- 单片机入门led模拟交通灯
led模拟交通灯 #include <reg52.h> #define uchar unsigned char #define uint unsigned intsbit RED_A=P0 ...
- 单片机(ISIS 7 Professional):简易汽车转向灯代码项目
这一篇文章主要介绍用C语言制作一个三方向开关控制的汽车转向灯. 设计思路:三开关控制三个功能:左转向.右转向.停车,其中P1^0控制左转向,P1^1控制右转向,P1^2控制四个灯同时闪烁来达到模拟停车 ...
- 单片机(ISIS 7 Professional):简易LED闪烁代码项目
这一篇文章主要介绍用C语言制作一个简易的不停闪烁的LED灯. 基本电路图如下: 使用的代码如下: #include<reg51.h> #define uchar unsigned char ...
- 单片机(ISIS 7 Professional):简易按钮控制LED代码项目
设计思路:当按钮摁下时灯亮,松开时灯灭. 基本电路如下: 使用的代码如下: #include<reg51.h> #include<intrins.h> #define ucha ...
最新文章
- CSS美化上传按钮、checkbox和radio样式
- [leetcode-515-Find Largest Value in Each Tree Row]
- 【转】xargs命令详解,xargs与管道的区别
- Redis03_基础命令操作
- 好用的数学公式(持续更新中)
- STL|QTL工作笔记-QString与std::string寻找子串的区别与联系
- PCL学习(3)——kdtree搜索(error C2079: “pcl::KdTreeFLANN::param_radius_)
- IDEA ---- 插件
- mysql 开发进阶篇系列 13 锁问题(关于表锁,死锁示例,锁等待设置)
- 中国大数据与智能计算产业联盟“开源软件工作委员会”成立会议在京召开
- vscode - 设置 Python 版本
- android之在java代码引用res资源
- 安卓4.X的桌面启动器-尖端启动器APEX
- 相机像素尺寸(像元大小)和成像系统分辨率之间的关系
- win7计算机属性里面的图标变白,Win7系统桌面图标白边如何解决
- CCF-20180901 卖菜
- 什么样的语言可以进行反编译
- android设置页面转场特效
- MATLAB怎么新建头文件,头文件()包含了C++的MATLAB引擎函数的定义。
- 2022-2028年全球与中国SCADA石油和天然气行业发展趋势及投资战略分析
热门文章
- 3dmax渲染器下载VRay4.1渲染器下载安装教程(支持3dmax2013-2019)
- 如何建语料库_语料库-如何建设语料?如何建设语料库 爱问知识人
- 北斗三号频点_解码北斗三号:和前两代卫星相比,它有何不同?
- dnf外挂java代码,使用Java实现简朴的斗地主案例_rust辅助,绝地求生卡盟
- 软件开发设计文档模版
- 毕设-周报-20150520
- cadence SPB16.6原理图库(.olb)集合的库内容列表2
- python语法详解大全_Python语法大全
- 动手学深度学习(三十四)——序列模型
- usb抓包工具 安卓_android 抓包工具的使用