普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 6247|回复: 1

交通灯求助

 关闭 [复制链接]

1

主题

1

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2018-9-4 21:45:41 | 显示全部楼层 |阅读模式
大佬们帮我看一下这个交通灯程序,为什么黄灯一直亮,而且为什么在second判断时不需要second>30&second<36

#include<reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
u8 code smgduan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
          0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};       //共阴
u8 SMGDATA[8];
sbit LSA=P2^7;
sbit LSB=P2^6;
sbit LSC=P2^5;

#define SMG P0
#define TRAFFIC P1
sbit SRred=P1^0;
sbit SRgreen=P1^1;
sbit Sred=P1^2;
sbit Syellow=P1^3;
sbit Sgreen=P1^4;

sbit XRred=P3^0;
sbit XRgreen=P3^1;
sbit Xred=P1^5;
sbit Xyellow=P1^6;
sbit Xgreen=P1^7;

u16 second;

void delay(u16 i)
{
  while(i--);
}
void DIG()
{  
    u8 i;
    for(i=0;i<8;i++)
    {
      switch(i)
      {
        case 0SA=0,LSB=0,LSC=0;break;
        case 1SA=1,LSB=0,LSC=0;break;
        case 2SA=0,LSB=1,LSC=0;break;
        case 3SA=1,LSB=1,LSC=0;break;
        case 4SA=0,LSB=0,LSC=1;break;
        case 5SA=1,LSB=0,LSC=1;break;
        case 6SA=0,LSB=1,LSC=1;break;
        case 7SA=1,LSB=1,LSC=1;break;
      }   
      SMG=SMGDATA[i];
      delay(100);
    }
}
void Timer0Init()
{
  TMOD=0x01;
  TH0=0xfc;
  TL0=0x18;
  ET0=1;
  EA=1;
  TR0=1;
   
}                          
void main()
{  
  second=1;
  Timer0Init();
  DIG();
  while(1){
  if(second==70)
  {
    second=1;
  }
  if(second<31)
  {
    SMGDATA[0]=0x00;
    SMGDATA[1]=0x00;
    SMGDATA[2]=smgduan[(30-second)%100/10];
    SMGDATA[3]=smgduan[(30-second)%10];
   
    SMGDATA[4]=0x00;
    SMGDATA[5]=0x00;
    SMGDATA[6]=SMGDATA[2];
    SMGDATA[7]=SMGDATA[3];
    DIG();
   
    SRred=1;
    SRgreen=0;
    Sred=1;
    Syellow=0;
    Sgreen=0;
   
    XRred=0;
    XRgreen=1;
    Xred=0;
    Xyellow=0;
    Xgreen=1;  
  }
  else if(second<36)
  {              
    SMGDATA[0]=0x00;
    SMGDATA[1]=0x00;
    SMGDATA[2]=smgduan[(35-second)%100/10];
    SMGDATA[3]=smgduan[(35-second)%10];
   
    SMGDATA[4]=0x00;
    SMGDATA[5]=0x00;
    SMGDATA[6]=SMGDATA[2];
    SMGDATA[7]=SMGDATA[3];
    DIG();
   
    SRred=1;
    SRgreen=0;
    Sred=1;
    Syellow=0;
    Sgreen=0;
   
    XRred=0;
    XRgreen=0;
    Xred=0;
    Xyellow=1;
    Xgreen=0;  
  }
  else if(&second<66)
  {
    SMGDATA[0]=0x00;
    SMGDATA[1]=0x00;
    SMGDATA[2]=smgduan[(65-second)%100/10];
    SMGDATA[3]=smgduan[(65-second)%10];
   
    SMGDATA[4]=0x00;
    SMGDATA[5]=0x00;
    SMGDATA[6]=SMGDATA[2];
    SMGDATA[7]=SMGDATA[3];
    DIG();
   
    SRred=1;
    SRgreen=0;
    Sred=1;
    Syellow=0;
    Sgreen=0;
   
    XRred=0;
    XRgreen=1;
    Xred=0;
    Xyellow=0;
    Xgreen=1;  
  }
  
  else
  {
    SMGDATA[0]=0x00;
    SMGDATA[1]=0x00;
    SMGDATA[2]=smgduan[(70-second)%100/10];
    SMGDATA[3]=smgduan[(70-second)%10];
   
    SMGDATA[4]=0x00;
    SMGDATA[5]=0x00;
    SMGDATA[6]=SMGDATA[2];
    SMGDATA[7]=SMGDATA[3];
    DIG();
   
    SRred=1;
    SRgreen=0;
    Sred=1;
    Syellow=0;
    Sgreen=0;
   
    XRred=0;
    XRgreen=0;
    Xred=0;
    Xyellow=1;
    Xgreen=0;  
  }
  }
}
void Timer0() interrupt 1
{
  static u16 i;
  TH0=0xfc;
  TL0=0x18;
  i++;
  if(i==1000)
  {
    i=0;
    second++;
  }
}
回复

