用遥控器控制led灯亮以及LCD上显示相应的按键数

//delay.c

 
#include"./delay/delay.h"


 void delay_us(unsigned char t)
 {
     while(--t);
 }


 void delay_ms(unsigned char t)
 {
     while(t--)
{
    delay_us(200);
delay_us(245);
}
 }


 /*void delay_s(unsigned char t)
 {
  unsigned char i;
for(i = 0;i < t;i++)
{
    delay_ms(200);
delay_ms(200);
delay_ms(200);
delay_ms(200);
delay_ms(200);
}
 }*/


//LCD.c

#include<reg52.h>
#include<intrins.h>
#include "./LCD/LCD.h"
#include"./delay/DELAY.H"




sbit RS = P2^4;    
sbit RW = P2^5;
sbit EN = P2^6;


#define  _Nop()  _nop_()        //定义空指令
#define RS_CLR RS=0 
#define RS_SET RS=1


#define RW_CLR RW=0 
#define RW_SET RW=1 


#define EN_CLR EN=0
#define EN_SET EN=1
#define DataPort P0


void LCD_Write_Com(unsigned char com) //写入命令
 {  
delay_ms(5);
RS_CLR; 
RW_CLR; 
EN_SET; 
DataPort = com; 
_nop_(); 
EN_CLR;
 }


 void LCD_Write_Data(unsigned char Data) //写入数据
 { 
delay_ms(5);
RS_SET; 
RW_CLR; 
EN_SET; 
DataPort= Data; 
_nop_();
EN_CLR;
 }




 void LCD_Clear(void)  //清屏
 { 
LCD_Write_Com(0x01); 
delay_ms(5);
 }


void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)  //写入字符串
{     
    if (y == 0) 
  {     
   LCD_Write_Com(0x80 + x);     
  }
    else 
  {     
    LCD_Write_Com(0xC0 + x);     
  }  
     
    while (*s) 
  {     
       LCD_Write_Data( *s);     
       s ++;     
  }
}


