單片機課大作業,溫控風扇并能顯示時間日期
單片機源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #include"lcd.h"
- #include"temp.h"
- #include"ds1302.h"
- uchar ChCh[10] = "HUANG SONG";
- uchar num=0;
- uchar j;
- uint tp;
- uint temp;
- uchar a,b;
- uchar datas[] = {0, 0, 0, 0, 0}; //定義數組
- void LcdDisplay(int);
- #define LCD1602_DATAPINS P0
- ////////////////////
- sbit beep=P2^4;
- sbit dj=P2^1;//電機控制端接口
- sbit DQ=P3^7;//溫度傳感器接口
- //////////按鍵接口/////////////////////////////////
- sbit key1=P3^0;//設置溫度
- sbit key2=P3^1;//溫度加
- sbit key3=P3^2;//溫度減
- //////////////////////////////////////////////////////
- sbit w1=P3^3;
- sbit w3=P2^2;
- sbit w4=P2^3;
- sbit LE=P2^0;
- /////共陰數碼管段選//////////////////////////////////////////////
- uchar table[22]=
- {0x3F,0x06,0x5B,0x4F,0x66,
- 0x6D,0x7D,0x07,0x7F,0x6F,
- 0x77,0x7C,0x39,0x5E,0x79,0x71,
- 0x00,0x38,0x76,0x00,0xff,0x37};//'-',L,H,滅,全亮,n 16-21
- int wen_du=0;
- uchar gao,di;//pwm
- uint shang,xia; //對比溫度暫存變量
- uchar dang,dang1;//檔位顯示
- uchar flag;
- uchar d1,d2,d3;//顯示數據暫存變量
- void delay(uint ms)
- {
- uint i,j;
- for(i=ms;i>0;i--)
- for(j=110;j>0;j--);
- }
- /***********ds18b20延遲子函數(晶振12MHz )*******/
- void display()//顯示溫度
- {
- w1=0;P1=table[d1];LE=1;LE=0;delay(1); w1=1;//第1位
- P1=0x00;LE=1;LE=0;
- w3=0;P1=table[d2]; LE=1;LE=0; delay(1);w3=1;//第3位
- P1=0x00;LE=1;LE=0;
-
- w4=0;P1=table[d3]; LE=1;LE=0; delay(1);w4=1;//第4位
- P1=0x00;LE=1;LE=0;
- }
- void zi_keyscan()//自動模式按鍵掃描函數
- {
- if(key1==0)
- {
- delay(1);
- if(key1==0)flag=1;
- while(key1==0);//松手檢測
- }
- while(flag==1)
- {
- d1=18;d2=shang/10;d3=shang%10;
- display();
- if(key1==0)
- {
- delay(0.1);
- if(key1==0)flag=2;
- while(key1==0);//松手檢測
- }
- if(key2==0)
- {
- delay(0.1);
- if(key2==0)
- {
- shang+=1;
- if(shang>=100)shang=100;
- }while(key2==0);//松手檢測
- }
- if(key3==0)
- {
- delay(0.1);
- if(key3==0)
- {
- shang-=1;
- if(shang<=10)shang=10;
- }while(key3==0);//松手檢測
- }
- }
- while(flag==2)
- {
- d1=17;d2=xia/10;d3=xia%10;
- display();
- if(key1==0)
- {
- delay(0.1);
- if(key1==0)flag=0;
- while(key1==0);//松手檢測
- }
- if(key2==0)
- {
- delay(0.1);
- if(key2==0)
- {
- xia+=1;
- if(xia>=95)xia=95;
- }while(key2==0);//松手檢測
- }
- if(key3==0)
- {
- delay(0.1);
- if(key3==0)
- {
- xia-=1;
- if(xia<=0)xia=0;
- }while(key3==0);//松手檢測
- }
- }
- }
- void zi_dong()//自動溫控模式
- {
- uchar i;
- d1=dang;d2=16;d3=16;
- zi_keyscan();//按鍵掃描函數
- display();
- if(wen_du<xia){dj=0;dang=0;}//低于下限 停止
- if((wen_du>=xia)&&(wen_du<=shang))//1擋
- {
- dang=1;
- for(i=0;i<10;i++){dj=0;display();}
- for(i=0;i<10;i++){dj=1;display();}
- zi_keyscan();
- }
- if(wen_du>shang){dj=1;dang=2;display();}//高溫全速
- }
- unsigned int i=0;
- void main()
- {
- TMOD= 0x01; //配置T0為模式1
- TL0=0x00;
- TH0=0xDC;
- TF0 = 0;
- EA=1;
- ET0=1;
- TR0=1;
- beep=1;
- dj=0;
- shang=30;
- xia=20; //初始化LCD1602
- LcdInit();
- Ds1302Init();
- LcdWriteCom(0xc6); //寫地址 80表示初始地址
- LcdWriteData('C');
- tp=Ds18b20ReadTemp();
- Ds1302ReadTime();
- display();
- while(1)
- {
- temp=tp*0.0625*100+0.5;
- a=temp % 10000 / 1000;
- b=temp % 1000 / 100;
- wen_du=a*10+b;
- LcdDisplay(tp);
- Delay1ms(100);//1s鐘刷一次
- }
- }
- void T0_time() interrupt 1
- {
- TL0=0x00;
- TH0=0xDC;
- TF0=0;
- TR0=0;
- tp=Ds18b20ReadTemp();
- Ds1302ReadTime();
- dang1=dang;
- if(dang1==2)
- {beep=~beep;
- num=num++;
- if(num==10)dang1=0;}
- display();
- zi_dong();
- TR0=1;
- }
- void LcdDisplay(int temp) //lcd顯示
- {
-
- unsigned char datas[] = {0, 0, 0, 0, 0}; //定義數組
- float tp;
- if(temp< 0) //當溫度值為負數
- {
- LcdWriteCom(0xc0); //寫地址 80表示初始地址
- LcdWriteData('-'); //顯示負
- //因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
- temp=temp-1;
- temp=~temp;
- tp=temp;
- temp=tp*0.0625*100+0.5;
- //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
- //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
- //算由?.5,還是在小數點后面。
-
- }
- else
- {
- LcdWriteCom(0xc0); //寫地址 80表示初始地址
- LcdWriteData('+'); //顯示正
- tp=temp;//因為數據處理有小數點所以將溫度賦給一個浮點型變量
- //如果溫度是正的那么,那么正數的原碼就是補碼它本身
- temp=tp*0.0625*100+0.5;
- //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
- //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
- //算加上0.5,還是在小數點后面。
- }
- datas[0] = temp / 10000;
- datas[1] = temp % 10000 / 1000;
- datas[2] = temp % 1000 / 100;
- datas[3] = temp % 100 / 10;
- datas[4] = temp % 10;
- LcdWriteCom(0xc1); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[1]); //十位
- LcdWriteCom(0xc2); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[2]); //個位
- LcdWriteCom(0xc3); //寫地址 80表示初始地址
- LcdWriteData('.'); //顯示 ‘.’
- LcdWriteCom(0xc4); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[3]); //顯示小數點
- LcdWriteCom(0xc5); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[4]); //顯示小數點
-
- LcdWriteCom(0x80);
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
51單片機溫控風扇源程序.zip
(69.97 KB, 下載次數: 28)
2017-10-7 10:46 上傳
點擊文件名下載附件
|