硬件设计
链接:https://pan.baidu.com/s/10UQ9OEOgZbuSICMQBaMe9A
提取码:juad
原理图:
PCB:
程序设计
#include "STC15Fxxxx.H"
#include "config.h"
#include "delay.h"
#include "GPIO.h"
#include "lcd.h"
#include "uart.h"
#include "queue.h"
#include "speaker.h"
/
// 指令相关
/
TYPE tx_buf[128];
TYPE head[] = "\r\n";
TYPE tail[] = "\r\n";
TYPE at[] = "AT";
TYPE dmo[] = "+DMO";
TYPE cnt[] = "CONNECT";
TYPE grp[] = "SETGROUP";
TYPE aut[] = "AUTOPOWCONTR";
TYPE ver[] = "VERQ";
TYPE vol[] = "SETVOLUME";
TYPE vox[] = "SETVOX";
TYPE mic[] = "SETMIC";
TYPE mes[] = "MES";
//TYPE* cmd[] = { cnt, grp, aut, ver, vol, vox, mic, mes, NULL };
unsigned int ch_hi[ CH_N ] = { 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438 };
unsigned int ch_lo[ CH_N ] = { 2250, 3000, 3500, 4000, 4500, 5000, 5500, 6000, 6500, 7000, 7500, 8000, 8500, 9000, 9500 };
TYPE sms_str[SMS_N][17] = { "Hello world!",
"CQ CQ CQ",
"Happy Birthday!",
"I Love You!",
"Good Bye " };
TYPE *MAKE_STR( TYPE *dst, TYPE *str )
{
while ( *str != '\0' )
{
*(dst++) = *(str++);
}
return dst;
}
void AT_SetGroup( TYPE *dst,
unsigned int Tx_Hi,
unsigned int Tx_Lo,
unsigned int Rx_Hi,
unsigned int Rx_Lo,
unsigned char GBW,
unsigned char Tx_C,
unsigned char Rx_C,
unsigned char SQ )
{
#if MAKE_HEAD
dst = MAKE_STR(dst,head);
#endif
dst = MAKE_STR(dst,at);
dst = MAKE_STR(dst,dmo);
dst = MAKE_STR(dst,grp);
*(dst++) = '=';
*(dst++) = ( GBW & 0x01 ) + '0';
*(dst++) = ',';
*(dst++) = ( Tx_Hi / 100 % 10 ) + '0';
*(dst++) = ( Tx_Hi / 10 % 10 ) + '0';
*(dst++) = ( Tx_Hi % 10 ) + '0';
*(dst++) = '.';
*(dst++) = ( Tx_Lo / 1000 % 10 ) + '0';
*(dst++) = ( Tx_Lo / 100 % 10 ) + '0';
*(dst++) = ( Tx_Lo / 10 % 10 ) + '0';
*(dst++) = ( Tx_Lo % 10 ) + '0';
*(dst++) = ',';
*(dst++) = ( Rx_Hi / 100 % 10 ) + '0';
*(dst++) = ( Rx_Hi / 10 % 10 ) + '0';
*(dst++) = ( Rx_Hi % 10 ) + '0';
*(dst++) = '.';
*(dst++) = ( Rx_Lo / 1000 % 10 ) + '0';
*(dst++) = ( Rx_Lo / 100 % 10 ) + '0';
*(dst++) = ( Rx_Lo / 10 % 10 ) + '0';
*(dst++) = ( Rx_Lo % 10 ) + '0';
*(dst++) = ',';
if ( Rx_C >= 100 )
*(dst++) = ( Rx_C / 100 % 10 ) + '0';
*(dst++) = ( Rx_C / 10 % 10 ) + '0';
*(dst++) = ( Rx_C % 10 ) + '0';
*(dst++) = ',';
*(dst++) = ( SQ % 9 ) + '0';
*(dst++) = ',';
if ( Tx_C >= 100 )
*(dst++) = ( Tx_C / 100 % 10 ) + '0';
*(dst++) = ( Tx_C / 10 % 10 ) + '0';
*(dst++) = ( Tx_C % 10 ) + '0';
dst = MAKE_STR(dst,tail);
*dst = '\0';
}
void AT_SetChennal( TYPE*dst, unsigned ch )
{
if ( ch<0 || ch>=CH_N )
return;
AT_SetGroup( dst,
ch_hi[ch],
ch_lo[ch],
ch_hi[ch],
ch_lo[ch],
1,
0,
0,
3 );
}
void AT_Connect( TYPE *dst )
{
#if MAKE_HEAD
dst = MAKE_STR(dst,head);
#endif
dst = MAKE_STR(dst,at);
dst = MAKE_STR(dst,dmo);
dst = MAKE_STR(dst,cnt);
dst = MAKE_STR(dst,tail);
*dst = '\0';
}
void AT_Make_SMS( u8 sms, TYPE *dst )
{
u8 len = 0;
TYPE *p = sms_str[sms];
while ( *p != '\0' )
{
len++;
p++;
}
#if MAKE_HEAD
dst = MAKE_STR(dst,head);
#endif
dst = MAKE_STR(dst,at);
dst = MAKE_STR(dst,dmo);
dst = MAKE_STR(dst,mes);
*(dst++) = '=';
*(dst++) = len;
dst = MAKE_STR(dst,sms_str[sms]);
dst = MAKE_STR(dst,tail);
*dst = '\0';
}
/
// 控制相关
/
char ch = 0;
char sms = 100;
char tmp[128];
void SPEAKER_INI()
{
INI_QUEUE( &RX_BUF );
ch = 0;
sms = 100;
SET_CH();
delay_ms(500);
SET_CH();
}
//函数说明
//信道增加
void Key_0_()
{
ch++;
if ( ch >= CH_N )
ch = 0;
SET_CH();
}
//函数说明
//信道减一
void Key_1_()
{
ch--;
if ( ch < 0 )
ch = CH_N - 1;
SET_CH();
}
//函数说明
//数传选择
void Key_2_()
{
sms++;
if ( sms >= SMS_N )
sms = 0;
SET_SMS();
}
//函数说明: 按键程序
//发射键
void Key_3_()
{
PTT = 0;
}
//按键扫描
void KEYBOARD()
{
u8 temp;
temp = P2&0x0F;
if(temp != 0x0F)
{
delay(10);
temp = P2&0x0F;
if(temp!= 0x0F)
{
switch(temp)
{
case 0x0E: Key_0_();PTT = 1; break; //20
case 0x0D: Key_1_();PTT = 1; break; //21
case 0x0B: Key_2_();PTT = 1; break; //22
case 0x07: Key_3_(); break; //23
default: PTT = 1; break;
}
}
while ( (P2&0x0F) != 0x0F ) //先进来在判断死循环
;
}
else
PTT = 1;
}
void SET_CH()
{
AT_SetChennal( tx_buf, ch );
SEND_STRING( tx_buf );
lcd_pos( 0x00 );
lcd_wdat( 'C' );
lcd_wdat( 'H' );
SHOW_NUM( 0, 2, ch, 2 );
SHOW_NUM( 0, 6, ch_hi[ch], 3 );
lcd_wdat( '.' );
SHOW_NUM( 0, 10, ch_lo[ch], 4 );
}
void SET_SMS()
{
.
文件仅供参考:
.