173 2438 5004
KEROS加密芯片——品牌直销 | 免费样品 | 技术支持
当前位置:网站首页 > 资讯中心 正文 资讯中心

51单片机空调遥控器毕业设计

htxw 2023-03-14 资讯中心 20 ℃

基于51单片机的智能空调研究意义

基于51单片机的智能空调研究意义是空调技术原理。根据查询相关公开信息显示:研究意义是掌握空调技术原理及单片机的工作原理,从而实现智能化管理,提高空调的节能效果。

求一个单片机红外遥控器控制设计的源程序

程序太长,须仔细研究。

#define main_GLOBALS

#include reg51.h

#include "main.h"

#include "SAA3010.h"

unsigned char counter;

unsigned char temp;

sbit P2_0 = 0xA0;

sbit P2_1 = 0xA1;

sbit P2_2 = 0xA2;

sbit P2_3 = 0xA3;

void decode_init(void)

{

load_code_detected=0;

repeat_code_detected=0;

decode_error=0;

temp1=0;

temp2=0;

temp3=0;

temp4=0;

TH1=0;

TL1=0;

TR1=0;

}

void main(void)

{  

EX0=1;

IT0=1;

TMOD=0x11;

ET0=1;

TH0=128;

TL0=0;

TR0=1;

P0=0;

TH1=0;

TL1=0;

decode_init();

EA=1;

counter=0;

data_available=0;

while(1)

{

if(data_available==1)

{

            if (key_code==01) //display "1"

            {

P2_0=0; //选中四个数码管  

P2_1=0;  

P2_2=0; 

P2_3=0;   

P0=0xf9; 

            }

            if (key_code==0x02) //display "2"

            {

P2_0=0; //选中四个数码管  

P2_1=0;  

P2_2=0; 

P2_3=0;   

P0=0xa4; 

            }

            if (key_code==0x03) //display "3"

            {

P2_0=0; //选中四个数码管  

P2_1=0;  

P2_2=0; 

P2_3=0;   

P0=0xb0; 

            }

            if (key_code==0x04) //display "4"

            {

P2_0=0; //选中四个数码管  

P2_1=0;  

P2_2=0; 

P2_3=0;   

P0=0x99; 

            }

            if (key_code==0x05) //display "5"

            {

P2_0=0; //选中四个数码管  

P2_1=0;  

P2_2=0; 

P2_3=0;   

P0=0x92; 

            }

            if (key_code==0x06) //display "6"

            {

P2_0=0; //选中四个数码管  

P2_1=0;  

P2_2=0; 

P2_3=0;   

P0=0x82; 

            }

            if (key_code==0x07) //display "7"

            {

P2_0=0; //选中四个数码管  

P2_1=0;  

P2_2=0; 

P2_3=0;   

P0=0xf8;

            }

            if (key_code==0x08) //display "8"

            {

P2_0=0; //选中四个数码管  

P2_1=0;  

P2_2=0; 

P2_3=0;   

P0=0x80; 

            }

            if (key_code==0x09) //display "9"

            {

P2_0=0; //选中四个数码管  

P2_1=0;  

P2_2=0; 

P2_3=0;   

P0=0x90; 

            }

            if (key_code==0x00) //display "0"

            {

P2_0=0; //选中四个数码管  

P2_1=0;  

P2_2=0; 

P2_3=0;   

P0=0xc0; 

            }

data_available=0;

}

}

}

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

void key_isr(void) interrupt 0

{

EX0=0;                                 // 立即关闭外部中断,转为查询方式解码

led=0;                                 // 开LED表示收到红外信号

    temp=SAA3010_decode();   // 解码

if(temp==1) goto key_isr_exit;

counter=0;

key_isr_exit:

decode_init();

led=1;

EX0=1;

}

void Timer0_isr(void) interrupt 1

{

counter++;

if(counter3)

{

if(led==0) led=1;

counter=0;

}

ET0=1;

}

#define SAA3010_GLOBALS

#include reg51.h

#include "SAA3010.h"

#include "main.h"

//===========================================================================================================

// 该函数的作用是每调用一次就在temp1-4组成的32bit长度的最低位上移入

// 一个0或者1,数据由bitdata确定

void SAA3010_cycle_data(unsigned char bitdata)

{

temp4=temp41;

if((temp30x80)==1) temp4=temp4|0x01;

else temp4=temp40xfe;

temp3=temp31;

if((temp20x80)==1) temp3=temp3|0x01;

else temp3=temp30xfe;

temp2=temp21;

if((temp10x80)==1) temp2=temp2|0x01;

else temp2=temp20xfe;

temp1=temp11;

if(bitdata==1) temp1=temp1|0x01;

else temp1=temp10xfe;

}

