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