標題: 基于51單片機的智能電風扇設計 [打印本頁]
作者: 1731062422 時間: 2017-11-10 14:19
標題: 基于51單片機的智能電風扇設計
以前寫過的一個東西 有三檔調節 可以報警
#include <reg52.H>
#include <intrins.H>
#include <math.H>
#define uchar unsigned char
#define uint unsigned int
sbit led1 = P1^2;
sbit OUTPUT = P3^2; //電機驅動位1
sbit OUTPUT_0 = P3^3; //電機驅動位2
sbit RS = P1^1; //LCD命令及指令聲明
sbit LCDEN = P1^0; //LCD信號使能端聲明
sbit set_warn_temp = P1^4; //設置報警溫度
sbit KEY_F_UP = P1^5; //頻率上調按鈕;
sbit KEY_F_DOWN = P1^6; //頻率下調按鈕;
sbit KEY_F_auto = P1^7; //智能與手動轉換調速位
int feq,flag_c = 1,flag_auto = 1; //頻率初值相關位、檔位標志位、智能與手動轉換調速位轉換標志位
uint temp_2,warn_temp = 28; //提取溫度
void delayMs(uint a) //毫秒延時函數
{
uint i, j;
for(i = a; i > 0; i--)
for(j = 100; j > 0; j--);
}
void t_init() //定時器初始化
{
TMOD=0x01; //定時器0和定時器1都工作在方式1,16位計數器;
TH0 = 1000/256;
TL0 = 1000%256;
ET0 = 1;
EA = 1;
TR0 = 1;
}
void key_scan() //按鍵掃描
{
if(set_warn_temp == 0) //頻率上調鍵按下;
{
delayMs(5);
if(set_warn_temp == 0) //增大檔位
{
warn_temp++;
while(set_warn_temp == 0);
}
}
if(KEY_F_UP == 0) //頻率上調鍵按下;
{
delayMs(5);
if(KEY_F_UP == 0) //增大檔位
{
flag_c++;
if(flag_c > 3)
flag_c = 3;
while(KEY_F_UP == 0);
}
}
else if(KEY_F_DOWN == 0) //減小檔位
{
delayMs(5);
if(KEY_F_DOWN == 0)
{
flag_c--;
if(flag_c < 0)
flag_c = 0;
while(KEY_F_DOWN == 0);
}
}
else if(KEY_F_auto == 0) //智能與手動轉換;
{
delayMs(5);
if(KEY_F_auto == 0)
{
flag_auto = ~flag_auto;
while(KEY_F_auto == 0);
}
}
}
void flag_auto_change() //檔位隨溫度智能轉換
{
if(flag_auto == 1)
{
if(temp_2< 25)
{
flag_c = 0;
}
else if((temp_2>=27) && (temp_2<=29))
{
flag_c=1;
}
elseif((temp_2 >= 30) && (temp_2 <= 32))
{
flag_c = 2;
}
elseif((temp_2 >= 33 )&&( temp_2 <= 34) )
{
flag_c = 3;
}
}
}
void flag_feq() //檔位標志位與頻率的轉換
{
if(flag_c == 0)
{
TR0 = 0;
OUTPUT = 0;
}
else
{
TR0 = 1;
switch(flag_c)
{
case 1:
feq = 63000;
break;
case 2:
feq = 33000;
break;
case 3:
feq = 13000;
break;
default:
break;
}
}
}
void timer0() interrupt 1 //定時器中斷函數
{
TH0 = (65536-feq)/256;
TL0 = (65536-feq)%256;
//TR1=1; //開定時器1;
OUTPUT = ~OUTPUT;
}
//LCD部分
void delayUs() //毫秒延時函數
{
_nop_();
}
void writeComm(uchar comm) //LCD命令函數
{
RS = 0;
P2 = comm;
LCDEN = 1;
delayUs();
LCDEN = 0;
delayMs(1);
}
void writeData(uchar dat) //寫數據:RS=1,RW=0;
{
RS = 1;
P2 = dat;
LCDEN = 1;
delayUs();
LCDEN = 0;
delayMs(1);
}
voidinit() //LCD初始化
{
// dula = wela = 0;
writeComm(0x38);
writeComm(0x0c);
writeComm(0x06);
writeComm(0x01);
}
void writeString(uchar * str, uchar length) //送字符函數
{
uchar i;
for(i = 0; i < length; i++)
{
writeData(str);
}
}
/**//*****************************DS18B20溫度部分*******************************/
sbitds = P3^7; //溫度計IO引腳
void dsInit()
{
unsigned int i;
ds = 0;
i= 100;
while(i>0)
i--;
ds = 1;
i= 4;
while(i>0)
i--;
}
void dsWait()
{
unsigned int i;
while(ds);
while(~ds);
i = 4;
while(i > 0)
i--;
}
bit readBit()
{
unsigned int i;
bit b;
ds = 0;
i++;
ds = 1;
i++;
i++;
b= ds;
i= 8;
while(i>0) i--;
return b;
}
unsigned char readByte()
{
unsigned int i;
unsigned char j, dat;
dat = 0;
for(i=0; i<8; i++)
{
j = readBit();
dat = (j << 7) | (dat >> 1);
}
return dat;
}
void writeByte(unsigned char dat)
{
unsigned int i;
unsigned char j;
bit b;
for(j = 0; j < 8; j++)
{
b = dat & 0x01;
dat >>= 1;
if(b)
{
ds = 0;
i++;
i++;
ds = 1;
i = 8;
while(i>0)i--;
}
else
{
ds = 0;
i = 8;
while(i>0)
i--;
ds = 1;
i++;
i++;
}
}
}
void sendChangeCmd()
{
dsInit();
writeByte(0xcc);
writeByte(0x44);
}
void sendReadCmd()
{
dsInit();
writeByte(0xcc);
writeByte(0xbe);
}
int getTmpValue()
{
unsigned int tmpvalue;
int value;
float t;
unsigned char low, high;
sendReadCmd();
low = readByte();
high = readByte();
tmpvalue = high;
tmpvalue <<= 8;
tmpvalue |= low;
value = tmpvalue;
\
t= value * 0.0625;
\
value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0減0.5
return value;
}
void display(int v) //LCD顯示函數
{
uinta,b;
unsigned char count;
unsigned char datas[] = {0, 0, 0, 0, 0};
unsigned int tmp = abs(v);
uchar table[] = "warning";
uchar table1[] = "safe ";
datas[0] = tmp / 10000;
datas[1] = tmp % 10000 / 1000;
datas[2] = tmp % 1000 / 100;
datas[3] = tmp % 100 / 10;
datas[4] = tmp % 10;
a= datas[2];
b= datas[1];
temp_2= b * 10 + a;
if(temp_2 > warn_temp)
{
writeComm(0x80+ 9);
writeString(table, 7);
}
if(temp_2 <= warn_temp)
{
writeComm(0x80 + 9);
writeString(table1, 7);
}
writeComm(0x80+0x40);
if(v < 0)
{
writeString("- ", 2);
}
else
{
writeString("+ ", 2);
}
if(datas[0] != 0)
{
writeData('0' + datas[0]);
}
for(count = 1; count != 5; count++)
{
writeData('0' + datas[count]);
if(count == 2)
{
writeData('.');
}
}
flag_auto_change(); //檔位隨溫度智能轉換
writeComm(0x80+ 6);
writeData(0x30 + flag_c);
writeComm(0x80+ 0x40 + 13);
writeData(0x30 + warn_temp / 10);
writeData(0x30+ warn_temp % 10);
}
/*************************主函數部分***********************/
void main()
{
uchartable_lev[] = "level:" ;
uchartable_set[] = "set:" ;
sendChangeCmd();
init(); //LCD初始化
t_init(); //定時器初始化
OUTPUT_0= 0; //給電機驅動一端始終賦零
writeComm(0x80);
writeString(table_lev, 6);
writeComm(0x80 + 0x40 + 9);
writeString(table_set, 4);
while(1)
{
delayMs(1000); //溫度轉換時間需要750ms以上
key_scan(); //按鍵掃描
display(getTmpValue()); //顯示
flag_feq(); //檔位標志位與頻率的轉換
sendChangeCmd();
}
}
file:///C:/Users/Liu/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |