找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 500|回复: 3
收起左侧

mini51单片机开发板程序 为啥P1口全亮 而且数码管不显示啊?

[复制链接]
ID:1026861 发表于 2022-5-16 22:44 | 显示全部楼层 |阅读模式
  1. #include <reg51.h>
  2. #define        uchar        unsigned char
  3. #define        uint        unsigned int
  4. /*****定义控制位**********************/
  5. sbit        K4=P3^2;                        //恢复正常
  6. sbit        K3=P3^3;                        //紧急(全部红灯)
  7. sbit        K2=P3^4;                        //东西通行
  8. sbit        K1=P3^5;                        //南北通行

  9. sbit        EW_LED2=P2^3;        //EW_LED2控制位
  10. sbit        EW_LED1=P2^2;        //EW_LED1控制位
  11. sbit        SN_LED2=P2^1;        //SN_LED2控制位
  12. sbit        SN_LED1=P2^0;        //SN_LED1控制位

  13. sbit  SN_Yellow=P1^6; //SN黄灯
  14. sbit  SN_Red=P1^7;    //SN红灯
  15. sbit  SN_Green=P1^5;  //SN绿灯
  16. sbit  EW_Yellow=P1^2; //EW黄灯
  17. sbit  EW_Red=P1^3;    //EW红灯
  18. sbit  EW_Green=P1^1;  //EW绿灯

  19. bit          Restore_flag=0;                        //恢复正常标志位
  20. bit   Flag_SN_Yellow;     //SN黄灯标志位
  21. bit   Flag_EW_Yellow;     //EW黄灯标志位
  22. char        Time_EW;  //东西方向倒计时单元
  23. char        Time_SN;  //南北方向倒计时单元
  24. uchar EW=25,SN=30;     //程序初始化赋值      
  25. uchar EW1=30,SN1=25;   //用于存放修改值的变量
  26. uchar KeyNumber=0;
  27. uchar code table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0~~~~9段选码
  28. uchar code S[9]={0X28,0X48,0X18,0X48,0X82,0X84,0X81,0X84,0x88};//交通信号灯控制代码

  29. /**********************延时子程序************************/
  30. void delay_ms(uint x) //延时ms
  31. {
  32.         uint i,j;
  33.         for(i=x;i>0;i--)
  34.         for(j=110;j>0;j--);
  35. }
  36. /*****************显示函数**************************/
  37. void Display(void)
  38. {
  39.         char h,l;
  40.         h=Time_EW/10;
  41.         l=Time_EW%10;
  42.   P0=table[l];EW_LED2=1;delay_ms(1);EW_LED2=0;
  43.   P0=table[h];EW_LED1=1;delay_ms(1);EW_LED1=0;                                //东西方向数码管显示
  44.       
  45.         h=Time_SN/10;
  46.         l=Time_SN%10;
  47.         P0=table[l];SN_LED2=1;delay_ms(1);SN_LED2=0;
  48.   P0=table[h];SN_LED1=1;delay_ms(1);SN_LED1=0;                                //南北方向数码管显示      
  49. }

  50. /**********************INT0中断服务程序(按键扫描)*****************/
  51. void int0_FXR() interrupt 0
  52. {
  53.         uchar FXR=P2;
  54.         FXR=FXR&0Xf0;
  55.         switch(FXR)
  56.                 {
  57.                 case 0x70 : KeyNumber = 1; break;
  58.                 case 0xb0 : KeyNumber = 2; break;
  59.                 case 0xd0 : KeyNumber = 3; break;
  60.                 case 0xe0 : KeyNumber = 4; break;
  61.                 default:KeyNumber = 0;
  62.                 }
  63. }
  64. /**********************T0中断服务程序*******************/
  65. void timer0()  interrupt 1
  66. {
  67.         static uchar count;                         //count为静态变量初值为0
  68.         TL0 = 0xB0;                                                          //重赋定时初值50ms
  69.         TH0 = 0x3C;                                                         //重赋定时初值50ms
  70.         count++;                                                                 //计数
  71.         if(count==10)                                           //加快闪烁速度
  72.         {
  73.           if(Flag_SN_Yellow==1)  //测试南北黄灯标志位
  74.           {SN_Yellow=~SN_Yellow;}//南北黄灯闪烁
  75.           if(Flag_EW_Yellow==1)  //测试东西黄灯标志位
  76.           {EW_Yellow=~EW_Yellow;}//东西黄灯闪烁
  77.         }
  78.         if(count==20)                                                                         //20*50=1000ms=1S      
  79.         {
  80.                 Time_EW--;                                                                         //东西方向倒计时
  81.                 Time_SN--;                                                                   //南北方向倒计时
  82.         if(Flag_SN_Yellow==1)                                        //测试南北黄灯标志位
  83.             {SN_Yellow=~SN_Yellow;}                //南北黄灯闪烁
  84.         if(Flag_EW_Yellow==1)                                        //测试东西黄灯标志位
  85.             {EW_Yellow=~EW_Yellow;}                //东西黄灯闪烁
  86.         count=0;
  87.         }
  88. }
  89. void keyboard()
  90. {
  91. while(KeyNumber)
  92.         {
  93.         if(KeyNumber)
  94.                 {
  95.                 if(KeyNumber==1)
  96.                         {
  97.                                 TR0=0;
  98.                                 Time_EW=0;                                                        //东西数码管赋值0s      
  99.                                 Time_SN=0;                                                        //南北数码管赋值0s                                               
  100.                                 while(KeyNumber==1)                       
  101.                                 {
  102.                                   Flag_EW_Yellow=0;          //东西关黄灯显示信号
  103.                                         P1=S[0];                                                 //南北通行,东西红灯
  104.                                         Display();                                  //调用显示函数                          
  105.                                 }
  106.                   }
  107.                 if(KeyNumber==2)
  108.                         {      
  109.                                 TR0=0;
  110.                                 Time_EW=0;                                                        //东西数码管赋值0s      
  111.                                 Time_SN=0;                                                        //南北数码管赋值0s
  112.                                 while(KeyNumber==2)                       
  113.                                         {  
  114.                                                 Flag_SN_Yellow=0;          //东西关黄灯显示信号                          
  115.                                                 P1=S[4];                                                         //东西通行,南北红灯
  116.                                                 Display();                                          //调用显示函数
  117.                                         }
  118.                         }
  119.                 if(KeyNumber==3)
  120.                         {      
  121.                                 TR0=0;
  122.                                 Time_EW=0;                                                         //东西数码管赋值0s
  123.                                 Time_SN=0;                                                         //南北数码管赋值0s
  124.                                 while(KeyNumber==3)
  125.                                         {
  126.                                                 P1=S[8];                                                          //所有路口红灯
  127.                                                 Display();                                           //调用显示函数
  128.                                         }
  129.                         }
  130.                 if(KeyNumber==4)
  131.                         {
  132.                                 TR0=1;
  133.                                 Time_EW=25;                                                        //东西数码管赋值25s      
  134.                                 Time_SN=30;                                                        //南北数码管赋值30s
  135.                                 Restore_flag=1;
  136.                                 break;
  137.                         }
  138.                 }
  139.         }
  140. }
  141. /*********************主程序开始**********************/
  142. void main(void)
  143. {
  144. /*********************中断初始化**********************/
  145.         IT0=1;                                                                         //设置外部中断0触发方式(下降沿触发)
  146.         EX0=1;                                                                         //打开外部中断0的IE寄存器中断
  147.         EA=1;                                                                           //CPU开中断总允许
  148.         ET0=1;                                                                         //开定时中断
  149.         TMOD=0x01;                                                         //定时器工作于方式1
  150.         TL0 = 0xB0;                                                          //设置定时初值50ms
  151.         TH0 = 0x3C;                           //设置定时初值50ms
  152.         TF0 = 0;                             //清除TF0标志
  153.         TR0 = 1;                             //定时器0开始计时
  154. while(1)                                                                              
  155.         {
  156.                 keyboard();
  157.                 if(Restore_flag)
  158.                 break;               
  159.                 /*******S1状态(东西直行状态)**********/
  160.                 Time_EW=EW;                                                        //东西数码管赋值25s      
  161.                 Time_SN=SN;                                                        //南北数码管赋值30s
  162.           while(Time_SN>=6)                                //南北方向倒计时前25s循环体
  163.            {  
  164.                          Flag_SN_Yellow=0;          //东西关黄灯显示信号                          
  165.                          P1=S[4];                                                         //东西通行,南北红灯
  166.                          Display();                                          //调用显示函数
  167.                          keyboard();
  168.                          if(Restore_flag)
  169.                          break;
  170.                  }
  171.                 /*******S2状态(东西直行黄灯闪烁状态)**********/
  172.             P1=0x00;                                                        //所有路口红绿灯短时熄灭
  173.                  if(Time_SN==5)                                        //当南北倒计时为5s时
  174.                                 Time_EW=5;                                        //东西重新从5s开始倒计时
  175.           while(Time_SN>=1)                                //南北方向倒计时最后5s循环体
  176.            {
  177.                          Flag_EW_Yellow=1;                //东西开黄灯信号位
  178.              SN_Red=1;                                                //东西黄灯开始闪烁,南北红灯亮      
  179.              Display();                                                //调用显示函数
  180.                          keyboard();
  181.                          if(Restore_flag)
  182.                          break;                        
  183.            }
  184.                 /***********赋值(东西通行变南北通行)**********/
  185.                 EW=EW1;                                                                        //东西25s-->30s
  186.                 SN=SN1;                                                                        //南北30s-->25s         
  187.                 /*******S3状态(南北直行状态)**********/                       
  188.                 Time_EW=EW;                                                        //东西数码管赋值30s
  189.                 Time_SN=SN;                                                        //南北数码管赋值25s
  190.            while(Time_EW>=6)                        //东西方向倒计时前25s循环体
  191.             {
  192.                                 Flag_EW_Yellow=0;          //东西关黄灯显示信号
  193.                                 P1=S[0];                                                 //南北通行,东西红灯
  194.               Display();                                  //调用显示函数
  195.                                 keyboard();      
  196.                                 if(Restore_flag)
  197.                           break;               
  198.                   }
  199.                 /*******S4状态(南北直行黄灯闪烁状态)**********/
  200.                         P1=0X00;                                             //所有路口红绿灯短时熄灭
  201.                         if(Time_EW==5)                                //当东西倒计时为5s时
  202.                                 Time_SN=5;                                        //南北重新从5s开始倒计时
  203.                 while(Time_EW>=1)                                //东西方向倒计时最后5s循环体
  204.            {
  205.              Flag_SN_Yellow=1;          //南北开黄灯信号位
  206.                          EW_Red=1;            //南北黄灯开始闪烁,东西红灯亮
  207.              Display();                                    //调用显示函数
  208.                          keyboard();
  209.                          if(Restore_flag)
  210.                          break;                                 
  211.            }
  212.           /***********赋值(南北通行变东西通行)**********/
  213.           EW=SN1;                                                                        //东西30s-->25s
  214.                 SN=EW1;                                                                        //南北25s-->30s         
  215.         }
  216. }
