[51单片机]

单片机设计的交通灯

[复制链接]
4718|29
手机看帖
扫描二维码
随时随地手机跟帖
长的帅怪我落| | 2016-9-28 09:34 | 显示全部楼层
还能有什么原因,程序不对呗

使用特权

评论回复
lzhanh|  楼主 | 2016-9-28 09:41 | 显示全部楼层
长的帅怪我落 发表于 2016-9-28 09:34
还能有什么原因,程序不对呗

但是程序这里不知道是哪里出现问题,它是有时候或者1个周期后才会出现一下的

使用特权

评论回复
长的帅怪我落| | 2016-9-28 09:43 | 显示全部楼层
本帖最后由 长的帅怪我落 于 2016-9-28 09:47 编辑

你不把程序贴上来,坛友是神啊。。。

使用特权

评论回复
h_8816002| | 2016-9-28 09:47 | 显示全部楼层
我有个经验,你参考一下。 你检查一下你的电路,连接黄灯的I/O口是否连接了其他的外设,要把那些外设都在初始化中关掉。我原来遇到过你的问题,最后检查完,是点阵和液晶屏复用了那个引脚,关掉就好了。或者干脆拔掉。

使用特权

评论回复
lzhanh|  楼主 | 2016-9-28 09:48 | 显示全部楼层
长的帅怪我落 发表于 2016-9-28 09:43
你不把程序贴上来,坛友是神啊。。。

请问你的代码是怎样的?这是我的代码,帮我看看是什么问题,谢谢。。
#define        uchar        unsigned char
#define        uint        unsigned int
#include        <reg52.h>
/*****¶¨Òå¿ØÖÆλ**********************/
sbit  Time_Show_LED2=P2^5;//Time_Show_LED2¿ØÖÆλ
sbit  Time_Show_LED1=P2^4;//Time_Show_LED1¿ØÖÆλ
sbit        EW_LED2=P2^3;        //EW_LED2¿ØÖÆλ
sbit        EW_LED1=P2^2;        //EW_LED1¿ØÖÆλ
sbit        SN_LED2=P2^1;        //SN_LED2¿ØÖÆλ
sbit        SN_LED1=P2^0;        //SN_LED1¿ØÖÆλ
sbit  SN_Yellow=P1^6;//SN»ÆµÆ
sbit  EW_Yellow=P1^2;//EW»ÆµÆ
sbit  EW_Red=P1^3;//EWºìµÆ
sbit  SN_Red=P1^7;//SNºìµÆ
sbit  EW_Redlift=P2^6;//EW×óתºìµÆ
sbit        SN_Redlift=P2^7;//SN×óתºìµÆ
sbit  SN_ManGreen=P3^0;//SNÈËÐеÀÂ̵Æ
sbit  EW_ManGreen=P3^1;//EWÈËÐеÀÂ̵Æ
sbit  SN_ManRed=P3^2;//SNÈËÐеÀºìµÆ
sbit  EW_ManRed=P3^5;//EWÈËÐеÀºìµÆ
sbit  Busy_Btton=P3^6;//½»Í¨·±Ã¦°´¼ü
sbit  Special_Btton=P3^7;//½»Í¨ÌØÊâ°´¼ü  
sbit  Add_Button=P3^3;//ʱ¼ä¼Ó
sbit  Reduces_Button=P3^4;//ʱ¼ä¼õ

bit   Flag_SN_Yellow; //SN»ÆµÆ±ê־λ
bit   Flag_EW_Yellow;//EW»ÆµÆ±ê־λ
bit                flag_jinji;
char        Time_EW;//¶«Î÷·½Ïòµ¹¼Æʱµ¥Ôª
char        Time_SN;//Äϱ±·½Ïòµ¹¼Æʱµ¥Ôª
uchar EW=60,SN=40,EWL=19,SNL=19; //³ÌÐò³õʼ»¯¸³Öµ£¬Õý³£Ä£Ê½
uchar EW1=60,SN1=40,EWL1=19,SNL1=19;//ÓÃÓÚ´æ·ÅÐÞ¸ÄÖµµÄ±äÁ¿
uchar code table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//1~~~~9¶ÎÑ¡Âë
uchar code S[9]={0X28,0X48,0X98,0X48,0X82,0X84,0X89,0X84,0x88};//½»Í¨ÐźŵƿØÖÆ´úÂë
/**********************ÑÓʱ×Ó³ÌÐò************************/

