基于51单片机的对讲机原理图PCB程序设计

硬件设计

链接: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()
{

.

文件仅供参考:

.

  • 11
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值