找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10736|回复: 15
收起左侧

51单片机十字路口交通灯仿真程序(有行人,交通繁忙探头,功能很全)

  [复制链接]
ID:331026 发表于 2018-5-16 09:51 | 显示全部楼层 |阅读模式
《单片机原理》期中考试
适用班级:电子A1621,电子A1622
注意事项:
    1. 课外开放设计,开卷考核,可查阅任意资料。
    2. 单人考核,独立完成,如有雷同,一律0分。
    3. 不允许对电路图做任意形式修改。
    4. 提交以“电子A1622_01_陈**_期中测试”格式命名的项目文件夹。

这是我们学校单片机课程的期中考试自己写的程序,花了两周时间,压缩包里面包含了keil的源代码和protuse电路仿真图,可能也还有很多不完善的地方,望大家多多见谅。
电路如图所示,设计程序实现如下功能:
1. 能根据交通规律正确设置交通灯状态及数码管显示内容(60分)
2. 能手动调节时间(30分)
3. 能根据交通状况自动延长直行时间;(10分)

带行人与繁忙检测的单片机交通灯仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png

注:通过键盘调节时间项目中,分为东西直行时间、东西左转时间、南北直行时间、南北左转时间4个项目,每个项目7.5分,小数点四舍五入。
0.png
东西向交通繁忙探头,1正常,0繁忙
南北向交通繁忙探头,1正常,0繁忙

1. 模式键用来选择设定的时间,如东西直行时间、南北左转时间等。
   时间加减键用于手动调节直行时间,每按键一次加减5s。
2. 交通繁忙探头用于探测道路交通状况,如果当前道路排队较长,
   则繁忙探头返回0,可临时延长当前方向直行通道时间10s,一个
   红绿灯周期最多延长3次。本设计用逻辑状态输入端口模拟。

0.png 0.png

