📄 hongwai_2.c
字号:
/****************************************************/
/*** 题目:基于C8051F020单片机***红外遥控编码***
/*** 方法:扫描法
/*** 创建:杨占刚
/*** 时间:08_04_16
/*** 注解;0xAA:0键控制;0xAB:1键控制;0xAC:2键控制;0xAD:3键控制;0xB2:4键控制
0xB3:5键控制;0xB4:6键控制;0xB5:7键控制;0xCA:8键控制;0xCB:9键控制
*******************************************************/
#include "c8051f020.h"
#include "stdio.h"
#define BAUDRATE 115200
#define SYSCLK 22114800
#define uchar unsigned char
sbit P36=P3^6;
static uchar data IRCode[3],IRCON,IRCON2; //定义静态变量
static uchar data key_number;
void SYSCLK_Init(void)
{
int i = 0; //定义延时变量
OSCXCN = 0x67; //启动外部振荡器22.1184MHz晶体
for (i = 0; i < 3000; i++); // Wait 1ms for initialization
while ((OSCXCN & 0x80) == 0); //等待晶体振荡器稳定
OSCICN = 0x88; //使能时钟丢失检测器,检测到时钟丢失时间大于100ms将触发复位,使能外部时钟为系统时钟
}
void PORT_Init(void)
{
WDTCN = 0xde;
WDTCN = 0xad;
XBR0 = 0x04;
XBR2 = 0x40;
}
void Timer1_Init(void)
{
TMOD = 0x21; //定时T1方式2,为波特率发生器 115200
TH1 = 0xF4; //按波特率设置初值
SCON0 = 0X50; //URAT0方式1,允许接收
CKCON|= 0x10; //
PCON |= 0X80; //SMOD00=1
TI0=0;
}
void Delay(uchar j)
{
unsigned int de,i;
if(j)//这里起到按键值正确后会有一个延时,防止重复按键
{
for(i=0; i<1000; i++)
for(de=0; de<200; de++);
j--;
}
}
void main(void)
{
SYSCLK_Init();
PORT_Init();
Timer1_Init();
P5=0X18;
EA=0;
key_number=10;
while(P36==1);
while(P36==0)
{
EA=1;
ET0 = 1; //定时器0中断打开
TH0 = 0XFA;
TL0 = 0X05;//T0 产生800us的定时中断
for (IRCON=0; IRCON<3; IRCON++)
IRCode[IRCON] = 0;
IRCON = 0;
IRCON2 = 0; //计数清零
TR0 = 1; //开始计数
while(1)
{
if(key_number!=10)
break;
}
}
}
//定时器0溢出中断
void Timer0(void) interrupt 1
{
TR1 = 1; //激活定时1,产生波特率
TH0 = 0XFA;
TL0 = 0X05;//T0 产生800us的定时中断
if(IRCON<3)
{
if(IRCON2<8)
{
IRCON2++;
IRCode[IRCON]=IRCode[IRCON]<<1; //每读一次放入变量中的二进制的一个位,每次左移一位
IRCode[IRCON]=IRCode[IRCON] | P36; //每八次填满一个字节,一个字节存放遥控编码4个位
}
else
{
IRCON++; //填满一个字节,指向下一个变量[注意: 这里会抛弃一个脉冲周期 不接收 ]
IRCON2=0; //计数清零
}
}
else
{
//第一字节是引导码起始位、控制位等 后两个字节有意义 (IRCode[1]不都是0x55只是现在方便判断) 最后一位是编码末尾的前半位
TR1 = 1;
TR0 = 0; //关闭定时器
ET0 = 0; //定时器0中断关闭
SBUF0=IRCode[2];
while(TI0!=0);
TI0=0;
if((IRCode[1]!=0xFF) && (IRCode[2]!=0xFF))
{
if(IRCode[1] == 0x55)
{
switch(IRCode[2])
{
case 0xAA: //0键控制
key_number=0;
P5=0X00;
Delay(1);
break;
case 0xAB: //1键控制
key_number=1;
P5=0X01;
Delay(1);
break;
case 0xAC: //2键控制
key_number=2;
P5=0X02;
Delay(1);
break;
case 0xAD: //3键控制
P5=0X04;
key_number=3;
Delay(1);
break;
case 0xB2: //4键控制
P5=0X08;
key_number=4;
Delay(1);
break;
case 0xB3: //5键控制
P5=0X10;
key_number=5;
Delay(1);
break;
case 0xB4: //6键控制
P5=0X20;
key_number=6;
Delay(1);
break;
case 0xB5: //7键控制
P5=0X40;
key_number=7;
Delay(1);
break;
case 0xCA: //8键控制
P5=0X80;
key_number=8;
Delay(1);
break;
case 0xCB: //9键控制
key_number=9;
P5=0XFF;
Delay(1);
break;
default:
break;
}
printf("key_number is:%d",key_number%256);
printf("\n");
printf("\n");
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -