找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 41161|回复: 13
打印 上一主题 下一主题
收起左侧

51单片机交通灯系统设计(流程框图+硬件+源码)

  [复制链接]
跳转到指定楼层
楼主
ID:410059 发表于 2018-10-15 17:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是老师要求做的项目,现在已经做好了,没有什么大问题。

一, 设计要求与方案论证
1.1设计要求:
              1.1.1基本要求:
              1、东西方向、南北方向均有红、黄、绿三种信号灯,初始红灯30秒,黄灯闪烁3秒,绿灯30秒,东西方向红灯时刻,南北方向绿灯,南北方向绿灯,东西方向红灯;
2、按键调节与控制功能,通过按键,可以控制某一个方向长时间绿灯,另一个方向长时间红灯;通过按键可以控制某一个方向的红灯时长,比如调整东西方向红灯40秒,绿灯20秒,于此同时,南北方向红灯20秒,绿灯40秒。
3、夜间模式按钮按下,所有方向显示黄灯闪烁
4、实时提醒灯亮的剩余时间

1.1.2拓展部分:
目前还没拓展
1.2系统基本方案选择和论证:
              1.2.1单片机芯片的选择方案和论证:
    STC公司生产的8051内核,CMOS工艺;
              1.2.2数码管显示模块的选择方案和论证:
    选择的是共阳的数码管,单片机的驱动能力不是很强,故此选择共阳数码管;。
              1.2.3Led灯的选择方案与论证:
    通过一个Led灯的电流大约是10ms。
              1.3 电路设计最终方案
2.1  表数的产生由定时器T0产生
TH0=0xFC;TL0=0x67; 每1ms中断一下,对整个项目的标志量改变一下它的值。
2.2  略;
3.1 电路设计框图
3.2系统硬件描述
  主要的硬件是89C51这个芯片进行输入输出控制。
3.3主要单元电路的设计
              3.3.1单片机主控模块的设计
      
              3.3.2数码管模块的设计
      
              3.3.3Led灯模块的设计
     
              3.3.4电源稳压模块


4.1程序流程框图
4.2 数码管模块流程图
4.3 按键调整模块设计框图
5.1 测试仪器
万能表对是否导通,是否短路进行检测。
5.2软件测试平台 Keil C51


5.3 硬件测试
              5.3.1 显示模块测试
   
  
5.4 测试结果分析与结论
              5.4.1测试结果分析
    已经可以实现上述功能。
              5.4.2测试结论
    测试已经完成,已经可以实现了要求的功能。
作品总结
  在这一次的作品制作过程中对万用表,c语言,Proteus的使用更加的得心应手,更加的熟练。
附录一:系统电路图


