单片机接收到红外对管的数据怎么用c语言程序传给led显示器,用单片机解码再用595驱动数码管显示出红外遥控接收来的解码数据...

#include "SC92F732X_C.H"

#define        uchar         unsigned        char

#define        uint         unsigned    int

#define        ul         unsigned    long

///引脚

#define   mosout               P00                 //输出引脚

#define   baiout               P11

#define   lvout_510r               P17

#define   huangout_510r               P27

#define   hongout               P24

#define   usbfout               P12

#define   led               P26

#define   on               P13

#define   vin               P10

#define   CLK               P02

#define   DATA_1           P01

#define   CKSHX               P05

#define   hwpin               P16

#define   vbatt              0x41

#define   v1              0x40

// 变量定义

bit  ON_OFF,bi;

bit irpro_ok,irok,jsok;

uint  sleep_data;

uchar bb,hs,h,ied;

ul v1_add,v1_data;

ul vb_add,vb_data;

uchar  irtime,irdet;

uchar kehuh,kehul,keyma,keyfanma;

uchar keydata,jsokadd;

///

unsigned char IRcord[4];

unsigned char irdata[33];

/

unsigned char const code shuma[] =

{0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};// 0--9 //

上电初始化程序

void mcu_init(void)

{

/* 初始化I/O口 */

P0CON =0xff;          // 0为输入,1为输出

P0PH=0;                  //        1有效

P0 =0;

P1CON = 0x86;

P1PH=0x48;

P1 = 0x49;

P2CON = 0xf0;

P2PH=0;

P2 = 0;

/*初始化AD*/

ADCCFG1 = 0;                                        // AIN8通道开关 //

ADCCFG0 = 0x3;

ADCCON = 0;

/打开外部中断

EA=1;

EINT0=0;

IPINT0=0;

INT0F=0;

INT0R=0;

EINT1=1;

INT1F=0x4;        //INT12

INT1R=0;

IP1=0x8;

/打开定时器

ET0=1;           //**** T0使能

TMCON=0;   //*****频率来自FSYS/12(系统时钟) 12M

TMOD=0x1A; //****8位自动重装定时器,溢出时将TH0的值自动装入TL0

TR0=1;           //*****定时器1的开始计数

TL0=0;

TH0=156;        //256-120

//AD参考电压2.4

OPINX=0xC2;

OPREG=0X80;

// 初始化变量

}

//

void waibu12_int(void) interrupt 2

{

irdet=irtime;

irtime=0;

if((irdet<140)&&(irdet>=130))//引导码 TC9012的头码,9ms+4.5ms

{

ied=0;

jsok=1;

}

if(irdet>160)//引导码大于16MS

{

irdet=0;

ied=0;

jsok=0;

}

if(jsok)

{

irdata[ied]=irdet;//存储每个电平的持续时间,用于以后判断是0还是1

ied++;

if(ied>=33)

{

irok=1;

ied=0;

jsok=0;

}

}

}

定时中断

void time_int(void) interrupt 1

{

irtime++;  //用于计数2个下降沿之间的时间

/*if(irtime>250)

{

irtime=0;

}         */

//************************************

}

/

unsigned int ad_conver(uchar ad_pin)

{

uint ad_res_data,ad_h,ad_l;

uchar as;

ADCCON=0x80;

ad_h=0;ad_l=0;

ADCCON|=ad_pin;                  //ADCS=1; 00001000  on ad

while(!(ADCCON&0x10)){as=0;}

ad_l=ADCVL;

ad_h=ADCVH;

ad_h<<=4;

ad_l>>=4;

ad_res_data=ad_h|ad_l;

ADCCON=0;

return(ad_res_data);

}

///

void dalay_1(uint yanshi)

