首 页文档资料下载资料维修视频包年699元
请登录  |  免费注册
当前位置:精通维修下载 > 文档资料 > 家电技术 > 单元电路介绍 > 其它电路
多机红外通信发送端程序
来源:本站整理  作者:佚名  2011-08-04 10:14:45



多机红外通信发送端程序

#include "reg932.h"
#define    uchar    unsigned char

sbit    KEY1=P0^0;                    //定义KEY1
sbit    KEY2=P0^1;                    //定义KEY2
                    
sbit    Infr=P0^3;                    //定义红外输出端口
//--------------------------------------
void    CCU_Init();                    //CCU初始化
void    KeyISR_Init();                //键盘中断初始化
void    ReadKey();                    //判断按键
void    Power_Down();                //完全掉电

void    StartDevICe01();            //启动设备1(灯)
void    StartDevice02();            //启动设备2(门/窗)
void    SendHead();                    //发送帧头
void    SendData(uchar Data);        //发送数据

void    delay400us();                //延时400us
void    delayms(uchar i);            //ms级延时
//--------------------------------------
void    KEY_ISR() interrupt    7{
    EA=0;                            //关中断
    
    PCONA=0x00;                        //功能模块上电
    CCU_Init();                        //CCU模块初始化

    delayms(10);                    //延时10ms
    ReadKey();                        //判断按键

    KBCON=0x00;                        //清键盘中断标志
    delayms(50);                    //延时50ms
    EA=1;                            //开中断
}

//--------------------------------------
main()
{
    P0M1=0x00;                        //设置P0口为准双向
    P0M2=0x00;
    P2M1=0x40;                        //设置P26为开漏                        
    P2M2=0x40;
    CCU_Init();                        //CCU初始化
    KeyISR_Init();                    //键盘初始化
    while(1)
    {
        Power_Down();                //完全掉电
    }
}
//--------------------------------------
//功能:进入掉电模式
//--------------------------------------
void    Power_Down()
{
    PCONA=0xFF;                        //外部功能模块掉电
    PCON=0x03;                        //进入掉电模式
}
//-------------------------------------------------------------
//功能:    CCU模块初始化,使OCA(P2.7)输出38KHz,50%占空比的PWM波,
//使用内部RC振荡器时:CCU频率=((7375000/2)/6)*32=9.833MHz
//定时器重装值=CCU频率/红外线载频=9833333/38000=258.772=0x102
//-------------------------------------------------------------
void    CCU_Init()
{

    TOR2H=0x02;                     //定时器重装值
    TOR2L=0x05;
    OCRAH=0x01;                     //(OCRAH:OCRAL)=(TOR2H:TOR2L)/2,PWM的占空比为50%
    OCRAL=0x02;
    TCR21=0x85;                     //PLL预分频为5+1
    CCCRA=1;                        //非反相的PWM在比较匹配时置位,在CCU定时器向下溢出时清0

    PLLEN=1;                        // 启动 PLL
    OCA=1;
    while(PLLEN==0);
    TCR20=0x82;                        // 设置输出模式,非反相PWM

}
//--------------------------------------
//功能:键盘中断初始化
//--------------------------------------
void    KeyISR_Init()
{
    KBMASK=0x03;                    //设置P01->P00为中断源
    KBCON=0x00;                        //清除键盘中断标志
    EKBI=1;                            //键盘中断允许
    EA=1;                            //开中断
}
//--------------------------------------
//功能:键盘判断
//--------------------------------------
void ReadKey()
{    
    delayms(12);                    //延时去抖动

    if(KEY1==0)                        //等待KEY1按下
    {
        while(KEY1==0);                //等待KEY1为1
        StartDevice01();            //启动设备1(灯)
    }
    else if(KEY2==0)                //等待KEY2按下
    {
        while(KEY2==0);                //等待KEY2为1
        StartDevice02();            //启动设备2(门/窗)
    }
}

//--------------------------------------
//功能:启动设备1(门/窗)    
//--------------------------------------
void StartDevice01()                
{
    SendHead();                        //发送帧头
    SendData(1);                    //发送数据“1”,
}
//--------------------------------------
//功能:启动设备2(门/窗)
//--------------------------------------
void StartDevice02()
{
    SendHead();                        //发送帧头
    SendData(2);                    //发送数据“2”,
}
//--------------------------------------
//功能:发送帧头
//--------------------------------------
void SendHead()
{
    Infr=0;                            //将Infr拉为低电平
    delayms(50);
    Infr=1;                            //将Infr拉为高电平
    delayms(10);

    Infr=0;                            //将Infr拉为低电平
    delayms(1);
    Infr=1;                            //将Infr拉为高电平
    delayms(1);
    Infr=0;                            //将Infr拉为低电平
    delayms(1);
}
//--------------------------------------
//功能:发送数据,从高位到低位依次发送8个位
//入口参数:要发送的数据
//--------------------------------------
void SendData(uchar  Data)
{
    uchar    Temp;
    uchar    i=8;
    while(i>0)
    {
        Temp=Data&0x80;                //取欲发送数的最高位
        if(Temp==0x80)                //对最高位进行判断.
        {    
            Infr=1;                    //为1则将Infr拉高
        }
        else
        {
            Infr=0;                    //为0,则将Infr拉低
        }
        
        i--;
        Data=Data<<1;                //循环移位
        delay400us();                //延时
    }
}
//--------------------------------------
//在内部RC作用的情况下,延时1000.9us
//--------------------------------------
void    delayms(uchar i)
{
    int    j;
    while(i>0)
    {
        for(j=0;j<670;j++);
        i--;
    }
}
//---------------------------------------
//在内部RC作用的情况下,延时 401us;
//---------------------------------------
void    delay400us()
{
    int    i;
    for(i=0;i<283;i++);
}//---------------------------------------

关键词:

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分)
Copyright © 2007-2017 down.gzweix.Com. All Rights Reserved .
页面执行时间:55,250.00000 毫秒