//===========================================================================================================

// 解码出错返回1,对则返回0

unsigned char SAA3010_decode(void)

{

//-----------------------------------------------------------------------------------------------------------

unsigned char count=0;

TR1=1;                                 // 启动计时

while(1)

{

while(ir_receive==0);                  // 等待电平变高,不需要超时监测

TR1=0;                                 // 高电平(对发射电路而言)测试结束

high_level_time=TH1*256+TL1;           // 记录高电平的数据

//-----------------------------------------------------------------------------------------------------------

TH1=0; TL1=0; TR1=1;                  // 启动对低电平的测试

//-----------------------------------------------------------------------------------------------------------

// 处理低电平

if((high_level_time750)||(high_level_time1800)) return 1;    // 不是合格的电平

if((high_level_time750)(high_level_time1000)){SAA3010_cycle_data(0);count+=1;} // 移入一个0

if((high_level_time1500)(high_level_time1800)) {SAA3010_cycle_data(0);SAA3010_cycle_data(0);count+=2;} // 移入两个0

while(ir_receive==1)                   // 等待电平变低

{

if(TH10x08) break;                // 高电平超时,正常情况下是测试结束,异常时则是出错

}

       

TR1=0;                                 // 低电平(对发射电路而言)测试结束

if(TH10x08) {break;}

low_level_time=TH1*256+TL1;            // 保存低电平的数据

TH1=0; TL1=0; TR1=1;  // 为增加计时的准确性,数据的处理都是在计时过程里

//-----------------------------------------------------------------------------------------------------------

// 处理高电平

if((low_level_time750)||(low_level_time1800)) return 1;    // 不是合格的电平

if((low_level_time750)(low_level_time1000)) {SAA3010_cycle_data(1); count+=1;} // 移入一个0

if((low_level_time1500)(low_level_time1800)) {SAA3010_cycle_data(1); SAA3010_cycle_data(1);count+=2;} // 移入两个0

}                           

if(count==26) {SAA3010_cycle_data(1); count++;}

if(count!=27) return 1;

led=0;

// 提取按健信息

key_code=0;

if((temp11)0x01) key_code=key_code|0x01;

else key_code=key_code0xfe;

if((temp13)0x01) key_code=key_code|0x02;

else key_code=key_code0xfd;

if((temp15)0x01) key_code=key_code|0x04;

else key_code=key_code0xfb;

if((temp17)0x01) key_code=key_code|0x08;

else key_code=key_code0xf7;

if((temp21)0x01) key_code=key_code|0x10;

else key_code=key_code0xef;

if((temp23)0x01) key_code=key_code|0x20;

else key_code=key_code0xdf;

// 提取系统信息

sys_code=0;

if((temp25)0x01) sys_code=sys_code|0x01;

else sys_code=sys_code0xfe;

if((temp27)0x01) sys_code=sys_code|0x02;

else sys_code=sys_code0xfd;

if((temp31)0x01) sys_code=sys_code|0x04;

else sys_code=sys_code0xfb;

if((temp33)0x01) sys_code=sys_code|0x08;

else sys_code=sys_code0xf7;

if((temp35)0x01) sys_code=sys_code|0x10;

else sys_code=sys_code0xef;

if((temp37)0x01) sys_code=sys_code|0x20;

else sys_code=sys_code0xdf;

data_available=1;

return 0;

}

//===========================================================================================================

用51单片机制作学习型红外遥控器的原理

以下是程序,调试成功,LCD1602显示

//本解码程序适用于NEC的upd6121及其兼容芯片的解码,支持大多数遥控器 实验板采用11.0592MHZ晶振

#includereg52.h       //包含单片机寄存器的头文件

#includeintrins.h  //包含_nop_()函数定义的头文件

sbit IR=P3^2;           //将IR位定义为P3.2引脚

sbit RS=P2^0;    //寄存器选择位,将RS位定义为P2.0引脚

sbit RW=P2^1;    //读写选择位,将RW位定义为P2.1引脚

sbit E=P2^2;     //使能信号位,将E位定义为P2.2引脚

sbit BF=P0^7;    //忙碌标志位,,将BF位定义为P0.7引脚

sbit BEEP = P3^6; //蜂鸣器控制端口P36

unsigned char flag;

unsigned char code string[ ]= {"1602IR-CODE TEST"};

unsigned char a[4];    //储存用户码、用户反码与键数据码、键数据反码

unsigned int LowTime,HighTime; //储存高、低电平的宽度

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