void delay(uint x)
{
        uint p;
        uchar q;
        for(p=0;p<x;p++)
        for(q=0;q<125;q++);
}
/*****************ÏÔʾ×Óº¯Êý**************************/
void        Display(void)
        {
                char h,l;
                h=Time_EW/10;
                l=Time_EW%10;
          P0=table[l];
                EW_LED2=1;
                delay(1);
                EW_LED2=0;
          P0=table[h];
                EW_LED1=1;
                delay(1);
                EW_LED1=0;

                h=Time_SN/10;
                l=Time_SN%10;
                P0=table[l];
                SN_LED2=1;
                delay(1);
                SN_LED2=0;
          P0=table[h];
                SN_LED1=1;
                delay(1);
                SN_LED1=0;
               

                h= EW1/10;
                l= EW1%10;
                P0=table[l];
                Time_Show_LED1=1;
                delay(1);
    Time_Show_LED1=0;
                P0=table[h];
                Time_Show_LED2=1;
                delay(1);
          Time_Show_LED2=0;
}

void KEY()
{
        if(Add_Button==0) //ʱ¼ä¼Ó
        {
                delay(20);
                if(Add_Button==0)
                {
                        EW1+=5;
                        SN1+=5;
                        SN1=EW1-10;
                        EWL1=19;
                        SNL1=19;
                        if(EW1>=100)
                        {
                                EW1=99;
                                SN1=89;
                        }
                }
                while(Add_Button==0) Display();
        }
        if(Reduces_Button==0) //ʱ¼ä¼õ
        {
                delay(20);
                if(Reduces_Button==0)
                {
                        EW1-=5;
                        SN1-=5;
                        SN1=EW1-10;
                        EWL1=19;
                        SNL1=19;
                        if(EW1<=40)
                        {
                                EW1=40;
                                SN1=30;
                        }                       
                }       
                while(Reduces_Button==0) Display();       
        }

        if(Busy_Btton==0) //²âÊÔ°´¼üÊÇ·ñ°´Ï£¬°´ÏÂΪ·±Ã¦×´Ì¬
        {
                delay(20);
                if(Busy_Btton==0)
                {
                        EW1=45;
                        SN1=30;
                        EWL1=14;
                        SNL1=14;
                }
        while(Busy_Btton==0) Display();
        }

        if(Special_Btton==0)
        {
                delay(50);
                if(Special_Btton==0)
                flag_jinji=~flag_jinji;       
                while(Special_Btton==0) Display();
        }
}
/**********************T0ÖжϷþÎñ³ÌÐò*******************/
void timer0() interrupt 1 using 1
{
        static uchar count;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        count++;
       
        if(count==10)
        {
          if(Flag_SN_Yellow==1) //²âÊÔÄϱ±»ÆµÆ±ê־λ
          {
                        SN_Yellow=~SN_Yellow;
                }
          if(Flag_EW_Yellow==1)  //²âÊÔ¶«Î÷»ÆµÆ±ê־λ
          {
                EW_Yellow=~EW_Yellow;
                }
        }
        if(count==20)
        {
        Time_EW--;
        Time_SN--;
        if(Flag_SN_Yellow==1)//²âÊÔÄϱ±»ÆµÆ±ê־λ
            {
                        SN_Yellow=~SN_Yellow;
                        }
        if(Flag_EW_Yellow==1)//²âÊÔ¶«Î÷»ÆµÆ±ê־λ
            {
                        EW_Yellow=~EW_Yellow;
                        }
        count=0;
        }
       
}
/*********************Ö÷³ÌÐò¿ªÊ¼**********************/
void        main(void)

