/********************************测试源码如下*************************************/
#include "HC89F003.h"
#include "TM1650.h" //引入数码管用作代码调试
//定义键码
#define IR_KEY_A 0XFFA25D
#define IR_KEY_B 0XFF629D
#define IR_KEY_C 0XFFE21D
#define IR_KEY_D 0XFF22DD
#define IR_KEY_E 0XFFC23D
#define IR_KEY_F 0XFFB04F
#define IR_KEY_OK 0XFFA857
#define IR_KEY_S 0XFF02FD
#define IR_KEY_X 0XFF9867
#define IR_KEY_Z 0XFFE01F
#define IR_KEY_Y 0XFF906F
#define IR_KEY_0 0XFF6897
#define IR_KEY_1 0XFF30CF
#define IR_KEY_2 0XFF18E7
#define IR_KEY_3 0XFF7A85
#define IR_KEY_4 0XFF10EF
#define IR_KEY_5 0XFF38C7
#define IR_KEY_6 0XFF5AA5
#define IR_KEY_7 0XFF42BD
#define IR_KEY_8 0XFF4AB5
#define IR_KEY_9 0XFF52AD
//定义引脚
#define IN2 P0_6 //之前是P2_7 外部中断6
//定义变量、引脚
volatile unsigned long timerCount=0; //定时器计数
unsigned char irdataCount=0; //自加变量
volatile unsigned int xdata ircode[33]; //红外代码接收缓冲区
volatile unsigned char xdata hexData[4]={0}; //红外代码接收缓冲区
//unsigned int testArr[50]={0};
bit readStart = 0;
bit isEnd = 0;
unsigned long longZero = 0x00000000;
//定义函数
void System_init(void);
void Timer3Init(void);
void GPIO_init();
void Int6Init(void);
void parseRevdata();
void Uart1_init(unsigned long BaudRate);
void UART1_SendByte(unsigned char temp);
//void Delay_1ms(unsigned short ms);
void main(){
System_init();
GPIO_init();
Timer3Init();
Int6Init();
Uart1_init(9600);
EA=1;
// Delay_1ms(1000);
// UART1_SendByte('a');
while(1){
if(isEnd){ //数据读取完成 开始解析数据
unsigned long parseResData;
unsigned char result;
isEnd=0;
parseRevdata();
parseResData=(unsigned long) ((longZero|hexData[0])<<24)+((longZero|hexData[1])<<16)+((longZero|hexData[2])<<8)+((longZero|hexData[3]));
switch(parseResData){
case IR_KEY_A:
UART1_SendByte('A');
result= 'A';
break;
case IR_KEY_B:
UART1_SendByte('B');
result= 'B';
break;
case IR_KEY_C:
UART1_SendByte('C');
result= 'C';
break;
case IR_KEY_D:
UART1_SendByte('D');
result= 'D';
break;
case IR_KEY_E:
UART1_SendByte('E');
result= 'E';
break;
case IR_KEY_F:
UART1_SendByte('F');
result= 'F';
break;
case IR_KEY_S:
UART1_SendByte('S');
result= 'S';
break;
case IR_KEY_X:
UART1_SendByte('X');
result= 'X';
break;
case IR_KEY_Z:
UART1_SendByte('Z');
result= 'Z';
break;
case IR_KEY_Y:
UART1_SendByte('Y');
result= 'Y';
break;
case IR_KEY_OK:
UART1_SendByte('K');
result= 'K';
break;
case IR_KEY_0:
UART1_SendByte('0');
result= '0';
break;
case IR_KEY_1:
UART1_SendByte('1');
result= '1';
break;
case IR_KEY_2:
UART1_SendByte('2');
result= '2';
break;
case IR_KEY_3:
UART1_SendByte('3');
result= '3';
break;
case IR_KEY_4:
UART1_SendByte('4');
result= '4';
break;
case IR_KEY_5:
UART1_SendByte('5');
result= '5';
break;
case IR_KEY_6:
UART1_SendByte('6');
result= '6';
break;
case IR_KEY_7:
UART1_SendByte('7');
result= '7';
break;
case IR_KEY_8:
UART1_SendByte('8');
result= '8';
break;
case IR_KEY_9:
UART1_SendByte('9');
result= '9';
break;
default:
UART1_SendByte(0);
result=0;
break;
}
}
}
}
//引脚初始化
void GPIO_init()
{
P1M0=(P1M0&0XFF)|0X88; //OUT3 P11 推挽输出 //OUT4 P10 推挽输出
}
//系统初始化
void System_init(void)
{
WDTCCR = 0x00; //关闭看门狗
while((CLKCON&0x20)!=0x20); //等待内部高频晶振起振
CLKDIV = 0x02; //CPU时钟2分频,确保在进行RC32分频时CPU时钟小于20M
CLKSWR = 0x51; //选择内部高频时钟为主时钟,且内部高频RC2分频,
while((CLKSWR&0xC0)!=0x40); //等待内部高频切换完成
CLKDIV = 0x01; //CPU时钟1分频
BORC=0xc2;
BORDBC=0x06; //V3.0版本加入
}
//定时器3初始化
//时钟频率:16.000MHz
//定时长度:50微秒
void Timer3Init(void)
{
T3CON &= 0xCF;//1分频
T3CON &= 0xFC;//系统时钟Fosc
TH3 = 0xFC;//初值高8位
TL3 = 0xE0;//初值低8位
T3CON &= 0x7F;//清除中断标志
ET3 = 1;//使能中断
T3CON |= 0x04; //开启定时器
}
//外部中断6初始化
void Int6Init(void)
{
P0M3 = P0M3&0xF0|0x02; // IN2 P06 上拉输入(非施密特)
PITS1 = (PITS1&0xCF)|0x10; //INT6下降沿
PINTE0 |=0x40; //允许该INT6中断
IE1 |=0x40; //允许 INT2~INT7 中断
}
//T3中断服务函数
void Timer3Interrupt (void) interrupt T3_VECTOR
{
//具体代码
timerCount++;
T3CON &= 0x7F;//清除中断标志
}
//INT1中断服务函数
void INT6Interrupt(void) interrupt INT2_7_VECTOR //外部中断时无法实时读取定时器的值 读到定时器的是一个固定值
{
if(timerCount>300){ //如果时间大于15ms 检测引导码起始段
readStart = 1; //读数据标识
irdataCount = 0; //将数据读取标识位值0
}
else{
if(readStart){
ircode[irdataCount] = timerCount; //当前中断为上一个信号的结束,下一个信号的开始
showNumberDec(ircode[32]);
irdataCount++;
if(irdataCount>=33){ //数据的终止码
readStart=0;
irdataCount =0;
isEnd=1; //数据接收完成标志
}
else if(irdataCount==1&&timerCount>225&&timerCount<230){ //重复码的终止码
readStart=0;
irdataCount =0;
isEnd=1;
}
}
}
timerCount=0;
PINTF0 &= ~0x40; //清除中断标志
}
void parseRevdata(){
unsigned char i;
unsigned char revdata=0x00;
if(ircode[0]>272&&ircode[0]<278){ //判断是数据引导头
for(i=1;i<33;i++){
if(ircode[i]>18&&ircode[i]<24){
// UART1_SendByte(0);
revdata<<=1;
}
else if(ircode[i]>40&&ircode[i]<45){
// UART1_SendByte(1);
revdata<<=1;
revdata |=0x01;
}
if(i%8==0){
hexData[i/8-1]=revdata;
revdata = 0x00;
}
}
}
else if(ircode[0]>225&&ircode[0]<230){ //判断第一位是重复码
for(i=1;i<33;i++){
if(ircode[i]>18&&ircode[i]<24){
// UART1_SendByte(0);
revdata<<=1;
}
else if(ircode[i]>40&&ircode[i]<45){
// UART1_SendByte(1);
revdata<<=1;
revdata |=0x01;
}
if(i%8==0){
hexData[i/8-1]=revdata;
revdata = 0x00;
}
}
}
}
//void Delay_1ms(unsigned short ms) //2mhz时钟
//{
// unsigned short i,j;
// for(i=ms;i>0;i--)
// for(j=1600;j>0;j--);
//}
/********************************************--串口函数--********************************************************/
void Uart1_init(unsigned long BaudRate)
{
unsigned short temp;
unsigned char ch,cl;
T4CON = 0x06; //T4工作模式:UART1波特率发生器 分频比一直在调整,以实际为准
if(BaudRate==115200)
temp=65536-(1000000/BaudRate)-1; //分频系数为16的计算公式 -1是为了减少当波特率为115200时的误差
else
temp=65536-(1000000/BaudRate); //分频系数为16的计算公式
ch=(temp>>8)&0xff;
cl=temp&0xff;
TH4 = ch;
TL4 = cl; //波特率9600
P2M0=(P2M0&0X0F)|0X80; //P21推挽输出 TX1
P0M1=(P0M1&0X0F)|0X20; //P03上拉输入 RX1
TXD_MAP = 0x21; //TXD1映射P21
RXD_MAP = 0x03; //RXD1映射P03
SCON2 = 0x02; //8位UART,波特率可变
SCON = 0x10; //允许串行接收
}
void UART1_SendByte(unsigned char temp)
{
SBUF=temp; //串口1发送
while(!(SCON & 0X02)); //等待发送完成
SCON &=0XFD; //清除发送标志位
}
|