找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 26166|回复: 27
打印 上一主题 下一主题
收起左侧

单片机发送寻呼机pocsag码

  [复制链接]
跳转到指定楼层
楼主
//本例实现单片机用pocsag码向数字机发送pocsag数字28167的全部编码
//包括引导码、同步码、闲置码、地址码、信息码。、
//本例用stc12C5a60s2用32M晶振成功呼响了motorola大顾问传呼机
//本例仅供传呼机爱好者地pocsag进行了解和试验,切勿用于商业用途
#include "STC12C5A60S2.H"                  

//#include "string.h"
//#include "intrins.h"
//#include"stdio.h"

#define uchar unsigned char
#define uint unsigned int           

#define TIMER0_ENABLE  TR0=1;
#define TIMER0_DISABLE TR0=0;

#define TX  P2_0   //数据输出端
#define PTT P2_2   //PTT控制端
#define HIGH   1
#define LOW    0

unsigned long xdata addr;        //地址         
uchar  Tx_Num;//地址码发射次序

bit TM0_FLAG=0;

void UartInit(void)                //9600bps@32.000MHz
{
        PCON &= 0x7F;                //波特率不倍速
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
        AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                //清除定时器1模式位
        TMOD |= 0x20;                //设定定时器1为8位自动重装方式
        TL1 = 0x98;                //设定定时初值
        TH1 = 0x98;                //设定定时器重装值
        ET1 = 0;                //禁止定时器1中断
        TR1 = 1;                //启动定时器1
   //        TI = 1;
}         

void Delay200ms()                //@32MHz
{
        unsigned char i, j, k;

        i = 25;
        j = 82;
        k = 145;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}        

unsigned long  calc_bch_and_parity( unsigned long cw_e ) //BCH校验和奇偶校验函数
{
   uchar i;
   uchar  parity = 0; //奇偶校验计数   
   unsigned long local_cw; //临时存放数         
   local_cw=cw_e;//保存cw_e参数值
   for(i=1;i<=21; i++,cw_e<<=1)           
       if (cw_e & 0x80000000) cw_e ^= 0xED200000;  
   cw_e=cw_e&0xFFC00000;//保留前10位,BCH校验值共11位,只保留前10位有效数据         
   local_cw |= (cw_e >> 21); //BCH校验数移至第22位到31位,BCH共10位,并和原始数据相加
   cw_e=local_cw;         
   for(i=0; i<31; i++, cw_e<<=1) if(cw_e&0x80000000) parity++;        
   if(parity%2) local_cw+=1;//从1至31位判断为奇数则后面加1补充为偶数
   return local_cw;         
}  

unsigned long  calc_addr( unsigned long add,uchar fun ) //地址转换,第1参数为地址,第2参数为功能
{
  unsigned long adr;
  unsigned long tem;   
  Tx_Num=(uchar)(add&0x00000007);//获取地址发射的帧位次,111位第7帧,后3位地址数据隐藏不发送,接收按帧位还原
  adr=0x00;
  adr=add&0xFFFFFFF8;        //去掉地址码后3位
  adr=adr<<10;  //地址左移10位
  tem=0x00;
  tem=fun;  //功能位
  tem=tem<<11;//功能位左移11位,功能位为00 01 10 11四种状态,代表4个地址码
  adr=adr|tem; //地址码和功能位合成地址码;
  return adr;
}


void IntTimer0() interrupt 1 //设定中断时间为0.8333毫秒,1/1200=0.8333,1200比特速率
{
     TL0 = 0x53;                //设置定时初值
         TH0 = 0xF7;                //设置定时初值         
     TM0_FLAG=1;
}
         

void WaitTF0( void )
{
   while(!TM0_FLAG);
   TM0_FLAG=0;      //清标志位
}

void Send_start(unsigned long s)
{
   uchar i,n;
   unsigned long tem;  
   for(i=0;i<20;i++) //发送576个前导10101010101010
        {      
      tem=s;
          for (n=0;n<32;n++)
       {
                 if(tem&0x80000000)TX= HIGH ;else TX=LOW;
                 WaitTF0();//等待延时结束 0.833ms                           
                    tem<<=1;
           }      
        }   
}

void Send_nill()//发送闲置位
{
  uchar n;
  unsigned long s=0x7A89C197;
  for(n=0;n<32;n++)
   {
          if(s&0x80000000)TX= HIGH ;else TX=LOW;
          WaitTF0();//等待延时结束 0.833ms                           
          s<<=1;
   }
}

