/***************************************************************
作品:红外线发射
单片机:STC89C52RC
晶振:12M
编译环境:Keil uVision4 V9.00
***************************************************************/
//
// 发射引脚(接PNP三极管b极)
// PNP三极管e极接2Ω电阻,c极接红外发射管
#include <REG51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define SBM 0x80 //识别码
#define m9 (65536-9000) //约9mS
#define m4_5 (65536-4500) //约4.5mS
#define m1_6 (65536-1630) //约1.65mS
#define m_65 (65536-580) //约0.65mS
#define m_56 (65536-560) //约0.56mS
#define m40 (65536-40000) //约40mS
#define m56 (65536-56000) //56mS
#define m2_25 (65536-2250) //约2.25mS
sbit IR = P3^6; //定义发射引脚(接PNP三极管基极)
sbit LED = P3^7; //发射指示灯
uchar KEY(void);
void SanZhuan(void);
void ZZ(uchar x);
void Z0(uchar temp);
void TT0(bit BT,uint x);
void YS(uchar
time);
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数功能:主函数
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void main(void)
{
TMOD = 0x01; //T0 16位工作方式
IR=1; //发射端口常态为高电平
while(1)
{
SanZhuan();
}
}
/***************************************************************
函数功能: 4×4矩阵键盘
键值
P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
│ │ │ │ │ │ │ │ ┃
│ │ │ └────13 14 15 16 ┃
│ │ └─────────9 10 11 12 ┃
│ └──────────────5 6 7 8 ┃
└────────────────────1 2 3 4 ┃
***************************************************************/
uchar KEY(void)
{
uchar H,L; //行值,列值
H=0;
L=0;
P1 = 0xf0; //将键盘端口行值设为1,列值设为0
if(P1!= 0xf0) //检测是否有按键按下,如果有则hangval必不为0x0f
{
YS(10); //按键去抖动,延时10毫秒
if(P1!=0xf0) //确实有按键按下
{
H = P1&0xf0; //按键后得到按键的行标志位,将行标志位赋值给hangval
P1 = 0x0f; //翻转键盘接口输出
L = P1&0x0f; //得到列标志位
}
return (H+L);
}
return 0;
}
/***************************************************************
函数功能:散转程序
入口参数:v
//
// 13 14 15 16
// 9 10 11 12
// 5 6 7 8
// 1 2 3 4
***************************************************************/
void SanZhuan(void)
{
uchar v;
v = KEY();
switch(v)
{
case 0x77:ZZ(0x01);v=0;break; //" "
case 0xb7:ZZ(0x02);v=0;break; //" "
case 0xd7:ZZ(0x03);v=0;break; //" "
case 0xe7:ZZ(0x04);v=0;break; //" "
case 0x7b:ZZ(0x05);v=0;break; //" "
case 0xbb:ZZ(0x06);v=0;break; //" "
case 0xdb:ZZ(0x07);v=0;break; //" "
case 0xeb:ZZ(0x08);v=0;break; //" "
case 0x7d:ZZ(0x09);v=0;break; //" "
case 0xbd:ZZ(0x10);v=0;break; //" "
case 0xdd:ZZ(0x11);v=0;break; //" "
case 0xed:ZZ(0x12);v=0;break; //" "
case 0x7e:ZZ(0x13);v=0;break; //" "
case 0xbe:ZZ(0x14);v=0;break; //" "
case 0xde:ZZ(0x15);v=0;break; //" "
case 0xee:ZZ(0x16);v=0;break; //" "
default:v=0;
}
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数功能:发送主程序
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void ZZ(uchar x)
{
TT0(1,m9); //高电平9mS
TT0(0,m4_5); //低电平4.5mS
/*┈ 发送4帧数据 ┈*/
Z0(SBM);
Z0(~SBM);
Z0(x);
Z0(~x);
/*┈┈ 结束码 ┈┈*/
TT0(1,m_65);
TT0(0,m40);
/*┈┈ 重复码 ┈┈*/
// while(KEY())
// {
// TT0(1,m9);
// TT0(0,m2_25);
//
// TT0(1,m_56);
// TT0(0,m40);
// TT0(0,m56);
//
// LED = !LED; //指示灯
// }
//
// LED = 1;
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数功能:单帧发送程序
入口参数:1帧数据
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void Z0(uchar temp)
{
uchar v;
for (v=0;v<8;v++) //循环8次移位
{
TT0(1,m_65); //高电平0.65mS
if(temp&0x01) TT0(0,m1_6); //发送最低位
else TT0(0,m_56);
temp >>= 1; //右移一位
}
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数功能:38KHz脉冲发射 + 延时程序
入口参数:(是否发射脉冲,延时约 x (uS))
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void TT0(bit BT,uint x)
{
TH0 = x>>8; //输入T0初始值
TL0 = x;
TF0=0; //清0
TR0=1; //启动定时器0
if(BT == 0) while(!TF0); //BT=0时不发射38KHz脉冲只延时;BT=1发射38KHz脉冲且延时;
else while(1) //38KHz脉冲,占空比5:26
{
IR = 0;
if(TF0)break;
if(TF0)break;
IR = 1;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
}
TR0=0; //关闭定时器0
TF0=0; //标志位溢出则清0
IR =1; //脉冲停止后,发射端口常态为高电平
}
/***************************************************************
函数功能:按键消抖 延时程序
入口参数:1ms×time (晶振=12MHz)
***************************************************************/
void YS(uchar time)
{
uchar i,j;
for(i=0; i<time; i++)
for(j=0; j<247; j++)_nop_();
}
一周热门 更多>