/*三角牌遙控風扇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板、弄塑料外殼、充電電路… 也就基本像個正經的遙控器了。
按鍵不會弄那種導電膠的軟按鍵
|