找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机智能交通灯控制系统设计实验流程图与程序

[复制链接]
跳转到指定楼层
楼主
ID:409924 发表于 2018-10-15 14:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.设计目的
  • 学习AT89C51的原理及应用
  • 了解使用单片机处理复杂逻辑的方法
2.设计任务

本系统的软件设计主要分为四大模块:定时模块、倒计时显示、红绿灯显示、按键输入。定时模块通过定时器T0在模式1下,完成1秒的定时功能,每1秒时间到,将会对通行时间进行倒计时。显示模块采用动态显示的方式,段选码从P2端口输出,位选码从P1端口输出。红绿灯显示采用单片机IO端口直接驱动,当IO端口输出低电平时,相应的发光二极管发光;当IO端口输出高电平时,相应的发光二极管熄灭。按键输入,主要完成“东西通行”、“南北通行”、“禁止通行”三个功能,每次按键输入的时候,会对按键进行软件消抖,从而保证按键的准确输入。

基本要求

a显示电路采用七段共阴极数码管显示,南北方向的数码管的段选端分别与P2端口的P2.0~P2.7相连,位选端分别与P1.2和P1.3相连;东西方向的数码管的段选端也与P2端口的P2.0~P2.7相连,位选端分别与P1.0和P1.1相连

b. 实现这三个功能:东西通行、南北通行、禁止通行。


  • 高级要求

   在以上设计基础上,在单片机的P1.0-P1.3口分别接入4个按键:



    • 东西方向和南北方向的通行时间输入和输入时间的显示
    • 在绿灯亮起时,添加声音提示行人通行

3.设计原理图







4.数字钟程序流程图

   

图9.3 智能交通灯控制主程序流程图