{
  TMOD=0x01;//¶¨Ê±Æ÷¹¤×÷ÓÚ·½Ê½1
        TH0=(65536-50000)/256;//¶¨Ê±Æ÷¸³³õÖµ
        TL0=(65536-50000)%256;
        EA=1; //CPU¿ªÖжÏ×ÜÔÊÐí
        ET0=1;//¿ª¶¨Ê±ÖжÏ
  TR0=1;//Æô¶¯¶¨Ê±

        while(1)
        {
                if(flag_jinji==0)
                {
                                        /*******S0״̬**********/
                                        Time_EW=EW;       
                                        Time_SN=SN;               
                                        while(Time_SN>=3&&flag_jinji==0)
                                  {
                                                P1=S[0];         //SNͨÐУ¬EWºìµÆ                                       
                                                SN_Redlift=1;   //SN×óתºìµÆÁÁ
                                                EW_Redlift=1;   //EW×óתºìµÆÁÁ
                                                SN_Yellow=0;
                                                EW_Yellow=0;
                                                EW_ManGreen=1;        //EWÈËÐеÀ½ûÖ¹
                                                SN_ManGreen=0;  //SNÈËÐеÀͨÐÐ
                                                EW_ManRed=0;    //
                                                SN_ManRed=1;    //
                                                Flag_EW_Yellow=0;           //EW¹Ø»ÆµÆÏÔʾÐźÅ
                              Display();
                                                KEY();
                                        }
                                       
                                        /*******S1״̬**********/
                                  P1=0x00;
                                        while(Time_SN>=0&&flag_jinji==0)
                                  {
                                                Flag_SN_Yellow=1;         //SN¿ª»ÆµÆÐźÅλ
                                                SN_ManGreen=0;
                                                EW_ManGreen=0;
                                    EW_Red=1;      //SN»ÆµÆÁÁ£¬µÈ´ý×ó¹ÕÐźţ¬EWºìµÆ
                                                SN_Red=0;           //
                                                EW_ManRed=1;    //
                                                SN_ManRed=1;    //
                                                SN_Redlift=0;   //SN×óתºìµÆÃð
                                                EW_Redlift=1;   //EW×óתºìµÆÁÁ
                                    Display();
                                                KEY();
                                        }
                                       
                                        /*******S2״̬**********/
                                        Time_SN=SNL;
                                       
                                        while(Time_SN>=3&&flag_jinji==0)
                                        {
                                                P1=S[2];//SN×ó¹ÕÂ̵ÆÁÁ£¬EWºìµÆ        SNºìµÆ                                10011000                                               
                                                Flag_SN_Yellow=0; //SN¹Ø»ÆµÆÏÔʾÐźŠ                              
                                                SN_Yellow=0;
                                                EW_Yellow=0;
                                                SN_ManGreen=0;//SNÈËÐеÀjinzhi
                                                EW_ManGreen=0;
                                                EW_ManRed=1;    //
                                          SN_ManRed=1;    //
                                                SN_Redlift=0;   //SN×óתºìµÆÃð
                                                EW_Redlift=1;   //EW×óתºìµÆÁÁ
                                                Display();
                                                KEY();
                                        }
       
                                  /*******S3״̬**********/
                                        P1=0x00;
                                        Flag_SN_Yellow=1;        //SN¿ª»ÆµÆÐźÅλ
                                        Flag_EW_Yellow=1;        //EW¿ª»ÆµÆÐźÅλ
                                        while(Time_SN>=0&&flag_jinji==0)
                                  {
                                               
                                    EW_Red=0;      //SN»ÆµÆÁÁ,µÈ´ýÍ£Ö¹Ðźţ¬EWºìµÆ
                                           SN_Red=0;
                                                SN_ManGreen=0;
                                                EW_ManGreen=0;
                                                EW_ManRed=1;   
                                          SN_ManRed=1;   
                                                SN_Redlift=0;   //SN×óתºìµÆÃð
                                                EW_Redlift=0;   //EW×óתºìµÆÃð
                                    Display();
                                                KEY();
                                        }
       
                                  /***********¸³Öµ**********/
                                        EW=EW1;
                                        SN=SN1;
                                        EWL=EWL1;
                                        SNL=SNL1;
       
                                        /*******S4״̬**********/
                                        Flag_SN_Yellow=0;  //SN¹Ø»ÆµÆÏÔʾÐźÅ
                                        Time_EW=SN;
                                        Time_SN=EW;
                                  while(Time_EW>=3&&flag_jinji==0)
                                  {
                                                P1=S[4];         //EWͨÐУ¬SNºìµÆ
                                                SN_Redlift=1;   //SN×óתºìµÆÁÁ
                                                EW_Redlift=1;   //EW×óתºìµÆÁÁ                                       
                                                SN_Yellow=0;
                                                EW_Yellow=0;
                                                EW_ManGreen=0;//EWÈËÐеÀͨÐÐ
                                                SN_ManGreen=1;//SNÈËÐеÀ½ûÖ¹
                                                EW_ManRed=1;   
                                                SN_ManRed=0;                                       
                                                Display();
                                                KEY();
                                        }
                                       
                                        /*******S5״̬**********/
                                        P1=0X00;
                                        while(Time_EW>=0&&flag_jinji==0)
                                  {
                                                Flag_EW_Yellow=1;//EW¿ª»ÆµÆÐźÅλ
                                                SN_ManGreen=0;
                                                EW_ManGreen=0;
                                    SN_Red=1;//EW»ÆµÆÁÁ£¬µÈ´ý×ó¹ÕÐźţ¬SNºìµÆ
                                                EW_Red=0;       
                                                EW_ManRed=1;   
                                          SN_ManRed=1;
                                                SN_Redlift=1;   //SN×óתºìµÆÃð
                                                EW_Redlift=0;   //EW×óתºìµÆÃð
                                    Display();
                                                KEY();
                                        }
                                       
                                        /*******S6״̬**********/
                                        Flag_EW_Yellow=0;            //EW¹Ø»ÆµÆÏÔʾÐźÅ
                                        Time_EW=EWL;
                                        while(Time_EW>=3&&flag_jinji==0)
                                        {
                                               
                                                SN_Yellow=0;
                                                EW_Yellow=0;                                       
                                                P1=S[6];//EW×ó¹ÕÂ̵ÆÁÁ£¬SNºìµÆ                                          10001001
                                                EW_ManGreen=0;
                                                SN_ManGreen=0;
                                                EW_ManRed=1;   
                                          SN_ManRed=1;
                                                SN_Redlift=1;   //SN×óתºìµÆÁÁ
                                                EW_Redlift=0;   //EW×óתºìµÆÃð
                                                Display();
                                                KEY();
                                        }
       
                                        /*******S7״̬**********/
                                        P1=0X00;
                                        while(Time_EW>=0&&flag_jinji==0)
                                  {
                                                Flag_EW_Yellow=1; //EW¿ª»ÆµÆÐźÅλ
                                                Flag_SN_Yellow=1;        //SN¿ª»ÆµÆÐźÅλ
                                    SN_Red=0;//EW»ÆµÆÁÁ£¬µÈ´ýÍ£Ö¹Ðźţ¬SNºìµÆ
                                                EW_Red=0;       
                                                EW_ManGreen=0;
                                                SN_ManGreen=0;
                                                EW_ManRed=1;   
                                          SN_ManRed=1;
                                                SN_Redlift=0;   //SN×óתºìµÆÃð
                                                EW_Redlift=0;   //EW×óתºìµÆÃð
                                    Display();
                                                KEY();
                                        }
                               
                                  /***********¸³Öµ**********/
                                  EW=EW1;
                                        SN=SN1;
                                        EWL=EWL1;
                                        SNL=SNL1;
                                }
               
                  else
                  {
                          P1=S[8];
                          EW_ManGreen=0;//EWÈËÐеÀͨÐÐ
                          SN_ManGreen=0;
                          KEY();                       
                }
        }
}

