51單片機做的多點溫度采集系統的仿真,帶源碼
0.png (18.64 KB, 下載次數: 93)
下載附件
2016-9-9 22:50 上傳
0.png (76.29 KB, 下載次數: 72)
下載附件
2016-9-9 22:50 上傳
全部資料下載:
51單片機-ds18b20多點采集-lcd1602顯示.zip
(56.56 KB, 下載次數: 290)
2016-9-9 22:53 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
lcd1602顯示ds18b20讀溫度程序:
- #include<reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit lcdrs=P3^0;
- sbit lcdrw=P3^1;
- sbit lcden=P3^2;
- sbit DQ=P1^7;
- uint value;
- uchar code table1[]={0x28,0x30,0xc5,0xb8,0x00,0x00,0x00,0x8e};//rom1 測得的序列號
- uchar code table2[]={0x28,0x31,0xc5,0xb8,0x00,0x00,0x00,0xb9};//rom2
- uchar code table3[]="Temple";
- bit fg=0;
- void delay(uint n)
- { uint x,y;
- for(x=n;x>0;x--)
- for(y=110;y>0;y--);
- }
- void write_com(uchar com)
- {
- lcdrs=0; //rs=0時輸入指令
- P2=com;
- delay(5);
- lcden=1; //en=1時讀取信息
- delay(5);
- lcden=0; //1 -> 0 執行指令
- }
- void write_dat(uchar dat)
- {
- lcdrs=1; //rs=1時輸入數據
- P2=dat;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void init_lcd()
- {
- lcden=0;
- lcdrw=0;
- write_com(0x38); //8位數據,雙列,5*7字形
- write_com(0x0c); //開啟顯示屏,關光標,光標不閃爍
- write_com(0x06); //顯示地址遞增,即寫一個數據后,顯示位置右移一位
- write_com(0x01);
- }
- void delay_us(uchar t)//微妙延時
- {
- while(t--);
- }
- void init_ds18b20() //數據初始化
- {
- DQ=1;
- delay_us(4);
- DQ=0;
- delay_us(80);
- DQ=1;
- delay_us(200);
- }
- void write_ds18b20(uchar dat) //寫數據
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- DQ=0;
- DQ=dat&0x01;
- delay_us(15);
- DQ=1;
- dat=dat>>1;
- }
- delay_us(10);
- }
- uchar read_ds18b20() //讀數據
- {
- uchar i=0,readat=0;
- for(i=0;i<8;i++)
- {
- DQ=0;
- readat=readat>>1; //八位全部都是0,向右移一位后,仍然全是0
- DQ=1;
- if(DQ) //如果DQ為1,readat進行或運算,如果為0,則子語句不執行,直接for循環此時采集的數據是0
- readat=readat|0x80;//此時最高位為1 ,然后再進行for循環 最高位成為第七位,依次往復
- delay_us(10);
- }
- return readat;
- }
- void check_rom(uchar a) //匹配序列號
- {
- uchar j;
- write_ds18b20(0x55);
- if(a==1)
- {
- for(j=0;j<8;j++)
- {
- write_ds18b20(table1[j]);
- }
- }
- if(a==2)
- {
- for(j=0;j<8;j++)
- {
- write_ds18b20(table2[j]);
- }
- }
- }
- uchar change_ds18b20(uchar z)
- {
- uchar tl,th;
-
- init_ds18b20(); //初始化
- write_ds18b20(0xcc); //跳過
- init_ds18b20();
- if(z==1)
- {
- check_rom(1); // 匹配rom1
- }
- if(z==2)
- {
- check_rom(2); // 匹配rom2
- }
- write_ds18b20(0x44);
- init_ds18b20();
- write_ds18b20(0xcc);
- init_ds18b20();
- if(z==1)
- {
- check_rom(1); //
- }
- if(z==2)
- {
- check_rom(2); //
- }
- write_ds18b20(0xbe); //啟動讀暫存器。讀內部ram中9字節溫度數據
- tl=read_ds18b20();
- th=read_ds18b20();
- value=th;
- value=value<<8;
- value=value|tl;
- if(th < 0x80)
- { fg=0; }
-
- if(th>= 0x80)
- { fg=1;
-
- value=~value+1;
- }
- value=value*(0.0625*10);
- return value;
-
- }
- void display_lcd1602(uchar z)
- {
- uchar i;
- if(z==1)
- {
- write_com(0x80);
- for(i=0;i<6;i++)
- {
- write_dat(table3[i]);
- delay(3);
- }
- write_dat(0x2d);
- write_dat(0x41);
- write_dat(0x3a);
- if(fg==1)
- {
- write_dat(0xb0);
- }
- if(fg==0)
- {
- write_dat(0x20);
- }
- write_dat(value/100+0x30);
- write_dat(value%100/10+0x30);
- write_dat(0x2e);
- write_dat(value%10+0x30);
- write_dat(0xdf);
- write_dat(0x43);
- }
- if(z==2)
- {
- write_com(0x80+0x40);
- for(i=0;i<6;i++)
- {
- write_dat(table3[i]);
- delay(3);
- }
- write_dat(0x2d);
- write_dat(0x42);
- write_dat(0x3a);
- if(fg==1)
- {
- write_dat(0xb0);
- }
- if(fg==0)
- {
- write_dat(0x20);
- }
- write_dat(value/100+0x30);
- write_dat(value%100/10+0x30);
- write_dat(0x2e);
- write_dat(value%10+0x30);
- write_dat(0xdf);
- write_dat(0x43);
- }
- }
- void main()
- {
- init_lcd();
- while(1)
- {
- change_ds18b20(1);
- display_lcd1602(1);
-
- change_ds18b20(2);
- display_lcd1602(2);
-
- }
- }
復制代碼
lcd1602顯示ds18b20溫度采集讀序列號程序
|