标题: 51单片机交通灯 红绿灯设计 程序+电路图+PROTUES仿真下载 [打印本页]

作者: xuwei    时间: 2015-6-12 00:43
标题: 51单片机交通灯 红绿灯设计 程序+电路图+PROTUES仿真下载


程序预览:
1.main.c 文件:
  1. #define _MAIN_C
  2. #include "use.h"
  3. #include "main.h"
  4. #include "time.h"
  5. #include "key.h"
  6. bit flag1s;
  7. uchar count1s,NS_time,WE_time;
  8. uchar GreenTime=30,RedTime=35;
  9. uchar index=0;
  10. enum eStaSysterm StaSysterm=NormalRun;

  11. void main()
  12. {
  13.         EA=1;                                                                  //开总中断
  14.         InintTimer0();                                                  //初始化定时器0
  15.         while(1)
  16.         {       
  17.                 LEDScan();                                                  //数码管即LED扫描
  18.                 KeyDriver();                                          //键盘驱动扫描
  19.                 if(flag1s)
  20.                 {
  21.                         flag1s=0;
  22.                         NS_time--;                                          //红绿灯倒计时时间减
  23.                         WE_time--;
  24.                 }       
  25.         }
  26. }
  27. void InintTimer0()
  28. {
  29.         TMOD=0X01;
  30.         TH0=0X4C;
  31.         TL0=0X00;
  32.         ET0=1;
  33.         TR0=1;
  34. }
  35. void Timer0() interrupt 1
  36. {
  37.         TH0=0XBB;
  38.         TL0=0X00;
  39.         KeyScan();
  40.         if(++count1s<50)        return;
  41.         count1s=0;
  42.         if(StaSysterm==NormalRun) flag1s=1;         //非正常运行时,不红绿灯数值不减一       
  43. }
  44. void LEDScan()
  45. {
  46.          if(StaSysterm==NormalRun)                         //正常运行
  47.          {
  48.                 if(NS_time==0 || WE_time==0)
  49.                 {
  50.                         switch(index)                                 //改变红绿灯的状态,状态机
  51.                         {
  52.                                 case 0:
  53.                                 {
  54.                                         index=1;
  55.                                         NS_time=GreenTime;
  56.                                         WE_time=RedTime;
  57.                                         P2=0X09;       
  58.                                 }break;
  59.                                 case 1:
  60.                                 {
  61.                                         index=2;
  62.                                         NS_time=RedTime-GreenTime;
  63.                                         P2=0X0A;       
  64.                                 }break;
  65.                                 case 2:
  66.                                 {
  67.                                         index=3;
  68.                                         NS_time=RedTime;
  69.                                         WE_time=GreenTime;
  70.                                         P2=0X24;       
  71.                                 }break;
  72.                                 case 3:
  73.                                 {
  74.                                         index=0;
  75.                                         WE_time=RedTime-GreenTime;
  76.                                         P2=0X14;       
  77.                                 }break;
  78.                                 default:break;
  79.                         }
  80.                 }
  81.                 Seg_Display(NS_time/10,0);
  82.                 Seg_Display(NS_time%10,1);
  83.                 Seg_Display(WE_time/10,2);
  84.                 Seg_Display(WE_time%10,3);
  85.         }
  86.         else if(StaSysterm==UrgentRun)
  87.         {                                                                   //紧急情况运行
  88.                 P2=0x12;
  89.                 Delayms(200);
  90.                 P2=0x00;
  91.                 Delayms(200);
  92.         }
  93.         else                                                           //设置调整红绿灯时间
  94.         {
  95.                 index=0;
  96.                 NS_time=0;
  97.                 WE_time=0;         //重新初始化红绿灯并运行
  98.                 UrgentScan();
  99.         }
  100. }
复制代码