void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)  //写入字符
{     
    if (y == 0) 
  {     
    LCD_Write_Com(0x80 + x);     
  }    
    else 
  {     
    LCD_Write_Com(0xC0 + x);     
 
      
    LCD_Write_Data( Data);  
}


void LCD_Init(void) //初始化
{
    LCD_Write_Com(0x38);    /*显示模式设置*/ 
    delay_ms(5); 
    LCD_Write_Com(0x38); 
    delay_ms(5); 
    LCD_Write_Com(0x38); 
    delay_ms(5); 
    LCD_Write_Com(0x38);  
    LCD_Write_Com(0x08);    /*显示关闭*/ 
    LCD_Write_Com(0x01);    /*显示清屏*/ 
    LCD_Write_Com(0x06);    /*显示光标移动设置*/ 
    delay_ms(5); 
    LCD_Write_Com(0x0C);    /*显示开及光标设置*/
}


//uart.c

#include<reg52.h>
#include"./uart/uart.h"


void uart_init()
{
SCON = 0x50; //设置串口工作模式,打开接受允许
//SM0 = 0 ; SM1 = 1 ; REN = 0 ;
//TMOD &= 0x0f;
    TMOD |= 0x20; //设置定时器1为工作方式2
TH1 = 0xfd;  //波特率9600
//ET1 = 0;
TR1 = 1;
//EA = 1;
//ES = 1;
}


void uart_send_byte(unsigned char byte)
{
SBUF = byte;
//TI位自动置1,手动清0
while(!TI);//  while(TI != 1);
TI = 0;
}


void uart_send_string(unsigned char *string)
{
    while(*string)
{
   uart_send_byte(*string);
string++;
}  
}


//ir.c

#include<reg52.h>

#include"./uart/uart.h"
#include"./LCD/LCD.h"


sbit led1 = P1^0;
sbit led2 = P1^1;
sbit led3 = P1^2;
sbit led4 = P1^3;
sbit led5 = P1^4;
sbit led6 = P1^5;
sbit led7 = P1^6;
sbit led8 = P1^7;


sbit IR_IN = P3^2;


unsigned int irtime;
bit irok = 0;
bit startflag = 0;




unsigned char led[9];
unsigned char irdata[34];
unsigned char irchg[14];
unsigned char bitnum = 0;


void int0_init()
{
    IT0 = 1; //设置外部中断的触发方式
EA = 1;
EX0 = 1;


}


void timer0_init()
{
    EA = 1;
TMOD |= 0x02;
TH0 = 0;
ET0 = 1;
TR0 = 1;
}


void timer0_isr() interrupt 1
{
   irtime++;//0.256ms  引导码 13.5/0.256 = 52 1.12/0.256 = 4   0.56+1.685/0.256 = 8


}






/*unsigned char to_hex(unsigned char a,unsigned char b,unsigned char c,unsigned char d)
{
    unsigned char i;
i = (a - '0')*8 + (b - '0')*4 + (c - '0')*2 + (d - '0');
if(i <= 9)
return i+'0';
else
return i+'0'+49;
}


void chg_hex()
{
   irchg[0] = irdata[0];
   irchg[1] = ' ';
   irchg[4] = ' ';
   irchg[7] = ' ';
   irchg[10] = ' ';
   irchg[13] = '\0';


   irchg[2] = to_hex(irdata[1],irdata[2],irdata[3],irdata[4]);
   irchg[3] = to_hex(irdata[5],irdata[6],irdata[7],irdata[8]);
   irchg[5] = to_hex(irdata[9],irdata[10],irdata[11],irdata[12]);
   irchg[6] = to_hex(irdata[13],irdata[14],irdata[15],irdata[16]);


   irchg[8] = to_hex(irdata[24],irdata[23],irdata[22],irdata[21]);
   irchg[9] = to_hex(irdata[20],irdata[19],irdata[18],irdata[17]);
   irchg[11] = to_hex(irdata[32],irdata[311],irdata[30],irdata[29]);
   irchg[12] = to_hex(irdata[28],irdata[27],irdata[26],irdata[25]);
}*/


unsigned char change(unsigned char * str,unsigned char n)
{
    unsigned char temp,i,value;
temp = 0x01;
value = 0;
for(i = 0;i < 4;i++)
{  
value <<= 1;
    value |= str[n+3-i] & temp;
}


if(value >= 0&&value <= 9)
return value+'0';
else if(value >=10 && value <= 15)
return value+'a'-10;
else
return 0;
}


void transform()
{
    irchg[0] = '#';
irchg[1] = ' ';
irchg[2] = change(irdata,5);
irchg[3] = change(irdata,1);
irchg[4] = ' ';
irchg[5] = change(irdata,13);
irchg[6] = change(irdata,9);
irchg[7] = ' ';
irchg[8] = change(irdata,21);
irchg[9] = change(irdata,17);
irchg[10] = ' ';
irchg[11] = change(irdata,29);
irchg[12] = change(irdata,25);
irchg[13] = '\0';


//if()
}


void led_show()
{
    unsigned char temp;
if(irchg[9] >= 'a' && irchg[9]<= 'f')
irchg[9] -= 39;
temp = (irchg[8]- '0')*16+(irchg[9] - '0');
    switch(temp)
{
   case 0x45:led1 = ~led1;LCD_Clear();LCD_Write_Char(7,0,'1');break;
case 0x46:led2 = ~led2;LCD_Clear();LCD_Write_Char(7,0,'2');break;
case 0x47:led3 = ~led3;LCD_Clear();LCD_Write_Char(7,0,'3');break;
case 0x44:led4 = ~led4;LCD_Clear();LCD_Write_Char(7,0,'4');break;
case 0x40:led5 = ~led5;LCD_Clear();LCD_Write_Char(7,0,'5');break;
case 0x43:led6 = ~led6;LCD_Clear();LCD_Write_Char(7,0,'6');break;
case 0x07:led7 = ~led7;LCD_Clear();LCD_Write_Char(7,0,'7');break;
case 0x15:led8 = ~led8;LCD_Clear();LCD_Write_Char(7,0,'8');break;
case 0x09:LCD_Clear();LCD_Write_Char(7,0,'9');break;
case 0x16:LCD_Clear();LCD_Write_String(7,0,"10");break;
case 0x19:LCD_Clear();LCD_Write_String(7,0,"11");break;
case 0x0d:LCD_Clear();LCD_Write_String(7,0,"12");break;
case 0x0c:LCD_Clear();LCD_Write_String(7,0,"13");break;
case 0x18:LCD_Clear();LCD_Write_String(7,0,"14");break;
case 0x5e:LCD_Clear();LCD_Write_String(7,0,"15");break;
case 0x08:LCD_Clear();LCD_Write_String(7,0,"16");break;
case 0x1c:LCD_Clear();LCD_Write_String(7,0,"17");break;
case 0x5a:LCD_Clear();LCD_Write_String(7,0,"18");break;
case 0x42:LCD_Clear();LCD_Write_String(7,0,"19");break;
case 0x52:LCD_Clear();LCD_Write_String(7,0,"20");break;
case 0x4a:LCD_Clear();LCD_Write_String(7,0,"21");break;
}
}


void main()
{
    timer0_init();
int0_init();
uart_init();
LCD_Init();
    while(1)
{
   if(irok == 1)
{
   uart_send_string(irdata); 
   uart_send_byte('\n');
uart_send_string(irchg);
   uart_send_byte('\n');
led_show();
irok = 0;
}
}
}


void int0_isr() interrupt 0
{
unsigned char temp;
    if(startflag)
{
if(irtime>=40&&irtime<=60)
{
   bitnum = 0;
}

if(irtime < 6)
{
   temp = '0';
}
else if(irtime > 6 && irtime < 10)
{
   temp = '1';
}
else
{
   temp = '#';
}
 
irdata[bitnum] = temp;
bitnum++;
irtime = 0;
if(bitnum == 33)
{
   irok = 1;
irdata[33] = '\0';
transform();
bitnum = 0;
startflag = 0;
}
}
else
{
   irtime = 0;
startflag = 1;
}
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
单片机课程设计—空调遥控器的设计 空调遥控器可以用来庙宇空调机的控制温度(室内温度) 、工作状态(常态、 除湿、通风) 、风扇风速(强、弱、中)以及定时时间(空调工作多少小时自动 开机或延时多少小时自动开机) 。 使用者在遥控器上庙宇预期的空调机工作状态、 控制温度及延时时间后,这些参数即送至空调机,空调机按要求开始工作。 该遥控器的要求如下: (1) 数字显示器:第一组显示时间,发送前指示设定的延时时间:0——9 h,发送后指示剩余的延时时间;第二组显示控制温度 15——35 。 (2) 工作状态指示器 3 组:第一组指示设定的工作状态:常态、除湿、通 风;第二组指示延时开机、延时停机、取消等三种延时要求;第三组指示空调机 的三种工作速度:慢速、中速、高速。 (3)红外发射管,发射的调制频率是 45 KHz。 (4)3 节 5 号电供电。 (5)面板示意图见图。 设计以 AT89C51 为核心的遥控器电路,并编写相关的系统软件(汇编、C51 程序均可) 。 设计思路: 数字显示器使用 LCD1602 显示时间和温度值,其中时间的切换利用 AT89C51 内部自带的定时器 0,定时初值为 3cb0,定时器工作模式为'01'16 位定时器, 工作状态利用 LED 灭来指示,其中 LED 代表相对应的工作模 式被选中,各种工作状态的切换使用 8 个独立按键来实现,分别位'工作状态设 定键' 、 '延时状态设定键' 、 '风速选定键' 、 '温度+键' 、 '温度-键' 、 '延时时间 位选定键' 、 '延时时间设置键' 、 '发送键';按下'发送键'后信息的发送使用 串行口的方式发送给上位机并显现出来,当延时时间到启动空调。 具体实现: 经分析将该设计划分为如下 4 个模块:按键模块,LED 状态显示模块,LCD1602 显示模块,双机串口通信模块 按键模块: 仿真原理图: 详细描述:8 个按键的功能如下表: 按键 功能 K1 工作状态设定键(常态、除湿、通风) K2 延时状态设定键(延时开、延时关、取消) K3 风速选定键(慢、中、快) K4 温度设定键(增加+) K5 温度设定键(减少-) K6 延时时间位选定键(XXXXXX) K7 延时时间设置键(默认为循环增加) K8 发送键 当 K1 按下时,保持 P0 高 5 位状态,按下第一次最后一位置 0,倒数第二、三 位置 1 按下第二次时到数第二位置 0,倒数第一、三位置 1,按下第三次时倒数 第 三 位 置 0 , 倒 数 第 一 、 二 位 置 1 , 依 次 循 环 , 代 码 实 现 : P0=(states1[i]&(P0"0x07)); 当 K2 按下时,保持 P0 倒数第 1、2、3 位和正数第 1、2、3 状态按下第一次 时倒数第一位表示延时开, 按下第二次时倒数第五位表示延时关,按下第三 次 时 倒 数 第 3 、 4 位 皆 灭 表 示 取 消 延 时 , 依 次 循 环 , 代 码 实 现 : P0=(states2[j]&(P0"0x18)); 当 K3 按下时,保持 P0 低 5 位不变,按下最高两位置 1,第三位置 0,表示慢 速,按下第二次时第二位置 0,第一、三位置 1,表示中速,按下第三次时第一 位置 0,第一、二位置 1,依次循环,代码实现:P0=(states3[k]&(P0"0xe0)); LED 状态显示模块: 仿真原理图: 详细描述:8 个按键的功能如下表: LED 状态指示 D1 正常 D2 除湿 D3 通风 D4 延时开(如果 D4/D5 两全灭则取消延时) D5 延时关 D6 慢 D7 中 D8 高 LCD1602 显示模块: 仿真原理图: 详细描述: LCD1602 一共可以显示 16x2 个字符, 其中数据线为 8 位分别接 AT89C51 的 P2 端口的 8 个管脚,控制线为 RS、RW、E 分别接 P3.3,P3.4,P3.5 管脚, 仿 真电路中排阻是必要的它的功能是电阻作为有功原件串联在电路中能消除振荡, 目的是得到更好的 EMC 性能。 主要子函数包括: (详细代码见附录源程序 LCD 部分) void initLCM( void); //LCD 初始化子程序 void DisplayListChar(unsigned char X,unsigned char Y, unsigned char *DData); //显示指定坐标的一串字符子函数 void DisplayOneChar(uchar X,uchar Y,uchar DData);//显示单个字符 双机串口通信功能: 仿真原理图: 详细描述: 利用串口查询的方式实现两台单片机之间通信的功能:单片机 1(模拟遥控器) 作为发送机其 P3.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值