打印

跑马灯进阶——交通灯

[复制链接]
2049|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
面对你|  楼主 | 2008-11-5 12:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
硬件平台:单片机:华邦系列W78E516B40DL
晶振:12MHZ  8个二极管   四个数码管   四个按键   一个温度传感器
  串口通信:MAX232                  
软件平台:Keil uVision2
开发语言:C语言
程序下载软件:8051IspWriter.exe
源代码:
//由于硬件受限制!不能完全模拟交通灯,因开发板当初只装了红灯和黄灯,故用红等灯表示停,黄灯表示行!
//东西方向用2个灯(D3,D4),南北方向用2个灯(D5,D6)!
//此项目只有2种情况,东西方向黄灯(红),南北方向红灯(黄)!初始化时间为30s!
//初始化,东西行(黄),南北停(红)!
#include<reg51.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
uchar  *dis_ptr;
uchar data dis_buf[2]={3,0};//显示缓冲区
uchar data time_buf=0x1e;//显示数据
uchar code seg_tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
    0xf8,0x80,0x90,0xff};//7段共阴极,依次为0-9
uchar code digit_tab[2]={1,2};//动态显示缓冲区
uchar code light_buf[2]={0x06,0x09};
uint m=0;
uint n=1;
uint a=0;
uint key_flag=0;
uchar b=0x1e;
sbit p24=P2^4;
sbit p25=P2^5;
bit key_test(void);
void key_delay(void);
void key(void);
void init_sys();
void disply_one(void);
void dis_buf_flash(void);
void main()
{init_sys();
for(;;);}

void init_sys(void)//T0工作于方式2,定时250um,
{
dis_ptr=dis_buf+1;
TH0=6;
TL0=6;
TMOD=2;
IE=0x82;
IP=2;
TR0=1;

}

void disply_one(void)//动态显示1位
{uchar i;
P0=seg_tab[*dis_ptr];
i=dis_ptr-dis_buf;
P2=~digit_tab;
if (dis_ptr>dis_buf)
    dis_ptr--;
else dis_ptr=dis_buf+1;
}


void dis_buf_flash(void)//显示数据送缓冲区
{
dis_buf[0]=time_buf/10;
dis_buf[1]=time_buf%10;

}


void time0(void) interrupt 1 
{   
            dis_buf_flash();
              disply_one();
          P1=~light_buf[n];
                  TF0=0;
                   m++;a++;
                    if(key_test()==0)
                        {key_flag=0;}
                        
                   if ((a>=40)&&(key_flag==0))//10ms扫描键盘
                  {a=0;
                  key_test();
                  if(key_test()==1){key_delay();//去抖动
                                    if(key_test()==1)
                                          {key();}
                                   }
                  }
                  if (m>=4000)//1秒处理
                  {    m=0;
                      time_buf-=1;
                       if (time_buf<=0)//循环显示
                        {time_buf=b;
                        P1=~(light_buf[n]);
                        if(n>0){n--;}
                        else n=1;
                        }
                     
                  }
 }


bit key_test(void)//读键盘
{if((p24==0)||(p25==0))
 return ((bit)1);//有键按下
else return((bit)0);
}

void key_delay(void)
{uchar i,s;
for(i=10000,s=5;s>=1;i--)
{s=i;}
}

void key(void)
{key_flag=1;//停止扫描,使每次按键只执行一次
if(time_buf>=0x64)
    {time_buf=0x00;}
if(p24==0){time_buf+=1;}
if(p25==0){time_buf-=1;}
b=time_buf;
}

程序调试遇到的问题:
将uchar data time_buf=0x1e
改成uint time_buf=30
就卡在30不走了!
灯总要30S后才亮
灯显示程序放在30S处理中了
所以要等30S!
在前面加一句显示语句!P1=~light_buf[n];
灯不跳!
原来是语句P1=~(light_buf[~(n)]);有问题,原来数字常量不能这样用!
将之改为P1=~(light_buf[n]);
                        if(n>0){n--;}
                        else n=1;
即可!

大家给点意见,看还有什么错误!
呵呵

相关帖子

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

本版积分规则

4

主题

7

帖子

0

粉丝