代码:


  1. #include <reg51.h>                                             //包含MCS-51单片机头文件
  2. #define uchar unsigned char   //定义宏uchar
  3. #define uint unsigned int     //定义宏uint
  4. sbit P1_0 =P1^0;              //定义单片机IO口P1.0
  5. sbit P1_1 =P1^1;               //定义单片机IO口P1.1
  6. sbit P1_2 =P1^2;               //定义单片机IO口P1.2
  7. sbit P1_3 =P1^3;               //定义单片机IO口P1.3
  8. sbit ew_red=P0^0;              //定义单片机IO口P0.0为东西方向红灯控制位
  9. sbit ew_yellow=P0^1;           //定义单片机IO口P0.1为东西方向黄灯控制位
  10. sbit ew_green=P0^2;            //定义单片机IO口P0.2为东西方向绿灯控制位
  11. sbit sn_red=P0^3;              //定义单片机IO口P0.3为南北方向红灯控制位
  12. sbit sn_yellow=P0^4;           //定义单片机IO口P0.4为南北方黄灯控制位
  13. sbit sn_green=P0^5;            //定义单片机IO口P0.5为南北方向绿灯控制位
  14. sbit key_earth_west=P3^2;      //定义单片机IO口P3.2东西方向通行控制按键
  15. sbit key_sourth_north= P3^3;              //定义单片机IO口P3.3南北方向通行控制按键
  16. sbit all_not=P3^4;             //定义单片机IO口P3.4为全部禁行控制位
  17. sbit key_earth_west_add=P3^0;      //定义单片机IO口P3.0为东西加
  18. sbit key_earth_west_jian= P3^1;              //   定义单片机IO口P3.1为东西减
  19. sbit key_sourth_north_add=P3^5;      //              定义单片机IO口P3.5为南北加
  20. sbit key_sourth_north_jian= P3^6;              //              定义单片机IO口P3.6为南北减
  21. uchar code s7_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  22.                                //七段码显示表
  23. uchar a,b,c,d;                                                                      //定义东西南北时间
  24. uchar sou_nor_time;            //南北通行时间变量定义
  25. uchar east_weat_time;          //东西通行时间变量定义
  26. uchar time_flag;               //时间标志位定义
  27. uchar traffic_flag;                       //traffic_flag=0时南北通行,traffic_flag=1时东西通行
  28. uchar time_multiply;           //定义计时变量
  29. void delayms(uchar z)          //延时子程序
  30. {
  31.               uchar i,j;                   //定义变量i,j
  32.               for(i=z;i>0;i--)             //for循环,共循环z次
  33.                             for(j=110;j>0;j--);                            //for循环,共循环j次
  34. }
  35. void display_time( )  //显示倒计时子程序
  36. {
  37.               P1_0 =0;                                                                      //P1.0输出低电平,位选使能
  38. P1_1 =1;                                                                       //P1.1输出高电平
  39. P1_2 =1;                                                                      //P1.2输出高电平
  40. P1_3 =1;                                                                      //P1.3输出高电平
  41.               P2=s7_table[a/10];       //P2端口输出显示的段码
  42.               delayms(2);                                                                      //延时2毫秒
  43.               P2=0;                                                               //P2端口输出低电平
  44.               P1_0 =1;                                                                      //P1.0输出高电平
  45.             
  46.               P1_1 =0;                                                                      //P1.1输出低电平,位选使能
  47.               P2=s7_table[b%10];                            //P2端口输出显示的段码
  48.               delayms(2);                                                                      //延时2毫秒
  49.               P2=0;                                                                                    //P2端口输出低电平
  50.               P1_1 =1;                                                                      //P1.1输出高电平
  51.             
  52.               P1_2 =0;                                                                      //P1.2输出低电平,位选使能
  53.               P2=s7_table[(c)/10];                            //P2端口输出显示的段码
  54.               delayms(2);                                                                      //延时2毫秒
  55.               P2=0;                                                                                    //P2端口输出低电平
  56.               P1_2 =1;                                                                      //P1.2输出高电平
  57.             
  58.               P1_3 =0;                                                                      //P1.3输出低电平,位选使能
  59.               P2=s7_table[(d)%10];                            //P2端口输出显示的段码
  60.               delayms(2);                                                                      //延时2毫秒
  61.               P2=0;                                                                                    //P2端口输出低电平
  62.               P1_3 =1;                                                                      //P1.3输出高电平
  63. }
  64. void  south_north_allow()     //南北通行允许子程序
  65. {               
  66.               ew_red=0;                                                                      //东西方向红灯亮
  67.               ew_green=1;                                                                      //东西方向绿灯熄灭
  68.               ew_yellow=1;                                                        //东西方向黄灯熄灭

  69.               sn_red=1;                                                        //南北方向红灯熄灭
  70.               sn_green=0;                                                        //南北方向绿灯亮
  71.               sn_yellow=1;                                          //南北方向黄灯熄灭                           
  72. }
  73. void  east_west_allow()   //东西通行允许子程序
  74. {
  75.               ew_red=1;                                                        //东西方向红灯熄灭
  76.               ew_green=0;                                                        //东西方向绿灯亮
  77.               ew_yellow=1;                                          //东西方向黄灯熄灭
  78.               sn_red=0;                                                        //南北方向红灯亮
  79.               sn_green=1;                                                        //南北方向绿灯熄灭
  80.               sn_yellow=1;                                             //南北方向绿灯熄灭
  81. }
  82. void init0_timer0()                            //定时器0初始化子程序
  83. {
  84.               TMOD=0X01;                                                                                    //定时器0设置为模式1
  85.               TH0=(65536-50000)/256;                                          //TH0装载初值
  86.               TL0=(65536-50000)%256;                                          //TL0装载初值
  87.               ET0=1;                                                                                                  //开启定时器中断
  88.               EA=1;                                                                                                  //开启CPU中断
  89.               TR0=1;                                                                                                  //启动定时器T0
  90. }
  91. void keyscan()                                                                      //键盘扫描子程序
  92. {
  93.               if(key_sourth_north==0)                                          //判断南北通行控制按键是否按下
  94.               {
  95.                             delayms(2);                                                                      //延时2毫秒
  96.                             if(key_sourth_north==0)                            //再次判断南北通行控制按键是否按下
  97.                             {
  98.                                           south_north_allow();              //调用南北通行子程序
  99.                                           while(!key_sourth_north) display_time(); //南北通行时,
  100. //显示通行倒计时
  101.                                           TR0=0;                                        //南北通行结束,关闭定时器T0
  102.                            
  103.                             }
  104.               }
  105.               if(key_earth_west==0)                                          //判断东西通行控制按键是否按下
  106.               {
  107.                             delayms(2);                                                                      //延时2毫秒
  108.                             if(key_earth_west==0)                            //再次判断东西通行控制按键是否按下
  109.                             {
  110.                                           east_west_allow();                            //调用东西通行子程序
  111.                                           while(!key_earth_west) display_time();              //东西通行时,
  112. //显示通行倒计时
  113.                                           TR0=0;                                                                      //东西通行结束,关闭定时器T0
  114.                             }
  115.               }
  116.               if(all_not==0)                                                                      //判断全部禁行按键是否按下
  117.               {
  118.                             delayms(2);                                                                      //延时2毫秒
  119.                             if(all_not==0)                                                        //再次全部禁行按键是否按下
  120.                             {
  121.                                           TR0=0;                                                                      //进入全部禁行子程序,关闭定时器T0
  122.                                           ew_red=0;                                                        //东西方向红灯亮
  123.                                           ew_green=1;                                                        //东西方向绿灯熄灭
  124.                                           ew_yellow=1;                                          //东西方向黄灯熄灭
  125.                                           sn_red=0;                                                        //南北方向红灯亮
  126.                                           sn_green=1;                                           //南北方向绿灯熄灭
  127.                                           sn_yellow=1;                                          //南北方向黄灯熄灭
  128.                             }
  129.               }
  130.               if(key_earth_west_add==0)                               //              东西时间+1
  131.               {
  132.                  delayms(200);
  133.                  if(key_earth_west_add==1)
  134.                  {
  135.                     east_weat_time=east_weat_time+1;
  136.                                             time_flag=time_flag+1;
  137.                  }
  138.               }
  139.               if(key_earth_west_jian==0)                                          //东西时间-1
  140.               {
  141.                  delayms(200);
  142.                  if(key_earth_west_jian==1)
  143.                  {
  144.                     east_weat_time=east_weat_time-1;
  145.                                           time_flag=time_flag-1;
  146.                  }
  147.               }
  148.               if(key_sourth_north_add==0)                                          //南北时间+1
  149.               {
  150.                  delayms(200);
  151.                  if(key_sourth_north_add==1)
  152.                  {
  153.                     sou_nor_time=sou_nor_time+1;
  154.                                           time_flag=time_flag+1;
  155.                  }
  156.               }
  157.               if(key_sourth_north_jian==0)                                             //南北时间-1
  158.               {
  159.                  delayms(200);
  160.                  if(key_sourth_north_jian==1)                                            
  161.                  {
  162.                     sou_nor_time=sou_nor_time-1;                              
  163.                                           time_flag=time_flag-1;
  164.                  }
  165.               }
  166. }

  167. void main()                                                                                                  //主程序
  168. {                           
  169.               sou_nor_time=15;                                                                      //初始化南北通行时间为15秒
  170.               east_weat_time=6;                                                                      //初始化东西通行时间为6秒
  171.               traffic_flag=0;                                                                                    //初始化,南北通行
  172.               time_flag=sou_nor_time;                                                        //设置南北通行的时间
  173.               time_multiply =0;                                                                      //计时变量初始化

  174.               init0_timer0();                                                                                    //调用定时器T0初始化子程序
  175.               south_north_allow();                                                        //调用南北通行允许子程序

  176.               while(1)                                                                                                  // while(1)无限循环
  177.               {
  178. keyscan();                                                                                    //调用键盘扫描子程序
  179.                             display_time();                   //调用显示倒计时子程序
  180.               }
  181. }
  182. void int0_isr() interrupt 1                                            //定时器T0中断服务程序
  183. {
  184.               TH0=(65536-50000)/256;                                                        //TH0装载初值
  185.               TL0=(65536-50000)%256;                                                        //TL0装载初值
  186.               time_multiply++;                                                                      //计时变量加1
  187.               if(time_multiply>=20)                                                        //判断计时变量是否大于20
  188.               {
  189.                             time_multiply=0;                                                        //计时变量大于20,则把计时变量清零
  190.                             time_flag--;                                                                      //倒计时的秒数减1
  191.                            
  192.                             if(traffic_flag==0)                                          //若traffic_flag为0,则进入南北通行模式
  193.                             {
  194.                                           if(time_flag>2)                                          //南北通行倒计时进行中
  195.                                           {
  196.                                                         south_north_allow();//南北通行红绿灯输出
  197.                                                         a=time_flag;
  198.                                                         b=time_flag;
  199.                                                         c=time_flag-3;
  200.                                                         d=time_flag-3;                                          
  201.                                           }
  202.                                           else if(time_flag>0)               //若倒计时时间小于2秒
  203.                                           {                                                         
  204.                                                         sn_red=1;
  205.                                                         sn_green=1;
  206.                                                         sn_yellow=0;                                                         //此时南北黄灯亮2秒
  207.                                                         ew_red=0;                                                                      //此时东西仍然是红灯亮
  208.                                                         ew_green=1;
  209.                                                         ew_yellow=1;
  210.                                                         a=time_flag;
  211.                                                         b=time_flag;
  212.                                                         c=0;
  213.                                                         d=0;
  214.                                                                                    
  215.                                           }
  216.                                           else
  217.                                           {
  218.                                                         traffic_flag=1;                                          //此时南北通行计时结束,改为东西通行模式
  219.                                                         time_flag= east_weat_time;              //东西通行时间变量赋值
  220.                                           }                           
  221.                             }
  222.                             if(traffic_flag==1)                                                          //此时为东西通行模式            
  223.                             {
  224.                                           if(time_flag>2)                                                                      //东西通行计时未结束
  225.                                           {
  226.                                                         east_west_allow();                               //东西通行红绿灯输出
  227.                                                         c=time_flag;                                                        //北时间
  228.                                                         d=time_flag;                                                        //南时间
  229.                                                         a=time_flag-3;                                                        //西时间
  230.                                                         b=time_flag-3;                                                        //东时间
  231.                                                                                                    
  232.                                           }
  233.                                           else if(time_flag>0)
  234.                                           {                                                         
  235.                                                       
  236.                                                         ew_red=1;                                                                      //此时东西黄灯亮2秒
  237.                                                         ew_green=1;
  238.                                                         ew_yellow=0;
  239.                                                         sn_red=0;                                                                      //此时南北仍然是红灯亮
  240.                                                         sn_green=1;
  241.                                                         sn_yellow=1;
  242.                                                         c=time_flag;
  243.                                                         d=time_flag;
  244.                                                         a=0;
  245.                                                         b=0;                                                                     
  246.                                           }
  247.                                           else
  248.                                           {
  249.                                                         traffic_flag=0;                                          //此时东西通行计时结束,改为东西通行模式
  250.                                                         time_flag= sou_nor_time;              //南北通行时间变量赋值
  251.                                           }                             
  252.                             }                                         
  253.               }
  254.               else if(time_multiply>=10)                                                        //判断计时变量是否大于20
  255.               {            
  256.                             if(traffic_flag==0)                                          //若traffic_flag为0,则进入南北通行模式
  257.                             {
  258.                                           if(time_flag>2)                                          //南北通行倒计时进行中
  259.                                           {
  260.                                                         south_north_allow();//南北通行红绿灯输出                                          
  261.                                           }
  262.                                           else if(time_flag>0)               //若倒计时时间小于2秒
  263.                                           {                                                         
  264.                                                         sn_red=1;
  265.                                                         sn_green=1;
  266.                                                         sn_yellow=1;                                                         //此时南北黄灯亮2秒
  267.                                                         ew_red=0;                                                                      //此时东西仍然是红灯亮
  268.                                                         ew_green=1;
  269.                                                         ew_yellow=1;                           
  270.                                           }
  271.                                           else
  272.                                           {
  273.                                                         traffic_flag=1;                                          //此时南北通行计时结束,改为东西通行模式
  274.                                                         time_flag= east_weat_time;              //东西通行时间变量赋值
  275.                                           }                           
  276.                             }
  277.                             if(traffic_flag==1)                                                          //此时为东西通行模式            
  278.                             {
  279.                                           if(time_flag>2)                                                                      //东西通行计时未结束
  280.                                           {
  281.                                                         east_west_allow();                               //东西通行红绿灯输出                                          
  282.                                           }
  283.                                           else if(time_flag>0)
  284.                                           {                                                         
  285.                                                       
  286.                                                         ew_red=1;                                                                      //此时东西黄灯亮2秒
  287.                                                         ew_green=1;
  288.                                                         ew_yellow=1;
  289.                                                         sn_red=0;                                                                      //此时南北仍然是红灯亮
  290.                                                         sn_green=1;
  291.                                                         sn_yellow=1;                                                                     
  292.                                           }
  293.                                           else
  294.                                           {
  295.                                                         traffic_flag=0;                                          //此时东西通行计时结束,改为东西通行模式
  296.                                                         time_flag= sou_nor_time;              //南北通行时间变量赋值
  297.                                           }                             
  298.                             }                                         
  299.               }                                 
  300.               }
复制代码

实验一.doc

176 KB, 下载次数: 149, 下载积分: 黑币 -5

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

使用道具 举报

沙发
ID:453602 发表于 2018-12-24 16:35 | 只看该作者
真的是非常的有用
回复

使用道具 举报

板凳
ID:607466 发表于 2019-9-4 15:50 | 只看该作者
dogjijrk 发表于 2018-12-24 16:35
真的是非常的有用

楼主厉害
回复

使用道具 举报

地板
ID:607466 发表于 2019-9-4 15:51 | 只看该作者
dogjijrk 发表于 2018-12-24 16:35
真的是非常的有用

很有用谢谢分享
回复

使用道具 举报

5#
ID:607752 发表于 2019-9-8 16:31 | 只看该作者
楼主厉害,感谢分享
回复

使用道具 举报

6#
ID:618858 发表于 2019-10-2 21:03 | 只看该作者
下载了附件但是仿真图还是看不清楚呢
回复

使用道具 举报

7#
ID:617465 发表于 2019-10-9 17:44 | 只看该作者
你这个原理图看不清楚啊,有没有清楚点的图啊
回复

使用道具 举报

8#
ID:718501 发表于 2020-3-30 22:18 来自手机 | 只看该作者
定时器中断服务程序这么长行吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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