函数功能:延时1ms

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

void delay1ms()

{

unsigned char i,j;

for(i=0;i10;i++)

for(j=0;j33;j++)

;

}

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

函数功能:延时若干毫秒

入口参数:n

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

void delay(unsigned char n)

{

unsigned char i;

for(i=0;in;i++)

delay1ms();

}

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

void beep()  //蜂鸣器响一声函数

{

unsigned char i;

for (i=0;i100;i++)

{

delay1ms();

BEEP=!BEEP;       //BEEP取反

}

BEEP=1;           //关闭蜂鸣器

delay(250);       //延时

}

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

函数功能:判断液晶模块的忙碌状态

返回值:result。result=1,忙碌;result=0,不忙

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

unsigned char BusyTest(void)

{

bit result;

RS=0;       //根据规定,RS为低电平,RW为高电平时,可以读状态

RW=1;

E=1;        //E=1,才允许读写

_nop_();   //空操作

_nop_();

_nop_();

_nop_();   //空操作四个机器周期,给硬件反应时间

result=BF;  //将忙碌标志电平赋给result

E=0;

return result;

}

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

函数功能:将模式设置指令或显示地址写入液晶模块

入口参数:dictate

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

void WriteInstruction (unsigned char dictate)

{

while(BusyTest()==1); //如果忙就等待

RS=0;                  //根据规定,RS和R/W同时为低电平时,可以写入指令

RW=0;

E=0;                   //E置低电平(根据表8-6,写指令时,E为高脉冲,

// 就是让E从0到1发生正跳变,所以应先置"0"

_nop_();

_nop_();             //空操作两个机器周期,给硬件反应时间

P0=dictate;            //将数据送入P0口,即写入指令或地址

_nop_();

_nop_();

_nop_();

_nop_();               //空操作四个机器周期,给硬件反应时间

E=1;                   //E置高电平

_nop_();

_nop_();

_nop_();

_nop_();               //空操作四个机器周期,给硬件反应时间

E=0;                  //当E由高电平跳变成低电平时,液晶模块开始执行命令

}

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

函数功能:指定字符显示的实际地址

入口参数:x

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

void WriteAddress(unsigned char x)

{

WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"

}

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

函数功能:将数据(字符的标准ASCII码)写入液晶模块

入口参数:y(为字符常量)

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

void WriteData(unsigned char y)

{

while(BusyTest()==1);

RS=1;           //RS为高电平,RW为低电平时,可以写入数据

RW=0;

E=0;            //E置低电平(根据表8-6,写指令时,E为高脉冲,

// 就是让E从0到1发生正跳变,所以应先置"0"

P0=y;           //将数据送入P0口,即将数据写入液晶模块

_nop_();

_nop_();

_nop_();

_nop_();       //空操作四个机器周期,给硬件反应时间

E=1;          //E置高电平

_nop_();

_nop_();

_nop_();

_nop_();        //空操作四个机器周期,给硬件反应时间

E=0;            //当E由高电平跳变成低电平时,液晶模块开始执行命令

}

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

函数功能:对LCD的显示模式进行初始化设置

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

void LcdInitiate(void)

{

delay(15);             //延时15ms,首次写指令时应给LCD一段较长的反应时间

WriteInstruction(0x38);  //显示模式设置:16×2显示,5×7点阵,8位数据接口

delay(5);   //延时5ms

WriteInstruction(0x38);

delay(5);

WriteInstruction(0x38);

delay(5);

WriteInstruction(0x0C);  //显示模式设置:显示开,有光标,光标闪烁

delay(5);

WriteInstruction(0x06);  //显示模式设置:光标右移,字符不移

delay(5);

WriteInstruction(0x01);  //清屏幕指令,将以前的显示内容清除

delay(5);

}

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

函数功能:对4个字节的用户码和键数据码进行解码

说明:解码正确,返回1,否则返回0

出口参数:dat

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

bit DeCode(void)

