|
本人小白,正在做避障小車,其中需要超聲波測距并用數碼管顯示距離,可是數碼管顯示一堆亂碼,求指教
程序如下
#include<reg52.h>
#include <intrins.h> //常變量定義:?
code unsigned char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; //表:共陽數碼管?0-9?-??
unsigned int time=0;
unsigned int timer=0;
unsigned long S=0;
bit flag =0;
unsigned char l_disbuff[4]={0xff,0,0,0,};//顯示緩沖
unsigned char l_posit=1;//位選擇
//引腳定義
sbit SMG_q=P1^0;//定義數碼管陽級控制腳(千位)本例程只用到三位數 碼管
sbit SMG_b=P1^1;//定義數碼管陽級控制腳(百位)
sbit SMG_s=P1^2;//定義數碼管陽級控制腳(十位)
sbit SMG_g=P1^3;//定義數碼管陽級控制腳(個位)
sbit RX=P2^1;//模塊引腳
sbit TX=P2^0;//顯示函數,參數為顯示內容
void display()
{
P0=0XFF; //
switch(l_posit)
{
case 0: //選擇千位數碼管,關閉其它位
SMG_q=0;
SMG_b=1;
SMG_s=1;
SMG_g=1;
P0=0xff;//table[l_disbuff[0]];
//此位不顯示
break;
case 1: //選擇百位數碼管,關閉其它位
SMG_q=1;
SMG_b=0;
SMG_s=1;
SMG_g=1;
P0=table[l_disbuff[1]]&0x7f;//加入小數點
break;
case 2://選擇十位數碼管,關閉其它位
SMG_q=1;
SMG_b=1;
SMG_s=0;
SMG_g=1;
P0=table[l_disbuff[2]];
break;
case 3: //選擇個位數碼管,關閉其它位
SMG_q=1;
SMG_b=1;
SMG_s=1;
SMG_g=0;
P0=table[l_disbuff[3]];
break;
}
l_posit++;
if(l_posit>3)
l_posit=0;
}
/********************************************************/
void Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/100;//算出來是CM
if((S>=700)||flag==1)//超出測量范圍顯示“-”
{
flag=0;
l_disbuff[1]=10;//“-”
l_disbuff[2]=10;//“-”
l_disbuff[3]=10;//“-”
}
else
{
l_disbuff[1]=S%1000/100;
l_disbuff[2]=S%1000%100/10;
l_disbuff[3]=S%1000%100%10;
}
}
/********************************************************/
void zd0() interrupt 1//T0中斷用來計數器溢出,超過測距范圍
{
flag=1; //中斷溢出標志
}
/********************************************************/
void zd3() interrupt 3//T1中斷用來掃描數碼管和計800MS啟動模塊
{
TH1=0xf8;
TL1=0x30;
display();
timer++;
if(timer>=400)
{
timer=0;
TX=1;//800MS啟動一次模塊
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
}
/*********************************************************/
void main(void)
{
TMOD=0x11;//設T0,T1為方式1
TH0=0;
TL0=0;
TH1=0xf8;//2MS定時
TL1=0x30;
ET0=1;//允許T0中斷
ET1=1;//允許T1中斷
TR1=1;//開啟定時器
EA=1; //開啟總中斷
while(1)
{
while(!RX);//當RX為零時等待
TR0=1;
//開啟計數
while(RX);//當RX為1計數并等待
TR0=0; //關閉計數
Conut();//計算
}
}
|
|