风扇控制系统--初版

风扇控制系统--初版

利用51单片机实现的风扇控制系统,包括硬件到软件的实现。(功能未完,待完善)

硬件的代码如下:  /********************************************************************

* 文件名  : 风扇控制智能系统

* 描述    :

1、红外线遥控板 控制风扇开关 挡速

2、液晶显示器 显示风扇的工作情况

3、客户端显示风扇工作情况

4、客户端控制风扇工作

5、定时开关风扇  LED倒数

6、开启风扇时 记录上次的挡速

* 创建人  : wu_zhuojun,2014年2月16日 北京

* 版本号  : 2.0

***********************************************************************/

#include <reg51.h>

#include <intrins.h>

#define uchar unsigned char

#define uint  unsigned int

uchar LCD_ID_1[16] = {"I have a dream!"};

uchar LCD_ID_2[16] = {"Speed: 0"};

void delay(uchar x);  //x*0.14MS

void delay1(int ms);

void beep();

sbit IRIN = P3^3;         //红外接收器数据线

sbit BEEP = P1^5;         //蜂鸣器驱动线

sbit RELAY= P1^4;         //继电器驱动线

uchar IRCOM[7];

sbit E=P2^7;//1602使能引脚

sbit RW=P2^6;//1602读写引脚

sbit RS=P2^5;//1602数据/命令选择引脚

/********************************************************************

* 名称 : delay()

* 功能 : 延时,延时时间大概为140US。

* 输入 : 无

* 输出 : 无

***********************************************************************/

void Delay2()

{

int i,j;

for(i=0; i<=10; i++)

for(j=0; j<=2; j++)

;

}

/********************************************************************

* 名称 : enable(uchar del)

* 功能 : 1602命令函数

* 输入 : 输入的命令值

* 输出 : 无

***********************************************************************/

void enable(uchar del)

{

P0 = del;

RS = 0;

RW = 0;

E = 0;

Delay2();

E = 1;

Delay2();

}

/********************************************************************

* 名称 : write(uchar del)

* 功能 : 1602写数据函数

* 输入 : 需要写入1602的数据

* 输出 : 无

***********************************************************************/

void write(uchar del)

{

P0 = del;

RS = 1;

RW = 0;

E = 0;

Delay2();

E = 1;

Delay2();

}

/********************************************************************

* 名称 : L1602_init()

* 功能 : 1602初始化,请参考1602的资料

* 输入 : 无

* 输出 : 无

***********************************************************************/

void L1602_init(void)

{

enable(0x01);

enable(0x38);

enable(0x0c);

enable(0x06);

enable(0xd0);

}

/********************************************************************

* 名称 : L1602_char(uchar hang,uchar lie,char sign)

* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下

L1602_char(1,5,‘b‘)

* 输入 : 行,列,需要输入1602的数据

* 输出 : 无

***********************************************************************/

void L1602_char(uchar hang,uchar lie,char sign)

{

uchar a;

if(hang == 1) a = 0x80;

if(hang == 2) a = 0xc0;

a = a + lie - 1;

enable(a);

write(sign);

}

/********************************************************************

* 名称 : L1602_string(uchar hang,uchar lie,uchar *p)

* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下

L1602_string(1,5,"ab cd ef;")

* 输入 : 行,列,需要输入1602的数据

* 输出 : 无

***********************************************************************/

void L1602_string(uchar hang,uchar lie,uchar *p)

{

uchar a;

if(hang == 1) a = 0x80;

if(hang == 2) a = 0xc0;

a = a + lie - 1;

enable(a);

while(1)

{

if(*p == ‘\0‘) break;

write(*p);

p++;

}

}

/********************************************************************

* 名称 : Com_Init()

* 功能 : 初始化串口程序,晶振11.0592, 波特率9600

* 输入 : 无

* 输出 : 无

***********************************************************************/

void Com_Init(void)

{

TMOD = 0x20;

PCON = 0x00;

SCON = 0x50;

TH1 = 0xFd;

TL1 = 0xFd;

TR1 = 1;

}

/********************************************************************

* 名称 : main()

* 功能 :

* 输入 : 无

* 输出 : 无

***********************************************************************/

main()

{

//所要发送的数据 所用的串口是烧写程序的串口,并不是9针串口

//uchar code Buffer[] = "wo shi wuzhuojun";

//uchar *p = Buffer;

//P2 = 0x00;

//p = Buffer;

//=========初始化红外线控制 Begin=======//

IE = 0x84;                 //允许总中断中断,使能 INT1 外部中断

TCON = 0x10;               //触发方式为脉冲负边沿触发

IRIN=1;                    //I/O口初始化

BEEP=1;

RELAY=1;

//=========初始化红外线控制 End=======//

delay1(10);                 //延时

L1602_init();               //初始化LCD

L1602_string(1, 1, LCD_ID_1);  //设置 液晶显示屏  显示LCD_ID_1的内容

L1602_string(2, 1, LCD_ID_2);  //设置 液晶显示屏  显示LCD_ID_2的内容

//=======初始化串口 Begin=======//

Com_Init();

#if 0

while(1)

{

SBUF = *p;

while(!TI)                   //如果发送完毕,硬件会置位TI

{

_nop_();

}

p++;

if(*p == ‘\0‘) break;//在每个字符串的最后,会有一个‘\0‘

TI = 0;                //TI清零

}

#endif

//=======初始化串口 Begin=======//

while(1);

} //end main

