找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3308|回复: 6
收起左侧

单片机交通灯调试的时候独立按键按下去没反应,其他正常 求各位前辈指教

[复制链接]
ID:473748 发表于 2019-2-1 17:20 | 显示全部楼层 |阅读模式
无按键按下时红灯和绿灯倒计时时间为30s,黄灯时间为5s,按键1有两种模式:第一种模式是改变宝田路时间,第二种模式(即再按一下按键1),改变前进路时间
按键2和按键3分别是在不同模式下时间加1和时间减1;按键4是交通管制时交通灯的不同状态。
单片机程序在附件中
  1. /**************************************************************************************
  2. *                              交通灯实验                                                                                                  *
  3. 实现现象:下载程序后,按照视频操作正确接线,呈现交通灯现象
  4. 注意事项:                                                                                                                                                                  
  5. ***************************************************************************************/

  6. #include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器

  7. typedef unsigned int u16;          //对数据类型进行声明定义
  8. typedef unsigned char u8;

  9. sbit LSA=P2^5;        //动态数码管位选
  10. sbit LSB=P2^6;
  11. sbit LSC=P2^7;

  12. //--定义使用的IO口--//
  13. #define GPIO_DIG   P0          //数码管段选

  14. #define GPIO_TRAFFIC P1                  
  15. #define        GPIO_TRAFFId P2

  16. sbit RED10   = P1^0;   //上人行道红灯
  17. sbit GREEN10 = P1^1;   //上人行道绿灯
  18. sbit RED11   = P1^2;        //宝田路红灯
  19. sbit YELLOW11= P1^3;        //宝田路黄灯
  20. sbit GREEN11 = P1^4;        //宝田路绿灯
  21. v

  22. sbit RED00   = P3^0;        //右人行道红灯
  23. sbit GREEN00 = P3^1;        //右人行道绿灯
  24. sbit RED01   = P1^5;        //前进路红灯
  25. sbit YELLOW01= P1^6;        //前进路黄灯
  26. sbit GREEN01 = P1^7;        //前进路绿灯
  27. u8 BT,QJ;
  28. u8 time=30;
  29. u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  30.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
  31. u8 DisplayData[8];
  32. u8 Second;                                 //倒计时时间
  33. u8 key_can;                                  //独立按键
  34. u8 men_1;                                   //按键模式
  35. u8  flag_jdgz;                           //交通管制



  36. /*******************************************************************************
  37. * 函 数 名         : delay
  38. * 函数功能                   : 延时函数,i=1时,大约延时10us
  39. *******************************************************************************/
  40. void delay(u16 i)
  41. {
  42.         while(i--);        
  43. }

  44. /*******************************************************************************
  45. * 函 数 名         : DigDisplay
  46. * 函数功能                   : 数码管动态扫描函数,循环扫描8个数码管显示
  47. *******************************************************************************/
  48. void DigDisplay()
  49. {
  50.         u8 i;
  51.         for(i=0;i<8;i++)
  52.         {
  53.                 switch(i)         //位选,选择点亮的数码管,
  54.                 {
  55.                         case(0):
  56.                                 LSA=0;LSB=0;LSC=0; break;//显示第0位
  57.                         case(1):
  58.                                 LSA=1;LSB=0;LSC=0; break;//显示第1位
  59.                         case(2):
  60.                                 LSA=0;LSB=1;LSC=0; break;//显示第2位
  61.                         case(3):
  62.                                 LSA=1;LSB=1;LSC=0; break;//显示第3位
  63.                         case(4):
  64.                                 LSA=0;LSB=0;LSC=1; break;//显示第4位
  65.                         case(5):
  66.                                 LSA=1;LSB=0;LSC=1; break;//显示第5位
  67.                         case(6):
  68.                                 LSA=0;LSB=1;LSC=1; break;//显示第6位
  69.                         case(7):
  70.                                 LSA=1;LSB=1;LSC=1; break;//显示第7位        
  71.                 }
  72.                 GPIO_DIG=DisplayData[i];//发送段码
  73.                 delay(100); //间隔一段时间扫描        
  74.                 GPIO_DIG=0x00;//消隐
  75.         }
  76. }


  77. /*******************************************************************************
  78. * 函 数 名         : Timer0Init
  79. * 函数功能                   : 定时器0初始化
  80. * 输    入         : 无
  81. * 输    出         : 无
  82. *******************************************************************************/
  83. void Timer0Init()
  84. {
  85.         TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。

  86.         TH0=0XFC;        //给定时器赋初值,定时1ms
  87.         TL0=0X18;        
  88.         ET0=1;//打开定时器0中断允许
  89.         EA=1;//打开总中断
  90.         TR0=1;//打开定时器                        
  91. }


  92. void jtdzc()                          //正常时交通灯控制函数
  93. {
  94.         if(Second == 70)
  95.         {
  96.                         Second = 1;
  97.         }

  98.         if(Second < 31)
  99.         {
  100.                         DisplayData[0] = 0x00;
  101.                         DisplayData[1] = 0x00;
  102.                         DisplayData[2] = smgduan[(30 - Second) % 100 / 10];
  103.                         DisplayData[3] = smgduan[(30 - Second) %10];
  104.                         DisplayData[4] = 0x00;
  105.                         DisplayData[5] = 0x00;
  106.                         DisplayData[6] = DisplayData[2];
  107.                         DisplayData[7] = DisplayData[3];
  108.                         DigDisplay();

  109.                         //--宝田路通行--//

  110.                         GPIO_TRAFFIC = 0xFF;  //将所有的灯熄灭
  111.                         RED00 = 1;
  112.                         GREEN00 = 1;

  113.                         GREEN11 = 0;    //宝田路绿灯亮                        
  114.                         GREEN10        = 0;    //上人行道绿灯亮

  115.                         RED01 = 0;      //前进路红灯亮
  116.                         RED00 = 0;      //右人行红灯亮
  117.                 }

  118.                 //--黄灯等待切换状态,5秒--//
  119.                 else if(Second < 36)
  120.                 {
  121.                         DisplayData[0] = 0x00;
  122.                         DisplayData[1] = 0x00;
  123.                         DisplayData[2] = smgduan[(35 - Second) % 100 / 10];
  124.                         DisplayData[3] = smgduan[(35 - Second) %10];
  125.                         DisplayData[4] = 0x00;
  126.                         DisplayData[5] = 0x00;
  127.                         DisplayData[6] = DisplayData[2];
  128.                         DisplayData[7] = DisplayData[3];
  129.                         DigDisplay();

  130.                         //--黄灯阶段--//

  131.                         GPIO_TRAFFIC = 0xFF;  //将所有的灯熄灭
  132.                         RED00 = 1;
  133.                         GREEN00 = 1;

  134.                         YELLOW11 = 0;    //宝田路黄灯亮                        
  135.                         RED10        = 0;     //上人行道红灯亮

  136.                         YELLOW01 = 0;    //前进路红灯亮
  137.                         RED00 = 0;       //右人行道红灯亮
  138.                 }

  139.                 //--前进路通行--//
  140.                 else if(Second < 66)
  141.                 {
  142.                         DisplayData[0] = 0x00;
  143.                         DisplayData[1] = 0x00;
  144.                         DisplayData[2] = smgduan[(65 - Second) % 100 / 10];
  145.                         DisplayData[3] = smgduan[(65 - Second) %10];
  146.                         DisplayData[4] = 0x00;
  147.                         DisplayData[5] = 0x00;
  148.                         DisplayData[6] = DisplayData[2];
  149.                         DisplayData[7] = DisplayData[3];
  150.                         DigDisplay();

  151.                         //--黄灯阶段--//

  152.                         GPIO_TRAFFIC = 0xFF;  //将所有的灯熄灭
  153.                         RED00 = 1;
  154.                         GREEN00 = 1;

  155.                         RED11 = 0;       //宝田路红灯亮                        
  156.                         RED10 = 0;       //上人行道红灯亮

  157.                         GREEN01 = 0;     //前进路绿灯亮
  158.                         GREEN00 = 0;     //右人行道绿灯亮
  159.                 }

  160.                 //--黄灯等待切换状态,5秒--//
  161.                 else
  162.                 {
  163.                         DisplayData[0] = 0x00;
  164.                         DisplayData[1] = 0x00;
  165.                         DisplayData[2] = smgduan[(70 - Second) % 100 / 10];
  166.                         DisplayData[3] = smgduan[(70 - Second) %10];
  167.                         DisplayData[4] = 0x00;
  168.                         DisplayData[5] = 0x00;
  169.                         DisplayData[6] = DisplayData[2];
  170.                         DisplayData[7] = DisplayData[3];
  171.                         DigDisplay();

  172.                         //--黄灯阶段--//

  173.                         GPIO_TRAFFIC = 0xFF;  //将所有的灯熄灭
  174.                         RED00 = 1;
  175.                         GREEN00 = 1;

  176.                         YELLOW11 = 0;    //宝田路黄灯亮                        
  177.                         RED10        = 0;     //上人行道红灯亮

  178.                         YELLOW01 = 0;    //前进路红灯亮
  179.                         RED00 = 0;       //右人行道红灯亮
  180.                 }        
  181. }                                       

  182. void DULIANJIAN()               //独立按键模块
  183. {        
  184.         GPIO_TRAFFId|=0x1f;                        //P2口
  185.         if((GPIO_TRAFFId)&(0x0f)!=0x0f)                //判断按键
  186.         {                                                                        //延时
  187.                 delay(100);
  188.                 if((GPIO_TRAFFId)&(0x1f)!=0x1f)
  189.                 {
  190.                         switch((GPIO_TRAFFId)&(0x1f))        //按键键位的确定
  191.                         {
  192.                                 case(0x0e):key_can=1;break;
  193.                                 case(0x0d):key_can=2;break;
  194.                                 case(0x0b):key_can=3;break;
  195.                                 case(0x07):key_can=4;break;

  196.                         }
  197.                
  198.                 }
  199.         }

  200. }
  201. void DULIANJIANCAOZUO()     //各按键所要执行的功能
  202. {
  203.         key_can=20;
  204.         
  205.         if(key_can==4)                   //交通管制状态
  206.         {
  207.                 flag_jdgz ++;
  208.                 if(flag_jdgz>=5)
  209.                 {
  210.                         flag_jdgz=0;
  211.                 }
  212.                 if(flag_jdgz==1)
  213.                 {
  214.                         GPIO_TRAFFIC = 0xFF;  //将所有的灯熄灭
  215.                         RED00 = 1;
  216.                         GREEN00 = 1;


  217.                         RED10 = 0;       //各路所有红灯亮
  218.                         RED11=0;         
  219.                         RED00=0;                 //
  220.                         RED01=0;
  221.                 }
  222.                 if(flag_jdgz==2)
  223.                 {
  224.                         GPIO_TRAFFIC = 0xFF;  //将所有的灯熄灭
  225.                         RED00 = 1;
  226.                         GREEN00 = 1;
  227.                         
  228.                         GREEN10=0;                           //上人行道绿灯亮
  229.                         GREEN11=0;                           //宝田路绿灯亮
  230.                         RED00=0;                           //右人行道红灯
  231.                         RED01=0;                           //前进路红灯
  232.                 }
  233.                 if(flag_jdgz==3)
  234.                 {
  235.                         GPIO_TRAFFIC = 0xFF;  //将所有的灯熄灭
  236.                         RED00 = 1;
  237.                         GREEN00 = 1;
  238.                         
  239.                         RED10=0;                          //上人行红灯
  240.                         RED11=0;                          //宝田路红灯
  241.                         GREEN00=0;                          //右人行道绿灯
  242.                         GREEN01=0;                           //前进路绿灯
  243.                 }
  244.                 if(flag_jdgz==4)
  245.                 {
  246.                         GPIO_TRAFFIC = 0xFF;  //将所有的灯熄灭
  247.                         RED00 = 1;
  248.                         GREEN00 = 1;
  249.                         
  250.                         GREEN10=0;                          //各路绿灯亮
  251.                         GREEN11=0;
  252.                         GREEN00=0;
  253.                         GREEN01=0;
  254.                 }
  255.                 if(flag_jdgz==5)
  256.                 {
  257.                         GPIO_TRAFFIC = 0xFF;  //将所有的灯熄灭
  258.                         RED00 = 1;
  259.                         GREEN00 = 1;
  260.                         
  261.                         RED10=0;                           //人行道红灯 前进路宝田路黄灯
  262.                         YELLOW11=0;
  263.                         RED00=0;
  264.                         YELLOW01=0;                                
  265.                 }                        
  266.                         
  267.         
  268.         }
  269.         if(key_can==1)                                   //键值为1
  270.         {
  271.                
  272.                 men_1++;                                   //模式选择
  273.                 if(men_1>=3)
  274.                 {
  275.                         men_1=0;
  276.                 }
  277.         }
  278.         if(men_1==1)                                   //模式为1时  
  279.         {                                                           //独立按键2功能为宝田路倒计时时间加1
  280.                 if(key_can==2)
  281.                 {
  282.                         time++;
  283.                         if(time>99)
  284.                         {
  285.                                 time=0;
  286.                         }
  287.                 }
  288.                 if(key_can==3)                          //独立按键3功能为宝田路倒计时时间减1
  289.                 {
  290.                         time--;
  291.                         if(time<10)
  292.                         {
  293.                                 time=10;
  294.                         }

  295.                 }
  296.                 DisplayData[0] = 0x00;                                         //显示前进路调整后的时间
  297.                 DisplayData[1] = 0x00;
  298.                 DisplayData[2] = smgduan[time/10];
  299.                 DisplayData[3] = smgduan[time%10];
  300.                 DisplayData[4] = 0x00;
  301.                 DisplayData[5] = 0x00;
  302.                 DisplayData[6] = DisplayData[10];
  303.                 DisplayData[7] = DisplayData[10];
  304.                 DigDisplay();                        
  305.         }
  306.         if(men_1==2)                                                                   //模式2时
  307.         {                                                                                           //前进路时间加1
  308.                 if(key_can==2)
  309.                 {
  310.                         time++;
  311.                         if(time>99)
  312.                         {
  313.                                 time=0;
  314.                         }
  315.                 }
  316.                 if(key_can==3)                                                                //前进路时间减1
  317.                 {
  318.                         time--;
  319.                         if(time<10)
  320.                         {
  321.                                 time=10;
  322.                         }

  323.                 }
  324.                 DisplayData[0] = 0x00;                                                                           //显示调整后的时间
  325.                 DisplayData[1] = 0x00;
  326.                 DisplayData[2] = smgduan[11];
  327.                 DisplayData[3] = smgduan[11];
  328.                 DisplayData[4] = 0x00;
  329.                 DisplayData[5] = 0x00;
  330.                 DisplayData[6] = DisplayData[time/10];
  331.                 DisplayData[7] = DisplayData[time%10];
  332.                 DigDisplay();                        
  333.         }

  334. }


  335. void main()
  336. {
  337.         Timer0Init();
  338.         while(1)
  339.         {
  340.                  if(key_can<20)
  341.                 {
  342.                         
  343.                         DULIANJIANCAOZUO();               
  344.                 }
  345.                
  346.                 if((men_1==0)&&(flag_jdgz == 0))
  347.                 {
  348.                         jtdzc();        
  349.                
  350.                 }
  351.                 DULIANJIAN();
  352.            
  353.         }        

  354. }




  355. /*******************************************************************************
  356. * 函 数 名         : void Timer0() interrupt 1
  357. * 函数功能                   : 定时器0中断函数
  358. * 输    入         : 无
  359. * 输    出         : 无
  360. *******************************************************************************/

  361. void time0()interrupt 1
  362. {
  363.         static u16 i;
  364.         TH0=0XFC;        //给定时器赋初值,定时1ms
  365.         TL0=0X18;
  366.         i++;
  367.         if(i==1000)
  368.         {
  369.                 i=0;
  370.                 Second ++;        
  371.         }        
  372. }
