12-红外发射程序.rar

  • 王晓琴
    了解作者
  • C/C++
    开发工具
  • 32KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 0
    下载次数
  • 2018-05-03 16:34
    上传日期
红外发射程序,内含C和汇编两种语言供选择
12-红外发射程序.rar
  • 12-红外发射程序
  • list
  • IR-tx.hex
    3.1KB
  • IR-tx
    79.7KB
  • IR-tx.lnp
    121B
  • IR-tx.plg
    707B
  • IR-tx_Uv2.Bak
    0B
  • IR-tx.Opt
    1.4KB
  • delay.h
    849B
  • IR-tx_Opt.Bak
    1.4KB
  • config.h
    1.3KB
  • STC15Fxxxx.H
    32.6KB
  • IR-tx.Uv2
    2KB
  • delay.c
    1.4KB
  • PCA.c
    5.4KB
  • main.c
    7.3KB
  • IR-tx.plg
    193B
  • PCA.h
    2.6KB
内容介绍
/*---------------------------------------------------------------------*/ /* --- STC MCU International Limited ----------------------------------*/ /* --- STC 1T Series MCU Demo Programme -------------------------------*/ /* --- Mobile: (86)13922805190 ----------------------------------------*/ /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/ /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/ /* --- Web: www.GXWMCU.com --------------------------------------------*/ /* --- QQ: 800003751 -------------------------------------------------*/ /* 如果要在程序中使用此代码,请在程序中注明使用了宏晶科技的资料及程序 */ /*---------------------------------------------------------------------*/ /************* 本程序功能说明 ************** 用户可以在"config.h"中选择MCU主时钟频率. 范围 8MHZ ~ 33MHZ. 红外接收程序。模拟市场上用量最大的HT6121/6122及其兼容IC的编码。 用户可以在 "本地常量声明" 中指定用户码. 使用PCA2高速输出产生38KHZ载波, 1/3占空比, 每个38KHZ周期发射管发射9us,关闭16.3us. 使用开发板上的16个IO扫描按键, MCU不睡眠, 连续扫描按键. 当键按下, 第一帧为数据, 后面的帧为重复争,不带数据, 具体定义请自行参考HT6121/6122及其兼容IC的编码资料. 键释放后, 停止发送. ******************************************/ #include "config.H" #include "PCA.h" #include "delay.h" /****************************** 用户定义宏 ***********************************/ /*****************************************************************************/ /************* 本地常量声明 **************/ #define User_code 0xFF00 //定义红外用户码 /************* IO口定义 **************/ sbit P_HC595_SER = P4^0; //pin 14 SER data input sbit P_HC595_RCLK = P5^4; //pin 12 RCLk store (latch) clock sbit P_HC595_SRCLK = P4^3; //pin 11 SRCLK Shift data clock /************* 本地变量声明 **************/ u8 IO_KeyState, IO_KeyState1, IO_KeyHoldCnt; //行列键盘变量 u8 KeyHoldCnt; //键按下计时 u8 KeyCode; //给用户使用的键码, 1~16有效 u8 TxTime; /************* 本地函数声明 **************/ void IO_KeyScan(void); /**************** 外部函数声明和外部变量声明 *****************/ void DisableHC595(void) { u8 i; P_HC595_SER = 1; for(i=0; i<20; i++) { P_HC595_SRCLK = 1; P_HC595_SRCLK = 0; } P_HC595_RCLK = 1; P_HC595_RCLK = 0; //锁存输出数据 P_HC595_RCLK = 1; P_HC595_RCLK = 0; //锁存输出数据 } /********************** PCA配置函数 ************************/ void PCA_config(void) { PCA_InitTypeDef PCA_InitStructure; // PCA_InitStructure.PCA_Mode = PCA_Mode_HighPulseOutput; //PCA_Mode_PWM, PCA_Mode_Capture, PCA_Mode_SoftTimer, PCA_Mode_HighPulseOutput PCA_InitStructure.PCA_Mode = PCA_Mode_SoftTimer; //PCA_Mode_PWM, PCA_Mode_Capture, PCA_Mode_SoftTimer, PCA_Mode_HighPulseOutput PCA_InitStructure.PCA_PWM_Wide = 0; //PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bit PCA_InitStructure.PCA_Interrupt_Mode = ENABLE; //PCA_Rise_Active, PCA_Fall_Active, ENABLE, DISABLE PCA_InitStructure.PCA_Value = 30000; //对于软件定时, 为匹配比较值 PCA_Init(PCA2,&PCA_InitStructure); PCA_InitStructure.PCA_Clock = PCA_Clock_1T; //PCA_Clock_1T, PCA_Clock_2T, PCA_Clock_4T, PCA_Clock_6T, PCA_Clock_8T, PCA_Clock_12T, PCA_Clock_Timer0_OF, PCA_Clock_ECI PCA_InitStructure.PCA_IoUse = PCA_P34_P35_P36_P37; //PCA_P12_P11_P10_P37, PCA_P34_P35_P36_P37, PCA_P24_P25_P26_P27 PCA_InitStructure.PCA_Interrupt_Mode = DISABLE; //ENABLE, DISABLE PCA_InitStructure.PCA_Polity = PolityHigh; //优先级设置 PolityHigh,PolityLow PCA_InitStructure.PCA_RUN = DISABLE; //ENABLE, DISABLE PCA_Init(PCA_Counter,&PCA_InitStructure); } /************* 发送脉冲函数 **************/ void IR_TxPulse(u16 pulse) { tx_cnt = pulse; B_Space = 0; //发脉冲 INT_CLKO |= 0x02; //允许 T1 溢出脉冲在T1(P3.5)脚输出,Fck1 = 1/2 T1 溢出率,T1可以1T或12T。 CCAPM2 = PCA_Mode_HighPulseOutput | ENABLE; //允许 PCA2 高速脉冲从P3.7脚输出 CR = 1; //启动 while(CR); } /************* 发送空闲函数 **************/ void IR_TxSpace(u16 pulse) { tx_cnt = pulse; B_Space = 1; //空闲 CCAPM2 = PCA_Mode_SoftTimer | ENABLE; //允许 PCA2 16位软件定时中断 CR = 1; //启动 while(CR); } /************* 发送一个字节函数 **************/ void IR_TxByte(unsigned char dat) { u8 i; for(i=0; i<8; i++) { if(dat & 1) IR_TxSpace(63), TxTime += 2; //数据1对应 1.6875 + 0.5625 ms else IR_TxSpace(21), TxTime++; //数据0对应 0.5625 + 0.5625 ms IR_TxPulse(21); //脉冲都是0.5625ms dat >>= 1; //下一个位 } } /********************** 主函数 ************************/ void main(void) { PCA_config(); EA = 1; //打开总中断 DisableHC595(); while(1) { delay_ms(30); //30ms IO_KeyScan(); if(KeyCode > 0) //检测到收到红外键码 { TxTime = 0; //一帧数据最小长度 = 9 + 4.5 + 0.5625 + 24 * 1.125 + 8 * 2.25 = 59.0625 ms //一帧数据最大长度 = 9 + 4.5 + 0.5625 + 8 * 1.125 + 24 * 2.25 = 77.0625 ms IR_TxPulse(342); //对应9ms,同步头 9ms IR_TxSpace(171); //对应4.5ms,同步头间隔 4.5ms IR_TxPulse(21); //开始发送数据 0.5625ms IR_TxByte(User_code%256); //发用户码高字节 IR_TxByte(User_code/256); //发用户码低字节 IR_TxByte(KeyCode); //发数据 IR_TxByte(~KeyCode); //发数据反码 if(TxTime < 56) //一帧按最大77ms发送, 不够的话,补偿时间 108ms { TxTime = 56 - TxTime; TxTime = TxTime + TxTime / 8; delay_ms(TxTime); } delay_ms(31); while(IO_KeyState > 0) //键未释放 { IR_TxPulse(342); //对应9ms, 同步头 9ms IR_TxSpace(86); //对应2.25ms,同步头间隔 2.25ms IR_TxPulse(21); //开始发送数据 0.5625ms delay_ms(96); IO_KeyScan(); } KeyCode = 0; } } } /**********************************************/ /***************************************************** 行列键扫描程序 使用XY查找4x4键的方法,只能单键,速度快 Y P04 P05 P06 P07 | | | | X | | | | P00 ---- K00 ---- K01 ---- K02 ---- K03 ---- | | | | P01 ---- K04 ---- K05 ---- K06 ---- K07 ---- | | | | P02 ---- K08 ---- K09 ---- K10 ---- K11 ---- | | | | P03 ---- K12 ---- K13 ---- K14 ---- K15 ---- | | | | ******************************************************/ u8 code T_KeyTable[16] = {0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0}; void IO_KeyDelay(void) { u8 i; i = 60; while(--i) ; } void IO_KeyScan(void) //50ms call { u8 j; j = IO_KeyState1; //保存上一次状态 P0 = 0xf0; //X低,读Y IO_KeyDelay(); IO_KeyState1 = P0 & 0xf0; P0 = 0x0f; //Y低,读X IO_KeyDelay(); IO_KeyState1 |= (P0 & 0x0f); IO_KeyState1 ^= 0xff; //取反 if(j == IO_KeyState1) //连续两次读相等 { j = IO_KeyState; IO_KeyState = IO_KeyState1; if(IO_KeyState != 0) //有键按下 { F0 = 0; if(j == 0) F0 = 1; //第一次按下 else if(j == IO_KeyState) { if(++IO_KeyHoldCnt >= 20) //1秒后重键 { IO_KeyHoldCnt = 18; F0 = 1; } } if(F0) { j = T_KeyTable[IO_KeyState >> 4]; if((j != 0) && (T_KeyTable[IO_KeyState& 0x0f] != 0)) KeyCode = (j - 1) * 4 + T_KeyTable[IO_KeyState & 0x0f] + 16; //计算键码,17~32 } } else IO_KeyHoldCnt = 0; } P0 = 0xff; }
评论
    相关推荐