標(biāo)題:
單片機(jī)紅外感應(yīng)的溫控轉(zhuǎn)速型風(fēng)扇設(shè)計(jì)電路+源程序
[打印本頁(yè)]
作者:
啊豬豬
時(shí)間:
2020-7-20 21:28
標(biāo)題:
單片機(jī)紅外感應(yīng)的溫控轉(zhuǎn)速型風(fēng)扇設(shè)計(jì)電路+源程序
51hei.png
(111.6 KB, 下載次數(shù): 59)
下載附件
2020-7-21 00:45 上傳
單片機(jī)源程序如下:
#include<reg52.h>
sbit IN1=P2^7;
sbit IN2=P2^6;
sbit ENA=P2^5;
bit flag1s=0;//1s定時(shí)標(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定時(shí)10ms
Start18B20();//啟動(dòng)DS18B20
InitLcd1602();//初始化液晶
while(1)
{
if(flag1s)//每秒更新一次溫度
{
flag1s=0;
res=Get18B20Temp(&temp);//讀取當(dāng)前溫度
if(res)//讀取成功時(shí),刷新當(dāng)前溫度顯示
{
GetTemp();
LcdShowStr(0,0,"Welcome to use");//顯示字符及溫度值
LcdShowStr(0,1,"Current T:");
LcdShowStr(10,1,str);
Compare();
}
else //讀取失敗時(shí),提示錯(cuò)誤信息
{
LcdShowStr(0,0,"error!");
}
Start18B20();//重新啟動(dòng)下一次轉(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;//二進(jìn)制的小數(shù)部分轉(zhuǎn)換為1位十進(jìn)制位
str[len++]=decT+'0';//十進(jìn)制小數(shù)位再轉(zhuǎn)換為ASCII字符
while(len<6)//用空格補(bǔ)齊到6個(gè)字符長(zhǎng)度
{
str[len++]=' ';
}
str[len++]='\0';
}
/*延時(shí)函數(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è)置電機(jī)的轉(zhuǎn)速*/
void Compare()
{
unsigned int i=0;
unsigned char j;
if((intT>= 24) && (intT<26)) //以兩度為一個(gè)溫差范圍,并設(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è)置電機(jī)轉(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ù),返回值-字符串長(zhǎng)度*/
unsigned char IntToString(unsigned char *str,int dat)
{
signed char i=0;
unsigned char len=0;
unsigned char buf[6];
if(dat<0)//如果為負(fù)數(shù),首先取絕對(duì)值,并在指針上添加負(fù)號(hào)
{
dat=-dat;
*str++='-';
len++;
}
do{ //先轉(zhuǎn)換為低位在前的十進(jìn)制數(shù)組
buf[i++]=dat%10;
dat /=10;
}while(dat>0);
len += i;//i最后的值就是有效字符的個(gè)數(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;
……………………
…………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
基于紅外感應(yīng)的溫控轉(zhuǎn)速型風(fēng)扇設(shè)計(jì)資料.7z
(72.26 KB, 下載次數(shù): 62)
2020-7-21 00:47 上傳
點(diǎn)擊文件名下載附件
溫控風(fēng)扇設(shè)計(jì)
下載積分: 黑幣 -5
作者:
jemery1030
時(shí)間:
2020-9-2 13:31
正在找L298N控制風(fēng)扇的資料,非常詳細(xì),感謝了。
作者:
hq_zhu
時(shí)間:
2020-9-11 19:48
PWM控制的嗎?
作者:
5201314@
時(shí)間:
2020-12-28 21:09
有大神能根據(jù)這個(gè)電路畫個(gè)proteus電路仿真來學(xué)習(xí)下嗎?
作者:
5201314@
時(shí)間:
2020-12-28 21:23
有proteus仿真嘛??.
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1