久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
基于51的溫控系統溫度問題
[打印本頁]
作者:
1074024793
時間:
2019-4-20 11:27
標題:
基于51的溫控系統溫度問題
我的溫度 顯示不能隨傳感器溫度的改變而變化是為什么?
#include <reg52.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit ds=P3^5; //溫度傳感器
sbit beep=P3^7;
sbit rs=P2^4; //控制發光二極管
sbit rw=P2^3;
sbit lcde=P2^2;
uchar tp,tpx,num,count,miao,fen,shi;
uchar code table[]="happy everyday!";
uchar code table1[]=": :";
uchar code table2[]="weather:cold";
uchar code table3[]="weather:hot";
void delay(uint z) //延時
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay2(uint i)
{
while(i--);
}
////***ds18b20*****///
void init_ds18b20() //DS18B20復位,初始化函數
{
ds=1;
delay2(8);
ds=0;
delay2(90);
ds=1;
delay2(4);
if(ds==0)
delay2(14);
ds=1;
}
uchar read_ds18b20_byte() //讀1字節數據函數(MSB)
{
uchar i,dat;
dat=0;
for(i=0;i<8;i++)
{
ds=0;
dat=dat>>1;
ds=1;
if(ds==1)
{
dat=dat|0x80;//最高位或上一個1,使得最高位為1
}
delay2(4);
}
return dat;//循環8次完成一個字節,并返回數據
}
void write_ds18b20_byte(uchar date)//向ds8b20寫1字節數據函數
{
uchar j=0;
for(j=0;j<=8;j++)
{
ds=0;
ds=date&0x01; //取出數據最低位送到數據線
delay2(5);
ds=1;
date=date>>1;//字節右移一位,接著取第二位
delay2(5);
}
}
int read_ds18b20_temp() //DS18B20開始獲取溫度并轉換
{
uchar a=0;//低8位
uint b=0;//高8位
uint t=0;//組成新溫度
init_ds18b20();
write_ds18b20_byte(0xcc);
write_ds18b20_byte(0x44);
init_ds18b20();
write_ds18b20_byte(0xcc);
write_ds18b20_byte(0xbe);
a=read_ds18b20_byte();
b=read_ds18b20_byte();
a=a&0x00ff;
b=(b&0x000f)<<8;
t=a|b;
return t;
}
void writecom(uchar com)
{
rs=0;
rw=0;
lcde=0;
delay(5);
lcde=0;
P1=com;
delay(5);
lcde=1;
delay(5);
lcde=0;
}
void writedate(uchar date)
{
rs=1;
rw=0;
delay(5);
lcde=0;
P1=date;
delay(5);
lcde=1;
delay(5);
lcde=0;
}
void wendudisplay()//顯示溫度數值函數,t傳遞的是整型的溫度值
{
uint tp,tpz;
uchar tp2,tpshi,tpge,tpxiao;
tp=read_ds18b20_temp();
tp2=tp&0x000f;
tpxiao=tp2*0.0625;
tpz=(tp&0x0ff0)>>4;
tpz=tpz*0.0625;
tpshi=tpz/10;
tpge=tpz%10;
writecom(0x80+0x40+10);
writedate(tpshi+0x30);
writedate(tpge+0x30);
writedate('.') ;
writedate(tpxiao+0x30);
writedate(0xdf);
writedate('C');
if(tpz<15)
{
writecom(0x80);
for(num=0;num<16;num++)
{
writedate(table2[num]);
delay(5);
beep=0;
}
}
if((tpz<25)&&(tpz>=15))
{
writecom(0x80);
for(num=0;num<15;num++)
{
writedate(table[num]);
delay(5);
beep=1;
}
}
if(tpz>25)
{
writecom(0x80);
for(num=0;num<16;num++)
{
writedate(table3[num]);
delay(5);
}
}
}
void writesfm(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
writecom(0x80+0x40+add);
writedate(0x30+shi);
writedate(0x30+ge);
writecom(0x80+0x40+add);
}
void init()
{
lcde=0;
writecom(0x38);
writecom(0x0c);
writecom(0x06);
writecom(0x01);
delay(5);
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
miao=15;
fen=12;
shi=12;
}
void main()
{
init();
while(1)
{
wendudisplay();
writesfm(0,shi);
writesfm(3,fen);
writesfm(6,miao);
writecom(0x80+0x40+2);
writedate(':');
writecom(0x80+0x40+5);
writedate(':');
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
shi++;
fen=0;
if(shi==24)
shi=0;
}
}
}
}
作者:
dianzi741
時間:
2019-4-20 14:49
中斷會影響18b20 的讀值 我以前遇到過,這個屬于模擬I2C的時序問題
作者:
wulin
時間:
2019-4-20 15:57
給你改好了,仿真和程序的LCD用的是P0,你自己改回P1
無標題.jpg
(171.49 KB, 下載次數: 17)
下載附件
2019-4-20 15:56 上傳
#include <reg52.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS=P3^5; //溫度傳感器
sbit beep=P3^7;
sbit rs=P2^4; //控制發光二極管
sbit rw=P2^3;
sbit lcde=P2^2;
uchar tp,tpx,num,count,miao,fen,shi;
uchar code table[]= "happy everyday! ";
uchar code table1[]=": :";
uchar code table2[]="weather:cold ";
uchar code table3[]="weather:hot ";
void delay_us(uchar us)//約2us延時函數
{
while(--us);
}
void delay(uchar z)//約1ms延時函數
{
while(z--)
{
delay_us(245);
delay_us(245);
}
}
//讀一個字節
uchar read_byte()
{
uchar i,dat;
for(i=0;i<8;i++)
{
DS=0;
dat>>=1;
DS=1;
if(DS)
dat|=0x80;
delay_us(25);
}
return (dat);
}
//寫一個字節
void write_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DS=0;
DS=dat&0x01;
delay_us(25);//延時
DS=1;//釋放總線準備下一次數據的寫入
dat>>=1;
}
}
//單總線初始化時序
bit ds_init()
{
bit i;
DS=1;
delay_us(5);
DS=0;
delay_us(200);//拉低總線499.45us,總線上的溫度傳感器將會被全部復位
delay_us(200);
DS=1;//釋放總線
delay_us(50);//延時37.95us,等待溫度傳感器發回存在信號
i=DS;
delay_us(25);//延時141.95us,讀取溫度傳感器存在的時間
return (i);
}
uint ReadTemperature()
{
uint H,i;
uchar L;
ds_init();//初始化溫度傳感器
write_byte(0xcc);//發送跳躍ROM指令
write_byte(0x44);//發送溫度轉換指令
delay(10);
ds_init();//初始化溫度傳感器
write_byte(0xcc);//發送跳躍ROM指令
write_byte(0xbe);//讀取溫度傳感器暫存器的值
L=read_byte();
H=read_byte();
H<<=8;
i=L+H;
return(i);
}
void writecom(uchar com)
{
rs=0;
rw=0;
lcde=0;
delay(5);
lcde=0;
P0=com;
delay(5);
lcde=1;
delay(5);
lcde=0;
}
void writedate(uchar date)
{
rs=1;
rw=0;
delay(5);
lcde=0;
P0=date;
delay(5);
lcde=1;
delay(5);
lcde=0;
}
void wendudisplay()//顯示溫度數值函數,t傳遞的是整型的溫度值
{
uint tp,tpz;
uchar tpshi,tpge,tpxiao;
tp=ReadTemperature();
if(tp>0x0630 || (tp&0x8000)>0)//限制在0~99范圍
tp=0;
tpz=tp>>4; //分解為整數;
tpxiao=tp&0x0f;//分解為小數
tpxiao=tpxiao*6/10;//保留一位小數
/*
tp2=tp&0x000f;
tpxiao=tp2*0.0625;
tpz=(tp&0x0ff0)>>4;
tpz=tpz*0.0625;
*/
tpshi=tpz/10;
tpge=tpz%10;
writecom(0x80+0x40+10);
writedate(tpshi+0x30);
writedate(tpge+0x30);
writedate('.') ;
writedate(tpxiao+0x30);
writedate(0xdf);
writedate('C');
if(tpz<15)
{
writecom(0x80);
for(num=0;num<16;num++)
{
writedate(table2[num]);
delay(5);
beep=0;
}
}
if((tpz<25)&&(tpz>=15))
{
writecom(0x80);
for(num=0;num<16;num++)
{
writedate(table[num]);
delay(5);
beep=1;
}
}
if(tpz>25)
{
writecom(0x80);
for(num=0;num<16;num++)
{
writedate(table3[num]);
delay(5);
}
}
}
void writesfm(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
writecom(0x80+0x40+add);
writedate(0x30+shi);
writedate(0x30+ge);
writecom(0x80+0x40+add);
}
void init()
{
lcde=0;
writecom(0x38);
writecom(0x0c);
writecom(0x06);
writecom(0x01);
delay(5);
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
miao=15;
fen=12;
shi=12;
}
void main()
{
init();
writecom(0x80+0x40+2);
writedate(':');
writecom(0x80+0x40+5);
writedate(':');
while(1)
{
wendudisplay();
writesfm(0,shi);
writesfm(3,fen);
writesfm(6,miao);
// writecom(0x80+0x40+2);
// writedate(':');
// writecom(0x80+0x40+5);
// writedate(':');
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
shi++;
fen=0;
if(shi==24)
shi=0;
}
}
}
}
復制代碼
作者:
yzwzfyz
時間:
2019-4-20 16:53
沙發誤導你。
作者:
愛愛愛
時間:
2019-4-27 21:38
單片機時序有沒有問題
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
一区二区三区视频在线观看
|
www.一区二区
|
日韩av免费在线观看
|
蜜桃视频在线观看www社区
|
国产一级电影在线
|
不卡av在线
|
精品在线一区
|
一区二区在线视频
|
国产91久久久久久久免费
|
国产免费观看一级国产
|
欧美一级片在线看
|
久久精品国产一区二区电影
|
五月精品视频
|
欧美99
|
国产一区二区三区欧美
|
韩三级在线观看
|
精品一区二区av
|
成在线人视频免费视频
|
97精品国产97久久久久久免费
|
天天操天天插
|
999观看免费高清www
|
天天天操
|
av中文网
|
国产91一区二区三区
|
国产精品久久久久久吹潮
|
日韩欧美在线一区
|
欧美v免费
|
天天综合网天天综合色
|
综合精品
|
日韩av成人
|
在线看日韩
|
a级毛片基地
|
久久不射电影网
|
美女国产一区
|
影视一区
|
九九热re
|
国产在线资源
|
欧美国产日韩在线观看
|
日韩在线观看中文字幕
|
国产91久久精品一区二区
|
欧美在线视频二区
|