红外线遥控器解码C语言程序代码 SM0038接受头 发射端发射38KHz连续红外线,接收端用sm0038接收,则...

\u7ea2\u5916\u63a5\u6536\u5934 SM0038\u548c\u7ea2\u5916\u53d1\u5c04\u5668\uff08\u9065\u63a7\u5668\uff09\u4e24\u4e2a\u600e\u4e48\u6765\u63a7\u523651\u5355\u7247\u673aI/O\u53e3\u9ad8\u4f4e\u7535\u5e73

\u8fd9\u4e2a\u9700\u8981\u4e00\u4e2a\u5408\u7406\u7684\u7a0b\u5e8f\uff0c\u5982\u679c\u7a0b\u5e8f\u4e2d\u7684\u903b\u8f91\u662f\u9519\u7684\uff0c\u90a3\u4e48\u5c31\u5b9e\u73b0\u4e0d\u4e86\u8fd9\u4e2a\u529f\u80fd\uff0c\u5176\u6b21\uff0c\u7f16\u8bd1\u8f6f\u4ef6\uff0c\u53ea\u662f\u80fd\u68c0\u67e5\u8bed\u6cd5\u9519\u8bef\uff0c\u6bd4\u5982\u5c11\u4e2a\u5206\u53f7\u554a\uff0c\u591a\u4e2a\u62ec\u53f7\u554a\uff0c\uff0c\u4e0d\u80fd\u68c0\u67e5\u903b\u8f91\u7684\u5bf9\u9519\uff0c\u518d\u597d\u597d\u770b\u770b\u7a0b\u5e8f\u5427\uff0c\u5b9e\u5728\u4e0d\u884c\u7684\u8bdd\u5c31\u628a\u7a0b\u5e8f\u8d34\u4e0a\u6765\uff0c\u5927\u5bb6\u7ed9\u4f60\u770b\u770b

\u8fde\u7eed\u7684\u53d1\u5c04\u7ea2\u5916\u7ebf,sm0038\u89e3\u8c03\u51fa\u6765\u7684\u662f\u8fde\u7eed\u7684\u4f4e\u7535\u5e73\u4fe1\u53f7(\u591a\u6570\u7684\u63a5\u6536\u5934\u662f\u8f93\u51fa\u4f4e\u7535\u5e73)

//////////////////////////////////////
//晶振频率为6MHz 一个机器周期2us //
//实现按键地址码、指令码的数码管显示//
//2010-06-01 //
//////////////////////////////////////
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
bit overflag,dataover;//开始接收数据,数据处理完毕

uchar timedata;//定时器0溢出次数
uchar chubus[33];//33Byte数据 timedata组成的数组
uchar jieguos[4];//地址码,地址反码,数据码,数据反码;

void initial()//初始化
{
IT0=1;EX0=1;//负边沿触发

TMOD=0x01;ET0=1;TR0=1;//模式1,十六位定时器
TH0=0xff;TL0=0x06;//0.5ms溢出

EA=1; //开总中断
}

void time0() interrupt 1//定时器0中断
{TH0=0xff;TL0=0x06;
timedata++;
}

void ex0() interrupt 0//外部中断0,接收数据
{
static bit startflag;//开始接收
static uchar i;

if(startflag)
{
if(timedata<32&&timedata>=16) i=0;
chubus[i]=timedata;
timedata=0;
i++;
if(i==33){overflag=1;i=0;}

}
else
{
startflag=1;
timedata=0;
}
}

void chulidata()
{
uchar chubu;//初步数据
uchar jieguo;//结果数据
uchar x,y,z=1;
for(x=0;x<4;x++)//处理四组数据
{
for(y=1;y<=8;y++)//处理一组数据8Byte
{
chubu=chubus[z];
jieguo=jieguo>>1;
if(chubu>3) jieguo=jieguo|0x80;//大于1.5mS为1
z++;
}
jieguos[x]=jieguo;
jieguo=0;
}
dataover=1;

}

