钻石会员
主题
帖子
积分19886
阅读权限50
注册时间2009-4-2
最后登录1970-1-1
在线时间 小时
|
手持式发射器一般用纽扣电池供电,对电源功耗的要求很高,否则几天就没有电了,你的产品怎么能够卖得脱?
最近采用6个脚的pic10lf322做了一个模拟2262发码的发射器,功耗极低,目前我自己认为是满意了(好像有一点自我陶醉的感觉哈),用我目前身边的500型万用表的50uA档测试,一上电时有一点摆动,然后基本上处于0位置,去掉表表基本上感觉不到指针的回摆,(苦于没有精度高的电流表呀),不知还能不能做到更低?在发射数据时有2-3mA的电流。现把电路图和程序发布在下,希望感兴趣的朋友评头品足,多提意见,互相交流,共同提高。
/*************PIC10F322单片机程序******************************/
/**************************************************************/
/*****File Function : 模拟2262发码 *****/
/*****Program Author : fxh *****/
/*****MCU : PIC10F322 内部晶振 *****/
/*****Compile Date : 2012/10/18 *****/
/*****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 LATA2 //
#define _asm{"nop"} NOP()
//#define _asm{"clrwdt"} CLRWDT()
#define _asm{"sleep"} SLEEP()
//__CONFIG(HS&PROTECT&WDTEIS); //采用内部RC振荡器,看门狗关闭
//=============================================================
//=============================================================
void PortInit(void) {
OSCCON=0b01010000; //4MHz
WPUA =0b00001111; //使能口上拉电阻
//OPTION_REG=0b00001111; //后3位调整睡眠时间
TRISA=0b00000011; //使能端口输出驱动器20121018
ANSELA=0b00000000; //设置为数字功能
//INTCON=0b10001001;
INTCON=0b00001000; // IOCIE位置1,允许引脚产生中断
IOCAP=0b00001011; //上升沿产生中断
IOCAN=0b00001011; //下降沿产生中断
}
//=============================================================
//=============================================================
void main(void){
uint k,j;
uchar i;
//--------------------------------------------------
delayms(20000); //避免上电的干扰!
PortInit();
p2262=0;
while(1){
SLEEP();
//---------------------------------------------------------
if (PORTA0==0)
{
while(PORTA0==0);
delayms(20000);delayms(20000);
fs_2262(0xaaaa,15);
delayms(10000);
fs_2262(0xaaaa,15);
delayms(10000);
}
//---------------------------------------------------------
if (PORTA1==0)
{
while(PORTA1==0);
delayms(20000);delayms(20000);
fs_2262(0xaaaa,14);
delayms(10000);
fs_2262(0xaaaa,14);
delayms(10000);
}
IOCAF=0b00000000; //电平变化中断标志位清0,继续进入睡眠状态
}
}
//============================================================
void delayms(uint count){
uint i;
for(i=count;i>0;i--){
NOP();
//CLRWDT() //
NOP();NOP();NOP();NOP();NOP();NOP(); //
NOP();NOP();NOP();NOP();NOP();NOP(); //
NOP();NOP();NOP();NOP();NOP();NOP(); //
NOP();NOP();NOP();NOP();NOP();NOP(); //
//NOP();NOP();NOP();NOP();NOP();NOP(); //315必须用此句
}}
//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();
}
//-------------------------------------------------------
p2262=1; //发射结束码
delayms(20);//delayms(8);//delayms(10);
p2262=0;
delayms(410);//delayms(270);//delayms(310);
}
}
//###########################################################*/
//数据:0=00, 1=03, 2=0c, 3=0f, 4=30, 5=33, 6=3c, 7=3f,
// 8=c0, 9=c3,10=cc,11=cf,12=f0,13=f3,14=fc,15=ff,
// 16=00, 17=03,18=0c, 19=0f, 20=30, 21=33, 22=3c, 23=3f |
|