切换到宽版
爱科技/爱创意/爱折腾/爱极致;技术知识分享平台,点击进入新版数码之家网站
  • 2345阅读
  • 9回复

[无线]自制对讲机K头线,配合MP3和单片机实现自动间歇发播,用于独自外出测试 [复制链接]

上一主题 下一主题
离线bybeen
 

发帖
382
M币
2534
专家
33
粉丝
52
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2017-11-13
前些天买的BF-C1对讲机(拆机图传送门:http://bbs.mydigit.cn/read.php?tid=2275323),
实测了一下,在建筑密集的小区,一方在室内,能有效通话的距离也就500多米。
想起手头还有一个433MHz的吸盘天线,改了SMA外螺纹内孔的头,等有时间出去测试下。
想要一个人完成测试,于是有了标题的构思,自动发播装置。
因为对讲机不是设计用来连续发播的,持续发播会发热,本身也有连续发播时间限制(2分钟),
于是用单片机搭了个定时发播的电路,占空比从1/2(发5秒停5秒)到1/6(发5秒停25秒)五档可调。
用MP3做音源,在外收听即可。上图:
整体外观


电路板


“死特惨”15F104E


电路板背面


3.5mm和2.5mm大小两个插头


连上电源和音源就可以自动间歇发播了。



电路板上的按钮用于调节占空比,按照1/2,1/3,1/4,1/5,1/6的顺序循环切换。
特设继电器“敲击式”反馈——脑洞大开的人机交互方式——
按钮松开1秒钟开始,继电器以每500ms吸合100ms的规律做“敲击”动作,敲击次数即为占空比的分母,
敲完2秒钟后,进入工作状态。
也就是说,按完按钮,只要数一下继电器敲了几次,就知道当前占空比了——敲了2次就是1/2,3次就是1/3……
手绘电路图:


代码<Main.c>
  1. //PTT_CTRL - Main.c
  2. #include <STC15F104E.H>
  3. #include <KEY.C>
  4. #define    TH1_Load    0xfe        //6MHz下,12T定时器定时1ms
  5. #define    TL1_Load    0x0c
  6. sbit Q = P3^4;
  7. bit Clk1ms = 0;
  8. void main()
  9. {
  10.     int msCount=0;
  11.     unsigned char PTT_Count=0,PTT_SP=6,KnockCount=0,KnockDelay=0;
  12.     bit PTT_ON=0,Knock_ON=0;
  13.     P3 = 0xFF;
  14.     TMOD =    0x11;     //16位定时器
  15.     TL1 = TL1_Load;
  16.     TH1 = TH1_Load;
  17.     TR1 = 1;
  18.     ET1 = 1;
  19.     EA = 1;    
  20.     while(1)
  21.     {
  22.         if(Clk1ms)
  23.         {
  24.              Clk1ms = 0;
  25.             KEY_Scan();
  26.             msCount++;
  27.             PTT_ON = (PTT_Count < 5);    //每个周期接通5秒
  28.             
  29.             if(KnockCount)            //用继电器的点动敲击(Knock)作为输出信息的交互手段,此期间继电器由Konck_ON信号控制
  30.                 Q = !Knock_ON;
  31.             else                //正常工作时间,继电器由PTT_ON信号控制
  32.                 Q = !PTT_ON;
  33.             
  34.             if(msCount%10 == 2)            //10ms例程
  35.             {
  36.                 if(KnockDelay) KnockDelay--;        
  37.             }
  38.             if(msCount%50 == 4)            //50ms例程
  39.             {
  40.                    ;
  41.             }
  42.             if(msCount%100 == 6)        //100ms例程
  43.             {
  44.                 Knock_ON = 0;            //敲击吸合时长100ms(实际是98)
  45.             }
  46.             if(msCount%500 == 8)        //500ms例程
  47.             {
  48.                 if(KnockCount && (KnockDelay==0))            //敲击间隔时长500ms
  49.                 {
  50.                     KnockCount--;
  51.                     Knock_ON = 1;
  52.                     if(KnockCount==0) PTT_Count = PTT_SP*5-3;    //交互结束不立即进入工作,延迟2秒以便听者区分
  53.                 }
  54.             }
  55.             if(msCount%1000 == 8)        //1000mms例程
  56.             {
  57.                 if(++PTT_Count >= PTT_SP*5) PTT_Count = 0;        //PTT_SP在2~6之间,则总时间在10~30秒之间,接通时间固定5秒
  58.             }                                //故接通占空比为(1/PTT_SP)
  59.                 if(msCount>9999)        //10s例程
  60.             {
  61.                 msCount = 0;    
  62.             }
  63.         }
  64.         //===============================
  65.         //按键响应
  66.         if(KEY_SB[0])
  67.         {
  68.             if(++PTT_SP>6) PTT_SP = 2;        //2~6循环
  69.             KnockCount = PTT_SP + 1;        //以继电器敲击次数告知听者当前的PTT_SP值
  70.             KnockDelay = 100;            //按键结束不立即进入交互,延迟1秒以便听者区分
  71.             KEY_SB[0]--;
  72.         }
  73.     }
  74. }
  75. //===========================================
  76. //中断
  77. //===========================================
  78. void T1INT() interrupt 3
  79. {
  80.     TL1 = TL1_Load;
  81.     TH1 = TH1_Load;
  82.     Clk1ms = 1;
  83. }

代码<KEY.C>
  1. //==============================
  2. //按键驱动
  3. sbit KEY_0        =    P3^3;
  4. //sbit KEY_1        =    P3^6;
  5. //sbit KEY_2        =    P3^7;
  6. unsigned char KEY_SB[3]={0,0,0},KEY_SBH[3]={0,0,0};
  7. void KEY_Scan()
  8. {
  9.     unsigned char i,Key[3];
  10.     static unsigned char k[3]={1,1,1},m[3]={1,1,1},kc[3]={0,0,0},VerifyCycles=8;
  11.     static unsigned int RepDly[3]={0,0,0};
  12.     Key[0] = KEY_0;
  13. //    Key[1] = KEY_1;
  14. //    Key[2] = KEY_2;
  15.     for(i=0;i<1;i++)
  16.     {
  17.         if (k[i] == Key[i])    kc[i] = 0;
  18.         else if (kc[i]++>VerifyCycles) k[i] = Key[i];
  19.             
  20.         if (!k[i] && m[i]) KEY_SB[i]++;
  21.         if (k[i]) KEY_SBH[i] = 0; else KEY_SBH[i] = 1;
  22.         
  23.         if (KEY_SBH[i]) RepDly[i]++; else RepDly[i] = 0;
  24.         if (RepDly[i] > 250)
  25.         {
  26.             KEY_SB[i]++;
  27.             RepDly[i] = 200;
  28.         }
  29.         m[i] = k[i];
  30.     }
  31. }

谢谢观赏!

本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共7条打赏M币+140专家+1
离线阳光使者

发帖
32867
M币
5513
专家
113
粉丝
328
只看该作者 1楼 发表于: 2017-11-13
请登录后查看
离线635306791

发帖
7672
M币
5436
专家
1
粉丝
47
只看该作者 2楼 发表于: 2017-11-13
请登录后查看
离线965039114

发帖
6143
M币
36775
专家
115
粉丝
367
只看该作者 3楼 发表于: 2017-11-13
请登录后查看
离线bybeen

发帖
382
M币
2534
专家
33
粉丝
52
只看该作者 4楼 发表于: 2017-11-13
回 965039114 的帖子
请登录后查看
离线tttlm

发帖
990
M币
978
专家
1
粉丝
29
只看该作者 5楼 发表于: 2017-11-13
请登录后查看
离线bybeen

发帖
382
M币
2534
专家
33
粉丝
52
只看该作者 6楼 发表于: 2017-11-13
请登录后查看

发帖
1592
M币
1534
专家
2
粉丝
50
只看该作者 7楼 发表于: 2017-11-14
请登录后查看
离线devcang

发帖
18104
M币
9149
专家
20
粉丝
97
只看该作者 8楼 发表于: 2017-11-14
请登录后查看
离线exitwin98

发帖
164
M币
380
专家
1
粉丝
10
只看该作者 9楼 发表于: 2017-11-14
请登录后查看
快速回复
限80 字节
“新手上路”发帖需审核后才能显示(请认真发帖),达到数码9级后取消此限制
 
上一个 下一个