这是源代码。//使用12M晶振 适用于HS9148芯片#include<reg52.h>#include<stdio.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit led=P1^1;sbit in=P3^2;//红外接口标志uchar const tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71,0x3f,0x40,0x80}; //1~f 0 - .uint send_data=0; //接收数据的全局变量
/*************************************************************************///延时程序void delay1(void){
TMOD |= 0x01;
//定时器0,工作在模式1
TF0 = 0;
//清溢出标志位,软清零
TH0 = 0xfc;
//延时844us
TL0 = 0xb4;
TR0 = 1;
//启动定时器0
while(TF0==0){;}
//定时器无溢出,循环等待
TR0 = 0;
//关闭定时器0}void delay2(void){
TMOD |= 0x10;
//定时器1,工作在模式1
TF1 = 0;
//清溢出标志位,软清零
TH1 = 0xfe;
//延时500us
TL1 = 0x0c;
TR1 = 1;
//启动定时器1
while(TF1==0){;}
//定时器无溢出,循环等待
TR1 = 0;
//关闭定时器1}/*************************************************************/void jieshou() interrupt 0 using 0//外部中断0服务函数 { uchar a; uint num=0; EX0 = 0;
//处理数据是禁止中断 for(a=12;a>0;a--) {
while(!in);
delay1(); //0.844ms
num=num<<1;
if(!in)
{
num=num|0x01;
delay2(); //0.5ms+0.844ms刚好跳过最长的高电平
} } send_data=num; EX0 =1;
//处理数据完成后开中断 }
/******************************************************************/
void work(void)//红外键值散转程序 { switch(send_data)
{
case 0x0f20:P0=tab[1];break;//1 显示相应的按键值
case 0x0f10:P0=tab[2];break;//2
case 0x0f08:P0=tab[3];break;//3
case 0x0f04:P0=tab[4];break;//4
case 0x0f02:P0=tab[5];break;//5
case 0x0f01:P0=tab[6];break;//6
case 0x0ea0:P0=tab[7];break;//7
case 0x0e90:P0=tab[8];break;//8
case 0x0e88:P0=tab[9];break;//9
case 0x0e84:P0=tab[10];break;//a
case 0x0e82:P0=tab[11];break;//b
case 0x0e81:P0=tab[12];break;//c
case 0x0e60:P0=tab[13];break;//d
case 0x0e50:P0=tab[14];break;//e
case 0x0e48:P0=tab[15];break;//f
case 0x0e44:P0=tab[16];break;//0
case 0x0e42:P0=tab[17];break;//-
case 0x0e41:P0=tab[18];break;//.
default:led=0;break;
} }/***************************************************************/void main(void){ IT0 = 1; EX0 = 1; EA = 1; P2=0x00;//1位数码管全部显示 while(1)//主循环 { work(); }}
此帖出自
小平头技术问答
一周热门 更多>