使用特权

评论回复
lzhanh|  楼主 | 2016-9-28 09:49 | 显示全部楼层
h_8816002 发表于 2016-9-28 09:47
我有个经验,你参考一下。 你检查一下你的电路,连接黄灯的I/O口是否连接了其他的外设,要把那些外设都在初 ...

在软件仿真上都会出现这种情况,应该不是电路的问题

使用特权

评论回复
长的帅怪我落| | 2016-9-28 09:52 | 显示全部楼层
lzhanh 发表于 2016-9-28 09:49
在软件仿真上都会出现这种情况,应该不是电路的问题

出问题不可怕,怕的是出了问题连问都不知道怎么问

使用特权

评论回复
lzhanh|  楼主 | 2016-9-28 09:55 | 显示全部楼层
长的帅怪我落 发表于 2016-9-28 09:52
出问题不可怕,怕的是出了问题连问都不知道怎么问

刚贴了程序,大神们帮忙看看是什么问题

使用特权

评论回复
长的帅怪我落| | 2016-9-28 10:25 | 显示全部楼层
lzhanh 发表于 2016-9-28 09:55
刚贴了程序,大神们帮忙看看是什么问题

首先,我不是大神,我是菜鸟。。大学的时候51都没学好。。大致看了下,果然不会了。。第一是 if(flag_jinji==0),下面都是在这个条件下执行的,所以呢,我觉得while里面没必要加这么一句;然后就是flag_jinji,没有初值,我也没看到它是连着那个io,虽然我还没懂这个用来干嘛的。。在看了下s0和s1状态下, Time_EW=EW,一个>=3,一个>=0,这样你确定可以?要是上面说的不对,当没看见啊。。我真不会

使用特权

评论回复
h_8816002| | 2016-9-28 10:49 | 显示全部楼层
lzhanh 发表于 2016-9-28 09:55
刚贴了程序,大神们帮忙看看是什么问题

