您的位置:首页单片机其他单片机
内容搜索:
阅读内容
背景:#EDF0F5 #FAFBE6 #FFF2E2 #FDE6E0 #F3FFE1 #DAFAF3 #EAEAEF 默认  

多机红外通信发送端(C程序代码)

[日期:2007-12-30 ] [来源:周立功 作者:] [字体: (投递新闻)

/****************************************************************
*文件名: Host.C
*版权:  www.zlgmcu.com
*日期:  16:27 04-3-16
*功能:  多机红外通信发送端程序代码
****************************************************************/
#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++);
}//---------------------------------------

阅读:
录入:admin

推荐 】 【 打印
本文评论
      全部评论
发表评论


点评: 字数
姓名:
站长推荐