单片机源程序如下:

  1. #include <REGX51.H>
  2. #define uchar   unsigned char

  3. sbit NSgreen = P3^1; //南北人行道绿灯
  4. sbit WEgreen = P3^0; //东西人行道绿灯
  5. sbit Add_Button = P3^5;//加时间按键
  6. sbit Sub_Button = P3^4;//减时间按键
  7. sbit Reduces_Button = P3^3;//模式选择按键
  8. sbit Y1 = P3^2;
  9. sbit WEbuy_Button = P3^6 ;
  10. sbit NSbuy_Button = P3^7 ;
  11. uchar qiehuan=0;                  
  12. uchar  red = 33,yellow = 3,green_strant = 30,green_left = 30;
  13. uchar Mode = 0;
  14. uchar KeyDown=0;
  15. uchar DisplayTab[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x79};  // 0 1 2 3 4 5 6 7 8 9 E

  16. uchar led[8];


  17. uchar Display_Number[] = {0x82,0x84,0x28,0x48,0x81,0x84,0x18,0x48}; //路口红绿灯状态


  18. //延时
  19. void Delay_ms(unsigned int Cnt )
  20. {
  21. unsigned int t;
  22. while (Cnt--)
  23. {                                                         
  24.   t=100;
  25.   while(t--);
  26. }
  27. }


  28. //动态显示
  29. void Dynamic_display()
  30. {
  31.         uchar i = 0;
  32.         for(i = 0; i < 8; i++)
  33.         {
  34.                 P0 = DisplayTab[ led[i] ];
  35.             P2 = ~(0x01<<i);
  36.                 Delay_ms(1);
  37.                 P0 = 0x00;
  38.     }
  39. }


  40. /***************中断程序***********************************/

  41. /*******外部中断0**********/
  42. void function_isr(void) interrupt 0
  43. {
  44.           EX0=0;  //关中断
  45.          qiehuan++;
  46.          if(qiehuan == 5)  Mode=0;               
  47.          EX0=1; //开中断
  48.    
  49. }
  50. //状态1
  51. void luzhi1()
  52. {
  53.      led[4] = green_strant % 10;
  54.      led[5] = green_strant / 10;
  55.          led[6]        = 1;
  56.          led[7] = 10;
  57. if(WEbuy_Button == 0)  //时间加
  58.        {
  59.             green_strant += 10;   
  60.        }
  61. }
  62. //状态2
  63. void luzhi2()
  64. {
  65.      led[4] = green_strant % 10;
  66.      led[5] = green_strant / 10;
  67.          led[6]        = 3;
  68.          led[7] = 5;
  69.          if(NSbuy_Button == 0)  //时间加
  70.        {
  71.             green_strant += 10;
  72.                         
  73.        }
  74. }
  75. /******外部中断2********/
  76. void function_lib(void) interrupt 2
  77. {
  78.         Mode++;
  79.         if(Mode == 5)  Mode=0;
  80.         KeyDown=1;


  81. }


  82. //模式1
  83. void function1()
  84. {        
  85.      led[4] = green_strant % 10;
  86.      led[5] = green_strant / 10;
  87.          led[6]        = 1;
  88.          led[7] = 10;
  89.          if(Add_Button == 0)  //时间加
  90.        {
  91.             green_strant += 5;
  92.             green_left        += 5;
  93.             red += 5;     
  94.        }
  95.      if(Sub_Button == 0) //时间减
  96.        {
  97.             green_strant -= 5;
  98.                         green_left        -= 5;
  99.             red -= 5;                    
  100.            }
  101.             
  102. }

  103. //模式2
  104. void function2()
  105. {
  106.      led[4] = green_left % 10;
  107.      led[5] = green_left / 10;
  108.          led[6]        = 2;
  109.          led[7] = 10;
  110.          if(Add_Button == 0)  //时间加
  111.        {
  112.             green_strant += 5;
  113.                         green_left += 5;
  114.             red += 5;
  115.                              
  116.        }
  117.      if(Sub_Button == 0) //时间减
  118.        {
  119.             green_strant -= 5;
  120.                          green_left -= 5;
  121.             red -= 5;                    
  122.            }   
  123.          
  124. }

  125. //模式3
  126. void function3()
  127. {
  128.      led[4] = green_strant % 10;
  129.      led[5] = green_strant / 10;
  130.          led[6]        = 3;
  131.          led[7] = 5;
  132.          if(Add_Button == 0)  //时间加
  133.        {
  134.             green_strant += 5;
  135.                         green_left += 5;
  136.             red += 5;     
  137.        }
  138.      if(Sub_Button == 0) //时间减
  139.        {
  140.             green_strant -= 5;
  141.                         green_left -= 5;
  142.             red -= 5;                    
  143.            }
  144. }

  145. //模式4
  146. void function4()
  147. {
  148.      led[4] = green_left % 10;
  149.      led[5] = green_left / 10;
  150.          led[6]        = 4;
  151.          led[7] = 5;
  152.          if(Add_Button == 0)  //时间加
  153.        {
  154.             green_strant += 5;
  155.                         green_left += 5;
  156.             red += 5;     
  157.        }
  158.      if(Sub_Button == 0) //时间减
  159.        {
  160.             green_strant -= 5;
  161.                     green_left += 5;
  162.             red -= 5;                    
  163.            }
  164. }





  165. /*************计时程序*************/
  166. void count_down()
  167. {
  168.   uchar time = 0;
  169.   uchar Temp,state;
  170.   uchar Red,Yellow,Greens,Greenl;
  171.   Red = red;
  172.   Yellow = yellow;
  173.   Greens = green_strant;
  174.   Greenl = green_left;
  175.   
  176.   while(1)
  177.   {        
  178.      if(time < green_strant )
  179.          {
  180.            led[0] = Red % 10;
  181.            led[1] = Red        / 10;
  182.            led[2] =        Greens % 10;
  183.            led[3] = Greens / 10;

  184.            state=0;
  185.            WEgreen = 1;
  186.            NSgreen = 0;
  187.            Red--;
  188.            Greens--;

  189.          }

  190.          if(time >= green_strant  & time < (green_strant +yellow ))
  191.          {
  192.            led[0]=Red % 10;
  193.            led[1]=Red / 10;
  194.            led[2]=Yellow % 10;
  195.            led[3]=Yellow / 10;

  196.            state=1;
  197.        WEgreen = 1;
  198.            NSgreen = 0;
  199.            Red--;
  200.            Yellow--;
  201.            Greens=green_strant;  //给直行绿灯恢复初值

  202.          }

  203.          if(time >= (green_strant +yellow ) & time < (green_strant +yellow+green_strant ) )
  204.          {
  205.            if(time == (green_strant +yellow ))
  206.            {
  207.              Red = red;          //给红灯赋值
  208.            }
  209.            led[0]= Greens % 10;
  210.            led[1]= Greens / 10;
  211.            led[2]= Red % 10;
  212.            led[3]= Red / 10;

  213.            state=2;
  214.            WEgreen = 0;
  215.            NSgreen = 1;
  216.            Red--;
  217.            Greens--;
  218.            Yellow=yellow;   //给黄灯恢复初值
  219.          }

  220.          if(time >= (green_strant +yellow+green_strant ) & time < (green_strant +yellow+green_strant+yellow ) )
  221.          {
  222.            led[0]= Yellow % 10;
  223.            led[1]= Yellow / 10;
  224.            led[2]= Red % 10;
  225.            led[3]= Red / 10;
  226.            
  227.            state=3;
  228.            WEgreen = 0;
  229.            NSgreen = 1;
  230.            Greens=green_strant;  //给直行绿灯恢复初值
  231.            Yellow--;
  232.            Red--;
  233.          
  234.          }

  235.          if(time >= (green_strant +yellow+green_strant+yellow ) & time < (green_strant +yellow+green_strant+yellow+green_left ) )
  236.           {
  237.            if(time == (green_strant +yellow+green_strant+yellow ) )
  238.            {
  239.             Red = red;                //给红灯赋值
  240.            }
  241.            led[0] = Red % 10;
  242.            led[1] = Red / 10;
  243.            led[2]= Greenl % 10;
  244.            led[3]= Greenl / 10;

  245.            state=4;  
  246.            WEgreen = 1;
  247.            NSgreen = 0;
  248.            Greenl--;
  249.            Red--;
  250.            Yellow = yellow;  //给黄灯赋初值
  251.           }

  252.           if(time >= (green_strant +yellow+green_strant+yellow+green_left )  & time < (green_strant +yellow+green_strant+yellow+green_left+yellow ) )
  253.           {
  254.            led[0] = Red % 10;
  255.            led[1] = Red / 10;
  256.            led[2] = Yellow % 10;
  257.            led[3] = Yellow / 10;
  258.            
  259.            state=5;
  260.            WEgreen = 1;
  261.            NSgreen = 0;
  262.            Yellow--;
  263.            Red--;
  264.            Greenl = green_left;  //给左转绿灯赋初值
  265.           }

  266.          if(time >= (green_strant +yellow+green_strant+yellow+green_left+yellow ) & time < (green_strant +yellow+green_strant+yellow+green_left+yellow + green_left) )
  267.           {
  268.            if(time == (green_strant +yellow+green_strant+yellow+green_left+yellow ) )
  269.            {
  270.              Red = red;                   //给红灯赋值
  271.            }
  272.            led[0] = Greenl % 10;
  273.            led[1] = Greenl / 10;
  274.            led[2] = Red % 10;
  275.            led[3] = Red / 10;
  276.            
  277.            state=6;
  278.            WEgreen = 0;
  279.            NSgreen = 1;
  280.            Yellow = yellow;  //给黄灯赋初值
  281.            Greenl--;
  282.            Red--;
  283.           }

  284.           if(time >= (green_strant +yellow+green_strant+yellow+green_left+yellow + green_left) & time < (green_strant +yellow+green_strant+yellow+green_left+yellow + green_left+yellow) )
  285.          {
  286.            led[0]= Yellow % 10;
  287.            led[1]= Yellow / 10;
  288.            led[2]= Red % 10;
  289.            led[3]= Red / 10;

  290.            state=7;
  291.            WEgreen = 0;
  292.            NSgreen = 1;
  293.            Greenl = green_left;  //给左转绿灯赋初值
  294.            Yellow--;
  295.            Red--;
  296.          }

  297.          if(time >= (green_strant +yellow+green_strant+yellow+green_left+yellow + green_left+yellow))
  298.          {
  299.            Yellow = yellow;  //给黄灯赋初值
  300.            break;
  301.          }

  302.          time++;


  303.          Y1= 1 ;
  304.          Reduces_Button = 1;
  305. ……………………

  306. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

0.jpg

所有资料51hei提供下载:
51单片机交通灯程序_期中测试.zip (307.52 KB, 下载次数: 258)

评分

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

查看全部评分

回复

使用道具 举报

ID:1 发表于 2018-6-14 03:30 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:138707 发表于 2018-6-14 11:46 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:463831 发表于 2019-1-7 15:36 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:3802 发表于 2019-1-8 13:42 | 显示全部楼层
学习中了
回复

使用道具 举报

ID:560537 发表于 2019-6-12 08:32 | 显示全部楼层
我来瞅瞅
回复

使用道具 举报

ID:561435 发表于 2019-6-13 14:30 来自手机 | 显示全部楼层
好资料,51黑有你更精彩
回复

使用道具 举报

ID:360525 发表于 2019-6-27 13:10 | 显示全部楼层
那个黄色的小人是怎么画的啊
回复

使用道具 举报

ID:577476 发表于 2020-1-7 10:53 | 显示全部楼层

好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:711846 发表于 2020-6-8 09:24 | 显示全部楼层
好文章,可以学习了
回复

使用道具 举报

ID:773174 发表于 2020-6-9 12:37 | 显示全部楼层
请问为什么我调整模式按钮没有变化呢
回复

使用道具 举报

ID:774354 发表于 2020-6-9 20:43 | 显示全部楼层
谢谢分享,我的作业有救了
回复

使用道具 举报

ID:777864 发表于 2020-6-13 11:23 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:779160 发表于 2020-6-14 17:31 | 显示全部楼层
牛啊,太强了
回复

使用道具 举报

ID:779160 发表于 2020-6-14 17:31 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:796873 发表于 2020-7-3 23:18 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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