我是51初學者,程序也是從歷程中復制過來的,就想請問下高手,這個功能要怎么實現,怎么修改
主要問題是
LCD1602液晶屏顯示的只有第一行的溫度變化量,且溫度變化量的數據1秒顯示一個 超聲波距離不顯示
分開使用后又能實現,請問這是什么問題,最好能把解決的程序寫一下 謝謝
這是代碼的主要程序
#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,};
/*******************************************************************************
* 函數名 : LcdDisplay()
* 函數功能 : LCD顯示讀取到的溫度
* 輸入 : v
* 輸出 : 無
*******************************************************************************/
void LcdDisplay(int temp) //lcd顯示
{
unsigned char i, datas[] = {0, 0, 0, 0, 0}; //定義數組
float tp;
if(temp< 0) //當溫度值為負數
{
LcdWriteCom(0x80); //寫地址 80表示初始地址
SBUF='-';//將接收到的數據放入到發送寄存器
while(!TI); //等待發送數據完成
TI=0; //清除發送完成標志位
LcdWriteData('-'); //顯示負
//因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
temp=temp-1;
temp=~temp;
tp=temp;
temp=tp*0.0625*100+0.5;
//留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
//后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
//算由?.5,還是在小數點后面。
}
else
{
LcdWriteCom(0x80); //寫地址 80表示初始地址
LcdWriteData('+'); //顯示正
SBUF='+';//將接收到的數據放入到發送寄存器
while(!TI); //等待發送數據完成
TI=0; //清除發送完成標志位
tp=temp;//因為數據處理有小數點所以將溫度賦給一個浮點型變量
//如果溫度是正的那么,那么正數的原碼就是補碼它本身
temp=tp*0.0625*100+0.5;
//留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
//后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
//算加上0.5,還是在小數點后面。
}
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); //寫地址 80表示初始地址
LcdWriteData('0'+datas[0]); //百位
SBUF = '0'+datas[0];//將接收到的數據放入到發送寄存器
while (!TI); //等待發送數據完成
TI = 0;
LcdWriteCom(0x83); //寫地址 80表示初始地址
LcdWriteData('0'+datas[1]); //十位
SBUF = '0'+datas[1];//將接收到的數據放入到發送寄存器
while (!TI); //等待發送數據完成
TI = 0;
LcdWriteCom(0x84); //寫地址 80表示初始地址
LcdWriteData('0'+datas[2]); //個位
SBUF = '0'+datas[2];//將接收到的數據放入到發送寄存器
while (!TI); //等待發送數據完成
TI = 0;
LcdWriteCom(0x85); //寫地址 80表示初始地址
LcdWriteData('.'); //顯示 ‘.’
SBUF = '.';//將接收到的數據放入到發送寄存器
while (!TI); //等待發送數據完成
TI = 0;
LcdWriteCom(0x86); //寫地址 80表示初始地址
LcdWriteData('0'+datas[3]); //顯示小數點
SBUF = '0'+datas[3];//將接收到的數據放入到發送寄存器
while (!TI); //等待發送數據完成
TI = 0;
LcdWriteCom(0x87); //寫地址 80表示初始地址
LcdWriteData('0'+datas[4]); //顯示小數點
SBUF = '0'+datas[4];//將接收到的數據放入到發送寄存器
while (!TI); //等待發送數據完成
TI = 0;
for(i=0; i<6; i++)
{
SBUF = CNCHAR[i];//將接收到的數據放入到發送寄存器
while (!TI); //等待發送數據完成
TI = 0;
}
}
/*******************************************************************************
* 函 數 名 :UsartConfiguration()
* 函數功能 :設置串口
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void UsartConfiguration()
{
SCON=0X50; //設置為工作方式1
TMOD=0X20; //設置計數器工作方式2
PCON=0X80; //波特率加倍
TH1=0XF3; //計數器初始值設置,注意波特率是4800的
TL1=0XF3;
// ES=1; //打開接收中斷
// EA=1; //打開總中斷
TR1=1; //打開計數器
}
/*******************************************************************************
* 函 數 名 : main
* 函數功能 : 主函數
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/100; //算出來是CM
//顯示第二行
LcdWriteCom(0x80+0x40);
if((S>=700)||flag==1) //超出測量范圍顯示“-”
{
flag=0;
LcdWriteData(ASCII[11]);
LcdWriteData(ASCII[10]); //顯示點
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]); //顯示點
LcdWriteData(ASCII[disbuff[1]]);
LcdWriteData(ASCII[disbuff[2]]);
LcdWriteData(ASCII[12]); //顯示M
}
}
void zd0() interrupt 1 //T0中斷用來計數器溢出,超過測距范圍
{
flag=1; //中斷溢出標志
}
void StartModule() //啟動模塊
{
unsigned char i;
Trig=1; //啟動一次模塊
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; //設T0為方式1,GATE=1;
TH0=0;
TL0=0;
ET0=1; //允許T0中斷
EA=1; //開啟總中斷 */
LcdWriteCom(0x88); //寫地址 80表示初始地址
LcdWriteData('C');
while(1)
{
/*LcdDisplay(Ds18b20ReadTemp());*/
StartModule();
while(!Echo); //當RX為零時等待
TR0=1; //開啟計數
while(Echo); //當RX為1計數并等待
TR0=0; //關閉計數
Conut(); //計算距離
delayms(80);
}
}
求大佬幫忙 萌新求助
|