找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 73192|回复: 177
收起左侧

51单片机交通灯 红绿灯设计 程序+电路图+PROTUES仿真下载

  [复制链接]
ID:82781 发表于 2015-6-12 00:43 | 显示全部楼层 |阅读模式
00000000.png

程序预览:
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, 下载次数: 1704)

评分

参与人数 22黑币 +102 收起 理由
whbt51h + 12 很给力!
卡卡卡西 + 5 共享资料的黑币奖励!
mimonarch + 5 回帖助人的奖励!
haha_haha + 4
vktpas + 3 赞一个!
陈见夏 + 5 赞一个!
Vvinsmoke + 3 共享资料的黑币奖励!
xsy137158143 + 5 赞一个!
用户名已被占用 + 5 很给力!
yinkun230 + 5 赞一个!
crazyol + 5 很给力!
46546541561 + 5 很给力!
许久先生 + 5 很给力!
qqqq1 + 1
眼睛睁大啦 + 5 共享资料的黑币奖励!
nliang + 3 赞一个!
shanel + 5 绝世好帖!
xjjiangxin + 3
我不是我 + 5 共享资料的黑币奖励!
Tristina + 5 很给力!
msifortinet + 5 学习中,如果能有多点注释就更好了
huangxiao + 3 赞一个!

查看全部评分

回复

使用道具 举报

ID:82988 发表于 2015-7-11 11:00 | 显示全部楼层
不错,支持下
回复

使用道具 举报

ID:90378 发表于 2015-10-10 00:56 | 显示全部楼层
不错,如果加入转弯信号灯就更好了
回复

使用道具 举报

ID:95336 发表于 2015-11-11 13:44 | 显示全部楼层
求汇编程序!!!
回复

使用道具 举报

ID:100265 发表于 2015-12-24 20:36 来自手机 | 显示全部楼层
汇编程序的有没有啊
回复

使用道具 举报

ID:99525 发表于 2015-12-28 07:08 | 显示全部楼层
不错,这个也算比较完整的了
回复

使用道具 举报

ID:106369 发表于 2016-2-25 18:43 | 显示全部楼层
雪玉寐影 发表于 2015-12-28 07:08
不错,这个也算比较完整的了

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

使用道具 举报

ID:85227 发表于 2016-3-9 17:29 | 显示全部楼层
很不错,支持一下
回复

使用道具 举报

ID:85227 发表于 2016-3-9 17:29 | 显示全部楼层
定喜爱
回复

使用道具 举报

ID:111153 发表于 2016-3-28 16:38 | 显示全部楼层
下下来学习一下
回复

使用道具 举报

ID:111474 发表于 2016-3-30 18:57 | 显示全部楼层
支持支持,正在做课程设计~
回复

使用道具 举报

ID:112635 发表于 2016-4-7 01:16 | 显示全部楼层
支持支持,正在找,谢谢
回复

使用道具 举报

ID:123509 发表于 2016-5-27 14:43 | 显示全部楼层

汇编程序的有没有
回复

使用道具 举报

ID:123509 发表于 2016-5-27 14:48 | 显示全部楼层
汇编程序的有没有
回复

使用道具 举报

ID:124737 发表于 2016-6-2 17:52 | 显示全部楼层
keyi de
回复

使用道具 举报

ID:126188 发表于 2016-6-11 09:07 | 显示全部楼层
很好,值得下载
回复

使用道具 举报

ID:127801 发表于 2016-6-23 14:25 | 显示全部楼层
求汇编程序
回复

使用道具 举报

ID:129302 发表于 2016-7-5 15:03 | 显示全部楼层
多个c文件怎么弄到一起啊
回复

使用道具 举报

ID:129302 发表于 2016-7-5 15:10 | 显示全部楼层
怎么有错误啊  是什么情况啊
回复

使用道具 举报

ID:129595 发表于 2016-7-7 19:32 | 显示全部楼层
谢谢楼主
回复

使用道具 举报

ID:129595 发表于 2016-7-7 19:32 | 显示全部楼层
哈哈哈哈哈哈哈 谢谢楼主
回复

使用道具 举报

ID:136440 发表于 2016-8-10 16:03 | 显示全部楼层
嗯 不多 多多学习
回复

使用道具 举报

ID:138549 发表于 2016-9-5 23:57 | 显示全部楼层
不错 楼主辛苦了
回复

使用道具 举报

ID:147666 发表于 2016-11-13 21:06 | 显示全部楼层
赞一个
回复

使用道具 举报

ID:148983 发表于 2016-11-20 12:03 | 显示全部楼层
先谢楼主~
回复

使用道具 举报

ID:150567 发表于 2016-11-27 16:58 | 显示全部楼层
挺不错的
回复

使用道具 举报

ID:153688 发表于 2016-12-10 19:40 | 显示全部楼层
学习中,如果能有多点注释就更好了
回复

使用道具 举报

ID:156912 发表于 2016-12-22 17:16 | 显示全部楼层
学到了,感谢楼主
回复

使用道具 举报

ID:157017 发表于 2016-12-22 22:44 | 显示全部楼层
可以的
回复

使用道具 举报

ID:158425 发表于 2016-12-28 18:03 | 显示全部楼层
不错  支持下
回复

使用道具 举报

ID:158650 发表于 2016-12-29 16:06 | 显示全部楼层
午夜屠猪男 发表于 2016-2-25 18:43
**** 作者被禁止或删除 内容自动屏蔽 ****

是的,proteus和keil两个软件结合
回复

使用道具 举报

ID:158650 发表于 2016-12-29 16:07 | 显示全部楼层
很好,功能也比较完整
回复

使用道具 举报

ID:159030 发表于 2016-12-31 11:53 | 显示全部楼层
学习中
回复

使用道具 举报

ID:159227 发表于 2017-1-1 18:36 | 显示全部楼层
真棒 ,好人一生平安。支持
回复

使用道具 举报

ID:160856 发表于 2017-1-9 11:28 | 显示全部楼层

没错没错,是我自己马虎了

本帖最后由 杨文峰 于 2017-1-9 15:20 编辑

仿真执行有错误怎么搞?
回复

使用道具 举报

ID:160856 发表于 2017-1-9 15:19 | 显示全部楼层
杨文峰 发表于 2017-1-9 11:28
仿真执行有错误怎么搞?

对不起,文件都没错,是我马虎了!
回复

使用道具 举报

ID:125593 发表于 2017-1-11 19:10 | 显示全部楼层
谢谢楼主的分析,很不错
回复

使用道具 举报

ID:166896 发表于 2017-2-27 14:11 | 显示全部楼层
哎哟不错啊
回复

使用道具 举报

ID:168780 发表于 2017-3-7 12:11 | 显示全部楼层
很给力!挺好用的
回复

使用道具 举报

ID:184702 发表于 2017-3-30 09:01 | 显示全部楼层
学习中,很实用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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