2. key.c文件:
  1. #include "use.h"
  2. #include "time.h"
  3. sbit KEY1=P3^4;
  4. sbit KEY2=P3^5;
  5. sbit KEY3=P3^6;
  6. sbit KEY4=P3^7;
  7. uchar keystr[]={1,1,1,1},backup[]={1,1,1,1};
  8. void KeyScan()                                                                //键盘扫描
  9. {
  10.         static uchar keybuf[4]={0XFF,0XFF,0XFF,0XFF};
  11.         uchar i;
  12.         keybuf[0]=(keybuf[0]<<1)|KEY1;
  13.         keybuf[1]=(keybuf[1]<<1)|KEY2;
  14.         keybuf[2]=(keybuf[2]<<1)|KEY3;
  15.         keybuf[3]=(keybuf[3]<<1)|KEY4;
  16.         for(i=0;i<4;i++)
  17.         {
  18.                 if(keybuf[i]==0X00)                        keystr[i]=0;
  19.                 else if(keybuf[i]==0XFF)         keystr[i]=1;
  20.         }
  21. }
  22. void KeyAction(uchar key)                                                 //键盘执行
  23. {
  24.         switch(key)
  25.         {
  26.                 case 0:        SetModel();                break;       
  27.                 case 1:        ADDTime();                break;
  28.                 case 2:        SUBTime();                break;
  29.                 case 3: UrgentModel();        break;
  30.                           default:break;
  31.         }
  32. }
  33. void KeyDriver()                                                                 //键盘驱动
  34. {
  35.         uchar i;
  36.         for(i=0;i<4;i++)
  37.         {
  38.                 if(keystr[i]!=backup[i])
  39.                 {
  40.                         if(keystr[i]==0)
  41.                                 KeyAction(i);//这里适当修改程序可以实现组合按键的效果
  42.                 }
  43.                 backup[i]=keystr[i];
  44.         }
  45. }
复制代码



