找回密码
 注册
关于网站域名变更的通知
查看: 166|回复: 2
打印 上一主题 下一主题

基于51单片机的交通灯制作资料 4个数码管显示

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-6-29 10:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
里面有仿真图,源代码。.hex文件等等。: Y. _8 @7 E) h" `
仿真原理图如下(proteus仿真工程文件)
. G) ~" V& X3 k4 `1 N  Q! A
+ L9 m. b+ P  ]- ~2 J1 D" u2 N! Y- a$ U! r, z2 A
制作出来的实物图如下:$ w/ t% f. d5 |* W" b  c3 {% l% ~
, W0 V: ]  _2 h( S: w5 `) @6 R

/ C; r* T* T* k! m$ N单片机源程序如下:* K+ t9 e4 M/ q
  • #include <reg52.h>                 //调用单片机头文件
  • #define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255
  • #define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535
  • //数码管段选定义  0   1   2    3    4    5         6         7          8           9   A        B
  • uchar smg_du[]={0x40,0x75,0x0c,0x14,0x31,0x12,0x02,0x74,0x00,0x10,0x20,0x03,};         //断码
  • uchar dis_smg[4] = {0};           //数码管显示数组的缓冲区
  • //数码管位选定义
  • sbit smg_we1 = P2^0;            //数码管位选IO口定义
  • sbit smg_we2 = P2^1;                //数码管位选IO口定义
  • sbit smg_we3 = P3^6;                //数码管位选IO口定义
  • sbit smg_we4 = P3^7;                //数码管位选IO口定义
  • sbit key1 = P1^0;            //按键IO口定义
  • sbit key2 = P1^1;                //按键IO口定义
  • sbit key3 = P1^2;                //按键IO口定义
  • sbit key4 = P1^3;                //按键IO口定义
  • uchar menu_1;                            //设置不同参数的变量
  • char dx_s = 0,nb_s = 0;        //东西  南北 倒计时变量
  • sbit dx_red    = P2^7;            //东西红灯IO口定义
  • sbit dx_green  = P2^6;                //东西绿灯IO口定义
  • sbit dx_yellow = P2^5;                //东西黄灯IO口定义
  • sbit nb_red    = P2^4;                //南北红灯IO口定义
  • sbit nb_green  = P2^3;                //南北绿灯IO口定义
  • sbit nb_yellow = P2^2;                //南北黄灯IO口定义
  • bit flag_1s = 0;          //1秒的变量
  • bit flag_500ms;                  //500毫秒的变量
  • bit flag_dx_nb = 0;   //东西南北模式
  • uchar dx_time = 30,nb_time = 20;   //东西、南北的时间
  • uchar flag_jdgz ;     //交通管制
  • /***********************数码位选函数*****************************/
  • void smg_we_switch(uchar i)
  • {
  •         switch(i)
  •         {
  •                 case 0: smg_we1 = 0;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 1; break;
  •                 case 1: smg_we1 = 1;  smg_we2 = 0; smg_we3 = 1;  smg_we4 = 1; break;
  •                 case 2: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 0;  smg_we4 = 1; break;
  •                 case 3: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 0; break;
  •         }
  • }
  • /********************************************************************
  • * 名称 : delay_1ms()
  • * 功能 : 延时1ms函数
  • * 输入 : q
  • * 输出 : 无
  • ***********************************************************************/
  • void delay_1ms(uint q)
  • {
  •         uint i,j;
  •         for(i=0;i<q;i++)
  •                 for(j=0;j<120;j++);
  • }
  • uchar i;
  • /********************************************************************
  • * 名称 : display()
  • * 功能 : 数码管显示
  • * 输入 : 无
  • * 输出 : 无
  • ***********************************************************************/
  • void display()
  • {
  •          for(i=0;i<4;i++)
  •         {
  •                 P0 = 0xff;                  //消隐
  •                 smg_we_switch(i);            //位选
  •                 P0 = dis_smg;          //段选
  •                 delay_1ms(3);                  //延时
  •         }
  • }
  • /*********************定时器0、定时器1初始化******************/
  • void time0_init()
  • {
  •         EA  = 1;                   //开总中断
  •         TMOD = 0X01;          //定时器0工作方式1
  •         ET0 = 1;                  //开定时器0中断
  •         TR0 = 1;                  //允许定时器0定时
  •         TH0 = 0x3c;
  •         TL0 = 0xb0;     //50ms
  • }
  • /*********************交通灯处理函数*********************************/
  • void jiaotongdeng_dis()
  • {
  •         if(flag_1s == 1)           //1秒执行一次里面的程序
  •         {
  •                 flag_1s = 0;
  •                 if(flag_dx_nb == 0)           //南北绿灯时间
  •                 {
  •                         dx_s --;                   //东西倒计时时间减1
  •                         nb_s --;                   //南北倒计时时间减1
  •                         if(dx_s == 5)
  •                                 nb_s = 5;
  •                 }
  •                 if(flag_dx_nb == 1)           //东西绿灯时间
  •                 {
  •                         dx_s --;                   //南北倒计时时间减1
  •                         nb_s --;                   //东西倒计时时间减1
  •                         if(nb_s == 5)
  •                                 dx_s = 5;
  •                 }
  •                 if(dx_s <= 0)                  //倒计时时间为0切换东西 南北绿灯时间
  •                 {
  •                         flag_dx_nb = ~flag_dx_nb;
  •                         if(flag_dx_nb == 1)         //东西时间
  •                         {
  •                                 dx_s = dx_time;
  •                                 nb_s = dx_time + 5;
  •                         }
  •                         else                                  //南北时间
  •                         {
  •                                 dx_s = nb_time + 5;
  •                                 nb_s = nb_time;
  •                         }
  •                 }
  •         }
  •         dis_smg[0] = smg_du[dx_s % 10] ;        //显示东西倒计时 时间
  •         dis_smg[1] = smg_du[dx_s / 10] ;
  •         dis_smg[2] = smg_du[nb_s % 10] ;        //显示南北倒计时 时间
  •         dis_smg[3] = smg_du[nb_s / 10] ;
  • /***********************南北时间*********************************/
  •         if(flag_dx_nb == 0)
  •         {
  •                 if(dx_s > 5)
  •                 {
  •                         dx_red    = 0;     //东西红灯亮
  •                         dx_green  =        1;           //东西红灯灭
  •                         dx_yellow = 1;           //东西黄灯灭
  •                         nb_red    = 1;     //南北红灯灭
  •                         nb_green  =        0;           //南北绿灯亮
  •                         nb_yellow = 1;           //南北黄灯灭
  •                 }else if(dx_s <= 5)                 //当小于5秒时  黄灯要闪了
  •                 {
  •                         dx_red    = 0;     //东西红灯灭
  •                         dx_green  =        1;           //东西红灯灭
  •                         dx_yellow = 1;           //东西黄灯灭
  •                         nb_red    = 1;     //南北红灯灭
  •                         nb_green  =        1;           //南北绿灯灭
  •                         if(flag_500ms == 0)           //黄灯闪烁
  •                         {
  •                                 nb_yellow = 0;        //亮
  •                         }
  •                         else
  •                         {
  •                                 nb_yellow = 1;        //灭
  •                         }
  •                 }
  •         }
  • /***********************东西时间*********************************/
  •         if(flag_dx_nb == 1)
  •         {
  •                 if(nb_s > 5)
  •                 {
  •                         dx_red    = 1;  //东西红灯灭
  •                         dx_green  =        0;        //东西红灯亮
  •                         dx_yellow = 1;        //东西黄灯灭
  •                         nb_red    = 0;  //南北红灯亮
  •                         nb_green  =        1;        //南北绿灯灭
  •                         nb_yellow = 1;        //南北黄灯灭
  •                 }else if(nb_s <= 5)                 //当小于5秒时  黄灯要闪了
  •                 {
  •                         dx_red    = 1;    //东西红灯灭
  •                         dx_green  =        1;          //东西红灯灭
  •                         nb_red    = 0;    //南北红灯亮
  •                         nb_green  =        1;          //南北绿灯灭
  •                         nb_yellow = 1;          //南北黄灯灭
  •                         if(flag_500ms == 0)         //黄灯闪烁
  •                         {
  •                                 dx_yellow = 0;//东西黄灯亮
  •                         }
  •                         else
  •                         {
  •                                 dx_yellow = 1;//东西黄灯灭
  •                         }
  •                 }
  •         }
  • }
  • /********************独立按键程序*****************/
  • uchar key_can;         //按键值
  • void key()         //独立按键程序
  • {
  •         static uchar key_new;        //key_new  这个变量的功能是做按键松手检测的
  •         key_can = 0;                //按键值还原成0
  •          if(key1 == 0 || key2 == 0 || key3 == 0 || key4 == 0)                //有按键按下
  •         {
  •                 delay_1ms(1);                     //按键延时消抖动
  •                 if(key_new == 1)
  •                 {
  •                         key_new = 0;                //key_new = 0   说明按键已按下
  •                         if(key1 == 0)                //确认是按键按下
  •                                 key_can = 1;         //得到按键值
  •                         if(key2 == 0)                //确认是按键按下
  •                                 key_can = 2;         //得到按键值
  •                         if(key3 == 0)                //确认是按键按下
  •                                 key_can = 3;         //得到按键值
  •                         if(key4 == 0)                //确认是按键按下
  •                                 key_can = 4;         //得到按键值
  •                 }
  •         }
  •         else
  •                 key_new = 1;         //key_new = 1   说明按键已经松开了
  • }
  • /********************设置函数*****************/
  • void key_with()
  • {
  •         if(key_can == 4)   //交通管制按键
  •         {
  •                 flag_jdgz ++;
  •                 if(flag_jdgz > 4)
  •                         flag_jdgz = 0;
  •                 if(flag_jdgz == 1)         //  全部亮红灯
  •                 {
  •                         dx_red    = 0;  //东西红灯亮
  •                         dx_green  =        1;        //东西绿灯灭
  •                         dx_yellow = 1;        //东西黄灯灭
  •                         nb_red    = 0;  //南北红灯亮
  •                         nb_green  =        1;        //南北绿灯灭
  •                         nb_yellow = 1;        //南北黄灯灭
  •                 }
  •                 if(flag_jdgz == 2)         //  东西红灯  南北绿灯
  •                 {
  •                         dx_red    = 0;  //东西红灯亮
  •                         dx_green  =        1;        //东西绿灯灭
  •                         dx_yellow = 1;        //东西黄灯灭
  •                         nb_red    = 1;  //南北红灯灭
  •                         nb_green  =        0;        //南北绿灯亮
  •                         nb_yellow = 1;        //南北黄灯灭
  •                 }
  •                 if(flag_jdgz == 3)         //  南北红灯  东西绿灯
  •                 {
  •                         dx_red    = 1;  //东西红灯灭
  •                         dx_green  =        0;        //东西绿灯亮
  •                         dx_yellow = 1;        //东西黄灯灭
  •                         nb_red    = 0;  //南北红灯亮
  •                         nb_green  =        1;        //南北绿灯灭
  •                         nb_yellow = 1;        //南北黄灯灭
  •                 }
  •                  if(flag_jdgz == 4)         //  南北黄灯闪  东西黄灯闪
  •                 {
  •                         dx_red    = 1;  //东西红灯灭
  •                         dx_green  =        1;        //东西绿灯灭
  •                          nb_red    = 1;  //南北红灯灭
  •                         nb_green  =        1;        //南北绿灯灭
  •                  }
  •         }
  •         if(key_can == 1)          //设置键
  •         {
  •                 menu_1 ++;
  •                 if(menu_1 >= 3)
  •                 {
  •                         menu_1  = 0;  //menu_1 = 0 是在正常显示界面下
  •                 }
  •         }
  •         if(menu_1 == 1)           //设置东西绿灯的时间
  •         {
  •                 if(key_can == 2)
  •                 {
  •                         dx_time ++ ;                //设置东西绿灯的时间 加1
  •                         if(dx_time > 99)
  •                                 dx_time = 99;
  •                 }
  •                 if(key_can == 3)
  •                 {
  •                         dx_time -- ;                //设置东西绿灯的时间 减1
  •                         if(dx_time <= 5)
  •                                 dx_time = 5;
  •                 }
  •                 dis_smg[0] = smg_du[dx_time % 10] ;                //显示设置的东西绿灯的时间 个位数
  •                 dis_smg[1] = smg_du[dx_time / 10] ;            //显示设置的东西绿灯的时间 十位数
  •                 dis_smg[2] = smg_du[10] ;        //显示为A
  •                 dis_smg[3] = smg_du[10] ;        //显示为A
  •          }
  •         if(menu_1 == 2)           //设置南北绿灯的时间
  •         {
  •                 if(key_can == 2)
  •                 {
  •                         nb_time ++ ;                //设置南北绿灯的时间 加1
  •                         if(nb_time > 99)
  •                                 nb_time = 99;
  •                 }
  •                 if(key_can == 3)
  •                 {
  •                         nb_time -- ;                //设置南北绿灯的时间 减1
  •                         if(nb_time <= 5)
  •                                 nb_time = 5;
  •                 }
  •                 dis_smg[0] = smg_du[11] ;        //显示为B
  •                 dis_smg[1] = smg_du[11] ;        //显示为B
  •                 dis_smg[2] = smg_du[nb_time % 10] ;                //显示设置的南北绿灯的时间 个位数
  •                 dis_smg[3] = smg_du[nb_time / 10] ;                //显示设置的南北绿灯的时间 十位数
  •          }
  • }
  • /********************************************************************
  • * 名称 : main()
  • * 功能 : 实现灯的闪烁
  • * 输入 : 无
  • * 输出 : 无
  • ***********************************************************************/
  • void main()
  • {
  •          time0_init();                  //定时器初始化程序
  •          dx_s = nb_time + 5;          //南北时间
  •         nb_s = nb_time ;          //东西时间
  •         while(1)
  •         {
  •                 key();                           //按键函数
  •                 if(key_can > 0)           //有按键按下
  •                         key_with();           //按键处理函数
  •                 if((menu_1 == 0) && (flag_jdgz == 0))
  •                         jiaotongdeng_dis();           //交通灯处理函数
  •                 if(flag_jdgz == 4)        //夜间模式
  •                         if(flag_500ms == 1)                //  南北黄灯闪  东西黄灯闪
  •                         {
  •                                 flag_500ms = 0;
  •                                 nb_yellow = ~nb_yellow;           //  东西黄灯闪
  •                                 dx_yellow = ~dx_yellow;           //  东西黄灯闪
  •                         }
  •                 display();         //数码管显示函数
  •         }
  • }
  • /*********************定时器0中断服务程序************************/
  • void time0_int() interrupt 1
  • {
  •         static  uchar value;                         //定时50ms中断一次
  •         TH0 = 0x3c;
  •         TL0 = 0xb0;     //50ms
  •         value ++;
  •          if(value % 10 == 0)
  •                 flag_500ms = ~flag_500ms;           //定时产生一个500毫秒的变量
  •         if(value >= 20)
  •         {
  •                 value = 0;
  •                 flag_1s = 1;         //定时产生一个1秒的变量
  •         }
  • }
  • $ N$ I' Z% n; d4 I

3 z3 q* C: q( F3 ]4 Y" U2 V) h; G+ d  Q4 F# A$ s- }; P- k3 [. I! }

该用户从未签到

2#
发表于 2022-6-29 11:07 | 只看该作者
啊哈哈哈,太详细了。

该用户从未签到

3#
发表于 2022-6-29 13:09 | 只看该作者
哈哈哈,太详细了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-29 08:14 , Processed in 0.078125 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表