|
DHT11在12864顯示,單獨一個文件可以正常顯示,但是移植到我的工程里12864上面就什么都沒了。在單獨文件里面12864顯示函數就是從工程里拿的,而且我的串口通信代碼莫名其妙就不起作用了。下面是我的單獨文件,工程在下面
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit Data=P1^1; //定義數據線
uchar rec_dat[15]; //用于顯示的接收數據數組
sbit PSB=P2^4;
sbit SCLK=P2^5;
sbit SID=P2^6;
void Int_232() //232初始化
{
TMOD=0x20;
SCON=0x50;
TH1=0xFD;
TL1=0xFD;
TR1=1;
TI=0;
}
void TX(uchar TX_char)//串口發送數據
{
SBUF=TX_char;
while(!TI);
TI=0;
}
void TXT()//串口發送給數據
{
uchar i;
for(i=0;i<12;i++)
TX(rec_dat[ i]);
}
void delay(uint n)
{ uint x,y;
for(x=n;x>0;x--)
for(y=110;y>0;y--);
}
void Delayms(uint n) //延時時間為 1ms * x 晶振是11.0592M
{
unsigned int i,j;
for(i=n;i>0;i--)
for(j=110;j>0;j--);
}
//將8位二進制數逐位寫入
void LCD_sendbyte(uchar dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
SCLK=0;
if(dat&0x80)
SID=1;
else SID=0;
SCLK=1;
dat=dat<<1; //左移一位
}
}
//寫入命令
void LCD_write_com(uchar com)
{
LCD_sendbyte(0xf8); //送入5個連續的“1“,啟動一個周期,11111,RW(0),RS(0),0
LCD_sendbyte(0xf0&com); //取高四位,數據分兩次傳送,每個字節的內容被送入兩個字節,高四位放在第一個字節的高四位
LCD_sendbyte(0xf0&(com<<4)); //低四位放在第二個字節的高四位
Delayms(1); //串行不支持讀操作,不可檢測忙操作,這里用延時替代
}
//寫入數據
void LCD_write_dat(uchar dat)
{
LCD_sendbyte(0xfa);
LCD_sendbyte(0xf0&dat);
LCD_sendbyte(0xf0&(dat<<4));
Delayms(1);
}
//LCD初始化
void LCD_init()
{
LCD_write_com(0x30); //選擇基本指令集
LCD_write_com(0x0c); //開顯示,無游標,不反白
LCD_write_com(0x01); //清除顯示屏幕,把DDRAM位址計數器調整為00H
Delayms(1); //清屏操作時間較長1.6ms 因此加此延時
LCD_write_com(0x02); //清DDRAM位址歸位,此處貌似與清屏重復
LCD_write_com(0x06); //設定光標右移,整體顯示不移動
}
//LCD屏幕地址定位
void LCD_Setaddress(uchar x,uchar y) //地址從第1行第1列開始不從0開始(y)
{
unsigned char addr;
switch(x)
{
case 1: addr=0x80+y-1;
break;
case 2: addr=0x90+y-1;
break;
case 3: addr=0x88+y-1;
break;
case 4: addr=0x98+y-1;
break;
default : break;
}
LCD_write_com(addr); //字符顯示開始地址
}
//LCD顯示字符數組(文字)
void LCD_Putstring( uchar x, uchar y, uchar *pData )
{
LCD_Setaddress(x,y);
while(*pData)
{
LCD_write_dat( *pData++ );
}
}
void DHT11_delay_us(uchar n)
{
while(--n);
}
void DHT11_delay_ms(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void DHT11_start()
{
Data=1;
DHT11_delay_us(2);
Data=0;
DHT11_delay_ms(30); //延時18ms以上
Data=1;
DHT11_delay_us(30);
}
uchar DHT11_rec_byte() //接收一個字節
{
uchar i,dat=0;
for(i=0;i<8;i++) //從高到低依次接收8位數據
{
while(!Data); ////等待50us低電平過去
DHT11_delay_us(8); //延時60us,如果還為高則數據為1,否則為0
dat<<=1; //移位使正確接收8位數據,數據為0時直接移位
if(Data==1) //數據為1時,使dat加1來接收數據1
dat+=1;
while(Data); //等待數據線拉低
}
return dat;
}
void DHT11_receive() //接收40位的數據
{
uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
DHT11_start();
if(Data==0)
{
while(Data==0); //等待拉高
DHT11_delay_us(40); //拉高后延時80us
R_H=DHT11_rec_byte(); //接收濕度高八位
R_L=DHT11_rec_byte(); //接收濕度低八位
T_H=DHT11_rec_byte(); //接收溫度高八位
T_L=DHT11_rec_byte(); //接收溫度低八位
revise=DHT11_rec_byte(); //接收校正位
DHT11_delay_us(25); //結束
if((R_H+R_L+T_H+T_L)==revise) //校正
{
RH=R_H;
RL=R_L;
TH=T_H;
TL=T_L;
}
/*數據處理,方便顯示*/
rec_dat[0]=0x30+(RH/10);
rec_dat[1]=0x30+(RH%10);
rec_dat[2]=0x2e;//"."
rec_dat[3]=0x30+(RL/10);
rec_dat[4]=0x30+(RL%10);
rec_dat[5]=0x52;//"R"
rec_dat[6]=0x48;//"H"
rec_dat[7]=0x20;
rec_dat[8]=0x30+(TH/10);
rec_dat[9]=0x30+(TH%10);
rec_dat[10]=0x2e;
rec_dat[11]=0x30+(TL/10);
rec_dat[12]=0x30+(TL%10);
rec_dat[13]=0x43;//"C"
}
}
void main()
{
uchar i;
LCD_init();
Int_232() //232初始化
while(1)
{
DHT11_delay_ms(100); //DHT11上電后要等待1S以越過不穩定狀態在此期間不能發送任何指令
DHT11_receive();
LCD_write_com(0x88);//12864顯示定位
for(i=0;i<14;i++)
LCD_write_dat(rec_dat[ i]); //顯示數據
LCD_write_com(0x80+0x40);
LCD_write_dat(0x2d);
LCD_write_dat(0x42);
LCD_write_dat(0x3a);
TXT();//串口發送給數據
}
}
|
|