STC89C58RD+22.1184MHz晶振+外中断0+红外遥控解码+定时器0+定时器1+定时器2+串口+看门狗
本程序通过外中断0与定时器0实现红外遥控解码,并通115200波特率的串口将红外遥控的地址码和数据码发送到PC机上的串口助手,同时使用定时器1进行喂狗,防止程序出现异常。本程序适用于STC系列的单片,ATMEL的单片机基本通用,就是在设置看门狗和定时器2时需要参考ATMEL单片机的手册才行。
//以下程序适用于STC89C58RD+ ,使用22.1184MHz晶振,用1838来对红外遥控器解码,1838的1脚接外中断0脚,即单片机P3.2脚
//红外遥控器发出的红外信号经过1838处理后输出的是9.5ms低电平(也可能是4.5ms低电平)加4.5ms高电平的前导码,后面8位的地址码,8位的地址反码(也可能是地址码),8位的数据码,8位的数据反码,总共32位码
//其中0码由O.56ms低电平和0.56ms高电平组合而成.脉冲宽度为1.12ms;1码由0.56ms低电平和1.69ms高电平组合而成,脉冲宽度为2.25ms
/
/特别说明:当使用定时器1作为波特率发生器,而定时器2作为16位自动装载的定时器时,定时器2无法正常工作,必须是定时器2作为波特率发生器,定时器1作为定时器用
#include<reg52.h>
#include<stdio.h>
//#include<string.h>
unsigned char count;
unsigned int Address_Part,Data_Part;
unsigned char date;
bit Rev_flag;
bit Over_flag;
sfr WDT_CONTR=0xe1;//STC的看门狗寄存器的地址,ATMEL的芯片看门狗地址不一样
sfr T2MOD=0xc9;//定时器2的模式选择寄存器地址
//unsigned int time_data[35];
//unsigned char time_count;
#define WDT_Time 22
unsigned char Count_Num=0;
void delay(unsigned int z)//延时函数,在22.1184M晶振下没有调试过,只是大概的使用,大概是1个毫秒
{
    unsigned int x,y;
    for(x=z;x>0;x--)
        for(y=200;y>0;y--);
}
void init_config()//初始化函数
{
//    PCON |=0x80;//SMOD=1,定时器1要产生115200波特率必须置位,定时器2则不需要
    REN=1;//启动串行接收数据
    SM0=0;
    SM1=1;//SM0,SM1设置串行口为工作方式1,10位异步收发器-->1位起始位,8位数据,1位停止位
    TI=1;//要使用printf()函数,就需要置位,后期不能置0
    T2MOD=0x00;//选择定时器2为向上定时计数器
    T2CON=0x34;//选择定时器2为16位自动重新装载模式下的波特率发生器,启动定时器2
    RCAP2H=0xff;//65536-(fosc/(32*baud));//22.1184MHz产生115200波特率,算法和用定时器1做波特率发生器的算法不一样
    RCAP2L=0xfa;//
    TMOD=0x11;//设置定时器0为工作方式1,定时器1为方式1
    TH1=(65536-65000)/256;//定时器初值,大概是35ms进一次定时器中断
    TL1=(65536-65000)%256;//
    TR1=1;//启动T1定时器
    TH0=0x00;
    TL0=0x00;//设置定时器0初值
    IT0=1;//设置外中断0为下降沿触发
    ET0=1;//开定时器0允许中断
    ET1=1;//开定时器1允许中断
    EX0=1;//开外中断0
    //TR0=1;
    ES=1;//开串口中断
单片机printf函数    EA=1;//开总中断
    Rev_flag=0;