void delay(uint z)
{
uint x ,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void display()
{
uchar gao,gao1;
uchar di,di1;

uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
gao1=table[jieguos[0]/16];
di1=table[jieguos[0]%16];
gao=table[jieguos[2]/16];
di=table[jieguos[2]%16];

dula=1;
P0=gao1;
dula=0;
P0=0xff;
wela=1;
P0=0x7e;
wela=0;
delay(2);

dula=1;
P0=di1;
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(2);//地址码

dula=1;
P0=gao;
dula=0;
P0=0xff;
wela=1;
P0=0x77;
wela=0;
delay(2);

dula=1;
P0=di;
dula=0;
P0=0xff;
wela=1;
P0=0x6f;
wela=0;
delay(2);//指令码

}

void main()
{
initial();//初始化
while(1)
{

if(overflag)//数据接收完毕
{
chulidata();//处理数据,完成标志dataover
overflag=0;
}
if(dataover)
{
display();//数码管显示
}
}
}

#include <iom16v.h>
#include <macros.h>
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
/*------------------------------显示-----------------------------------*/
#define LED_DATA PORTB
const uchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/*
0 1 2 3 4 5 6 7 8 9 A B C D E F
*/
void delay(void){
uint i;
for(i=0;i<2000;i++);
}
void dis_int(uint dis_data)
{ //四位共阴数码管,十六进制显示
LED_DATA=tab[(uchar)((dis_data&0xf000)>>12)]; //显示千位
PORTD=0xf7;
delay(); //延时

LED_DATA=tab[(uchar)((dis_data&0x0f00)>>8)]; //显示百位
PORTD=0xfb;
delay(); //延时

LED_DATA=tab[(uchar)(dis_data&0x00f0)>>4]; //显示十位
PORTD=0xfd;
delay(); //延时

LED_DATA=tab[(uchar)dis_data&0x000f]; //显示个位
PORTD=0xfe;
delay(); //延时
}
void port_init(void)
{
PORTA = 0xFF;
DDRA = 0x00;
PORTB = 0xFF;
DDRB = 0xFF;
PORTC = 0xFF;
DDRC = 0xFF;
PORTD = 0xFF;
DDRD = 0x0F;
}
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0x00; //setup
TCNT1L = 0x00;
ICR1H = 0x00;
ICR1L = 0x08;
TCCR1A = 0x00;
/*一体化接收头的DATA引脚接到ATmega16的PD6(ICP1)引脚,采用上升沿捕捉的方法解码*/
/*晶振为6M,无分频,用8M太大(分频则太小)*/
TCCR1B = 0x41; //start Timer
}
uint arr[16];//保存捕捉值
uchar times;//记录捕捉次数
uchar index;//数组索引
uchar ir_code;//红外遥控键码
uchar OK_flag;//解码完毕标志
/*------------------------------------------------------------------------------
模块名称:PD6(ICP1)引脚上升沿捕捉中断程序
影响: 将捕捉值保存在arr[16]中
___ ___
| | | |
___| |_________| |__________
|<-----t----->|
DEC HEX
t=9ms 计数值=54000 0xD2F0
t=4.5ms 计数值=27000 0x6978
t=2.25ms 计数值=13500 0x34BC
t=1.125ms 计数值=6750 0x1A5E

------------------------------------------------------------------------------*/
#pragma interrupt_handler timer1_capt_isr:6
void timer1_capt_isr(void)
{
uint value;
value=ICR1L;
//CLI();
value|=(uint)(ICR1H << 8);
TCNT1H = 0x00;
TCNT1L = 0x00;
times++;
if(times>18&×<35){
//从第19个上升沿开始保存,直到第34个,短按时共有36个上升沿
arr[index]=value;
index++;
}
else if(times>=35){
//第35个上升沿到来时,解码完毕
times=0;
index=0;
OK_flag=1;
}
//SEI();
}
/*------------------------------解码程序----------------------------------------
结果:得到uchar型的键码ir_code,如果解码出错,则ir_code=0xff
-----------------------------------------------------------------------------*/
void get_code(void){
uchar i,dat,/*键码*/_dat;/*键码反码*/
uint temp=0;
for(i=0;i<16;i++){
if(arr[i]<7000){
//“0”
temp<<=1;
}
if(arr[i]>13000){
//“1”
temp<<=1;
temp|=1;
}
}
_dat=(uchar)(temp&0x00ff);/*键码*/
dat=(uchar)((temp>>8)&0x00ff);/*键码反码*/
/*“键码”与“键码反码相与,如果为0则解码正确*/
if((dat&_dat)==0){
ir_code=dat;
}
else{
TCNT1H = 0x00;
TCNT1L = 0x00;
ir_code=0xff;//解码出错
}
times=0;
index=0;
}
void init_devices(void)
{
CLI();
port_init();
timer1_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x20;
SEI();
}
void main(void){
uchar i;
init_devices();

while(1){

if (OK_flag){
get_code();//解码
OK_flag=0;
}
for(i=0;i<200;i++){
dis_int(ir_code);//显示键码
}

}
}

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

楼主程序今测试了下:
主要有两点改动

用M64,T3,晶体7.3728 ,GCC 20040214

1
void timer1_init(void)
{
TCCR3B = 0x00; //stop
TCNT3H = 0x00; //setup
TCNT3L = 0x00;
ICR3H = 0x00;
ICR3L = 0x08;
TCCR3A = 0x00;
/*一体化接收头的DATA引脚接到ATmega64的PE7(ICP3)引脚,采用上升沿捕捉的方法解码*/
/*晶振为7.3728M,8分频*/
TCCR1B = 0xC2; //start Timer @@@@@@@@@@@@@@@@@@@@@@@@@@@改动
}
2

