找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机交通灯,请大家帮忙看看程序哪里有错误

[复制链接]
跳转到指定楼层
楼主
ID:870327 发表于 2020-12-29 16:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序在Proteus上可以运行成功,在开发板连接之后中断返回有点问题(应该是功能函数那个地方),请大家帮忙看看是哪里有问题
  1. #include <reg51.h>
  2. #define        uint unsigned int
  3. #define uchar unsigned char
  4. //南北为次干道
  5. sbit Blue_nb=P2^7;                                                 //南北左转标志
  6. sbit Red_nb=P2^6;                                //南北红灯标志
  7. sbit Yellow_nb=P2^5;                        //南北黄灯标志
  8. sbit Green_nb=P2^4;                     //南北绿灯标志
  9. //东西为主干道
  10. sbit Blue_dx=P2^0;                                                //东西左转标志
  11. sbit Red_dx=P2^3;                                //东西红灯标志
  12. sbit Yellow_dx=P2^2;                        //东西黄灯标志
  13. sbit Green_dx=P2^1;                                //东西绿灯标志

  14. sbit set=P3^6;
  15. sbit key1=P3^4;
  16. sbit key2=P3^5;


  17. bit dx_nb=0;                                        //东西南北控制位
  18. bit Yellow_status=0;                        //黄灯闪烁标志位

  19. unsigned int  sec_dx;                             //东西方向时间存储变量
  20. unsigned int  sec_nb;                                      //南北方向时间存储变量
  21. float  set_timedx=15;                                    //东西方向的通行单次时间
  22. float  set_timenb=15;                                    //南北方向的通行单次时间
  23. unsigned char  buf[4];                                    //秒显示的变量
  24. unsigned char data countt0;             //定时器0中断定时器

  25. unsigned int Temp;
  26. unsigned char flag_option=0;            //功能选择: 紧急模式
  27. sbit beep=P3^3;                                                         //蜂鸣器
  28. sbit  key_EP=P3^2;                                //紧急模式
  29. unsigned char conut_ER;                 //紧急状态



  30. unsigned char code led[11]={                //共阳极字型码
  31.     0xc0,  //--0
  32.     0xf9,  //--1
  33.     0xa4,  //--2
  34.     0xb0,  //--3
  35.     0x99,  //--4
  36.     0x92,  //--5
  37.     0x82,  //--6
  38.     0xf8,  //--7
  39.     0x80,  //--8
  40.     0x90,  //--9
  41.     0x00   //--NULL
  42. };



  43. /*延时函数*/
  44. void delay(int time)
  45. {
  46.     unsigned int j,k;
  47.     for(j=0;j<time;j++)                       
  48.        for(k=0;k<124;k++);               
  49. }

  50. /*显示函数*/
  51. void display(void)
  52. {
  53.     buf[0]=sec_dx/10;                 //第1位 东西十位
  54.     buf[1]=sec_dx%10;                 //第2位 东西个位
  55.     P1=0x40;                           //LED1
  56.     P0=led[buf[0]];                    //东西十位
  57.     delay(1);
  58.     P1=0x80;                     //LED2
  59.     P0=led[buf[1]];                    //东西个位
  60.     delay(1);
  61.         buf[2]=sec_nb/10;                //南北十位
  62.         buf[3]=sec_nb%10;                //南北个位
  63.         P1=0x01;
  64.         P0=led[buf[2]];
  65.         delay(1);
  66.         P1=0x02;
  67.         P0=led[buf[3]];
  68.         delay(1);               

  69. }

  70. /*功能函数*/
  71. void function(void)
  72. {
  73.                            
  74.             conut_ER=1-conut_ER;
  75.             if(conut_ER==1)
  76.             {      
  77.                                  
  78.                 TR0=0;                                                //关交通灯定时器
  79.                                         Temp=P2;
  80.                 P2=0x00;                                        //关全部信号灯
  81.                 Red_dx=1;                   //全部置红灯
  82.                 Red_nb=1;
  83.                             beep=0;
  84.                
  85.                               
  86.             }               
  87.             if(conut_ER==0)
  88.             {
  89.                  TR0=1;                                                //开交通灯定时器
  90.                        P2=Temp;
  91.                                 beep=1;
  92.                           
  93.             }      
  94.             flag_option=0;      

  95.         }



  96. /*处理整个交通灯计时*/
  97. void time0(void) interrupt 1 using 1          //定时中断子程序
  98. {
  99.     TH0=0x4C;                                                        //重赋初值;11.0592m晶振50ms
  100.     TL0=0X00;
  101.     TR0=1;                                                                //开交通灯定时器
  102.     countt0++;                                                        //计数器数加1(用于计算时间)

  103.     if(countt0==20)                                  //定时器中断次数=20时(即1秒时)
  104.     {      
  105.         countt0=0;                                                //清零计数器
  106.         sec_dx--;                                                //东西时间减1
  107.         sec_nb--;                                                //南北时间减1
  108.                
  109.         if(sec_nb==5&&sec_dx==0&&(Yellow_status==0))                //当南北倒计时到5s时,用于黄灯闪烁时间
  110.         {
  111.                    sec_dx=5;
  112.             Yellow_status=1;
  113.         }
  114.         if(sec_dx==5&&sec_nb==0&&(Yellow_status==0))                 //当东西倒计时到5s时,用于黄灯闪烁时间
  115.         {
  116.             sec_nb=5;
  117.             Yellow_status=1;                        //启动黄灯开始倒计时
  118.         }
  119.         if((sec_nb<=5)&&(dx_nb==0)&&(Yellow_status==1))                  //东西黄灯闪
  120.         {
  121.             Blue_dx=0;
  122.             Yellow_dx=~Yellow_dx;
  123.         }
  124.         if((sec_dx<=5)&&(dx_nb==1)&&(Yellow_status==1))                  //南北黄灯闪
  125.         {
  126.             Blue_nb=0;
  127.             Yellow_nb=~Yellow_nb;
  128.         }
  129.         if(dx_nb==0&&sec_nb==0&&sec_dx==0)                                    //东西通行:当黄灯时间、通行方向倒计时到0时
  130.         {
  131.             P2=0x00;                                        //重置东西南背方向的红绿灯
  132.             Green_nb=1;                                        //南北绿灯亮
  133.             Red_dx=1;                                        //东西红灯亮
  134.             dx_nb=!dx_nb;                                //交换通行方向
  135.             Yellow_status=0;                        //关闭黄灯闪烁
  136.             sec_dx=set_timedx+25;                        //重赋东西方向的起始值
  137.             sec_nb=set_timenb+5;                //重赋南北方向的起始值
  138.         }
  139.         if(dx_nb==1&&sec_dx==0&&sec_nb==0)                                    //南北通行:当黄灯时间、通行方向倒计时到0时
  140.         {
  141.             P2=0X00;                                        //重置东西南北的红绿灯状态
  142.             Green_dx=1;                                        //东西绿灯亮
  143.             Red_nb=1;                                        //南北红灯亮
  144.             dx_nb=!dx_nb;                                //交换通行方向
  145.             Yellow_status=0;                                        //关闭黄灯闪烁
  146.             sec_dx=set_timedx+25;                //重赋东西方向的起始值
  147.             sec_nb=set_timenb+45;                        //重赋南北方向的起始值
  148.         }
  149.                 if(dx_nb==0&&sec_nb==20&&sec_dx==0)                 //东西通行:当东西直行绿灯倒数到0时
  150.                 {
  151.                         P2=0x00;
  152.                         Blue_dx=1;
  153.                         Red_nb=1;
  154.                         sec_dx=set_timedx;
  155.                         Yellow_status=0;
  156.                        
  157.                 }
  158.                 if(dx_nb==1&&sec_nb==0&&sec_dx==20)                 //南北通行:当南北直行绿灯倒数到0时
  159.                 {
  160.                         P2=0x00;
  161.                         Blue_nb=1;
  162.                         Red_dx=1;
  163.                         sec_nb=set_timedx;
  164.                         Yellow_status=0;
  165.                        
  166.                 }
  167.     }
  168. }

  169. void key_to1()
  170. {
  171.         TR0=0;         //关定时器
  172.                 if(set==0)
  173.                 {sec_nb++; //南北加1S
  174.                 sec_dx++;//东西加1S
  175.                 }
  176.                 else
  177.                 TR0=1;
  178.         if(sec_dx==100&sec_nb==100)           //东西黄灯闪烁
  179.         {
  180.                 sec_nb=5;
  181.                 sec_dx=5;
  182.         }
  183.         if(sec_nb==100)                //东西直行,南北禁止
  184.                 {
  185.                 sec_nb=60;
  186.                 sec_dx=40;
  187.                 }
  188.         if(sec_dx==100)                //南北直行,东西禁止
  189.                 {
  190.                 sec_nb=20;
  191.                 sec_dx=40;
  192.                 }
  193.         if(sec_nb==100&&sec_dx==95)         //东西左转,南北禁止
  194.         {
  195.                 sec_nb=20;
  196.                 sec_dx=15;
  197.         }      
  198.         if(sec_dx==100&&sec_nb==95)                //南北左转,东西禁止
  199.         {
  200.                 sec_nb=15;
  201.                 sec_dx=20;
  202.         }
  203.                
  204. }
  205. void key_to2()
  206. {
  207.         TR0=0;//关定时器
  208.                 if(set==0)
  209.                 {sec_nb--;  //南北减1S

  210.                 sec_dx--;  //东西减1S
  211.                 }
  212.                 else
  213.                 TR0=1;
  214.         if(sec_dx==0&sec_nb==0)         //南北黄灯闪烁
  215.         {
  216.                 sec_nb=5;
  217.                 sec_dx=5;
  218.         }      
  219.         if(sec_nb==0)                 //东西直行,南北禁止
  220.         {
  221.                 sec_nb=20;      
  222.                 sec_dx=40;
  223.                 }
  224.         if(sec_dx==0)                  //南北直行,东西禁止
  225.         {
  226.                 sec_nb=60;
  227.                 sec_dx=40;
  228.         }
  229.         if(sec_nb==5&&sec_dx==0)         //东西左转,南北禁止
  230.         {
  231.                 sec_nb=20;
  232.                 sec_dx=15;
  233.         }
  234.         if(sec_dx==5&&sec_nb==0)                //南北左转,东西禁止
  235.         {
  236.                 sec_nb=15;
  237.                 sec_dx=20;
  238.         }

  239. }
  240. void key()        //按键扫描子程序
  241. {
  242.         if(key1!=1)
  243.         {
  244.                 delay(10);
  245.                 if(key1!=1)
  246.                 {
  247.                         while(key1!=1);
  248.                         key_to1();
  249.                 }
  250.         }
  251.         if(key2!=1)
  252.         {
  253.                 delay(10);
  254.                 if(key2!=1)
  255.                 {
  256.                         while(key2!=1);
  257.                         key_to2();
  258.                 }
  259.         }
  260.         }
  261. //外部中断0
  262. void int0(void) interrupt 0 using 1            //紧急模式
  263. {
  264.     while(!key_EP)display();
  265.     flag_option=1;


  266. }


  267. /*初始化函数*/
  268. void init()
  269. {
  270.     TMOD=0X01;                                                           //定时器设置
  271.     TH0=0x4C;                                                        //TH0重赋初值;11.0592m晶振50ms
  272.     TL0=0X00;
  273.     TCON=0X10;                                                        //启动定时0
  274.     IE=0x83;                                                        //开总中断;定时器0中断开启;开外部中断
  275.     P2=0X42;                                                        //开始默认状态,东西红灯,南北绿灯      
  276.         beep=1;                                                                //beep为1,蜂鸣器不响
  277.     sec_nb=60;                                                        //南北方向初始时间
  278.     sec_dx=40;                                                        //东西方向初始时间
  279.         conut_ER=0;
  280. }

  281. //主程序
  282. void main()
  283. {
  284.     init();                                                                //初始化定时器、中断服务
  285.     while(1)                                                        
  286.     {         key(); //调用按键扫描程序
  287.         if(flag_option!=0)function();         //调用功能函数
  288.         display();                                                 //调用显示函数
  289.     }
  290. }
复制代码

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

使用道具 举报

沙发
ID:235200 发表于 2020-12-30 00:46 | 只看该作者
程序编译无错误,中断计时也无错误,但计时后的处理及信号灯的变化处理逻辑太混乱且复杂,可以简化
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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