3. time.c文件:
  1. #include "use.h"
  2. #include "main.h"

  3. uchar code seg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  4. uchar code seg_we[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  5. uchar BackupGreen,BackupRed,CopyLight;

  6. void Seg_Display(uchar number,uchar wei)        //数码管动态显示程序
  7. {
  8.         P0=0XFF;
  9.         we=1;
  10.         we=0;
  11.         P0=seg_du[number];
  12.         du=1;
  13.         du=0;
  14.         P0=seg_we[wei];
  15.         we=1;
  16.         we=0;
  17. }
  18. void UrgentScan()                                                    //紧急情况运行扫描
  19. {
  20.         Seg_Display(BackupGreen/10,0);
  21.         Seg_Display(BackupGreen%10,1);
  22.         Seg_Display(BackupRed/10,2);
  23.         Seg_Display(BackupRed%10,3);
  24. }
  25. void SetModel()                                                                //红绿灯设置模式
  26. {
  27.         if(StaSysterm==NormalRun)
  28.         {
  29.                 StaSysterm=ResetGreen;  //状态机
  30.             BackupGreen=GreenTime;
  31.             BackupRed=RedTime;       
  32.                 CopyLight=P2;                        //对数据进行备份
  33.                 P2=0X09;
  34.         }
  35.         else if(StaSysterm==ResetGreen)
  36.         {
  37.             StaSysterm=ResetRed;
  38.         }
  39.         else if(StaSysterm==ResetRed)
  40.         {
  41.                 StaSysterm=NormalRun;
  42.                 P2=CopyLight;                        //恢复数据
  43.         }
  44. }
  45. void ADDTime()                                                            //红绿灯时间加
  46. {
  47.         if(StaSysterm==ResetGreen)
  48.         {
  49.                 BackupGreen++;
  50.                 if(BackupGreen>=BackupRed)           BackupGreen=BackupRed;
  51.         }
  52.         else if(StaSysterm==ResetRed)
  53.         {
  54.             BackupRed++;
  55.         }
  56. }
  57. void SUBTime()                                                                   //红绿灯时间减
  58. {
  59.         if(StaSysterm==ResetGreen)
  60.         {
  61.                 BackupGreen--;
  62.        
  63.         }
  64.         else if(StaSysterm==ResetRed)
  65.         {
  66.             BackupRed--;
  67.                 if(BackupGreen>=BackupRed)           BackupRed=BackupGreen;
  68.         }
  69. }

  70. /****************
  71. void Confirm()                                                                   //备用函数
  72. {
  73.         if(StaSysterm!=NormalRun && StaSysterm!=UrgentRun)
  74.         {
  75.                 GreenTime=BackupGreen;
  76.                 RedTime=BackupRed;
  77.                 StaSysterm=NormalRun;
  78.         }

  79. }
  80. **************/
  81. void UrgentModel()                                                           //紧急模式
  82. {
  83.         if(StaSysterm==NormalRun)
  84.         {       
  85.                 StaSysterm=UrgentRun;
  86.                 CopyLight=P2;                         //对数据进行备份
  87.                 P0=0XFF;
  88.                 we=1;
  89.                 we=0;
  90.         }
  91.         else if(StaSysterm==UrgentRun)
  92.         {       
  93.                 StaSysterm=NormalRun;
  94.                 P2=CopyLight;                           //恢复数据
  95.         }
  96.         else if(StaSysterm==ResetGreen || StaSysterm==ResetRed)
  97.         {
  98.                 StaSysterm=NormalRun;
  99.                 GreenTime=BackupGreen;
  100.             RedTime=BackupRed;                   //重新设置红绿灯时间
  101.         }
  102. }
复制代码

完整程序代码,及其电路图和仿真文件下载: 加强版红绿灯.rar (70.65 KB, 下载次数: 1710)

作者: jyzas    时间: 2015-7-11 11:00
不错,支持下
作者: lb921464846    时间: 2015-10-10 00:56
不错,如果加入转弯信号灯就更好了
作者: zzc    时间: 2015-11-11 13:44
求汇编程序!!!

作者: lkaka525    时间: 2015-12-24 20:36
汇编程序的有没有啊
作者: 雪玉寐影    时间: 2015-12-28 07:08
不错,这个也算比较完整的了
作者: 午夜屠猪男    时间: 2016-2-25 18:43
雪玉寐影 发表于 2015-12-28 07:08
不错,这个也算比较完整的了

请问这个解压包下载之后,里面的文件是用什么软件打开啊。是proteus吗

作者: 心若孤城    时间: 2016-3-9 17:29
很不错,支持一下
作者: 心若孤城    时间: 2016-3-9 17:29
定喜爱
作者: lm1259032699    时间: 2016-3-28 16:38
下下来学习一下
作者: wangweiforever    时间: 2016-3-30 18:57
支持支持,正在做课程设计~
作者: jx26229    时间: 2016-4-7 01:16
支持支持,正在找,谢谢
作者: 199601    时间: 2016-5-27 14:43

汇编程序的有没有
作者: 199601    时间: 2016-5-27 14:48
汇编程序的有没有
作者: lj37397438    时间: 2016-6-2 17:52
keyi de
作者: huangxiao    时间: 2016-6-11 09:07
很好,值得下载
作者: danpianji0    时间: 2016-6-23 14:25
求汇编程序
作者: clearlove    时间: 2016-7-5 15:03
多个c文件怎么弄到一起啊
作者: clearlove    时间: 2016-7-5 15:10
怎么有错误啊  是什么情况啊
作者: 粑粑粑粑翔    时间: 2016-7-7 19:32
谢谢楼主
作者: 粑粑粑粑翔    时间: 2016-7-7 19:32
哈哈哈哈哈哈哈 谢谢楼主
作者: 安然_93921    时间: 2016-8-10 16:03
嗯 不多 多多学习
作者: mengkang    时间: 2016-9-5 23:57
不错 楼主辛苦了
作者: Tristina    时间: 2016-11-13 21:06
赞一个
作者: lzn312    时间: 2016-11-20 12:03
先谢楼主~
作者: xueyufeilong    时间: 2016-11-27 16:58
挺不错的
作者: 783    时间: 2016-12-10 19:40
学习中,如果能有多点注释就更好了
作者: baixuchang    时间: 2016-12-22 17:16
学到了,感谢楼主
作者: cyd    时间: 2016-12-22 22:44
可以的
作者: 437534778    时间: 2016-12-28 18:03
不错  支持下
作者: sfdsfdvxcv    时间: 2016-12-29 16:06
午夜屠猪男 发表于 2016-2-25 18:43
**** 作者被禁止或删除 内容自动屏蔽 ****

是的,proteus和keil两个软件结合
作者: sfdsfdvxcv    时间: 2016-12-29 16:07
很好,功能也比较完整
作者: 11927868942    时间: 2016-12-31 11:53
学习中
作者: 芝麻绿豆麻瓜    时间: 2017-1-1 18:36
真棒 ,好人一生平安。支持

作者: 杨文峰    时间: 2017-1-9 11:28
标题: 没错没错,是我自己马虎了
本帖最后由 杨文峰 于 2017-1-9 15:20 编辑

仿真执行有错误怎么搞?
作者: 杨文峰    时间: 2017-1-9 15:19
杨文峰 发表于 2017-1-9 11:28
仿真执行有错误怎么搞?

对不起,文件都没错,是我马虎了!
作者: ken8lee    时间: 2017-1-11 19:10
谢谢楼主的分析,很不错
作者: zc196    时间: 2017-2-27 14:11
哎哟不错啊
作者: sophy_1026    时间: 2017-3-7 12:11
很给力!挺好用的
作者: 白杨    时间: 2017-3-30 09:01
学习中,很实用
作者: 13434805884    时间: 2017-4-5 11:04
不错,学习中,如果能有多点注释就更好了
作者: 13434805884    时间: 2017-4-5 11:05

 学习中,很实用
作者: 小润龙    时间: 2017-4-5 23:20
好像学学交通灯

作者: 小润龙    时间: 2017-4-6 19:43
数码管电路是如何连接的,我的为什么一一只不行,求大神赐教
作者: 小润龙    时间: 2017-4-6 19:45
午夜屠猪男 发表于 2016-2-25 18:43
**** 作者被禁止或删除 内容自动屏蔽 ****

是的,用proteus和keil共同打开
作者: 武起风云    时间: 2017-4-10 11:03
东西很好,收下了
作者: cjc342019965    时间: 2017-4-14 09:55
干的漂亮
作者: heliu    时间: 2017-4-19 16:29
为什么加减时间退出设置,时间还是原来的
作者: 王者MS    时间: 2017-4-25 11:06
这个压缩包里面都有什么,只有这一个交通灯的吗
作者: 13434805884    时间: 2017-5-8 15:07
heliu 发表于 2017-4-19 16:29
为什么加减时间退出设置,时间还是原来的

设置好时间之后要按确定键才可以保存的,就是紧急按钮那个键
作者: 无色无味    时间: 2017-5-16 08:52
电源是5V,直流
作者: 无色无味    时间: 2017-5-22 09:37
这个数码管用那个型号啊,必须是5
作者: 无色无味    时间: 2017-5-22 09:38
这个数码管用那个型号啊,必须是5V哇,我在仿真上面是5v,可是实际的数码管好像不好找
作者: 1174722871    时间: 2017-6-4 17:15
l厉害了  楼主
作者: 1019SYY    时间: 2017-6-10 14:32
求汇编程序
作者: Tt1111    时间: 2017-6-11 14:32
非常给力啊,绝世号资料
作者: asd1235    时间: 2017-6-14 16:41
把这个稍稍改进一下,说不定会更好
作者: CSIR    时间: 2017-6-17 23:49
谢谢分享了饿
作者: hsy2966    时间: 2017-6-18 08:59
用vb 遍的调色板:vb 调色板
Private Sub Form_Load()

Form1.BackColor = RGB(255, 255, 255)
End Sub

Private Sub HScroll1_Change()
Form1.BackColor = RGB(HScroll1.Value, HScroll2.Value, HScroll3.Value)
Label4.Caption = HScroll1.Value
End Sub

Private Sub HScroll2_Change()
Form1.BackColor = RGB(HScroll1.Value, HScroll2.Value, HScroll3.Value)
  Label5.Caption = HScroll2.Value
End Sub

Private Sub HScroll3_Change()
Form1.BackColor = RGB(HScroll1.Value, HScroll2.Value, HScroll3.Value)
  Label6.Caption = HScroll3.Value
End Sub

作者: nliang    时间: 2017-6-20 16:19
不错,支持下
作者: cc778178521    时间: 2017-6-21 09:16
如果我说我是为了作业来的,会不会被人打死……
作者: anniejs    时间: 2017-6-26 09:10
我按照楼主的复制,为什么我的keil显示的是 Target not created?
求大神解答!!!!!
作者: 魏祥    时间: 2017-6-27 21:45
共享资料的黑币奖励!
作者: q741125422    时间: 2017-7-17 10:50
我正在找锁存器的编程方法,没想到直接找到了这样的好程序,连图都是画好了的。谢谢楼主的分享!
作者: cclinjiyan    时间: 2017-8-28 20:51
不错。支持一下
作者: doudou2292    时间: 2017-9-5 13:08
支持一下

作者: doudou2292    时间: 2017-9-6 20:46
数码管显示乱码怎么班

作者: sjwss    时间: 2017-9-12 15:23
非常给力!
作者: 强的隆冬强    时间: 2017-9-18 09:14
不错 楼主辛苦了
作者: ffsdsf    时间: 2017-9-19 20:28
很强大
作者: ffsdsf    时间: 2017-9-19 20:28
我就是其中的两个原件找不到
作者: asm    时间: 2017-9-22 19:24
程序流程图怎么画啊
作者: asm    时间: 2017-9-22 19:24
确实不错,很棒
作者: uyhnyrh    时间: 2017-9-24 09:48
最近正在学习,很实用
作者: F.romZero    时间: 2017-10-8 18:54
很好,来学习下
作者: lsfzxc    时间: 2017-10-18 11:38
好                好用
作者: 小猪后儿    时间: 2017-10-19 14:42
同样为了作业而来,谢谢作者
作者: g34567s    时间: 2017-10-22 11:31
可以的
作者: choi_hui    时间: 2017-11-3 18:02
支持支持

作者: 弘毅无非    时间: 2017-11-5 21:36
很强,学习一下
作者: john0317    时间: 2017-11-7 15:26
谢谢楼主分享,正需要……
作者: LEMONLEMON    时间: 2017-11-28 10:10
main.c(2): 警告 C318: can't open file 'use.h'
main.c(3): 警告 C318: can't open file 'main.h'
main.c(4): 警告 C318: can't open file 'time.h'
main.c(5): 警告 C318: can't open file 'key.h'
打不开文件是什么原因呀
作者: LEMONLEMON    时间: 2017-11-28 10:31
还是有错误呀
作者: LEMONLEMON    时间: 2017-11-28 10:48
源文件怎么编写呀
作者: fionx    时间: 2017-12-4 21:47
大赞。。。。。。。。。。。。。
作者: dhii1234    时间: 2017-12-7 09:00

学习中,很实用
作者: 邹小宇    时间: 2017-12-8 14:52
这个数码管是共阴极还是共阳极的
作者: 666eee    时间: 2017-12-14 21:53
不能下载
作者: tbjgdtcn    时间: 2017-12-15 14:45
不错,支持下
作者: he1915128840    时间: 2017-12-17 18:33
很给力
作者: lyfawsome    时间: 2017-12-19 23:57
感谢楼主 完成作业了
作者: 晨夕    时间: 2018-1-3 10:41
很不错
作者: zz251049105    时间: 2018-1-3 12:27
正在学习 希望下载后能学会原理
作者: zz251049105    时间: 2018-1-3 12:56
LEMONLEMON 发表于 2017-11-28 10:10
main.c(2): 警告 C318: can't open file 'use.h'
main.c(3): 警告 C318: can't open file 'main.h'
main. ...

请问你解决了吗
作者: 1308190907    时间: 2018-1-3 17:56
很棒哦
作者: jiankang333    时间: 2018-1-3 20:39
厉害了
作者: wglove    时间: 2018-1-4 09:32
我得好好看看
作者: adas123    时间: 2018-1-6 18:36
啊啊啊
作者: 张君硕    时间: 2018-1-7 16:11
挺不错的
作者: imbakyubb    时间: 2018-1-10 17:39
very good




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1