|
我做好實物后可以正常運行,但是仿真的時候顯示器不能顯示溫度,我把溫度傳感器接上后仿真就開始報錯了,不接溫度傳感器就不報錯了,但是溫度顯示不出來,還有按鍵部分按著也沒有反應(yīng)。大神指導(dǎo)一下,或者幫忙改一下,,謝謝了
下載:
1122.zip
(82.02 KB, 下載次數(shù): 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[]={"當(dāng)前溫度"};
- 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) //延時函數(shù)
- {
- 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) //寫數(shù)據(jù)
- {
- 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, 符合協(xié)議要求的480us以上
- while(i>0) i--;
- ds = 1; //產(chǎn)生一個上升沿, 進入等待應(yīng)答狀態(tài)
- i = 4;
- while(i>0) i--;
- }
-
- void dsWait()
- {
- unsigned int i;
- while(ds);
- while(~ds); //檢測到應(yīng)答脈沖
- i = 4;
- while(i > 0) i--;
- }
- bit readBit()
- {
- unsigned int i;
- bit b;
- ds = 0;
- i++; //延時約8us, 符合協(xié)議要求至少保持1us
- ds = 1;
- i++; i++; //延時約16us, 符合協(xié)議要求的至少延時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();
- //最先讀出的是最低位數(shù)據(jù)
- 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內(nèi)將DQ拉高, 即完成寫1
- if(b)
- {
- ds = 0;
- i++; i++; //拉低約16us, 符號要求15~60us內(nèi)
- 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時隙過程已經(jīng)超過60us, 這里就不用像寫1那樣, 再延時64us了
- }
- }
- }
- //向DS18B20發(fā)送溫度轉(zhuǎn)換命令
- void sendChangeCmd()
- {
- dsInit();
- dsWait();
- delay(1);
- writeByte(0xcc); //寫入跳過序列號命令字 Skip Rom
- writeByte(0x44); //寫入溫度轉(zhuǎn)換命令字 Convert T
- }
- //向DS18B20發(fā)送讀取數(shù)據(jù)命令
- void sendReadCmd()
- {
- dsInit();
- dsWait();
- delay(1);
- writeByte(0xcc); //寫入跳過序列號命令字 Skip Rom
- writeByte(0xbe); //寫入讀取數(shù)據(jù)令字 Read Scratchpad
- }
- //獲取當(dāng)前溫度值
- int getTmpValue()
- {
- unsigned int tmpvalue;
- int value; //存放溫度數(shù)值
- float t;
- unsigned char low, high;
- sendReadCmd();
- //連續(xù)讀取兩個字節(jié)數(shù)據(jù)
- low=readByte();
- high=readByte();
- //將高低兩個字節(jié)合成一個整形變量
- //計算機中對于負數(shù)是利用補碼來表示的
- //若是負值, 讀取出來的數(shù)值是用補碼表示的, 可直接賦值給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;
- }
- }
復(fù)制代碼
|
|