附录二:系统C程序
  1. #include<reg52.h>
  2. #define              uint unsigned int;
  3. #define  uchar unsigned char;

  4. void  DigitalTube();   //数码管显示函数
  5. void  InterruptT0();              //内部中断0

  6. sbit  P10 = P1^0;                            //红绿灯引脚的初始化
  7. sbit  P11 = P1^1;
  8. sbit  P12 = P1^2;
  9. sbit  P13 = P1^3;
  10. sbit  P14 = P1^4;
  11. sbit  P15 = P1^5;

  12. sbit  P16 = P1^6;                            //数码管使能控制
  13. sbit  P17 = P1^7;
  14. sbit  P20 = P2^0;
  15. sbit  P21 = P2^1;

  16. sbit  K22 = P2^2;                 //按键22
  17. sbit  K23 = P2^3;
  18. sbit  K24 = P2^4;
  19. sbit dula = P2^5;

  20. uint LedBuf[10] = {
  21.                               0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
  22.                             0x80,0x90
  23. };                            //0~9的数字显示共阳

  24. uint Kflag = 1;                              //按键24的标志
  25. uint LedNumNS = 27;                 //南北的数字显示
  26. uint LedNumEW = 30;                 //东西的数字显示
  27. uint i = 0;
  28. uint j = 0;
  29. uint j1 = 0;
  30. uint k = 0;
  31. uint g = 0;
  32. uint z = 0;                                          //计数及状态的变量

  33. uint LedTime1 = 30;
  34. uint LedTime2 = 27;
  35. uint LedTime3 = 30;
  36. uint LedTime4 = 27;

  37. uint Kf22 = 1;              //按键前一个状态的值
  38. uint Kf23 = 1;
  39. uint Kf24 = 1;
  40. uint KSta24 = 1;              //按键的当前值
  41. uint KSta23 = 1;
  42. uint KSta22 = 1;  
  43. uchar Kflag22 = 0;              //按键22的switch函数参数

  44. void main()
  45. {
  46.               EA = 1;                                          //开总中断
  47.               ET0 = 1;                            //开内部中断0
  48.               TR0 = 1;
  49.               TMOD = 0x01;                 //方式1
  50.               TH0 = 0xFC;
  51.               TL0= 0x67; //1ms中断
  52.               P1 = 0xEE;                            //

  53.               while(1)
  54.               {
  55.                             DigitalTube();              //数码管显示
  56.               }

  57. }


  58. void InterruptT0() interrupt 1
  59. {
  60.                                                         TH0 = 0xFC;
  61.                                                         TL0 = 0x67; //1ms中断            
  62.                                                         i++;            
  63.                                                         k++;
  64.                                          
  65.                                                         KSta24 = K24;                                //按键K24  夜间模式
  66.                                                         if(Kf24 != KSta24)                            //按键有动作
  67.                                                         {
  68.                                                                       if(Kf24 == 1)                            //按键按下
  69.                                                                       {
  70.                                                                                     Kflag = !Kflag;                           
  71.                                                                       }
  72.                                                                       Kf24 = KSta24;
  73.                                                         }
  74.                                          


  75.                                           KSta23 = K23;                                //按键K23  增减时长
  76.                                           if(Kf23 != KSta23)                            //按键有动作
  77.                                           {
  78.                                                         if(Kf23 == 1)                            //按键按下
  79.                                                         {
  80.                                                         //              LedTime = LedTime +2;
  81.                                                                       LedTime1 = LedTime1 +5;              //32  34 36 38 30
  82.                                                                       LedTime2 = LedTime2 +5;              //25  23 21  19 17
  83.                                                                       LedTime3 = LedTime3 +5;
  84.                                                                       LedTime4 = LedTime4 +5;
  85.                                                                       if(LedTime1 >=60)
  86.                                                                                     {
  87.                                                                                                   LedTime1 = 10;
  88.                                                                                                   LedTime2 = 7;
  89.                                                                                                   LedTime3 = 10;
  90.                                                                                                   LedTime4 = 7;
  91.                                                                                     }            
  92.                                                                       LedNumEW = LedTime1;
  93.                                                                       LedNumNS = LedTime2;
  94.                                                         }
  95.                                                         Kf23= KSta23;
  96.                                           }
  97.                            


  98.                                           KSta22 = K22;                                //按键K22  某方向长时间红灯
  99.                                           if(Kf22 != KSta22)                            //按键有动作
  100.                                           {
  101.                                                         if(Kf22 == 1)                            //按键按下
  102.                                                         {
  103.                                                                       Kflag22 ++;            
  104.                                                                       if(Kflag22>= 3)            
  105.                                                                                     {
  106.                                                                                     Kflag22 = 0;
  107.                                                                                     }

  108.                                                                       switch(Kflag22)
  109.                                                                       {
  110.                                                                                     case 1:
  111.                                                                                                   LedTime1 = 50;
  112.                                                                               LedTime2 = 47;              //case2
  113.                                                                                                   LedTime3 = 20;
  114.                                                                                                   LedTime4 = 17; //case1

  115.                                                                                                   LedNumEW = LedTime1;
  116.                                                                                                   LedNumNS = LedTime2;


  117.                                                                                         break;
  118.                                                                                     case 2:            
  119.                                                                                                   LedTime1 = 20;
  120.                                                                               LedTime2 = 17;                //case2
  121.                                                                                                   LedTime3 = 50;
  122.                                                                                                   LedTime4 = 47;              //case1

  123.                                                                                                   LedNumEW = LedTime1;
  124.                                                                                                   LedNumNS = LedTime2;
  125.                                                                                                   break;
  126.                                                                                     case 0:            
  127.                                                                      
  128.                                                                                                   LedTime1 = 30;
  129.                                                                               LedTime2 = 27;
  130.                                                                                                   LedTime3 = 30;
  131.                                                                                                   LedTime4 = 27;
  132.                                                                                                   LedNumEW = LedTime1;
  133.                                                                                                   LedNumNS = LedTime2;
  134.                                                                                     break;
  135.                                                                       }

  136.                                                         }
  137.                                                         Kf22 = KSta22;
  138.                                           }
  139.                                          

  140.               if(j >= 200)
  141.                             {
  142.                                           j  = 0;
  143.                                           j1++;
  144.                             }


  145.               if(i >= 1000)
  146.               {
  147.                             i = 0;
  148.                             LedNumNS--;              //27
  149.                             LedNumEW--;              //30
  150.                             switch(g)
  151.                             {                                            //刚开始东西红  南北绿
  152.                                           case 0:                                                                                                                   //********2
  153.                                                         if(LedNumEW == 3)                                                           //*****3
  154.                                                         {
  155.                                                                                     P14 = ! P14;   //绿灯灭
  156.                                                         if(Kf24 == Kflag)                            P15 = ! P15;   //黄灯亮
  157.                                                                                     LedNumNS = 3;
  158.                                                         }            
  159.                                                         if(LedNumEW == 0)
  160.                                                         {
  161.                                                                       LedNumNS =  LedTime3;              //   30东西绿南北红的时间
  162.                                                                       LedNumEW =               LedTime4;              //  27
  163.                                                                       P12 = ! P12;                 //东西绿灯亮
  164.                                                                       P10 = ! P10;                //东西红灯灭
  165.                                                                       P13 = ! P13;                              //nanbei红灯亮
  166.                                                             if(Kf24 == Kflag)
  167.                                                                       P15 = ! P15;                //南北黄灯灭
  168.                                                                       g = 1;
  169.                                                         }            
  170.                                                         break;

  171.                                           case 1:                                                                                                                              //******4
  172.                                                         if(LedNumNS == 3)                 //黄灯亮
  173.                                                                       {
  174.                                                                    P12 = !P12;
  175.                                                                                        P11 = !P11;            
  176.                                                                                        LedNumEW = 3;
  177.                                                                       }
  178.                                                         if(LedNumNS == 0)                                                                         //********5
  179.                                                         {
  180.                                                                       LedNumEW = LedTime1;//重新赋值
  181.                                                                       LedNumNS = LedTime2;
  182.                                                         if(Kf24 == Kflag)              P11 = !P11;                 //南北黄灯灭
  183.                                                                       P10 = !P10;                //dongxi红灯亮
  184.                                                                       P14 = !P14;
  185.                                                                       P13 = !P13;
  186.                                                                       g = 0;
  187.                                                         }
  188.                                                         break;
  189.                                }
  190.                            

  191.                   if(Kf24 != Kflag)                                                        //夜间模式
  192.                             {
  193.                                           if(j1 % 2 == 0)
  194.                                           {
  195.                                                         P11 = ! P11;            
  196.                                                         P15 = ! P15;
  197.                                 }                                                          //所有方向黄灯闪烁
  198.                             }                             
  199.               }                                                                       
  200. }




  201. void  DigitalTube()                            //数码管

  202. {                    
  203.               switch(z)
  204.               {
  205.                                           case 0:                                                                      //第一个数码管显示数字
  206.                                          
  207.                                               P0 =0xFF;                            //防止数字显示混乱
  208.                                                         dula = 1;
  209.                                                         P0 = LedBuf[LedNumEW / 10];              //十位
  210.                                                         P20 = 0;
  211.                                                         P17 = 0;
  212.                                                         P21 = 0;
  213.                                                         P16 = 1;
  214.                                                         dula = 0;
  215.                                                         z++;            
  216.                                                         break;                             
  217.             
  218.                                           case 1:                                                          //第二个数码管亮
  219.                                                            P0 =0xFF;
  220.                                                         dula = 1;
  221.                                                         P0 = LedBuf[LedNumEW % 10];              //个位
  222.                                                         P16 = 0;
  223.                                                         P20 = 0;
  224.                                                         P21 = 0;
  225.                                                         P17 = 1;
  226.                                                         dula = 0;
  227.                                               z++;
  228.                                                         break;
  229.                            
  230.                                           case 2:                                                        //第三个数码管亮
  231.                                               P0 =0xFF;
  232.                                                         dula = 1;
  233.                                                         P0 = LedBuf[LedNumNS / 10]; //十位
  234.                                                         P21 = 0;
  235.                                                         P16 = 0;
  236.                                                         P17 = 0;                                            //关闭2
  237.                                                         P20 = 1;                                            //使能第3个数码管
  238.                                                         dula = 0;
  239.                                                         z++;                                                        //进入3
  240.                                                         break;
  241.                                          
  242.                                           case 3:                                                          //第四个数码管亮

  243.                                               P0 =0xFF;
  244.                                                         dula = 1;
  245.                                                         P0 = LedBuf[LedNumNS % 10];              //个位
  246.                                                         P20 = 0;                                          //第三个关闭
  247.                                                         P16 = 0;
  248.                                                         P17 = 0;
  249.                                                         P21 = 1;                                          //使能第四个数码管
  250.                                                         dula = 0;
  251.                                                         z = 0;                                                          //进入0
  252.                                                         break;

  253.                                           default:break;                                                                                                   
  254.               }
  255. }