void Send_Num(unsigned long s)         //发送数据
{
   uchar n;
   for (n=0;n<32;n++)
    {  
          if(s&0x80000000)TX= HIGH ;else TX=LOW;
          WaitTF0();//等待延时结束 0.833ms                           
          s<<=1;
    }   
}         

void Print_code(unsigned long p)  //串口打印,用于测试BCH值
{
  uchar i;
  unsigned long t;
  t=p;
  for(i=0;i<32;i++,t<<=1)
   {
         if(t&0x80000000)
          {
            SBUF=0x31;
                while(TI==0);
                TI=0;
          }
         else
          {
                SBUF=0x30;
                while(TI==0);
                TI=0;
          }         
   }
  SBUF=0x0D;
                while(TI==0);
                TI=0;

  SBUF=0x0A;
                while(TI==0);
                TI=0;
  
   t=p;
   t<<=21;
   for(i=0;i<10;i++,t<<=1)
    {
          if(t&0x80000000)
           {
        SBUF=0x31;
                while(TI==0);
                TI=0;
          }
         else
          {
                SBUF=0x30;
                while(TI==0);
                TI=0;
          }         
        }
   SBUF=0x0D;
                while(TI==0);
                TI=0;

   SBUF=0x0A;
                while(TI==0);
                TI=0;  
}

         

