| 
钻石会员 主题
回帖0
积分19891
阅读权限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
 | 
 |