/********************************************************************

* 名称 : IR_IN interrupt 2 using 0

* 功能 : 接收红外线数据,并中断处理液晶屏显示

* 输入 : 无

* 输出 : 无

***********************************************************************/

void IR_IN() interrupt 2 using 0

{

//======初始化串口发送数据 变量  Begin=======//

uchar code strSpeed[][4] = {"0", "1", "2", "3" };

uchar *p = strSpeed[0];  //初始化为 0 档

//======初始化串口发送数据 变量  End=======//

unsigned char j,k,N=0;

EX1 = 0;

delay(15);

if (IRIN==1)

{

EX1 =1;

return;

}

//确认IR信号出现

while (!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。

{

delay(1);

}

for (j=0;j<4;j++)         //收集四组数据

{

for (k=0;k<8;k++)        //每组数据有8位

{

while (IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。

{

delay(1);

}

while (!IRIN)          //等 IR 变为高电平

{

delay(1);

}

while (IRIN)           //计算IR高电平时长

{

delay(1);

N++;

if (N>=30)

{

EX1=1;

return;

} //if (N>=30)    //0.14ms计数过长自动离开。

} //while (IRIN)      //高电平计数完毕

IRCOM[j]=IRCOM[j] >> 1;            //数据最高位补“0”

if (N>=8)

{

IRCOM[j] = IRCOM[j] | 0x80;    //数据最高位补“1”

}  //if (N>=8)

N=0;

}//for (k=0;k<8;k++)

}//for (j=0;j<4;j++)

if (IRCOM[2]!=~IRCOM[3])

{

EX1=1;

return;

}

IRCOM[5]=IRCOM[2] & 0x0F;     //取键码的低四位

IRCOM[6]=IRCOM[2] >> 4;       //右移4次,高四位变为低四位

if(IRCOM[5]>9)

{

IRCOM[5]=IRCOM[5]+0x37;

}

else

IRCOM[5]=IRCOM[5]+0x30;

if(IRCOM[6]>9)

{

IRCOM[6]=IRCOM[6]+0x37;

}

else

IRCOM[6]=IRCOM[6]+0x30;

//=======控制 液晶显示屏显示数据 Begin=========//

//L1602_char(2,10,IRCOM[5]);

//L1602_char(2,9,IRCOM[6]);

if( (‘4‘ == IRCOM[6]) && (‘5‘ == IRCOM[5]))  //触发开关键

{

p = strSpeed[0];   //档速

L1602_char(2,8,‘0‘);

}

else if( (‘0‘ == IRCOM[6]) && (‘C‘ == IRCOM[5]))  //触发1号键

{

p = strSpeed[1];   //档速

L1602_char(2,8,‘1‘);

}

else if( (‘1‘ == IRCOM[6]) && (‘8‘ == IRCOM[5]))  //触发2号键

{

p = strSpeed[2];   //档速

L1602_char(2,8,‘2‘);

}

else if( (‘5‘ == IRCOM[6]) && (‘E‘ == IRCOM[5]))  //触发3号键

{

p = strSpeed[3];   //档速

L1602_char(2,8,‘3‘);

}

//=======控制 液晶显示屏显示数据 End=========//

//=======发送串口数据 Begin=========//

while(1)

{

SBUF = *p;

while(!TI)                   //如果发送完毕,硬件会置位TI

{

_nop_();

}

p++;

if(*p == ‘\0‘) break;//在每个字符串的最后,会有一个‘\0‘

TI = 0;                //TI清零

}

//=======发送串口数据 End=========//

//beep();

EX1 = 1;

}

/**********************************************************/

void beep()

{

unsigned char i;

for (i=0;i<100;i++)

{

delay(4);

BEEP=!BEEP;                 //BEEP取反

}

BEEP=1;                      //关闭蜂鸣器

}

/**********************************************************/

void delay(unsigned char x)    //x*0.14MS

{

unsigned char i;

while(x--)

{

for (i = 0; i<13; i++) {}

}

}

/**********************************************************/

void delay1(int ms)

{

unsigned char y;

while(ms--)

{

for(y = 0; y<250; y++)

{

_nop_();

_nop_();

_nop_();

_nop_();

}

}

}

串口接收到单片机是数据:

软件实现的代码如下: (待续)

时间: 2025-01-11 07:44:22

风扇控制系统--初版的相关文章

风扇控制系统--最终版

简要描述: 硬件线路连接=>硬件编程=>软件编程 实现功能 : 1.红外线遥控板 控制风扇开关 挡速 2.液晶显示器 显示风扇的工作情况 3.客户端 显示风扇工作情况 4.开启风扇时 记录上次的挡速关键技术:         1.硬件中断         2.红外线通信         3.串口通信         4.FALSE存储 硬件截图:   客户端软件截图:   硬件编程源码: /****************************************************

【头条】造风扇技术那家强,码农为自己的翔代言

码农自己制作小风扇,妈妈再也用不担心我们夏天晚上被热醒了. 简要描述: 硬件线路连接=>硬件编程=>软件编程 实现功能 : 1.红外线遥控板 控制风扇开关 挡速 2.液晶显示器 显示风扇的工作情况 3.客户端 显示风扇工作情况 4.开启风扇时 记录上次的挡速 关键技术:         1.硬件中断         2.红外线通信         3.串口通信         4.FALSE存储 硬件截图: 客户端软件截图: 硬件编程源码: 1 /***********************

本科项目——基于STM32的室内温度控制系统

一.设计要求 设计基于DS18B20的数字式室内变电站温度控制系统,控制程序主要包括主程序.读出温度子程序.按键子程序.控制风机子程序等.要求能检测.显示及通过控制排气风机来降低室内温度. 采用的温度传感器是DS18B20数字温度传感器,当温度变化时,该传感器通过内部的模拟信号通过A/D转换器,将温度数据转换为数字信号,单线协议发送至单片机端口,单片机处理温度数据后通过TFT彩色液晶显示,同时单片机将温度信号分别与控制温度.报警温度比较,并通过PID控制算法计算出控制量调节风扇转速,从而达到控制

自己设计并制作了一个自动温度控制系统

一.课题任务 设计并制作一个水温自动控制系统,控制对象为1升净水,容器为搪瓷器皿.水温可以在一定范围内由人工设定,并能在环境温度降低时实现自动控制,以保持设定的温度基本不变. 1.基本要求 (1)温度设定范围为40-90℃,最小设定分度为1℃. (2)具有温度显示功能,分辨率为0.1℃,显示的绝对误差小于1℃. (3)当温度达到某一设定值并稳定后,水温的波动控制在±2℃以内.要求温度调控达到稳定状态时,必须给出声或光提示信号. (4)环境温度降低时(例如用电风扇降温)水温的波动控制在±2℃以内.

自己设计并制作了一个自己主动温度控制系统

一.课题任务 设计并制作一个水温自己主动控制系统,控制对象为1升净水,容器为搪瓷器皿.水温能够在一定范围内由人工设定,并能在环境温度减少时实现自己主动控制.以保持设定的温度基本不变. 1.基本要求 (1)温度设定范围为40-90℃,最小设定分度为1℃. (2)具有温度显示功能,分辨率为0.1℃,显示的绝对误差小于1℃. (3)当温度达到某一设定值并稳定后,水温的波动控制在±2℃以内.要求温度调控达到稳定状态时.必须给出声或光提示信号. (4)环境温度减少时(比如用电风扇降温)水温的波动控制在±2

使用单片机设计的智能温控风扇论文资料

使用单片机设计的智能温控风扇论文资料: 传统电风扇具有以下缺点:风扇不能遥控控制风扇调速,必须手动调速,给人们生活带来极大的不方便.传统电风机械的定时方式常常会伴随着机械运动的声音,特别是夜间影响人们的睡眠,而且定时范围有限,不能满足人们的需求.鉴于这些缺点,我们需要设计一款智能的电风扇控制系统来解决,技术交流:787059199. 本文以STC89C52单片机为核心,通过数字温度传感器对外界环境温度进行数据采集,从而建立一个控制系统,使电风扇随温度的变化而自动调节档位,实现“温度高.风力大.温

win7关机后cpu风扇转

主板: B150M-D3H 系统:win7旗舰版 故障现象:系统关机后,cpu风扇继续转,主板指示灯继续亮,屏幕是熄灭的,再按开机键,无法出现BIOS和系统界面,只能强制关机,每次都是如此. 解决措施:关闭主板的网络唤醒,即wake on lan选择disable.

Git 版本控制系统的基本使用、常用操作

以Ubuntu16.04操作系统为例(其他系统类似),主要记录常用的.基本操作: 0. 安装Git 分散型版本控制系统(CVS): sudo apt-get install git 1. 初始化本地配置git或其他配置等(配置仓库或者全局选项) git config --global user.name "your_name" git config --global user.email "[email protected]" git config --global

SELinux 与强制访问控制系统

SELinux 全称 Security Enhanced Linux (安全强化 Linux),是 MAC (Mandatory Access Control,强制访问控制系统)的一个实现,目的在于明确的指明某个进程可以访问哪些资源(文件.网络端口等).强制访问控制系统的用途在于增强系统抵御 0-Day 攻击(利用尚未公开的漏洞实现的攻击行为)的能力.所以它不是网络防火墙或 ACL 的替代品,在用途上也不重复.举例来说,系统上的 Apache 被发现存在一个漏洞,使得某远程用户可以访问系统上的敏