因为需要,搞了一个单片机模拟2262发码的小程序,贴上来,供需要的朋友品头评足多提建设性意见,以便进一步改进和完善,
/*************PIC12F629单片机程序******************************/
/**************************************************************/
/*****File Function : 模拟2262发码 *****/
/*****Program Author : *****/
/*****MCU : PIC12F629 内部4M晶振 *****/
/*****Compile Date : 2012/08/03 *****/
/*****Edition Info : V0.0 *****/
//*************************************************************/
/*************************************************************/
#include <pic.h>
#define uchar unsigned char
#define uint unsigned int
void delay5ms(void);
void delay200us(void);
void delayms(uint count);
void delay0d5s(void);
void PortInit(void);
//-------------------------------------------
void p2262_0(void);
void p2262_1(void);
void p2262_f(void);
void fs_2262(uint add,uchar dat);
#define p2262 GPIO4 //3脚,接5.6K到433发射模块,同时接4.7K电阻到发光2极管正极,发光管负极到地20120805
//#define led GPIO5 //2脚 4.7k,负极到地
#define _asm{"nop"} NOP()
#define _asm{"clrwdt"} CLRWDT()
#define _asm{"sleep"} SLEEP()
//__CONFIG(HS&PROTECT&WDTEIS); //采用内部RC振荡器,看门狗关闭
//=============================================================
//=============================================================
void PortInit(void)
{
TRISIO=0b00000000; //设置GP4,GP5为输出
// CMCON=0b00000000;
WPU =0b11111111; //使能口上拉电阻
OPTION_REG=0b00001111; //后3位调整睡眠时间
}
//=============================================================
//=============================================================
void main(void){
uint k,j;
uchar i;
//--------------------------------------------------
//void main(void){ //试验程序
// PortInit();
//while(1){
//delayms(1500);
// led=1;
//delayms(8500);
// led=0;
//delayms(8400);
// }}
//--------------------------------------------------
PortInit();
p2262=0;
while(1){
// for(i=0;i<2;i++)delay0d5s();
// CLRWDT();
// delay0d5s();
// led=0; //发光管亮
//for(k=0;k<16;k++){
fs_2262(0xaaaa,15); //
//for(j=0;j<35535;j++)
//;
//}
// led=1; //发光管熄灭
SLEEP();
NOP();
}
}
//============================================================
void delayms(uint count){
uint i;
for(i=count;i>0;i--){
NOP();
CLRWDT(); //315只用这一句
NOP();NOP();NOP();NOP();NOP();NOP(); //315也可用这一句,433也可用此句
NOP();NOP();NOP();NOP();NOP();NOP(); //433要用此句
NOP();NOP();NOP();NOP();NOP();NOP(); //433要用此句
NOP();NOP();NOP();NOP();NOP();NOP(); //433要用此句
NOP();NOP();NOP();NOP();NOP();NOP(); //433必须用此句
}}
void delay5ms(void){
uchar i;
for(i=24;i>0;i--){
delay200us();
}}
void delay200us(void){
uchar i;
for(i=50;i>0;i--)
NOP();
}
void delay0d5s(void){
uint i;
for(i=1500;i>0;i--){
delay200us();
}}
//=============================================================
/**************************************************************/
/*############################################################*/
//-------------------------------------------------------------
void p2262_0(void){
p2262=1;
delayms(10);
p2262=0;
delayms(30);
p2262=1;
delayms(10);
p2262=0;
delayms(30);
}
//-------------------------------------------------------------
void p2262_1(void){
p2262=1;
delayms(30);
p2262=0;
delayms(10);
p2262=1;
delayms(30);
p2262=0;
delayms(10);
}
//-------------------------------------------------------------
void p2262_f(void){
p2262=1;
delayms(10);
p2262=0;
delayms(30);
p2262=1;
delayms(30);
p2262=0;
delayms(10);
}
//-------------------------------------------------------------
void fs_2262(uint add,uchar dat){ //2262编码发射,00代表0,01代表1,10代表f
uchar i,j;
uint temp; //暂存地址单元
for(i=0;i<8;i++){ //发射相同的8组码 //发射相同的4组码?//发射相同的2组码 ?????
for(j=0;j<8;j++){ //先发射8位地址
temp=add;
temp>>=((7-j)*2); //将待发射的两位移到最低位
temp &=3;
if(temp==0) p2262_0();
else if (temp==1)p2262_1();
else if (temp==2)p2262_f();
}
for(j=0;j<4;j++){ //再发4位数据
temp=dat;
temp>>=(3-j);
temp &=1;
if(temp==0)p2262_0();
else if(temp==1)p2262_1();
}
// led=0; //发光管亮
p2262=1; //发射结束码
delayms(10);
p2262=0;
delayms(310);
}
// led=0; //发光管亮
}
//###########################################################*/
|