SING(XXXXXXXXXXXXXXX)
{
uint value;
value=ICR3L;
value|=(uint)(ICR3H << 8);
TCNT3H = 0x00;
TCNT3L = 0x00;
times++;
if(times>18)&&(times<35){
//从第19个上升沿开始保存,直到第34个,短按时共有36个上升沿
arr[index]=value;
index++;
}
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@改动
else if(times>35)@@@@@@@@@@@@@@@@@@@@@@@@@@@@@改动

//else if(times>=35) //用此语句时第二个键值的第一位被上一键值的第36个脉冲复用,
{
//第35个上升沿到来时,解码完毕
times=0;
index=0;
OK_flag=1;
}
}

  • C璇█鎬庝箞鍐绾㈠绋嬪簭?瀹炵幇閬ユ帶鎺у埗鍏釜led銆傛眰绋嬪簭鍜岃缁嗚В閲娿俖鐧惧害鐭 ...
    绛旓細define c(x) (x*110592/120000)sbit Ir_Pin=P3^3;unsigned char code Led_Tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //鍏遍槼鏋佹暟鐮佹樉绀虹爜0-F.unsigned char code Led_Sel[]={0xe,0xd,0xb,0x7};unsigned char Led_...
  • 绾㈠绾块仴鎺у櫒瑙g爜C璇█绋嬪簭浠g爜 SM0038鎺ュ彈澶
    绛旓細IT0=1;EX0=1;//璐熻竟娌胯Е鍙 TMOD=0x01;ET0=1;TR0=1;//妯″紡1,鍗佸叚浣嶅畾鏃跺櫒 TH0=0xff;TL0=0x06;//0.5ms婧㈠嚭 EA=1; //寮鎬讳腑鏂 } void time0() interrupt 1//瀹氭椂鍣0涓柇 {TH0=0xff;TL0=0x06;timedata++;} void ex0() interrupt 0//澶栭儴涓柇0锛屾帴鏀舵暟鎹 { static bit start...
  • 楂樺垎璇锋暀楂樹汉,绾㈠閬ユ帶瑙g爜绋嬪簭C璇█,瑕佹眰姣忎竴琛岄兘瑙i噴涓轰粈涔堜粈涔堜綔鐢...
    绛旓細if(temp<c(200) || temp>c(800)) goto restart; //鏍规嵁缂栫爜鏍煎紡,浣庣數骞冲皬浜0.2ms澶т簬0.8ms瑙嗕负鏃犳晥鐢靛钩,閲嶆柊妫娴 temp=Ir_Get_High();if(temp<c(200) || temp>c(2000)) goto restart; //鏍规嵁缂栫爜鏍煎紡,浣庣數骞冲皬浜0.2ms澶т簬2ms瑙嗕负鏃犳晥鐢靛钩,閲嶆柊妫娴 Ir_Buf[i]>>=1; //鎶奍r...
  • 姹51鍗曠墖鏈绾㈠閬ユ帶鍣(鐢佃閬ユ帶鎴栬呮満椤剁洅鐨勭孩澶栭仴鎺у櫒)瑙g爜C绋嬪簭!鍙互...
    绛旓細TL1 = TH1; PCON = 0x00; ES = 1; TR1 = 1; EX0=1; IT0=1; relay = 0;
  • 鐢C璇█缂栧啓涓涓绾㈠鍙戦佸拰鎺ユ敹鐨绋嬪簭???
    绛旓細缁欎綘涓娈430鍗曠墖鏈閬ユ帶鍣ㄨВ鐮鐨绋嬪簭鍚э紝涔熷氨鏄帴鏀堕儴鍒 姣曠珶涓栫晫澶幇瀹炲彧鑳借繖涔堝府浣 ifndef _IR_define _IR_char t0,t1,t2;uchar IR;void DelayIR(){ uint i=130;while(i--);} void init_port2(void){ P2DIR&=~BIT0;P2SEL&=~BIT0;P2IES|=BIT0;P2IE|=BIT0;} pragma vector=PORT2_...
  • 鎬ユ眰:鍗曠墖鏈绾㈠閬ユ帶鍣鎺ュ彈鍜屽彂灏勭數璺浘鍜绋嬪簭璁捐,绋嬪簭鏈濂C璇█缂栫殑...
    绛旓細UDR = c; return c; }void all_zero(void){ uchar i; for(i=0;i<48;i++) { total[i]=0; }}void initialize_eeprom(void){ all_zero(); timer0_init();count=0; } void display(void){ uint i,k,m,w; uchar s,r,t; /* for(i=0;i<35;i++) printf("total[%d]=%d\r\n",...
  • 鐢ㄥ崟鐗囨満c璇█娴嬮噺绾㈠閬ユ帶鍣鎵鍙戝皠鐨勭孩澶栦俊鍙风殑鎵鏈夐珮浣庣數骞虫椂闂,骞跺瓨...
    绛旓細uchar num;sbit IRIN=P3^2;main(){ uint time;uchar dat;num=0;TMOD=0x01;while(1){ IRIN=1;while(IRIN); //绛夊緟寮曞鐮佸埌鏉 TR0=1;while(!IRIN); //寮鍚畾鏃跺櫒璁℃椂锛岀瓑寰呭紩瀵兼缁撴潫 TR0=0;time=TH0*256+TL0;TH0=0;TL0=0;TR0=1;if(time>=9000) //濡傛灉寮曞娈甸暱搴﹀ぇ浜...
  • 51鍗曠墖鏈虹殑绾㈠閬ユ帶灏忚溅璁捐鍜屽埗浣滅殑C璇█绋嬪簭
    绛旓細鏈郴缁熼噰鐢ㄦā鍧楀寲璁捐锛岃蒋浠剁敤C璇█缂栧啓銆傝浆璐翠簬 51璁 鏂囩綉 www.51lun-wen.cn涓銆佽璁′换鍔″拰瑕佹眰浠T98C51鍗曠墖鏈轰负鏍稿績锛屽埗浣滀竴娆绾㈠閬ユ帶灏忚溅锛屽皬杞﹀叿鏈夎嚜鍔ㄩ┚椹讹紝鎵嬪姩椹鹃┒鍜屽惊杩瑰墠杩涚瓑鍔熻兘銆傝嚜鍔ㄩ┚椹舵椂锛屽墠杩涜繃绋嬩腑鍙互閬块殰銆傛墜鍔ㄩ┚椹舵椂锛岄仴鎺ф帶鍒跺皬杞﹀墠杩涖佸悗閫銆佸乏杞佸彸杞佸姞閫熺瓑鎿嶄綔銆傚杩瑰墠杩涙椂灏忚溅...
  • ...宸茬煡绾㈠閬ユ帶鍣鏁板瓧1閿殑閿0CH,鐢C璇█鎬庝箞缂栫▼璁╂寜鏁板瓧1閿甠鐧惧害...
    绛旓細闇瑕佺煡閬撲綘鎵閫夌敤鐨绾㈠閬ユ帶鍣鐢ㄤ粈涔堝崗涔夛紝32浣嶇殑杩樻槸42浣嶈繕鏄48浣嶇殑锛岃璁′竴涓绾㈠瑙g爜鐨绋嬪簭妯″潡锛屽湪鏃堕棿涓柇閲岃疆璇紝渚濇櫠鎸儏鍐佃缃悎閫傜殑鏃堕棿婧㈠嚭鍊硷紝姣忔绉掑埌灏戦噰鏍5娆★紝瑕佽兘姣忔绉掗噰鏍10-20娆℃洿濂斤紝瑙g爜鎴愬姛锛岃缃敭鍊煎彉閲忓苟鎶婁俊鍙锋爣璁扮疆1锛岃屼富绋嬪簭閲屽垯瑕佽疆璇㈡鏌ヨ繖涓俊鍙锋爣璁帮紝鍙戠幇鏈変俊鍙峰氨璇...
  • 绾㈠閬ユ帶鍣鍚屼竴涓敭鎺у埗涓涓狪/O鍙,绗竴娆″紑,绗簩娆″叧,姣斿P0^1寮鍚叧闂...
    绛旓細锛屽 IrValue[2]=0xff锛涳紙濡傛灉娌℃湁鎸夐敭鏄 0xff鐨勮瘽锛夌涓夛紝鏈姝g‘鐨勫仛娉曟槸锛屾敹鍒閬ユ帶鍚庯紝棰濆鎻愪緵涓涓爣蹇椾綅锛堝 IR_UpdateFlag锛夛紝绋嬪簭璇嗗埆鏍囧織浣嶅悗锛岃繘琛屾寜閿夋嫨锛屽鐞嗗畬鎸夐敭鍚庯紝娓呴櫎鏍囧織浣嶃傝繖鏍峰彲浠ラ伩鍏嶇▼搴忛噸澶嶃佸浣欐墽琛屾寜閿夋嫨锛堣櫧鐒舵槸鏃犳晥鐨勬寜閿紝浣嗛偅涔熸槸閫夋嫨锛夛紝鍙互鎻愰珮绯荤粺鎵ц鏁堢巼锛
  • 扩展阅读:苹果手机自带遥控器 ... 不用红外头的遥控软件 ... 万能遥控无需红外线 ... oppo如何开启红外线 ... 空调遥控器万能苹果版 ... 没有红外线怎么开空调 ... 手机红外线遥控器软件 ... 怎样自制功放机遥控器 ... 无需红外的手机开空调 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网