標(biāo)題:
51單片機(jī)LCD1602溫度超聲波測(cè)距雙顯示求解
[打印本頁(yè)]
作者:
農(nóng)大學(xué)生1
時(shí)間:
2019-5-2 20:17
標(biāo)題:
51單片機(jī)LCD1602溫度超聲波測(cè)距雙顯示求解
我是51初學(xué)者,程序也是從歷程中復(fù)制過(guò)來(lái)的,就想請(qǐng)問(wèn)下高手,這個(gè)功能要怎么實(shí)現(xiàn),怎么修改
主要問(wèn)題是
LCD1602液晶屏顯示的只有第一行的溫度變化量,且溫度變化量的數(shù)據(jù)1秒顯示一個(gè) 超聲波距離不顯示
分開(kāi)使用后又能實(shí)現(xiàn),請(qǐng)問(wèn)這是什么問(wèn)題,最好能把解決的程序?qū)懸幌?nbsp; 謝謝
這是代碼的主要程序
#include<reg51.h>
#include<intrins.h>
#include"lcd1602.h"
#include"wendu.h"
sbit Trig = P2^0;
sbit Echo = P2^1;
uchar CNCHAR[6] = "攝氏度";
unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
static unsigned char DisNum = 0; //顯示用指針
unsigned int time=0;
unsigned long S=0;
bit flag =0;
unsigned char disbuff[4] ={ 0,0,0,0,};
/*******************************************************************************
* 函數(shù)名 : LcdDisplay()
* 函數(shù)功能 : LCD顯示讀取到的溫度
* 輸入 : v
* 輸出 : 無(wú)
*******************************************************************************/
void LcdDisplay(int temp) //lcd顯示
{
unsigned char i, datas[] = {0, 0, 0, 0, 0}; //定義數(shù)組
float tp;
if(temp< 0) //當(dāng)溫度值為負(fù)數(shù)
{
LcdWriteCom(0x80); //寫(xiě)地址 80表示初始地址
SBUF='-';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while(!TI); //等待發(fā)送數(shù)據(jù)完成
TI=0; //清除發(fā)送完成標(biāo)志位
LcdWriteData('-'); //顯示負(fù)
//因?yàn)樽x取的溫度是實(shí)際溫度的補(bǔ)碼,所以減1,再取反求出原碼
temp=temp-1;
temp=~temp;
tp=temp;
temp=tp*0.0625*100+0.5;
//留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語(yǔ)言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
//后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
//算由?.5,還是在小數(shù)點(diǎn)后面。
}
else
{
LcdWriteCom(0x80); //寫(xiě)地址 80表示初始地址
LcdWriteData('+'); //顯示正
SBUF='+';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while(!TI); //等待發(fā)送數(shù)據(jù)完成
TI=0; //清除發(fā)送完成標(biāo)志位
tp=temp;//因?yàn)閿?shù)據(jù)處理有小數(shù)點(diǎn)所以將溫度賦給一個(gè)浮點(diǎn)型變量
//如果溫度是正的那么,那么正數(shù)的原碼就是補(bǔ)碼它本身
temp=tp*0.0625*100+0.5;
//留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語(yǔ)言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
//后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
//算加上0.5,還是在小數(shù)點(diǎn)后面。
}
datas[0] = temp / 10000;
datas[1] = temp % 10000 / 1000;
datas[2] = temp % 1000 / 100;
datas[3] = temp % 100 / 10;
datas[4] = temp % 10;
LcdWriteCom(0x82); //寫(xiě)地址 80表示初始地址
LcdWriteData('0'+datas[0]); //百位
SBUF = '0'+datas[0];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while (!TI); //等待發(fā)送數(shù)據(jù)完成
TI = 0;
LcdWriteCom(0x83); //寫(xiě)地址 80表示初始地址
LcdWriteData('0'+datas[1]); //十位
SBUF = '0'+datas[1];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while (!TI); //等待發(fā)送數(shù)據(jù)完成
TI = 0;
LcdWriteCom(0x84); //寫(xiě)地址 80表示初始地址
LcdWriteData('0'+datas[2]); //個(gè)位
SBUF = '0'+datas[2];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while (!TI); //等待發(fā)送數(shù)據(jù)完成
TI = 0;
LcdWriteCom(0x85); //寫(xiě)地址 80表示初始地址
LcdWriteData('.'); //顯示 ‘.’
SBUF = '.';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while (!TI); //等待發(fā)送數(shù)據(jù)完成
TI = 0;
LcdWriteCom(0x86); //寫(xiě)地址 80表示初始地址
LcdWriteData('0'+datas[3]); //顯示小數(shù)點(diǎn)
SBUF = '0'+datas[3];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while (!TI); //等待發(fā)送數(shù)據(jù)完成
TI = 0;
LcdWriteCom(0x87); //寫(xiě)地址 80表示初始地址
LcdWriteData('0'+datas[4]); //顯示小數(shù)點(diǎn)
SBUF = '0'+datas[4];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while (!TI); //等待發(fā)送數(shù)據(jù)完成
TI = 0;
for(i=0; i<6; i++)
{
SBUF = CNCHAR[i];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while (!TI); //等待發(fā)送數(shù)據(jù)完成
TI = 0;
}
}
/*******************************************************************************
* 函 數(shù) 名 :UsartConfiguration()
* 函數(shù)功能 :設(shè)置串口
* 輸 入 : 無(wú)
* 輸 出 : 無(wú)
*******************************************************************************/
void UsartConfiguration()
{
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ù) 名 : main
* 函數(shù)功能 : 主函數(shù)
* 輸 入 : 無(wú)
* 輸 出 : 無(wú)
*******************************************************************************/
void Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/100; //算出來(lái)是CM
//顯示第二行
LcdWriteCom(0x80+0x40);
if((S>=700)||flag==1) //超出測(cè)量范圍顯示“-”
{
flag=0;
LcdWriteData(ASCII[11]);
LcdWriteData(ASCII[10]); //顯示點(diǎn)
LcdWriteData(ASCII[11]);
LcdWriteData(ASCII[11]);
LcdWriteData( ASCII[12]); //顯示M
}
else
{
disbuff[0]=S%1000/100;
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%10 %10;
LcdWriteData(ASCII[disbuff[0]]);
LcdWriteData(ASCII[10]); //顯示點(diǎn)
LcdWriteData(ASCII[disbuff[1]]);
LcdWriteData(ASCII[disbuff[2]]);
LcdWriteData(ASCII[12]); //顯示M
}
}
void zd0() interrupt 1 //T0中斷用來(lái)計(jì)數(shù)器溢出,超過(guò)測(cè)距范圍
{
flag=1; //中斷溢出標(biāo)志
}
void StartModule() //啟動(dòng)模塊
{
unsigned char i;
Trig=1; //啟動(dòng)一次模塊
for(i=10;i>0;i--)
_nop_();
Trig=0;
}
void delayms(unsigned int ms)
{
unsigned char i=100,j;
for(;ms;ms--)
{
while(--i)
{
j=10;
while(--j);
}
}
}
void main(void)
{
LcdInit();
UsartConfiguration();
TMOD=0x01; //設(shè)T0為方式1,GATE=1;
TH0=0;
TL0=0;
ET0=1; //允許T0中斷
EA=1; //開(kāi)啟總中斷 */
LcdWriteCom(0x88); //寫(xiě)地址 80表示初始地址
LcdWriteData('C');
while(1)
{
/*LcdDisplay(Ds18b20ReadTemp());*/
StartModule();
while(!Echo); //當(dāng)RX為零時(shí)等待
TR0=1; //開(kāi)啟計(jì)數(shù)
while(Echo); //當(dāng)RX為1計(jì)數(shù)并等待
TR0=0; //關(guān)閉計(jì)數(shù)
Conut(); //計(jì)算距離
delayms(80);
}
}
求大佬幫忙 萌新求助
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1