欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
12864顯示溫度單片機仿真接上溫度傳感器就報錯 但實物后可以正常運行
[打印本頁]
作者:
黃瓜芝麻醬紫
時間:
2017-5-20 01:29
標題:
12864顯示溫度單片機仿真接上溫度傳感器就報錯 但實物后可以正常運行
我做好實物后可以正常運行,但是仿真的時候顯示器不能顯示溫度,我把溫度傳感器接上后仿真就開始報錯了,不接溫度傳感器就不報錯了,但是溫度顯示不出來,還有按鍵部分按著也沒有反應。大神指導一下,或者幫忙改一下,,謝謝了
112211.jpg
(143.08 KB, 下載次數: 73)
下載附件
2017-5-20 01:26 上傳
下載:
1122.zip
(82.02 KB, 下載次數: 23)
2017-5-20 01:23 上傳
點擊文件名下載附件
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define p0 P0
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P15=P1^5;
sbit P16=P1^6;
uchar code table1[]={"當前溫度"};
uchar code table2[]={"鋼板打印中......"};
uchar code table3[]={"攝氏度"};
uchar code table4[]={"偏高"};
uchar code table5[]={"適宜"};
uchar code table6[]={"偏低"};
uchar code table7[]={"缺少鋼板不能打印"};
uchar code table8[]={"鋼板凹凸不能打印"};
uchar code table9[]={"鋼板太薄打印穿透"};
sbit ds = P1^4;
sbit rs=P2^0;
sbit rw=P2^1;
sbit en=P2^2;
void delay(uint k) //延時函數
{
uint i,j;
for(i=0;i<k;i++)
for(j=0;j<121;j++);
}
void wcode(uchar c) //寫命令
{
rs=0;
rw=0;
en=0;
P0=c;
delay(5);
en=1;
delay(5);
en=0;
delay(5);
}
void wdata(uchar date) //寫數據
{
rs=1;
rw=0;
en=0;
P0=date;
delay(5);
en=1;
delay(5);
en=0;
delay(5);
}
void init() //12864初始化
{
wcode(0x30);
delay(5);
wcode(0x0c);
delay(5);
wcode(0x01);
delay(5);
}
//=====`====================================1820===============
void dsInit()
{
//對于11.0592MHz時鐘, unsigned int型的i, 作一個i++操作的時間大于為8us
unsigned int i;
ds = 0;
i = 100; //拉低約800us, 符合協議要求的480us以上
while(i>0) i--;
ds = 1; //產生一個上升沿, 進入等待應答狀態
i = 4;
while(i>0) i--;
}
void dsWait()
{
unsigned int i;
while(ds);
while(~ds); //檢測到應答脈沖
i = 4;
while(i > 0) i--;
}
bit readBit()
{
unsigned int i;
bit b;
ds = 0;
i++; //延時約8us, 符合協議要求至少保持1us
ds = 1;
i++; i++; //延時約16us, 符合協議要求的至少延時15us以上
b = ds;
i = 8;
while(i>0) i--; //延時約64us, 符合讀時隙不低于60us要求
return b;
}
unsigned char readByte()
{
unsigned int i;
unsigned char j, dat;
dat = 0;
for(i=0; i<8; i++)
{
j = readBit();
//最先讀出的是最低位數據
dat = (j << 7) | (dat >> 1);
}
return dat;
}
void writeByte(unsigned char dat)
{
unsigned int i;
unsigned char j;
bit b;
for(j = 0; j < 8; j++)
{
b = dat & 0x01;
dat >>= 1;
//寫"1", 將DQ拉低15us后, 在15us~60us內將DQ拉高, 即完成寫1
if(b)
{
ds = 0;
i++; i++; //拉低約16us, 符號要求15~60us內
ds = 1;
i = 8; while(i>0) i--; //延時約64us, 符合寫時隙不低于60us要求
}
else //寫"0", 將DQ拉低60us~120us
{
ds=0;
i=8; while(i>0) i--; //拉低約64us, 符號要求
ds=1;
i++;i++; //整個寫0時隙過程已經超過60us, 這里就不用像寫1那樣, 再延時64us了
}
}
}
//向DS18B20發送溫度轉換命令
void sendChangeCmd()
{
dsInit();
dsWait();
delay(1);
writeByte(0xcc); //寫入跳過序列號命令字 Skip Rom
writeByte(0x44); //寫入溫度轉換命令字 Convert T
}
//向DS18B20發送讀取數據命令
void sendReadCmd()
{
dsInit();
dsWait();
delay(1);
writeByte(0xcc); //寫入跳過序列號命令字 Skip Rom
writeByte(0xbe); //寫入讀取數據令字 Read Scratchpad
}
//獲取當前溫度值
int getTmpValue()
{
unsigned int tmpvalue;
int value; //存放溫度數值
float t;
unsigned char low, high;
sendReadCmd();
//連續讀取兩個字節數據
low=readByte();
high=readByte();
//將高低兩個字節合成一個整形變量
//計算機中對于負數是利用補碼來表示的
//若是負值, 讀取出來的數值是用補碼表示的, 可直接賦值給int型的value
tmpvalue=high;
tmpvalue<<=8;
tmpvalue|=low;
value=tmpvalue;
t=value*0.0625;
value=t*100+(value>0?0.5:-0.5);
return value;
}
void display(int v)
{
unsigned char count;
unsigned char datas[5];
datas[0]=v/10000;
datas[1]=v%10000/1000;
datas[2]=v%1000/100;
datas[3]=v%100/10;
datas[4]=v%10;
wcode(0x88+5);
if(v<0)
{
wdata('-');
}
else
{
wdata(' ');
}
if(datas[0]!=0)
{
wdata('0'+datas[0]);
}
for(count=1; count<5;count++)
{
wdata('0'+datas[count]);
if(count==2)
{wdata('.');}
}
}
void temperaturealarm(int b)
{unsigned char i;
if(b>2800){wcode(0x98+1);
for(i=0;i<4;i++)
{wdata(table4[i]);
}
}
else if(2200<=b&b<2800){wcode(0x98+1);
for(i=0;i<4;i++)
// if(P37==0){wcode(0x98+1);
{wdata(table5[i]);
}
}
else if(b<2200){wcode(0x98+1);
for(i=0;i<4;i++)
// if(P37==0){wcode(0x98+1);
{wdata(table6[i]);}
}
}
void main()
{
unsigned char i=0;
// int a=0;
init();
P10=1;
P11=1;
P12=1;
// P13=1;
P15=0;
// P16=1;
delay(200);
wcode(0x80+0x00);
for(i=0;i<16;i++)
{wdata(table2[i]);
}
wcode(0x88);
for(i=0;i<10;i++)
{wdata(table1[i]);
}
wcode(0x98+0x05);
for(i=0;i<6;i++)
{wdata (table3[i]);}
while(1)
{
if(P15==0)
{
display(getTmpValue());
temperaturealarm(getTmpValue());
sendChangeCmd();
}
if(P10==0)
{
delay(200);
wcode(0x80+0x00);
for(i=0;i<16;i++)
wdata (table7[i]);
}
if(P11==0)
{
delay(200);
wcode(0x80+0x00);
for(i=0;i<16;i++)
wdata (table8[i]);
}
if(P12==0)
{
delay(200);
wcode(0x80+0x00);
for(i=0;i<16;i++)
wdata (table9[i]);
}
if(P13==0)
{
delay(200);
init();
P15=1;
}
if(getTmpValue()>2800)
P16=0;
if(getTmpValue()<2800)
P16=1;
}
}
復制代碼
作者:
cjjcjj1
時間:
2017-5-20 06:41
提示:
作者被禁止或刪除 內容自動屏蔽
作者:
lyf898
時間:
2017-5-20 08:00
現在的仿真軟件很多時候都扯淡,測試了很多電路都是如此。18b20測溫電路最明顯的是數據輸出線接電阻就不能運行,甚至接一根虛線仿真都出錯。數字電路還好點,模擬電路就更是一塌糊涂了,比如雙向可控硅,控制極懸空都能導通,太扯淡了。
作者:
HUZAO
時間:
2017-5-20 09:15
堅持查一下溫度傳感器的連線有沒有問題
作者:
zl2168
時間:
2017-5-20 10:27
要學懂單片機及其控制程序,才能拼接應用。其實單片機應用就是把別人成功應用的部分拼接起來。
作者:
g753388438
時間:
2017-5-20 10:47
液晶屏的指令不一樣
作者:
走三關
時間:
2017-5-20 11:35
我正在做12864密碼鎖,現在過來看看資料
作者:
黃瓜芝麻醬紫
時間:
2017-5-21 17:10
g753388438 發表于 2017-5-20 10:47
液晶屏的指令不一樣
什么意思,該怎么改
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1