{

unsigned char  i,j;

unsigned char temp;    //储存解码出的数据

for(i=0;i4;i++)      //连续读取4个用户码和键数据码

{

for(j=0;j8;j++)  //每个码有8位数字

{

temp=temp1;  //temp中的各数据位右移一位,因为先读出的是高位数据

TH0=0;         //定时器清0

TL0=0;         //定时器清0

TR0=1;         //开启定时器T0

while(IR==0)   //如果是低电平就等待

;       //低电平计时

TR0=0;         //关闭定时器T0

LowTime=TH0*256+TL0;    //保存低电平宽度

TH0=0;         //定时器清0

TL0=0;         //定时器清0

TR0=1;         //开启定时器T0

while(IR==1)   //如果是高电平就等待

;

TR0=0;        //关闭定时器T0

HighTime=TH0*256+TL0;   //保存高电平宽度

if((LowTime370)||(LowTime640))

return 0;        //如果低电平长度不在合理范围,则认为出错,停止解码

if((HighTime420)(HighTime620))   //如果高电平时间在560微秒左右,即计数560/1.085=516次

temp=temp0x7f;       //(520-100=420, 520+100=620),则该位是0

if((HighTime1300)(HighTime1800)) //如果高电平时间在1680微秒左右,即计数1680/1.085=1548次

temp=temp|0x80;       //(1550-250=1300,1550+250=1800),则该位是1

}

a[i]=temp; //将解码出的字节值储存在a[i]

}

if(a[2]=~a[3])  //验证键数据码和其反码是否相等,一般情况下不必验证用户码

return 1;     //解码正确,返回1

}

/*------------------二进制码转换为压缩型BCD码,并显示---------------*/

void two_2_bcd(unsigned char date)

{

unsigned char temp;

temp=date;

date=0xf0;

date=4;                    //右移四位得到高四位码

date=0x0f;                  //与0x0f想与确保高四位为0

if(date=0x09)

{

WriteData(0x30+date);            //lcd显示键值高四位

}

else

{

date=date-0x09;

WriteData(0x40+date);

}

date=temp;

date=0x0f;

if(date=0x09)

{

WriteData(0x30+date);            //lcd显示低四位值

}

else

{

date=date-0x09;

WriteData(0x40+date);

}

WriteData(0x48);                 //显示字符'H'

}

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

函数功能:1602LCD显示

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

void Disp(void)

{

WriteAddress(0x40);  // 设置显示位置为第一行的第1个字

two_2_bcd(a[0]);

WriteData(0x20);

two_2_bcd(a[1]);

WriteData(0x20);

two_2_bcd(a[2]);

WriteData(0x20);

two_2_bcd(a[3]);

}

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

函数功能:主函数

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

void main()

{

unsigned char i;

LcdInitiate();         //调用LCD初始化函数

delay(10);

WriteInstruction(0x01);//清显示:清屏幕指令

WriteAddress(0x00);  // 设置显示位置为第一行的第1个字

i = 0;

while(string[i] != '\0')    //'\0'是数组结束标志

{      // 显示字符 

WriteData(string[i]);

i++;

}

EA=1;        //开启总中断

EX0=1;       //开外中断0

ET0=1;       //定时器T0中断允许

IT0=1;       //外中断的下降沿触发

TMOD=0x01;   //使用定时器T0的模式1

TR0=0;       //定时器T0关闭

while(1);   //等待红外信号产生的中断

}

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

函数功能:红外线触发的外中断处理函数

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

void Int0(void) interrupt 0

{

EX0=0;      //关闭外中断0,不再接收二次红外信号的中断,只解码当前红外信号

TH0=0;      //定时器T0的高8位清0

TL0=0;      //定时器T0的低8位清0

TR0=1;     //开启定时器T0

while(IR==0);          //如果是低电平就等待,给引导码低电平计时

TR0=0;                //关闭定时器T0

LowTime=TH0*256+TL0;  //保存低电平时间

TH0=0;      //定时器T0的高8位清0

TL0=0;      //定时器T0的低8位清0

TR0=1;     //开启定时器T0

while(IR==1);  //如果是高电平就等待,给引导码高电平计时

TR0=0;        //关闭定时器T0

HighTime=TH0*256+TL0; //保存引导码的高电平长度

if((LowTime7800)(LowTime8800)(HighTime3600)(HighTime4700))

{

//如果是引导码,就开始解码,否则放弃,引导码的低电平计时

//次数=9000us/1.085=8294, 判断区间:8300-500=7800,8300+500=8800.

if(DeCode()==1) // 执行遥控解码功能

{

Disp();//调用1602LCD显示函数

beep();//蜂鸣器响一声 提示解码成功

}

}

EX0=1;   //开启外中断EX0

}

基于单片机的温度控制器的毕业论文

温度相关的毕业设计

·基于单片机的数字温度计的设计

·基于MCS-51数字温度表的设计

·单片机的数字温度计设计

·基于单片机的空调温度控制器设计

·基于数字温度计的多点温度检测系统

·设施环境中温度测量电路设计

·DS18B20数字温度计的设计

·多点温度采集系统与控制器设计

·基于PLC和组态王的温度控制系统设计

·温度监控系统的设计

·用单片机进行温度的控制及LCD显示系统的设计