复制代码

完整的Word格式文档51黑下载地址:
项目报告说明书.docx (239.11 KB, 下载次数: 292)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏11 分享淘帖 顶4 踩
回复

使用道具 举报

沙发
ID:531151 发表于 2019-6-8 14:19 | 只看该作者
可以,很强势
回复

使用道具 举报

板凳
ID:548675 发表于 2019-6-10 12:59 来自手机 | 只看该作者
可以看看我的吗?  大佬帮我加个按键
回复

使用道具 举报

地板
ID:531151 发表于 2019-6-27 11:27 | 只看该作者
我也想加按键  但是不会
回复

使用道具 举报

5#
ID:575535 发表于 2019-7-1 15:04 来自手机 | 只看该作者
这不需要接晶振吗?
回复

使用道具 举报

6#
ID:678389 发表于 2019-12-31 14:18 | 只看该作者
很厉害,刚需
回复

使用道具 举报

7#
ID:687420 发表于 2020-1-19 19:08 | 只看该作者
gxgxg 发表于 2019-7-1 15:04
这不需要接晶振吗?

肯定需要接的!!!!!!!!
回复

使用道具 举报

8#
ID:732153 发表于 2020-4-18 23:48 | 只看该作者
这个程序有点问题啊,单步调式了一下,p1口根本就不变化,交通灯不凉,数码管是对的,另外我导入proteux里面得到的也是一样的结果
回复

使用道具 举报

9#
ID:736487 发表于 2020-4-23 21:13 | 只看该作者
可以把引脚的编码再发一遍吗?能看清数字的那种,谢谢
回复

使用道具 举报

10#
ID:738054 发表于 2020-5-6 18:33 来自手机 | 只看该作者
有做的成品提供下载
回复

使用道具 举报

11#
ID:776037 发表于 2020-6-11 11:48 | 只看该作者
引脚看不清难受
回复

使用道具 举报

12#
ID:779601 发表于 2020-6-15 16:47 | 只看该作者
在实验箱上怎么连啊
回复

使用道具 举报

13#
ID:779392 发表于 2020-6-15 21:00 来自手机 | 只看该作者
雪菜 发表于 2020-4-18 23:48
这个程序有点问题啊,单步调式了一下,p1口根本就不变化,交通灯不凉,数码管是对的,另外我导入proteux里 ...

我数码管不亮咋办
回复

使用道具 举报

14#
ID:845493 发表于 2020-11-25 20:37 | 只看该作者
李李李89 发表于 2020-4-23 21:13
可以把引脚的编码再发一遍吗?能看清数字的那种,谢谢

附议!!!!大佬可以再发下可以看清引脚的图片的吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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