#include "reg52.H"//器件配置文件
#include"lcd.h"
//傳感器接口
sbit RX = P3^2;
sbit TX = P3^3;
sbit key = P1^4;
char keymode=0;
int keycount=0;
//變量聲明
unsigned int time=0;
unsigned int timer=0;
unsigned char posit=0;
unsigned long S=0;
char Mode=0;
bit flag=0;
bit flag_KEY=0;
unsigned char act[]={0xff,0xfa,0xf5,0xf9,0xf6}; //小車(chē)動(dòng)作控制
unsigned char disbuff[4] ={0,0,0,0}; //數(shù)組用于存放距離信息
void Display();
//延時(shí)20ms(不精確)
void delay_ms(unsigned int m)
{
unsigned int b,c;
for(c=0;c<m;c++)
for(b=0;b<120;b++);
}
void Key(void)
{
key = 1;
delay_ms(1);
if(key==0) //檢測(cè)按鍵K1是否按下 開(kāi)關(guān)
{
delay_ms(10); //消除抖動(dòng) 一般大約10ms
if(key==0) //再次判斷按鍵是否按下
{
keymode++;
if(keymode == 2)keymode = 0;
}
while(!key); //檢測(cè)按鍵是否松開(kāi)
}
if(keymode==1)
{
keycount++;
if(keycount==8)
{
keycount=0;
keymode=0;
}
}
}
void Conut(void)
{
time=TH0*256+TL0; //讀出T0的計(jì)時(shí)數(shù)值
TH0=0;
TL0=0; //清空計(jì)時(shí)器
S=(time*1.7)/100; //算出來(lái)是CM
//聲音的速度是340m/s,時(shí)間的單位是us,計(jì)算到秒需要將時(shí)間數(shù)據(jù)/1000000,
//長(zhǎng)度=速度*時(shí)間,340*time/1000000,長(zhǎng)度數(shù)據(jù)單位是m轉(zhuǎn)換成cm需要乘以100得到340*time/10000,
//小數(shù)點(diǎn)都向左移兩位得到3.4*time/100,因?yàn)槌暡ㄊ峭盗,所以再除?,得到距離數(shù)據(jù)(time*1.7)/100
if(Mode==0) //非設(shè)置狀態(tài)時(shí)
{
if(S>=800) //超出測(cè)量范圍顯示“-”
{
disbuff[0]='o'-0x30; //“-”
disbuff[1]='v'-0x30; //“-”
disbuff[2]='e'-0x30; //“-”
disbuff[3]='r'-0x30; //“-”
}
else
{
disbuff[0]=S%1000/100; //將距離數(shù)據(jù)拆成單個(gè)位賦值
disbuff[1]=S%100/10;
disbuff[2]='.'-0x30;
disbuff[3]=S%10;
}
}
}
void delay(unsigned int t)
{
while(t--);
}
/**********************************************************************************************************/
//定時(shí)器0
void zd0() interrupt 1 //T0中斷用來(lái)計(jì)數(shù)器溢出,超過(guò)測(cè)距范圍
{
flag=1; //中斷溢出標(biāo)志
}
/**********************************************************************************************************/
//定時(shí)器1
void zd3() interrupt 3 //T1中斷用來(lái)掃描數(shù)碼管和計(jì)800MS啟動(dòng)模塊
{
char n=10;
P1 = 0xff;delay(7);
TH1=0xf8;
TL1=0x30; //定時(shí)2ms
timer++; //變量加
if(timer>=400) //1次就是40ms
{
timer=0;
TX=1; //40MS 啟動(dòng)一次模塊
while(n--);
TX=0;
SBUF=S/256;//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while(!TI); //等待發(fā)送數(shù)據(jù)完成
TI=0; //清除發(fā)送完成標(biāo)志位
SBUF=S%256;//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while(!TI); //等待發(fā)送數(shù)據(jù)完成
TI=0; //清除發(fā)送完成標(biāo)志位
}
P1 = act[keymode]; //掃描顯示
}
void UsartInit()
{
SCON=0X50; //設(shè)置為工作方式1
TMOD=0X20; //設(shè)置計(jì)數(shù)器工作方式2
PCON=0X80; //波特率加倍
TH1=0XF3; //計(jì)數(shù)器初始值設(shè)置,注意波特率是4800的
TL1=0XF3;
ES=1; //打開(kāi)接收中斷
EA=1; //打開(kāi)總中斷
TR1=1; //打開(kāi)計(jì)數(shù)器
}
/**********************************************************************************************************/
//主函數(shù)
void main(void)
{
TMOD=0x11; //設(shè)T0為方式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)啟總中斷
UsartInit(); //串口初始化 9600
LcdInit();
while(1)
{
while(!RX); //當(dāng)上次接收完波后,RX引腳是低電平,取反就是1,此while成立,反復(fù)判斷RX狀態(tài)。當(dāng)RX沒(méi)有接收到返回波時(shí)是高電平,取反就是0,此while不成立,跳出
TR0=1; //開(kāi)啟計(jì)數(shù)
while(RX); //當(dāng)RX沒(méi)有接收到返回波,此while成立,程序停在這里一直判斷RX狀態(tài)。當(dāng)RX接收到返回波,RX引腳變?yōu)榈碗娖,此while不成立,跳出
TR0=0; //停止計(jì)數(shù)
Conut(); //計(jì)算
LcdWriteCom(0x80);
LcdWritestr("distance:"); //液晶顯示距離
LcdWriteData(disbuff[0]+0x30);
LcdWriteData(disbuff[1]+0x30);
LcdWriteData(disbuff[2]+0x30);
LcdWriteData(disbuff[3]+0x30);
LcdWritestr("cm");
Key();
}
}
void Usart() interrupt 4
{
RI = 0;//清除接收中斷標(biāo)志位
}
XRLYGT_](LQ8S5%TW}C%`PM.png (132.2 KB, 下載次數(shù): 19)
下載附件
2020-6-29 20:06 上傳
|