main()
{
    uchar i,n;
        unsigned long tem;
        unsigned long star;  
        unsigned long sync;         //同步码
        unsigned long mess;  //信息码        
        

        UartInit();  //串口初始化

        TMOD|=0x01;  //定时器0为模式1 (16位定时器)                                    
        TL0 = 0x53;                //设置定时初值
        TH0 = 0xF7;                //设置定时初值
    ET0=1; //定时器0充许中断
        TR0=0;        
        EA=1;  //开总中断
        TX = 0;
        
    P2M0 = 0x01;//设P2_0为推挽输出模式
        P2M1 = 0x00;

    PTT= 0;        
        star = 0xAAAAAAAA; //前导码
        sync = 0x7CD215D8; //同步码        
   
        tem=calc_addr(1234567,1);//前面是地址码,后面是BB机内00 01 10 11  代表0,1,2,3种不同的声音        
    addr=calc_bch_and_parity(tem);//取得BCH校验后的地址码序列
        mess=calc_bch_and_parity( 0xA0C37000);//信息码28167数字码,取0010(2)的反顺序0100输入
        Print_code(mess);  //从串口打印32位信息码和BCH校验码


   while(1)
    {           
           PTT = 0;
           Delay200ms();        
           TL0 = 0x53;                //设置定时初值
           TH0 = 0xF7;                //设置定时初值                 
           TIMER0_ENABLE; //启动定时器
           Send_start(star); //引导码
       Send_Num(sync);        //同步码

       for(i=0;i<8;i++)  //发送一个批次,共8帧数据
            {
              if(Tx_Num==i)        //计算地址码插入的帧位,本例为第7帧
               {
                      Send_Num(addr);          //地址码
                      Send_Num(mess);          //信息码
               }
              else
               {
              Send_nill();        //闲置码
                      Send_nill();        //闲置码                     
                   }
            }                        
           Send_Num(0xFFFFFFFF);
           TX=LOW;
           TIMER0_DISABLE;
           Delay200ms();
           Delay200ms();
           Delay200ms();
           Delay200ms();
           Delay200ms();
           PTT = 1;  
     }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏15 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2016-10-6 22:10 来自手机 | 只看该作者
这个很好,楼主能描述一下外外接电路怎么连吗
回复

使用道具 举报

板凳
ID:18867 发表于 2016-10-7 16:31 | 只看该作者
本帖最后由 PLA 于 2016-10-7 16:36 编辑

发射机用宝峰5R改装,p2.0接对讲机的数据输入端,p2.2接对讲机的PTT,有兴趣 的留言,P2.0接图中的红色标记处位。

QQ图片20160824212451.jpg (77.84 KB, 下载次数: 197)

QQ图片20160824212451.jpg
回复

使用道具 举报

地板
ID:140601 发表于 2016-11-7 09:35 | 只看该作者
厉害了,楼主说点原理啊,详细点,好玩儿
回复

使用道具 举报

5#
ID:140601 发表于 2016-11-7 09:39 | 只看该作者
厉害了,详细说说原理会更过瘾~
回复

使用道具 举报

6#
ID:69271 发表于 2016-11-9 17:38 | 只看该作者
这个东西太老了,原理没有讲,你写那么多,并且没有电路图,谁能看懂?
回复

使用道具 举报

7#
ID:204213 发表于 2017-5-24 10:58 | 只看该作者
用89C52的单片机,可以吗??
回复

使用道具 举报

8#
ID:204213 发表于 2017-5-25 11:12 | 只看该作者
LZ上传个电路可好,只看代码,看不懂呀
回复

使用道具 举报

9#
ID:204213 发表于 2017-5-31 10:21 | 只看该作者
跪求电路图!!
回复

使用道具 举报

10#
ID:225369 发表于 2017-8-7 09:34 | 只看该作者

就像这个图,晶体换成32M
图中脚位再核对一下。
可能有变动。
回复

使用道具 举报

11#
ID:233842 发表于 2017-11-10 16:45 | 只看该作者
20538274@qq.com
能唤醒 NEC数至尊 吗?
求资料和教程
回复

使用道具 举报

12#
ID:204213 发表于 2017-11-27 16:54 | 只看该作者
我要试一下,看看能不能把我的传呼机给呼响
回复

使用道具 举报

13#
ID:249545 发表于 2018-1-14 09:20 | 只看该作者
虽然我玩了10多年无线,也有个人电台数台,和呼号BH7KHV.也用过对讲机,BP机.但是玩DIY硬件的,对于这个真不易看懂.
楼主老师是在个人电脑上编辑文字后,输出到USB线,USB线接CH340,再接STC12C5A60S,再控制150MHZ对讲机发射.
同频率BP机来接收吗?就是发数字~??
回复

使用道具 举报

14#
ID:204213 发表于 2018-5-14 17:31 | 只看该作者
好久没有人顶了,有新资料上传吗??
回复

使用道具 举报

15#
ID:204213 发表于 2018-5-17 11:04 | 只看该作者
GUOXUAN 发表于 2018-1-14 09:20
虽然我玩了10多年无线,也有个人电台数台,和呼号BH7KHV.也用过对讲机,BP机.但是玩DIY硬件的,对于这个真不易 ...

是不是需要在电脑上有个程序,这个程序把用户输入的文字通过串口传到单片机上,然后再靠对讲机发射?
回复

使用道具 举报

16#
ID:18867 发表于 2018-5-28 14:17 来自手机 | 只看该作者
govox 发表于 2018-5-17 11:04
是不是需要在电脑上有个程序,这个程序把用户输入的文字通过串口传到单片机上,然后再靠对讲机发射?

这个程序不完整,只能发固定的数字
回复

使用道具 举报

17#
ID:357018 发表于 2018-6-23 08:24 | 只看该作者
楼主:红色标记处要飞线连哪里?请指教,我做成功,谢谢!
回复

使用道具 举报

18#
ID:277550 发表于 2019-1-4 09:51 | 只看该作者
还有人研究连接别的对讲机的么     讨论讨论
回复

使用道具 举报

19#
ID:505153 发表于 2019-4-10 01:37 | 只看该作者
一次能发送多少字?
回复

使用道具 举报

20#
ID:375228 发表于 2020-2-10 23:25 | 只看该作者
有没有成功的详细说说
回复

使用道具 举报

21#
ID:695866 发表于 2020-2-20 23:29 | 只看该作者
现在呼响不是问题,问题是F协议呼响。
回复

使用道具 举报

22#
ID:253767 发表于 2020-6-3 06:54 | 只看该作者
谢谢分享!!!
回复

使用道具 举报

23#
ID:274739 发表于 2020-12-9 20:02 | 只看该作者
实在是 弄不明白     有没有现成的   导出文件  提供一下   谢谢



回复

使用道具 举报

24#
ID:18867 发表于 2021-1-17 07:52 | 只看该作者
xiao_chun 发表于 2020-12-9 20:02
实在是 弄不明白     有没有现成的   导出文件  提供一下   谢谢

STC单片机头文件没有
回复

使用道具 举报

25#
ID:832201 发表于 2021-4-16 14:59 | 只看该作者
牛啊,赞
回复

使用道具 举报

26#
ID:1031190 发表于 2022-6-17 22:29 来自手机 | 只看该作者
这个是头文件定义不一样,把它改为#define TX  P20   //数据输出端 #define PTT P22   //PTT控制端,去中间一横就可以通过了,另还有一个警告,可"n"删除
回复

使用道具 举报

27#
ID:1043483 发表于 2022-9-9 14:41 | 只看该作者
PLA 发表于 2016-10-7 16:31
发射机用宝峰5R改装,p2.0接对讲机的数据输入端,p2.2接对讲机的PTT,有兴趣 的留言,P2.0接图中的红色标记 ...

请问有没有教程
回复

使用道具 举报

28#
ID:204213 发表于 2023-12-31 20:58 | 只看该作者
  这个帖子还在呀,有更新信息吗?硬件连接的电路图有上传的吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表