我大致看了一下这代码。我估计有很大几率,黄灯闪是因为定时器的缘故,你自己再检查定时器中断服务函数里面的逻辑吧。这种写法写四方向的交通灯代码太冗长了。
我没去理逻辑,我建议你看看状态机方面的东西,这个程序是用节拍写的,可读性略差,换成状态机就好了,四个方向四个状态,每个状态独立,互不干涉很简洁明了。

使用特权

评论回复
lzhanh|  楼主 | 2016-9-28 10:55 | 显示全部楼层
h_8816002 发表于 2016-9-28 10:49
我大致看了一下这代码。我估计有很大几率,黄灯闪是因为定时器的缘故,你自己再检查定时器中断服务函数里 ...

就是说用case函数去写?

使用特权

评论回复
h_8816002| | 2016-9-28 11:03 | 显示全部楼层
lzhanh 发表于 2016-9-28 10:55
就是说用case函数去写?

是的,我一般遇到这些类似的项目都是用状态机建模,简单明了,自己也不会被搅浑。
if…else if…嵌套语句一般不用,这些东西逻辑稍微有点逻辑错误立刻就全崩溃了。况且,我本来就是个粗心大意的人。。。我曾经写出过一个if …else if…的状态机,但是就是因为一个入口参数不对,出现逻辑上的死循环了。功能可以实现,但是UART一直被占用,CPU被阻塞。从此if是路人。

使用特权

评论回复
lzhanh|  楼主 | 2016-9-28 11:05 | 显示全部楼层
h_8816002 发表于 2016-9-28 11:03
是的,我一般遇到这些类似的项目都是用状态机建模,简单明了,自己也不会被搅浑。
if…else if…嵌套语句 ...

我对这个case函数不熟悉,加上定时器和中断函数这边有很多不懂,所以不敢去动手尝试。。你刚才说我的定时器有问题,可以帮我指一下问题在哪里吗?

使用特权

评论回复
h_8816002| | 2016-9-28 11:13 | 显示全部楼层
lzhanh 发表于 2016-9-28 11:05
我对这个case函数不熟悉,加上定时器和中断函数这边有很多不懂,所以不敢去动手尝试。。你刚才说我的定时 ...

用switch--case语句,我只是说可能是定时器的问题,我没有仔细读。
至于问题,就靠你自己了,有什么不敢尝试的。以后做东西出了问题,你难道还想找另一人给你说你那句改成什么样子吗?不可能,实践出真知,单片机要自己去摸索。
四方向不懂是吧,那你先做一个方向的,当你成功做出一个方向的后,再做两方向的,就这样一步一步做。不要被别人的程序局限了,只要你明白原理,那就去试,一次不行两次对不对。把别人的例子扔了,自己建工程按照项目需求,把整块的东西化为小块一个一个区攻克!
SWITCH-CASE语句不懂是吧?那就看C语言相关的书,理解最重要。就算这次有人帮你指点完程序那一句出错了,但是你学会了什么?单片机设计就是个调试的过程。
最后,建议你不要用PROTEUS仿真了,自己焊个最小系统插几个led或者干脆拿个开发板去做,软件仿真有时候很不靠谱。

使用特权

评论回复
lzhanh|  楼主 | 2016-9-28 11:16 | 显示全部楼层
h_8816002 发表于 2016-9-28 11:13
用switch--case语句,我只是说可能是定时器的问题,我没有仔细读。
至于问题,就靠你自己了,有什么不敢 ...

好的,谢谢,我去试试

使用特权

评论回复
h_8816002| | 2016-9-28 11:25 | 显示全部楼层
lzhanh 发表于 2016-9-28 11:16
好的,谢谢,我去试试

加油,做技术千万不要心急

使用特权

评论回复
lzhanh|  楼主 | 2016-9-28 11:27 | 显示全部楼层
h_8816002 发表于 2016-9-28 11:25
加油,做技术千万不要心急

好的,谢谢

使用特权

评论回复
lydzzhx| | 2016-9-28 15:08 | 显示全部楼层
代码看着很眼熟啊 新疆大学的吧 呵呵 ??

使用特权

评论回复
lzhanh|  楼主 | 2016-9-28 17:01 | 显示全部楼层
h_8816002 发表于 2016-9-28 11:25
加油,做技术千万不要心急

我现在在软件仿真上解决了频闪的问题,但是程序烧写到硬件电路的时候,有些灯不亮,而且黄闪效果也没有了,是什么原因?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

11

帖子

1

粉丝