{

uint sb;

for(sb=0;sb

}

/IO口组合

void in_74ls595(uchar p)

{

uchar id;

for(id=0;id<8;id++)

{

if(p&0x80){DATA_1=1;}

else{DATA_1=0;}

CLK=0;

CLK=1;

p<<=1;

}

}

//

void  led_display(uint display_data )

{

uchar qian,bai,shi,ge;

qian=display_data/1000;

bai=(display_data%1000)/100;

shi=(display_data%100)/10;

ge=display_data%10;

//************************************************扫描

if(qian==0){in_74ls595(0);}

else{in_74ls595(shuma[qian]);}

in_74ls595(0x10);

CKSHX=1;

dalay_1(5);

CKSHX=0;

dalay_1(100);

in_74ls595(0);

in_74ls595(0);

CKSHX=1;

dalay_1(3);

CKSHX=0;

dalay_1(3);

if((qian==0)&&(bai==0)){in_74ls595(0);}

else{in_74ls595(shuma[bai]);}

in_74ls595(0x20);

CKSHX=1;

dalay_1(5);

CKSHX=0;

dalay_1(100);

in_74ls595(0);

in_74ls595(0);

CKSHX=1;

dalay_1(3);

CKSHX=0;

dalay_1(3);

if((qian==0)&&(bai==0)&&(shi==0)){in_74ls595(0);}

else{in_74ls595(shuma[shi]);}

in_74ls595(0x40);

CKSHX=1;

dalay_1(5);

CKSHX=0;

dalay_1(100);

in_74ls595(0);

in_74ls595(0);

CKSHX=1;

dalay_1(3);

CKSHX=0;

dalay_1(3);

in_74ls595(shuma[ge]);

in_74ls595(0x80);

CKSHX=1;

dalay_1(5);

CKSHX=0;

dalay_1(100);

in_74ls595(0);

in_74ls595(0);

CKSHX=1;

dalay_1(3);

CKSHX=0;

dalay_1(3);

}

//

void  ledoff_display()

{

//************************************************扫描

in_74ls595(0);

in_74ls595(0);

CKSHX=1;

dalay_1(3);

CKSHX=0;

dalay_1(400);

}

///

void key_in()

{

//*********************************************开关键

if(!on)

{

bb++;

if((bb>100)&&bi&&(!on))

{

bb=0;

ON_OFF=!ON_OFF;

bi=0;

}

}

else

{

bi=1;

bb=0;

}

//********************************************遥控功能键

}

/

void vbat_in()

{

h++;

vb_add+=ad_conver(vbatt);

if(h>=200)

{

h=0;

vb_data=vb_add/200;

vb_add=0;

}

}

/

void v1_in()

{

hs++;

v1_add+=ad_conver(v1);

if(hs>=200)

{

hs=0;

v1_data=v1_add/200;

v1_add=0;

}

}

// //红外码值处理

void Ircordpro(void)//红外码值处理函数

{

uchar i, j, k,value;

uchar cord;

k=1;

for(i=0;i<4;i++)      //处理4个字节

{

for(j=1;j<=8;j++) //处理1个字节8位

{

cord=irdata[k];

if(cord>20)高电平2.25MS,低电平1.125MS

{

value|=0x80;

}

if(j<8)

{

value>>=1;

}

k++;

}

IRcord[i]=value;

value=0;

}

irpro_ok=1;//处理完毕标志位置1

}

//

void Ir_work(void)

{

kehuh=IRcord[0];

kehul=IRcord[1];

keyma=IRcord[2];

keyfanma=IRcord[3];

if(keyma||keyfanma==255)

{

keydata=keyma;

}

}

//

void main(void)

{

mcu_init();

while(1)

{

v1_in();

vbat_in();

key_in();

//************************

if(irok)         //如果接收好了进行红外处理

{

irok=0;

Ircordpro();

}

if(irpro_ok)         //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等

{

irpro_ok=0;

Ir_work();

}

if(jsok)

{

jsokadd++;

if(jsokadd>250)

{

jsokadd=0;

jsok=0;

}

}

else

{

jsokadd=0;

}

//*********************

if(ON_OFF)

{

if(irok)         //如果接收好了进行红外处理

{

irok=0;

Ircordpro();

}

if(irpro_ok)         //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等

{

irpro_ok=0;

Ir_work();

}

led_display(keydata);

led=irok;

}

else

{

ledoff_display();

keydata=0;

led=0;

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值