·单片机电加热炉温度控制系统

·全氢罩式退火炉温度控制系统

·数字温度计的设计

·基于单片机AT89C51的语音温度计的设计

·基于单片机的多点温度检测系统

·基于51单片机的多路温度采集控制系统

·基于单片机的数字显示温度系统毕业设计论文

·基于MCS51单片机温度控制毕业设计论文

·西门子S7-300在温度控制中的应用

·燃气锅炉温度的PLC控制系统

·焦炉立火道温度软测量模型设计

·温度检测控制仪器

·智能温度巡检仪的研制

·电阻炉温度控制系统

·数字温度测控仪的设计

·温度测控仪设计

·多路温度采集系统设计

·多点数字温度巡测仪设计

·LCD数字式温度湿度测量计

·64点温度监测与控制系统

·温度报警器的电路设计与制作

·基于单片机的数字温度计的电路设计

·全氢煤气罩式炉的温度控制系统的研究与改造

·温度检测与控制系统

·红外快速检测人体温度装置的设计与研制

·具有红外保护的温度自动控制系统的设计

·基于单片机的温度测量系统的设计

·数字温度计设计

·DS18B20温度检测控制

·PN结(二极管)温度传感器性能的实验研究

·多功能智能化温度测量仪设计

·软胶囊的单片机温度控制(硬件设计)

·空调温度控制单元的设计

·大容量电机的温度保护——软件设计

·大容量电机的温度保护 ——硬件电路的设计

·基于DS18B20温度传感器的数字温度计设计

·热轧带钢卷取温度反馈控制器的设计

·基于单片机的温度采集系统设计

·多点温度数据采集系统的设计

·基于单片机的数字式温度计设计

·18B20多路温度采集接口模块

·基于单片机的户式中央空调器温度测控系统设计

·单片机电阻炉温度控制系统设计

·基于单片机的电阻炉温度控制系统设计

·基于ARM的嵌入式温度控制系统的设计

·基于DS18B20的多点温度巡回检测系统的设计

·基于单片机的多点无线温度监控系统

·基于MSC1211的温度智能温度传感器

·用集成温度传感器组成测温控制系统

·室内温度控制报警器

·自动温度控制系统

·烤箱温度控制系统

·基于单片机的电加热炉温度控制系统设计

·基于PLC的温度监控系统设计

·基于无线传输技术的室温控制系统设计——温度控制器软件设计

·温度箱模拟控制系统

·基于无线传输技术的室温控制系统设计——温度控制器硬件设计

·数字式温度计的设计

·温度监控系统设计

·基于单片机的电阻炉温度控制系统

·基于plc的温度湿度检测和显示系统设计

·基于单片机的3KW电炉温度控制系统的设计

·腔型肿瘤热疗仪温度控制系统设计

·基于AT89S51单片机的数字温度计设计

·吹塑薄膜挤出机温度控制与检测系统设计

·电加热炉PLC温度自适应控制系统的研究

·高压母线温度自动监测装置的设计

·高压母线温度自动检测装置

·小型热水锅炉单片机温度控制系统

·消毒柜单片机温度控制

·嵌入式系统在多点温度控制中的应用

·单片机温度控制系统

·上下限温度报警器的设计

·基于单片机的饮水机温度控制系统设计

·基于单片机的温度测量系统设计

基于单片机的空调遥控器设计。。。。用什么型号的单片机好呢。。

Proteus 我不会,所以哪个可以在Proteus 上仿真我不清楚

但是遥控器确实很简单,特别是空调的遥控器.

硬件上大概7,8个按键,一个晶振,一个单片机,一个红外发射管,一个电池盒(4节电池的那种),一个三端稳压器,加上几个电阻电容就行了.

通信协议到网上查,你要控制哪个牌子的空调,就查他的遥控器通信协议.

单片机随便选,最简单最原始的89S2051就足够了,你要是想功能再多点选89S51,要是想速度再快点可以选C8051F340,这三种都是51内核的单片机,很容易上手.

做遥控器的难点不是实现功能,而是控制功耗.待机时间不能太短.

谁能给个格力空调用51单片机编的红外遥控编码的c语言程序

这个程序没什么难的,主要是协调设备联调。

空调的控制有一套简单的空掉数据协议,

协议貌似是:

设备地址,指令类型,指令长度,指令,校验位。

可以和空调的销售技术人员咨询一下,每个空调品牌的协议有少许的出入。

51单片机空调遥控器毕业设计的介绍到此就结束了,感谢您耐心阅读,谢谢。

本文标签:51单片机空调遥控器毕业设计

<