这一篇文章主要介绍用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):交通灯代码项目相关推荐

  1. 带注释的c51汇编语言,51单片机汇编语言实现交通灯 代码有详细注释

    ORG 0000H;程序起始地址 LJMP START;初始化标号 ORG 0003H;外部中断地址--东西紧急按钮触发 LJMP DXJJ;东西紧急标号 ORG 0013H;外部中断地址--南北紧急 ...

  2. 51单片机的仿真实验——交通灯(十字路口演示)

    学习目标: 1.了解交通灯的基本工作原理: 2.用multisim模拟实现交通灯控制: 3.用Keil C51编程实现上述功能: 4.用Keil与multisim联调 学习内容: 通过AT89C51实 ...

  3. 单片机交通灯数码管c语言程序,51单片机C语言实现交通灯(红绿灯)源程序.doc

    51单片机用C语言实现交通灯(红绿灯)源程序 2009-10-29 23:00 交通灯,红黄绿灯交替亮,怎样实现呢?其实就是根据单片机定时器及倒计时的程序修改. 源程序如下: /*1.程序目的:使用定 ...

  4. c51倒计时程序汇编语言,51单片机汇编程序:倒计时交通灯

    一个51单片机汇编语言的程序,要求就是红灯25秒,绿灯20秒,黄灯闪烁5秒. 很简单的要求,用下图电路即可实现: 全部程序如下: ;倒计时交通灯 ;四位共阳数码管 ;P0 接段码 ;P2.0123 接 ...

  5. 单片机设计一个十字路口交通灯模拟控制系统(51单片机实训)

    1.东西.南北两个方向都通行25s(绿灯亮),警告5s(黄灯亮),禁行30s(红灯亮),用LED模拟交通灯 2.各个方向用数码管显示剩余时间 3.考虑到异常状态 东西发生异常时,东西通行,南北禁止,东 ...

  6. 基于51单片机六车道智能交通灯设计(仿真+源程序+PCB+论文)

    资料编号:204 功能介绍:(全套毕设资料齐全) 本设计的交通灯以十字路口为模型,在实现基本的功能前提下增加了时间及温度的液晶显示.从而还增加了路口高峰期的智能化人工管理机制. 实际生活中交通信号灯的 ...

  7. 单片机入门led模拟交通灯

    led模拟交通灯 #include <reg52.h> #define uchar unsigned char #define uint unsigned intsbit RED_A=P0 ...

  8. 单片机(ISIS 7 Professional):简易汽车转向灯代码项目

    这一篇文章主要介绍用C语言制作一个三方向开关控制的汽车转向灯. 设计思路:三开关控制三个功能:左转向.右转向.停车,其中P1^0控制左转向,P1^1控制右转向,P1^2控制四个灯同时闪烁来达到模拟停车 ...

  9. 单片机(ISIS 7 Professional):简易LED闪烁代码项目

    这一篇文章主要介绍用C语言制作一个简易的不停闪烁的LED灯. 基本电路图如下: 使用的代码如下: #include<reg51.h> #define uchar unsigned char ...

  10. 单片机(ISIS 7 Professional):简易按钮控制LED代码项目

    设计思路:当按钮摁下时灯亮,松开时灯灭. 基本电路如下: 使用的代码如下: #include<reg51.h> #include<intrins.h> #define ucha ...

最新文章

  1. CSS美化上传按钮、checkbox和radio样式
  2. [leetcode-515-Find Largest Value in Each Tree Row]
  3. 【转】xargs命令详解,xargs与管道的区别
  4. Redis03_基础命令操作
  5. 好用的数学公式(持续更新中)
  6. STL|QTL工作笔记-QString与std::string寻找子串的区别与联系
  7. PCL学习(3)——kdtree搜索(error C2079: “pcl::KdTreeFLANN::param_radius_)
  8. IDEA ---- 插件
  9. mysql 开发进阶篇系列 13 锁问题(关于表锁,死锁示例,锁等待设置)
  10. 中国大数据与智能计算产业联盟“开源软件工作委员会”成立会议在京召开
  11. vscode - 设置 Python 版本
  12. android之在java代码引用res资源
  13. 安卓4.X的桌面启动器-尖端启动器APEX
  14. 相机像素尺寸(像元大小)和成像系统分辨率之间的关系
  15. win7计算机属性里面的图标变白,Win7系统桌面图标白边如何解决
  16. CCF-20180901 卖菜
  17. 什么样的语言可以进行反编译
  18. android设置页面转场特效
  19. MATLAB怎么新建头文件,头文件()包含了C++的MATLAB引擎函数的定义。
  20. 2022-2028年全球与中国SCADA石油和天然气行业发展趋势及投资战略分析

热门文章

  1. 3dmax渲染器下载VRay4.1渲染器下载安装教程(支持3dmax2013-2019)
  2. 如何建语料库_语料库-如何建设语料?如何建设语料库 爱问知识人
  3. 北斗三号频点_解码北斗三号:和前两代卫星相比,它有何不同?
  4. dnf外挂java代码,使用Java实现简朴的斗地主案例_rust辅助,绝地求生卡盟
  5. 软件开发设计文档模版
  6. 毕设-周报-20150520
  7. cadence SPB16.6原理图库(.olb)集合的库内容列表2
  8. python语法详解大全_Python语法大全
  9. 动手学深度学习(三十四)——序列模型
  10. usb抓包工具 安卓_android 抓包工具的使用