使用道具 举报

20

主题

1344

帖子

8381

积分

论坛元老

Rank: 8Rank: 8

积分
8381
发表于 2018-9-5 08:32:36 | 显示全部楼层

J21跳线帽金接左边(VCC
JP8(P1)JP16
J12JP10(P0)
JP1JP11P2
J22P3.0P3.1
电路正确连接没?
程序示例:

  1. #include<reg51.h>



  2. //--定义使用的IO口--//

  3. #define GPIO_DIG   P0

  4. #define GPIO_PLACE P1



  5. #define GPIO_TRAFFIC P2



  6. sbit RED10   = P2^0;   //上人行道红灯

  7. sbit GREEN10 = P2^1;   //上人行道绿灯

  8. sbit RED11   = P2^2;

  9. sbit YELLOW11= P2^3;

  10. sbit GREEN11 = P2^4;



  11. sbit RED00   = P3^0;        //右人行道红灯

  12. sbit GREEN00 = P3^1;        //右人行道绿灯

  13. sbit RED01   = P2^5;

  14. sbit YELLOW01= P2^6;

  15. sbit GREEN01 = P2^7;



  16. //--定义全局变量--//

  17. unsigned char code DIG_PLACE[8] = {

  18. 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制   查表的方法控制

  19. unsigned char code DIG_CODE[17] = {

  20. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

  21. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

  22. //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码

  23. unsigned char DisplayData[8];

  24. //用来存放要显示的8位数的值

  25. unsigned char Time, Second;                  //用来存放定时时间



  26. //--声明全局函数--//

  27. void DigDisplay(); //动态显示函数

  28. void Timer0Cofig(void);



  29. /*******************************************************************************

  30. * 函 数 名         : main

  31. * 函数功能                   : 主函数

  32. * 输    入         : 无

  33. * 输    出         : 无

  34. *******************************************************************************/



  35. void main(void)

  36. {

  37.         Second = 1;



  38.         Timer0Cofig();



  39.         while(1)

  40.         {

  41.                 if(Second == 70)

  42.                 {

  43.                         Second = 1;

  44.                 }



  45.                 //--宝田路通行,30秒--//

  46.                 if(Second < 31)

  47.                 {

  48.                         DisplayData[0] = 0x00;

  49.                         DisplayData[1] = 0x00;

  50.                         DisplayData[2] = DIG_CODE[(30 - Second) % 100 / 10];

  51.                         DisplayData[3] = DIG_CODE[(30 - Second) %10];

  52.                         DisplayData[4] = 0x00;

  53.                         DisplayData[5] = 0x00;

  54.                         DisplayData[6] = DisplayData[2];

  55.                         DisplayData[7] = DisplayData[3];

  56.                         DigDisplay();



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



  58.                         GPIO_TRAFFIC = 0xFF;  //将所有的灯熄灭

  59.                         RED00 = 1;

  60.                         GREEN00 = 1;



  61.                         GREEN11 = 0;    //宝田路绿灯亮                       

  62.                         GREEN10        = 0;    //宝田路人行道绿灯亮



  63.                         RED01 = 0;      //前进路红灯亮

  64.                         RED00 = 0;      //前进路人行道红灯亮

  65.                 }



  66.                 //--黄灯等待切换状态,5秒--//

  67.                 else if(Second < 36)

  68.                 {

  69.                         DisplayData[0] = 0x00;

  70.                         DisplayData[1] = 0x00;

  71.                         DisplayData[2] = DIG_CODE[(35 - Second) % 100 / 10];

  72.                         DisplayData[3] = DIG_CODE[(35 - Second) %10];

  73.                         DisplayData[4] = 0x00;

  74.                         DisplayData[5] = 0x00;

  75.                         DisplayData[6] = DisplayData[2];

  76.                         DisplayData[7] = DisplayData[3];

  77.                         DigDisplay();



  78.                         //--黄灯阶段--//



  79.                         GPIO_TRAFFIC = 0xFF;  //将所有的灯熄灭

  80.                         RED00 = 1;

  81.                         GREEN00 = 1;



  82.                         YELLOW11 = 0;    //宝田路黄灯亮                       

  83.                         RED10        = 0;     //宝田路人行道红灯亮



  84.                         YELLOW01 = 0;    //前进路红灯亮

  85.                         RED00 = 0;       //前进路人行道红灯亮

  86.                 }



  87.                 //--前进路通行--//

  88.                 else if(Second < 66)

  89.                 {

  90.                         DisplayData[0] = 0x00;

  91.                         DisplayData[1] = 0x00;

  92.                         DisplayData[2] = DIG_CODE[(65 - Second) % 100 / 10];

  93.                         DisplayData[3] = DIG_CODE[(65 - Second) %10];

  94.                         DisplayData[4] = 0x00;

  95.                         DisplayData[5] = 0x00;

  96.                         DisplayData[6] = DisplayData[2];

  97.                         DisplayData[7] = DisplayData[3];

  98.                         DigDisplay();



  99.                         //--黄灯阶段--//



  100.                         GPIO_TRAFFIC = 0xFF;  //将所有的灯熄灭

  101.                         RED00 = 1;

  102.                         GREEN00 = 1;



  103.                         RED11 = 0;       //宝田路红灯亮                       

  104.                         RED10 = 0;       //宝田路人行道红灯亮



  105.                         GREEN01 = 0;     //前进路绿灯亮

  106.                         GREEN00 = 0;     //前进路人行道绿灯亮

  107.                 }



  108.                 //--黄灯等待切换状态,5秒--//

  109.                 else

  110.                 {

  111.                         DisplayData[0] = 0x00;

  112.                         DisplayData[1] = 0x00;

  113.                         DisplayData[2] = DIG_CODE[(70 - Second) % 100 / 10];

  114.                         DisplayData[3] = DIG_CODE[(70 - Second) %10];

  115.                         DisplayData[4] = 0x00;

  116.                         DisplayData[5] = 0x00;

  117.                         DisplayData[6] = DisplayData[2];

  118.                         DisplayData[7] = DisplayData[3];

  119.                         DigDisplay();



  120.                         //--黄灯阶段--//



  121.                         GPIO_TRAFFIC = 0xFF;  //将所有的灯熄灭

  122.                         RED00 = 1;

  123.                         GREEN00 = 1;



  124.                         YELLOW11 = 0;    //宝田路黄灯亮                       

  125.                         RED10        = 0;     //宝田路人行道红灯亮



  126.                         YELLOW01 = 0;    //前进路红灯亮

  127.                         RED00 = 0;       //前进路人行道红灯亮

  128.                 }

  129.         }                               

  130. }



  131. /*******************************************************************************

  132. * 函 数 名         : DigDisplay

  133. * 函数功能                   : 使用数码管显示

  134. * 输    入         : 无

  135. * 输    出         : 无

  136. *******************************************************************************/



  137. void DigDisplay()

  138. {

  139.         unsigned char i;

  140.         unsigned int j;





  141.         for(i=0; i<8; i++)

  142.         {

  143.                 GPIO_PLACE = DIG_PLACE[i];           //发送位选

  144.                 GPIO_DIG = DisplayData[i];     //发送段码

  145.                 j = 10;                                                   //扫描间隔时间设定

  146.                 while(j--);       

  147.                 GPIO_DIG = 0x00;               //消隐

  148.         }

  149. }



  150. /*******************************************************************************

  151. * 函 数 名         : Timer0Cofig

  152. * 函数功能                   : 配置定时器

  153. * 输    入         : 无

  154. * 输    出         : 无

  155. *******************************************************************************/



  156. void Timer0Cofig(void)

  157. {

  158.         TMOD = 0x01;     //定时器0选择工作方式1

  159.     TH0  = 0x3C;         //设置初始值,定时50MS

  160.     TL0  = 0xB0;

  161.     EA   = 1;             //打开总中断

  162.     ET0  = 1;                 //打开定时器0中断

  163.     TR0  = 1;                 //启动定时器0       

  164. }



  165. /*******************************************************************************

  166. * 函 数 名         : Timer0

  167. * 函数功能                   : 定时器0中断函数

  168. * 输    入         : 无

  169. * 输    出         : 无

  170. *******************************************************************************/                  



  171. void Timer0() interrupt 1

  172. {

  173.         TH0 = 0x3C;         //设置初始值

  174.         TL0 = 0xB0;

  175.         Time++;

  176.         if(Time == 20)

  177.         {

  178.                 Second ++;

  179.                 Time = 0;

  180.         }


  181. }

复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-4-27 03:36 , Processed in 0.088038 second(s), 31 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

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