/*三角牌遥控风扇FS-40-101 5键红外遥控器程序,可通用多种型号 数据总长度:46毫秒两帧有效帧 12MH晶振 12MHz=12,000,000Hz,也就是1秒振荡一千二百万次 13微秒中断一次
STC8G1K08A-36I-SOP8系列单片机是 STC 生产的单时钟/机器周期(1T)的单片机,是宽电压/高速/高可靠/低功耗/强抗静电/较强抗干扰的新一代 8051 单片机,超级加密。指令代码完全兼容传统 8051。*/
//无自动休眠、无任意键唤醒、无减速键 芯片工作电压:1.9V-5.5V 一帧12位,从低位到高位发射 发射顺序:3位起始码(110)、用户码C1C2(11)、指令码0-6位,间隔约8ms重复发一次,至少发两帧有效帧
//为“1”时:发射1.284ms高电平,不发射0.395ms低电平; 为“0”时:发射0.395ms高电平,不发射1.284ms低电平;各毫秒值与参考值近似也可以,参考红外遥控发射芯片:BA5104。
单片机源程序如下:
#include "stc8.h"
sbit ir=P5^5;/*红外发射管控制脚*/unsigned int count/*中断计数*/, set_count; /*设定中断次数*/
sbit key1=P3^0;sbit key2=P3^1;sbit key3=P3^2;sbit key4=P3^3;sbit key5=P5^4;/*5个按键*/
bit irflag;/*红外发送标志位*/unsigned char irdata,ircode,/*发送的红外数据*/irqy=0xfb;/*3位起始码+1位用户码*/
void delayms(unsigned int xms){unsigned int i,j;for(i=xms;i>0;i--) for(j=110;j>0;j--);}
void ir_sendbyte(char ws) //发送4位或8位红外数据
{
unsigned char i;
for(i=0;i<ws;i++) //判断4位或8位
{
if(ircode&0x01){ //判断红外编码最低位,
set_count=95; //若为1则1.284ms的高电平
irflag=1; //启动红外发射二极管发射
count=0; //中断计数清0
TR0=1; //开启定时器0
while(count<set_count);//等待发送完
TR0=0; //关闭定时器0
set_count=35; //若为1则0.395ms的低电平
irflag=0; //低电平则不发射
count=0; //中断计数清0
TR0=1; //开启定时器0
while(count<set_count);//等待发送完
TR0=0; } //关闭定时器0
else { //否则
set_count=35; //为0则0.395ms的高电平
irflag=1; //启动红外发射二极管发射
count=0; //中断计数清0
TR0=1; //开启定时器0
while(count<set_count);//等待发送完
TR0=0; //关闭定时器0
set_count=95; //为0则1.284ms的低电平
irflag=0; //低电平则不发射
count=0; //中断计数清0
TR0=1; //开启定时器0
while(count<set_count);//等待发送完
TR0=0;} //关闭定时器0
ircode=ircode>>1; //将数据右移,即从低位到高位发送
}
}
void ir_send() //发送红外数据 至少要发出两帧红外帧
{
ircode=irqy; //发送3位起始码+1位C1用户码(1)
ir_sendbyte(4); //发送4位红外数据
ircode=irdata; //发送1位C2用户码(1)+7位指令码
ir_sendbyte(8); //发送8位红外数据
set_count=550; /*延时4ms低电平*/
irflag=0; /*关闭红外发射二极管发射*/
count=0; /*中断计数先清0*/
TR0=1; /*开启定时器0*/
while(count<set_count);/*等待发送完*/
TR0=0; //关闭定时器0
ircode=irqy; //发送3位起始码+1位C1用户码(1)
ir_sendbyte(4); //发送4位红外数据
ircode=irdata; //发送1位C2用户码(1)+7位指令码
ir_sendbyte(8); //发送8位红外数据
ir=1; //发射完了关闭红外发射二极管
}
void timer0_init() //定时器初始化
{
TMOD=0x02; //定时0 8位自动重装模式
TH0=0xf3; //设置定时初始值 13微秒
TL0=0xf3; //设置定时重载值 13微秒
EA=1; //全局中断允许位。EA=1,打开全局中断控制。
EX0=0; //外部中断0允许位,1表示允许外部中断0的中断申请;
ET0=1; //定时/计数器0中断允许位,1表示允许定时/计数器0的溢出中断;
TR0=0; //关闭定时器0
count=0; //中断计数先清0
irflag=0; //红外发射标志先置0
}
void keyscan()//关机:0x81 定时:0x11 风类:0x21 摇头:0x09 彩灯:0xc3 开风速:0x41 减速:无 无:0x05 无:0x63
{
if(key1==0){delayms(500);if(key1==0){irdata=0x41;/*用户码+指令码*/ir_send();/*发送红外编码*/while(!key1);}} //开风速
if(key2==0){delayms(500);if(key2==0){irdata=0x11;/*用户码+指令码*/ir_send();/*发送红外编码*/while(!key2);}} //定时
if(key3==0){delayms(500);if(key3==0){irdata=0x81;/*用户码+指令码*/ir_send();/*发送红外编码*/while(!key3);}} //关机
if(key4==0){delayms(500);if(key4==0){irdata=0x21;/*用户码+指令码*/ir_send();/*发送红外编码*/while(!key4);}} //风类
if(key5==0){delayms(500);if(key5==0){irdata=0x09;/*用户码+指令码*/ir_send();/*发送红外编码*/while(!key5);}} //摇头
}
void main()
{
P5M0=0;P5M1=0;P3M0=0;P3M1=0;/*设置准双向口模式*/timer0_init();//定时0初始化
while(1) { keyscan();/*按键检测*/ }
}
void timer0() interrupt 1 //定时器0中断
{
count++;if(irflag==1) ir=~ir;/*有发射标志,则发射38khz的矩形波*/else ir=1;/*否则不发射,即相当于发射编码中的低电平*/
}
这个是参考波形图
这个是用线槽做的外壳参考图
这是焊接好的3+6键
背面走线
安装上锂电池
注意:锂电是4.2V的,不能与USB串口的5V电源共用,要不然电池会起鼓燃烧。
这里没弄降压电路,充电可另外用4.2V的充电器充。
另外弄了个3+6键、省电程序(掉电模式)、外部中断唤醒,我就不发这里了。
就差画PCB板、弄塑料外壳、充电电路… 也就基本像个正经的遥控器了。
按键不会弄那种导电胶的软按键
|