复制代码

交通灯.docx

16.33 KB, 下载次数: 8

回复

使用道具 举报

ID:473186 发表于 2019-2-1 18:54 | 显示全部楼层
电路图也上上来看看,应该不难

评分

参与人数 3黑币 +57 收起 理由
shuisheng60 + 35
找人PK + 12
sheng7533967 + 10

查看全部评分

回复

使用道具 举报

ID:213173 发表于 2019-2-1 20:20 | 显示全部楼层
void DULIANJIAN()               //独立按键模块
{        
        GPIO_TRAFFId=0x0f;                        //P2口
        if(GPIO_TRAFFId!=0x0f)                //判断按键
        {                                 
                delay(100); //延时
                if(GPIO_TRAFFId!=0x0f)
                {
                        switch(GPIO_TRAFFId)        //按键键位的确定
                        {
                                case(0x0e):key_can=1;break;
                                case(0x0d):key_can=2;break;
                                case(0x0b):key_can=3;break;
                                case(0x07):key_can=4;break;
                        }
                        while(!GPIO_TRAFFId);
                }
        }
}
回复

使用道具 举报

ID:473748 发表于 2019-2-3 14:46 | 显示全部楼层
wulin 发表于 2019-2-1 20:20
void DULIANJIAN()               //独立按键模块
{        
        GPIO_TRAFFId=0x0f;                       ...

试过了还是不行,还是要感谢你,新春快乐
回复

使用道具 举报

ID:473748 发表于 2019-2-3 14:55 | 显示全部楼层
zhengchong60 发表于 2019-2-1 18:54
电路图也上上来看看,应该不难

这是我的设计图截屏   有点迟了,如果有时间的话请帮我看看,新春快乐!

QQ截图20190203145108.png
回复

使用道具 举报

ID:473748 发表于 2019-2-3 15:44 | 显示全部楼层
zhengchong60 发表于 2019-2-1 18:54
电路图也上上来看看,应该不难

这个是我仿照开发板的电路设计的,静态数码管,34位显示宝田路时间,78位显示前进路时间
回复

使用道具 举报

ID:213173 发表于 2019-2-4 08:48 | 显示全部楼层
lhblhb 发表于 2019-2-3 14:46
试过了还是不行,还是要感谢你,新春快乐

看了你的电路图,P2高4位还有其他用途,所以判断按键时不能随意改变P2状态。可以这样写:
void DULIANJIAN()                        //独立按键模块
{        
        u8 i;                                        //临时变量
        i=GPIO_TRAFFId;                        //读P2口赋值变量i
        i&=0x0f;                                 //高4位清0,保留低4位
        if(i!=0x0f)                                //判断有键按下
        {
                delay(100);                        //延时
                if(i!=0x0f)                        //确认有键按下
                {
                        switch(i)                //按键键位的确定
                        {
                                case(0x0e):key_can=1;break;
                                case(0x0d):key_can=2;break;
                                case(0x0b):key_can=3;break;
                                case(0x07):key_can=4;break;
                        }
                }
        }
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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