最近在做单片机系统的项目设计,自己的系统板还在厂家制作,要一段时间才能送来,借用同学的小开发板先写了一个简易数字钟程序! 基本情况如下: 硬件平台:单片机:华邦系列W78E516B40DL 晶振:12MHZ 8个二极管 四个数码管 四个按键 一个温度传感器 串口通信:MAX232 软件平台:Keil uVision2 开发语言:C语言 程序下载软件:8051IspWriter.exe 程序功能:8个LED灯循环闪烁,数码管显示相应闪烁的位置!0001-0008 源程序如下: #include<reg51.h> #include<absacc.h> #define uchar unsigned char #define uint unsigned int uchar *dis_ptr; uchar data dis_buf[4]={0,0,0,1};//显示缓冲区 uchar data time_buf[2]={0x00,0x00};//显示数据 uchar code seg_tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, 0xf8,0x80,0x90,0xff};//7段共阳极,依次为0-9 uchar code digit_tab[4]={1,2,4,8};//动态显示缓冲区 uchar code light_buf[]={1,2,4,8,0x10,0x20,0x40,0x80}; uint m=0; uint n=0; 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+3; 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+3; }
void dis_buf_flash(void)//显示数据送缓冲区 { dis_buf[0]=time_buf[0]/10; dis_buf[1]=time_buf[0]%10; dis_buf[2]=time_buf[1]/10; dis_buf[3]=time_buf[1]%10; }
void time0(void) interrupt 1 { dis_buf_flash(); disply_one(); TF0=0; m++; if (m>=4000)//1秒处理 { m=0; time_buf[1]+=1; if (time_buf[1]>=9)//循环显示 {time_buf[1]=1; n=0;} P1=~(light_buf[n]); n++; } } 最终结果:8个LED灯从左至由循环闪烁!数码管循环显示0001-0008! 中途遇到的问题: 运行后, 显示这样: 灯的情况: 1-2-3-4-5-6-7-8-3-1-2-3-4-5-6-7-8-1-2-3-4-5-6-7-8-1-2。。。。。。 第一次循环之后不回到1而亮3, 但以后则是从1-8依次循环 解决办法:将程序段 if (m>=4000)//1秒处理 { m=0; time_buf[1]+=1; P1=~(light_buf[n]); n++; if (time_buf[1]>=9)//循环处理 {time_buf[1]=1; n=0; } 修改为: if (m>=4000)//1秒处理 { m=0; time_buf[1]+=1; if (time_buf[1]>=9)//循环处理 {time_buf[1]=1; n=0;} P1=~(light_buf[n]); n++; } 我认为出现的原因可能是:P1=~(light_buf[n]);n++;这两句应放在循环处理之后,否则程序运行可能导致循环处理不能及时反映给P1,从而出现一个bug. 将两句程序放在循环处理之后,则可消除这种bug.
|