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