复制代码


回复

使用道具 举报

ID:155507 发表于 2022-5-17 08:41 | 显示全部楼层
本帖最后由 angmall 于 2022-5-17 08:51 编辑
为啥P1口全亮 而且数码管不显示啊?

你控制的啊,因为P1口是上拉的。
  1.                 /*******S2状态(东西直行黄灯闪烁状态)**********/
  2.                 P1=0x00;                                          //所有路口红绿灯短时熄灭
复制代码

数码管 控制位要0才会显示的。
  1. h=Time_EW/10;
  2.         l=Time_EW%10;
  3.         P0=table[l];EW_LED2=1;delay_ms(1);EW_LED2=0;
  4.         P0=table[h];EW_LED1=1;delay_ms(1);EW_LED1=0;                                //东西方向数码管显示
复制代码

QX-Mini51Cct.jpg
回复

使用道具 举报

ID:979299 发表于 2022-5-17 09:45 | 显示全部楼层
交通灯程序可以在开发板上运行,但是对应的IO口不一定都能对上,你得根据实际电路改程序
回复

使用道具 举报

ID:1026861 发表于 2022-5-17 16:37 | 显示全部楼层
angmall 发表于 2022-5-17 08:41
你控制的啊,因为P1口是上拉的。

数码管 控制位要0才会显示的。

P1=0xff   吗?
h=Time_EW/10;
l=Time_EW%10;
P0=table[l];EW_LED2=0;delay_ms(1);EW_LED2=1;
P0=table[h];EW_LED1=0;delay_ms(1);EW_LED1=1;
这样吗?
                               
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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