1、將DS18B20溫度傳感器的溫度讀出來,并在LCD1602上顯示出來。 2、在LCD上分別切換顯示,軟件設計時鐘(時、分、秒),和當前溫度值,和溫度上下控制值。并可以通過按鍵進行修改設置,溫度高于上限,或下線都由蜂鳴器發出報警聲。
T-LCD - 副本.rar
(225.17 KB, 下載次數: 108)
2020-12-18 22:46 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
3、實現校時、校分、校秒功能。 附件里附帶所有程序、工程以及仿真圖,仿真圖為T-LCD2,程序工程為T-LCD,主程序是main.c 實驗原理圖:
51hei截圖20201218224035.png (15.91 KB, 下載次數: 57)
下載附件
2020-12-18 22:41 上傳
51hei截圖20201218224014.png (19.71 KB, 下載次數: 52)
下載附件
2020-12-18 22:41 上傳
單片機效果圖: 模式0為顯示溫度 時間 模式123分別為調個位、十位、十分位 按對應的按鍵就能實現調最高或最低 模式45顯示最高、最低溫度
IMG_20201218_221043.jpg (784.96 KB, 下載次數: 69)
下載附件
2020-12-18 22:43 上傳
IMG_20201218_221029.jpg (687.7 KB, 下載次數: 56)
下載附件
2020-12-18 22:43 上傳
IMG_20201218_125845.jpg (862.94 KB, 下載次數: 51)
下載附件
2020-12-18 22:43 上傳
IMG_20201218_125839.jpg (811.93 KB, 下載次數: 53)
下載附件
2020-12-18 22:43 上傳
IMG_20201218_125828.jpg (910.17 KB, 下載次數: 51)
下載附件
2020-12-18 22:43 上傳
IMG_20201218_125758.jpg (993.47 KB, 下載次數: 69)
下載附件
2020-12-18 22:43 上傳
程序部分: 570行主程序+100溫度傳感器+70行1602顯示 實現單片機溫度時間顯示 精確到十分位 并且有校時、設置最值溫度報警功能 精確到十分位
51hei圖片20201218224045.png (27.85 KB, 下載次數: 66)
下載附件
2020-12-18 22:41 上傳
具體的代碼功能在附件程序里都有標注 - #include<reg52.h> //調用52單片機庫
- #include"1602.h" //調用LCD1602庫
- #include"ds18b20.h" //調用ds18b20溫度傳感器
- #define uint unsigned int
- #define uchar unsigned char
- uchar hour,min,sec,count,hour1,hour2, //定義小時 分鐘 秒 對應的十位個位 以及 count計數
- sec1,sec2,min1,min2;
- sbit speaker=P2^1; //定義蜂鳴器
- sbit key1=P1^0; //最低溫度設置
- sbit key2=P1^1; //最高溫度設置
- sbit key3=P1^2; //連接切換模式的備用開關 P33和P12口短接 用于切換模式和退出報警中斷
-
- sbit keyh=P1^5; //校時
- sbit keym=P1^6; //校分
- sbit keys=P1^7; //校秒
- //定義時間按鍵
- uint tem; //定義采集溫度
- int htem,htem2,time,time2,x,y,z,dot,dot2,maxtem,mintem; //定義溫度十位數、個位數、小數,以及其三種模式的標記值
- int cnt1=1,cnt2=1,cnt3=1,cnt4=1,cnt5=1,cnt6=1,cnt7=1; //定義計數變量
- int i;
- uchar mode=0; //定義模式變量
- uchar code t3[]={" H/L=0/1: C"}; //顯示調最值溫度的十位
- uchar code t4[]={"O/D: C"}; //顯示調最值溫度的個位/小數位字模
- uchar code table2[]={
- '0','1','2','3','4','5','6','7','8','9',':'}; //顯示時間的字模
- uchar code t5[]={"Max . CD"}; //顯示最高溫度的字模
- uchar code t6[]={"Min . CD"}; //顯示最低溫度的字模
- //延時函數
- void delay1(uint i)
- {
- while(i--);
- }
- //顯示函數1 初始顯示
- void display(uint dat,uchar add)
- {
- uchar bai,shi ,ge;
- bai=dat/100;
- shi=dat%100/10;
- ge=dat%10;
- writelcd_cmd(add);
- writelcd_dat(bai+0x30);
- writelcd_dat(shi+0x30);
- writelcd_cmd(add+3);
- writelcd_dat(ge+0x30);
- }
- void lcd_min() //定義最小溫度顯示
- {
- uchar l;
-
- writelcd_cmd(0x38); //初始化屏那迤粱
- delay(5);
- writelcd_cmd(0x38);
- delay(5);
- writelcd_cmd(0x38);
- writelcd_cmd(0x08);
- writelcd_cmd(0x01);
- writelcd_cmd(0x06);
- writelcd_cmd(0x0c);
- writelcd_cmd(0x80);
-
- writelcd_cmd(0xc0);
- for(l=0;l<16;l++) //依次讀取t6并顯示
- {
- writelcd_dat(t6[l]);
- }
-
- display(mintem,0xca);
- delay1(5000000000); //延時顯示
- }
- void lcd_max() //定義最大溫度顯示
- {
- uchar k;
- writelcd_cmd(0x38); //初始化屏幕清屏
- delay(5);
- writelcd_cmd(0x38);
- delay(5);
- writelcd_cmd(0x38);
- writelcd_cmd(0x08);
- writelcd_cmd(0x01);
- writelcd_cmd(0x06);
- writelcd_cmd(0x0c);
- writelcd_cmd(0x80);
- writelcd_cmd(0xc0);
- for(k=0;k<16;k++) //依次讀取t5并顯示
- {
- writelcd_dat(t5[k]);
- }
- display(maxtem,0xca);
- delay1(5000000000);
- }
- void write_Char(unsigned char a,unsigned char b,unsigned char dat) //顯示時間程序母程序 定位
- {
- if (b == 0)
- {
- writelcd_cmd(0x80 + a);
- }
- else
- {
- writelcd_cmd(0xC0 + a);
- }
- writelcd_dat(dat);
- }
-
- void display4(uchar hour1,uchar hour2,uchar min1,uchar min2,uchar sec1,uchar sec2) //顯示時間子程序 取值
- {
-
- write_Char(4,0,table2[hour1]); //顯示小時
- write_Char(5,0,table2[hour2]);
- write_Char(6,0,table2[0x0a]); //顯示冒號
- write_Char(7,0,table2[min1]); //分鐘
- write_Char(8,0,table2[min2]);
- write_Char(9,0,table2[0x0a]); //顯示冒號
- write_Char(10,0,table2[sec1]); //秒
- write_Char(11,0,table2[sec2]);
-
-
- }
- //顯示函數2 調最值溫度低十位 在LCD上排顯示
- void display2(uint dat,uchar add)
- {
- uchar bai,shi ;
- bai=dat/100;
- shi=dat%100/10;
- //ge=dat%10;
- writelcd_cmd(add);
- writelcd_dat(shi+0x30);
- writelcd_dat(bai+0x30);
- writelcd_cmd(add+3);
- //writelcd_dat(ge+0x30);
- }
- //顯示函數3 調最值溫度的個位/小數 在LCD下排顯示
- void display3(uint dat,uchar add)
- {
- uchar ge;
- //bai=dat/100;
- //shi=dat%100/10;
- ge=dat%10;
- writelcd_cmd(add);
- //writelcd_dat(shi+0x30);
- //writelcd_dat(bai+0x30);
- //writelcd_cmd(add+3);
- writelcd_dat(ge+0x30);
- }
- //按鍵掃描函數
- void keyscan()
- { uchar i,j; //定義i/j
- writelcd_cmd(0x80); //顯示函數表示以此顯示t3字模里面的字符
- for(i=0;i<16;i++)
- {writelcd_dat(t3[i]);}
- writelcd_cmd(0xc0);
- for(j=0;j<16;j++) //顯示函數表示以此顯示t4字模里面的字符
- {writelcd_dat(t4[j]);}
-
- while(mode!=0) //當mode不為0時
- {
- display2(htem,0x8b); //顯示調十位
- display3(time,0xca); //顯示調個位小數位
-
- while(mode!=0)
- {
- switch(mode) //切換模式case語句循環 5個模式 5個循環 6個變量 初始模式為0 切換后對應地方的光標閃爍
- {
-
- case 1:writelcd_cmd(0xc0+10);writelcd_cmd(0x0f);break; //調個位
- case 2:writelcd_cmd(0x80+11);writelcd_cmd(0x0f);break; //調十位
- case 3:writelcd_cmd(0xc0+10);writelcd_cmd(0x0f);break; //調小數位
- case 4:lcd_max();break; //顯示最大溫度
- case 5:lcd_min();break; //顯示最小溫度
- default:mode=0;break;
- }
-
- if(key2==0&&mode==1) //模式為1 key2為0時 調最高位的個位
- {
- delay(50); //按鍵消抖
- y=0;display3(y,0x80);writelcd_cmd(0xca+11); //max one 在左上角顯示0 表示調最高溫度
-
- if(key2==0)
- {
- delay(10); //十個循環 對應0-9數字
- cnt1++; //計數+1
- while(key2==0);
- switch(cnt1%11) //按鍵到10以后清零
- {
- case 1:time=0;display3(time,0xca);writelcd_cmd(0xca+11);break; //在0xca的地方顯示個位值 光標閃爍
- case 2:time=1;display3(time,0xca);writelcd_cmd(0xca+11);break;
- case 3:time=2;display3(time,0xca);writelcd_cmd(0xca+11);break;
- case 4:time=3;display3(time,0xca);writelcd_cmd(0xca+11);break;
- case 5:time=4;display3(time,0xca);writelcd_cmd(0xca+11);break;
- case 6:time=5;display3(time,0xca);writelcd_cmd(0xca+11);break;
- case 7:time=6;display3(time,0xca);writelcd_cmd(0xca+11);break;
- case 8:time=7;display3(time,0xca);writelcd_cmd(0xca+11);break;
- case 9:time=8;display3(time,0xca);writelcd_cmd(0xca+11);break;
- case 10:time=9;display3(time,0xca);writelcd_cmd(0xca+11);break;
-
- default:break;
- }
- }
- }
- if(key1==0&&mode==1) //類似 最低個位
- {
- delay(50);
- y=1;display3(y,0x80);writelcd_cmd(0xca+11); //min one 在左上角顯示1 表示調最低溫度
-
- if(key1==0)
- {
- delay(10);
- cnt4++;
- while(key1==0);
- switch(cnt4%11)
- {
- case 1:time2=0;display3(time2,0xca);writelcd_cmd(0xca+11);break;
- case 2:time2=1;display3(time2,0xca);writelcd_cmd(0xca+11);break;
- case 3:time2=2;display3(time2,0xca);writelcd_cmd(0xca+11);break;
- case 4:time2=3;display3(time2,0xca);writelcd_cmd(0xca+11);break;
- case 5:time2=4;display3(time2,0xca);writelcd_cmd(0xca+11);break;
- case 6:time2=5;display3(time2,0xca);writelcd_cmd(0xca+11);break;
- case 7:time2=6;display3(time2,0xca);writelcd_cmd(0xca+11);break;
- case 8:time2=7;display3(time2,0xca);writelcd_cmd(0xca+11);break;
- case 9:time2=8;display3(time2,0xca);writelcd_cmd(0xca+11);break;
- case 10:time2=9;display3(time2,0xca);writelcd_cmd(0xca+11);break;
-
- default:break;
- }
- }
- }
- if(key2==0&&mode==2) //最高十位
- {
- delay(10);
- x=00;display2(x,0x80);writelcd_cmd(0x80+11); //max ten 在左上角顯示00 表示調最高
- if(key2==0)
- {
- cnt2++;
- while(key2==0);
- switch(cnt2%11)
- {
-
- case 1:htem=00;display2(htem,0x8b);writelcd_cmd(0x80+11);break;
- case 2:htem=10;display2(htem,0x8b);writelcd_cmd(0x80+11);break;
- case 3:htem=20;display2(htem,0x8b);writelcd_cmd(0x80+11);break;
- case 4:htem=30;display2(htem,0x8b);writelcd_cmd(0x80+11);break;
- case 5:htem=40;display2(htem,0x8b);writelcd_cmd(0x80+11);break;
- case 6:htem=50;display2(htem,0x8b);writelcd_cmd(0x80+11);break;
- case 7:htem=60;display2(htem,0x8b);writelcd_cmd(0x80+11);break;
- case 8:htem=70;display2(htem,0x8b);writelcd_cmd(0x80+11);break;
- case 9:htem=80;display2(htem,0x8b);writelcd_cmd(0x80+11);break;
- case 10:htem=90;display2(htem,0x8b);writelcd_cmd(0x80+11);break;
-
-
-
- default:break;
- }
- }
-
- }
- if(key1==0&&mode==2)
- {
- delay(10);
- x=10;display2(x,0x80);writelcd_cmd(0x80+11); //min ten 在左上角顯示10表示 調最低
- if(key1==0)
- {
- cnt3++;
- while(key1==0);
- switch(cnt3%11)
- {
-
- case 1:htem2=00;display2(htem2,0x8b);writelcd_cmd(0x80+11);break;
- case 2:htem2=10;display2(htem2,0x8b);writelcd_cmd(0x80+11);break;
- case 3:htem2=20;display2(htem2,0x8b);writelcd_cmd(0x80+11);break;
- case 4:htem2=30;display2(htem2,0x8b);writelcd_cmd(0x80+11);break;
- case 5:htem2=40;display2(htem2,0x8b);writelcd_cmd(0x80+11);break;
- case 6:htem2=50;display2(htem2,0x8b);writelcd_cmd(0x80+11);break;
- case 7:htem2=60;display2(htem2,0x8b);writelcd_cmd(0x80+11);break;
- case 8:htem2=70;display2(htem2,0x8b);writelcd_cmd(0x80+11);break;
- case 9:htem2=80;display2(htem2,0x8b);writelcd_cmd(0x80+11);break;
- case 10:htem2=90;display2(htem2,0x8b);writelcd_cmd(0x80+11);break;
-
-
- default:break;
- }
- }
-
- }
- if(key2==0&&mode==3) //最高小數
- {
- delay(50);
- z=00;display2(z,0x80);writelcd_cmd(0xca+11); //max dot
-
- if(key2==0)
- {
- delay(10);
- cnt5++;
- while(key2==0);
- switch(cnt5%11)
- {
- case 1:dot=0;display3(dot,0xca);writelcd_cmd(0xca+11);break;
- case 2:dot=1;display3(dot,0xca);writelcd_cmd(0xca+11);break;
- case 3:dot=2;display3(dot,0xca);writelcd_cmd(0xca+11);break;
- case 4:dot=3;display3(dot,0xca);writelcd_cmd(0xca+11);break;
- case 5:dot=4;display3(dot,0xca);writelcd_cmd(0xca+11);break;
- case 6:dot=5;display3(dot,0xca);writelcd_cmd(0xca+11);break;
- case 7:dot=6;display3(dot,0xca);writelcd_cmd(0xca+11);break;
- case 8:dot=7;display3(dot,0xca);writelcd_cmd(0xca+11);break;
- case 9:dot=8;display3(dot,0xca);writelcd_cmd(0xca+11);break;
- case 10:dot=9;display3(dot,0xca);writelcd_cmd(0xca+11);break;
-
- default:break;
- }
- }
- }
- if(key1==0&&mode==3) //最低小數
- {
- delay(50);
- z=10;display2(z,0x80);writelcd_cmd(0xca+11); //min dot
-
- if(key1==0)
- {
- delay(10);
- cnt6++;
- while(key1==0);
- switch(cnt6%11)
- {
- case 1:dot2=0;display3(dot2,0xca);writelcd_cmd(0xca+11);break;
- case 2:dot2=1;display3(dot2,0xca);writelcd_cmd(0xca+11);break;
- case 3:dot2=2;display3(dot2,0xca);writelcd_cmd(0xca+11);break;
- case 4:dot2=3;display3(dot2,0xca);writelcd_cmd(0xca+11);break;
- case 5:dot2=4;display3(dot2,0xca);writelcd_cmd(0xca+11);break;
- case 6:dot2=5;display3(dot2,0xca);writelcd_cmd(0xca+11);break;
- case 7:dot2=6;display3(dot2,0xca);writelcd_cmd(0xca+11);break;
- case 8:dot2=7;display3(dot2,0xca);writelcd_cmd(0xca+11);break;
- case 9:dot2=8;display3(dot2,0xca);writelcd_cmd(0xca+11);break;
- case 10:dot2=9;display3(dot2,0xca);writelcd_cmd(0xca+11);break;
-
- default:break;
- }
- }
- }
-
- if(mode==4) //模式4 顯示最大溫度
- {
- maxtem=htem*10+time*10+dot;
- lcd_max();
- }
-
- if(mode==5) //最低溫度
- {
- mintem=htem2*10+time2*10+dot2;
- lcd_min();
- }
-
- }
- }
- lcd_init(); //模式為0時執行LCD初始化函數
- }
- //中斷初始化函數
- void init()
- {
- lcd_init(); //lcd初始化
- speaker=1; //蜂鳴器口默認高電平
- mode=0; //模式默認0
- htem=80; //最高溫度默認80
- time=0;
- htem2=10; //最低溫度默認10
- time2=0;
- dot=0;
- dot2=0;
- EA=1; //總中斷開啟
- EX1=1; //外部中斷1允許
- ET1=1; //定時器1允許
- TMOD=0X01; //定時中斷1,模式1
- IT1=1; //中斷1 下降沿觸發
- TH1=0Xee; //定時中斷1 0.5us
- TL1=0X00;
- TR1=0; //定時中斷1默認關閉
-
- count=0; //時間計數默認為0
- hour=00; //小時00
- min=00; //分鐘00
- sec=00; //秒00
-
- TH0=(65536-50000)/256; //內部中斷T0初始化
- TL0=(65536-50000)%256;
- TR0=1; //內部中斷T0開啟
- ET0=1;
-
- }
- //主函數
- void main()
- {
- P1=0xe7; //初始P1口,P14,P13為低電平 使S1 S5 S9 S14 S15 S16變為接地的普通開關 S9與P33短接 用于切換模式和退出報警中斷
- init(); //中斷初始化
-
-
- while(1)
- {
- if(mode!=0) //當模式不為0
- {keyscan();} //執行按鍵掃描 以及調溫度的程序
- else if(mode==0) //模式為0時
- {
- delay(100);
- tmpchange(); //在ds18b20取數據
- tem=tmp(); //溫度值獲取 為整數 且小數位實際上是個位 如35.5攝氏度對應的值是355
-
- if(keyh==0) //當S14閉合時 實現小時加一
- {
- delay(5);
- if(keyh==0)
- {
- if(hour!=23) hour++; //hour=23后清零
- else hour=0;
- }
- while(!keyh); //檢測松手
-
- }
-
- if(keym==0) //實現分鐘加一
- {
- delay(5);
- if(keym==0)
- {
- if(min!=59) //59后清零
- {
- min++;
- }
- else
- {
- min=0;
- }
- }
- while(!keym); //松手檢測
-
- }
-
- if(keys==0) //實現秒加一
- {
- delay(5);
- if(keys==0)
- {
- if(sec!=59) //59后清零
- {
- sec++;
- }
- else
- {
- sec=0;
- }
- }
- while(!keys);
-
- }
-
- hour1=hour/10; //小時十位
- hour2=hour%10; //小時個位
- min1=min/10; //分鐘十位
- min2=min%10; //分鐘個位
- sec1=sec/10; //秒十位
- sec2=sec%10; //秒個位
-
-
- maxtem=htem*10+time*10+dot;
- mintem=htem2*10+time2*10+dot2;
-
- if(tem>=maxtem) //高于最高
- {
- TR1=1; //T1中斷開啟
-
- }
- else if(tem<=mintem) //低于最低
- {
- TR1=1; //T1中斷開啟
-
- }
- else //處于中間
- {
- TR1=0; //T1中斷關閉
- //報警燈滅
- }
-
- delay(10);
- display(tem,0xca); //一直顯示溫度
- display4(hour1,hour2,min1,min2,sec1,sec2); //一直顯示時鐘
- delay(100);
-
-
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
|