最近为了练习51单片机,便做了一个温控风扇的项目。
先说一下温控风扇的功能吧,对于我来说,已经接触51单片机已经有一年的时间了,可是真正的开始做东西,却没有多长时间。我之前只是用51做过一个光立方。而光立方的代码却十分的简单(只是简单的光立方,,没有涉及更加复杂的原理,,,像神马傅里叶变换,,神马高大上的东西,,,我还是先学好高数吧),只是用了个74HC573进行锁存进而位控制。。。。。从这说起来,光立方基本都是队友焊接的,,我只是一个编程者(苦逼的程序员),而光立方也没有做的多么完美,但是已经尽力了,当时只接触51一个月便做完了光立方。
最近因为一个比赛而接触了温控风扇,当时,,比赛没做出来(我实在是还太水),于是把未完成品带回去继续做,把上面的基本要求加拓展要求基本都做了出来,,唉 ,硬件调试的例程可真是艰辛啊,,代码更不用提 唉 ,说多了鼻子一把泪一把的。。好了,不扯太多东西,进入正题。
此温控风扇的功能:大体来说,分为以下几类:1,电机驱动(不用多说)2,LCD1602(咦,这是做神马的?不用急,下面会提到)3,DS18B20(哎呀,温控啊温控,说实话,这个时序图到现在还没记住,哎呀,只能靠现查了,再copy一下别人的例程修改一下啦),,,,,,有点懒,,但是都看懂啦,也会修改啦。4,红外遥控器加发射器。。。唉,这个红外遥控从一开始到明白可是耗费了我一年的时间啊。5,蜂鸣器,,额外功能,没打算加了。
好了,开始贴贴代码啦啦啦~~~~~~~~~~~~~~~~~~~~~~~~~~·
#include <reg52.h>
#include "18B20.h"
#define e P0 //LCD1602的D0~D7
/*****************************************************************************
* TH0和TL0是计数器0的高8位和低8位计数器,计算办法:TL0=(65536-C)%256; *
* TH0=(65536-C)/256,其中C为所要计数的次数即多长时间产生一次中断;TMOD是计数器*
* 工作模式选择,0X01表示选用模式1,它有16位计数器,最大计数脉冲为65536,最长时 *
* 间为1ms*65536=65.536ms *
******************************************************************************/
#define V_TH0 0x0FC
#define V_TL0 0x18
#define V_TMOD 0X01
#define T25 250
#define T30 300
#define T35 350
#define T40 400
sbit lcden=P1^4;//使能端
sbit lcdrs=P1^2;//读写选择端
sbit lcdrw=P1^5;//读写选择端
uchar num;
int result;
bit IrOK;
unsigned char IrValue[6];
unsigned char Time;
void IrInit();
void hongwai();
void deal(uint);
unsigned char ZKB1,ZKB2,ZKB3;
sbit K1=P2^3;
sbit K2=P2^7;
sbit K3=P2^6;
sbit K4=P2^5;
void init_sys(void); /*系统初始化函数*/
void delay(uint z);
sbit IRIN = P3^2;
//--定义全局变量--//
void jiema();
//--声明全局函数--//
extern void DelayMs(unsigned int );
sbit dianji=P1^1;
/*******************************************************************************
* 函数名 : main
* 函数功能 : 主函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
/*******************************************************************************
* 函数名 : LCD延时
* 函数功能 : 延时
* 输入 : z
* 输出 : 无
*******************************************************************************/
void delay_lcd(uchar z)
{
uint x,y;
for(x=z;x>0;x--)
{
for(y=110;y>0;y--);
}
}
void write_com(uint com)//写命令
{
lcden=0;
lcdrw=0;
lcdrs=0;
e=com;
delay_lcd(5);
lcden=1;
delay_lcd(5);
lcden=0;
}
void init()//进行初始化
{
lcden=0;
write_com(0x3c);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
void write_data(uint date)//写数据
{
lcden=0;
lcdrw=0;
lcdrs=1;
e=date;
delay_lcd(15);
lcden=1;
delay_lcd(15);
lcden=0;
}
/*******************************************************************************
*函数名 :红外遥控
*函数功能 :红外遥控
*输入 ;无
*输出 ; 无
**********************************************************************************/
void hongwai()
{
dianji=0;
// unsigned char i;
IrInit();
}
/*******************************************************************************
* 函数名 : DelayMs()
* 函数功能 : 延时
* 输入 : x
* 输出 &