|
51hei.png (111.6 KB, 下載次數(shù): 59)
下載附件
2020-7-21 00:45 上傳
單片機源程序如下:
- #include<reg52.h>
- sbit IN1=P2^7;
- sbit IN2=P2^6;
- sbit ENA=P2^5;
- bit flag1s=0;//1s定時標(biāo)志
- unsigned char T0RH=0;
- unsigned char T0RL=0;
- int temp;//讀取到的當(dāng)前溫度值
- unsigned char len;
- int intT,decT;//溫度值的整數(shù)和小數(shù)部分
- unsigned char str[12];
- void Compare();
- void GetTemp();
- void ConfigTimer0(unsigned int ms);
- unsigned char IntToString(unsigned char *str,int dat);
- extern bit Start18B20();
- extern bit Get18B20Temp(int *temp);
- extern void InitLcd1602();
- extern void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str);
- void main()
- {
- bit res;
- EA=1;
- ConfigTimer0(10);//T0定時10ms
- Start18B20();//啟動DS18B20
- InitLcd1602();//初始化液晶
- while(1)
- {
- if(flag1s)//每秒更新一次溫度
- {
- flag1s=0;
- res=Get18B20Temp(&temp);//讀取當(dāng)前溫度
- if(res)//讀取成功時,刷新當(dāng)前溫度顯示
- {
- GetTemp();
-
- LcdShowStr(0,0,"Welcome to use");//顯示字符及溫度值
- LcdShowStr(0,1,"Current T:");
- LcdShowStr(10,1,str);
- Compare();
- }
- else //讀取失敗時,提示錯誤信息
- {
- LcdShowStr(0,0,"error!");
- }
- Start18B20();//重新啟動下一次轉(zhuǎn)換
- }
- }
- }
- /*溫度獲取函數(shù),獲取當(dāng)前環(huán)境溫度值并保存在str數(shù)組中*/
- void GetTemp()
- {
- intT=temp>>4;//分離出溫度值整數(shù)部分
- decT=temp &0x0F;//分離出溫度值小數(shù)部分
-
- len=IntToString(str,intT);//整數(shù)部分轉(zhuǎn)換成字符串
-
- str[len++]='.';
- decT=(decT*10)/16;//二進制的小數(shù)部分轉(zhuǎn)換為1位十進制位
- str[len++]=decT+'0';//十進制小數(shù)位再轉(zhuǎn)換為ASCII字符
- while(len<6)//用空格補齊到6個字符長度
- {
- str[len++]=' ';
- }
- str[len++]='\0';
- }
- /*延時函數(shù),用于PWM控制*/
- void delay(unsigned int z)
- {
- unsigned int x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- /*比較函數(shù),通過溫度值的比較設(shè)置電機的轉(zhuǎn)速*/
- void Compare()
- {
- unsigned int i=0;
- unsigned char j;
- if((intT>= 24) && (intT<26)) //以兩度為一個溫差范圍,并設(shè)溫度范圍索引
- {
- j=0;
- }
- else if((intT>=26) &&(intT<28))
- {
- j=1;
- }
- else if((intT>=28) &&(intT<30))
- {
- j=2;
- }
- else if(intT>=30)
- {
- j=3;
- }
- switch(j) //根據(jù)溫度索引設(shè)置電機轉(zhuǎn)速
- {
- case 0: IN1=1;
- IN2=0;
- for(i=0;i<200;i++)
- {
- ENA=1;
- delay(20);
- ENA=0;
- delay(30);
- }
- break;
-
- case 1: IN1=1;
- IN2=0;
- for(i=0;i<200;i++)
- {
- ENA=1;
- delay(30);
- ENA=0;
- delay(30);
- }
- break;
-
- case 2: IN1=1;
- IN2=0;
- for(i=0;i<200;i++)
- {
- ENA=1;
- delay(55);
- ENA=0;
- delay(30);
- }
- break;
-
- case 3: IN1=1;
- IN2=0;
- ENA=1;
- break;
- default:break;
- }
- }
- /*整型數(shù)轉(zhuǎn)換為字符串,str-字符串指針,dat-待轉(zhuǎn)換數(shù),返回值-字符串長度*/
- unsigned char IntToString(unsigned char *str,int dat)
- {
- signed char i=0;
- unsigned char len=0;
- unsigned char buf[6];
- if(dat<0)//如果為負數(shù),首先取絕對值,并在指針上添加負號
- {
- dat=-dat;
- *str++='-';
- len++;
- }
- do{ //先轉(zhuǎn)換為低位在前的十進制數(shù)組
- buf[i++]=dat%10;
- dat /=10;
- }while(dat>0);
- len += i;//i最后的值就是有效字符的個數(shù)
- while(i-->0)//將數(shù)組值轉(zhuǎn)換為ASCII碼反向拷貝到接收指針上
- {
- *str++=buf[i]+'0';
- }
- *str='\0';
- return len;
- }
- void ConfigTimer0(unsigned int ms)
- {
- unsigned long tmp;
- tmp=11059200/12;
- tmp=(tmp*ms)/1000;
- tmp=65536-tmp;
- tmp=tmp+12;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
基于紅外感應(yīng)的溫控轉(zhuǎn)速型風(fēng)扇設(shè)計資料.7z
(72.26 KB, 下載次數(shù): 62)
2020-7-21 00:47 上傳
點擊文件名下載附件
溫控風(fēng)扇設(shè)計 下載積分: 黑幣 -5
|
評分
-
查看全部評分
|