三、通信聊天
任务要求:
用单片机实现与串口调试助手的通信,具体功能如下:
1、通过蓝牙模块(需要领取,如果使用笔记本电脑做该题,则只需要领取一个蓝牙模块,如果使用台式机则需要领取两个蓝牙模块外加一条USB转TTL线,尽量使用笔记本电脑,简化工作,学院的USB转TTL线并不多)实现与电脑串口调试助手的连接;(15分)
2、设定单片机的两种运行模式:接收消息/发送消息,同时按下按键A6和A7进行模式切换;(20分)
3、实现由电脑串口调试助手发送字母或数字给单片机,并由开发板OLED显示出来。(20分)
4、从PC端串口助手发送一个字符串到单片机,OLED显示屏显示该字符串,并通过按键上下左右选择其中任意一个字符,并将选中的字符发送回PC端。其中按键A4为上移方向、A5为下移方向、A6为左移方向、A7为右移方向。(25分)
5、单片机发送字符成功后流水灯亮起,接收到消息后蜂鸣器发出短暂声响。(20分)
附加题:
自行编写上位机软件与单片机通信,编程语言不限,基本功能必须有发送数据和接收数据并显示的功能。
【注释】
1、已提供串口调试助手软件;
2、蓝牙模块需要同学们自己外接,手柄板上有现成的接口,如需详细了解其引脚连接,可查看手柄板原理图。此部分涉及知识为串口通讯,蓝牙模块更多信息请参考说明书或网络资料。
3、请同学们根据自己情况搭配杜邦线(学院每位同学提供五根)与口袋开发板外接引脚(排针)连接,详见实验板数据手册。
部分程序:
c/*
* 引脚说明:
* KEY:
* P1.2 返回1 在发送模式下,按一下就发送字符
* P1.3 返回2 上 只有在发送模式下可以用
* P1.4 返回3 下 只有在发送模式下可以用
* P1.5 返回4 左 只有在发送模式下可以用
* P1.6 返回5 右 只有在发送模式下可以用
* 时按P1.5 P1.6 返回6 切换接收/发送
* BEEP:P5.6
* 指示灯:P6.7
* 8个LED:P4
* OLED CS P3.0 DC P2.7 RST P2.6 D1 P3.1 D0 P3.3
* 蓝牙串口UART1:P3.6tx P3.7rx 9600波特率
* 功能说明:
* 1 总体说来系统是一个聊天功能
* 2 依靠同时按P1.5 P1.6 来修改系统为发送模式或者是接收模式
* 3 接收模式状态下指示灯点亮,发射模式下只是灯不亮
* 4 接收模式下单片机可以接收电脑发送的字符串,每接受一帧字符串单片机蜂鸣器就要响一声
* 接收的字符串全部存入暂存区并在oLED中显示出来,最多可以接收64个字符
* 5 发送模式下,用户可以通过上下左右按键选择某一个字符
* OLED会将选择的字符以不一样的方式显示出来
* 中一个字符后可以按1.2按键将选中的字符发送到电脑
* 发送成功流水灯会亮一下
* 特殊说明:
* 1 转接板上面有复位按键
* 2 蓝牙模块使用5伏直流电压供电
* 3 使用的是串口1
* 4 user.c里面存放初始化程序和按键检测程序
* 5 isr.c里面存放定时器中断程序和串口接收中断程序 定时器中断程序中会有判断流水灯和判断接收一帧数据是否完毕的逻辑
* 6 task_oled.c里面存放oLED的显示驱动代码
*/
char taskBusy;
void main( void )
{
unsigned char temp;
char len_temp = 0;
WDT_Init(); /*看门狗设置 */
Clock_Init(); /* 系统时钟设置 */
User_SystemInit(); /* 用户控制系统初始化函数 */
Timer_Init( TimerA, 10000 ); /* 10ms定时器中断 */
UART_Init( UART0, 9600 ); /* 初始化串口 */
GPIO_Set( P6, 7, sys_mode_rt ); /* sys_mode_rt=0蓝色灯点亮 表示处于接收模式 =1不亮表示处于发送模式 */
memset( receive_data_buff, ' ', 64 ); /* 初始化数据暂存区 */
TBCCTL0 = CCIE; /* CCR0 interrupt enabled */
TBCCR0 = 1000;
TBCTL = TBSSEL_2 + MC_0 + ID_3; //关闭蜂鸣器
_EINT(); /* 打开总中断 */
while ( 1 )
{
/* 更新接收到的字符串 */
if ( len_temp != receive_data_length ) /* 检测到接收字符串长度有变化=只是说有新接收到一帧数据 */
{
len_temp = receive_data_length; /* 把新的数据长度负责给暂存变量 */
if ( receive_data_length <= 64 )
{
OLED_DisplaysCertainLengthString( receive_data_buff, 64 ); /*有新接收到一帧数据=就需要重新刷新显示 */
}
}
//蜂鸣器控制
if ( receive_finish == 2 ) /* 这个条件表示一帧数据已经接收完毕 */
{
receive_finish = 10; /* 重新将receive_finish负值为一个不相关的变量 不是012即可 */
TBCTL = TBSSEL_2 + MC_1 + TBCLR + ID_3; //打开蜂鸣器
delay_ms(30);
TBCTL = TBSSEL_2 + MC_0 + ID_3; //关闭蜂鸣器
GPIO_Set( P5, 6, 0 ); /* 关闭蜂鸣器 */
}
temp = TestKeyInput(); /* 检测按键 */
if ( temp )
{
ProcessKeyInput( temp ); /* 处理按键 */
}
if ( taskBusy == 1 )
{
User_RealTimeTask( 100 ); /* 实时控制任务 */
}else {
User_IdleTask();
}
}
}
/* Timer B0 interrupt service routine */
#pragma vector=TIMERB0_VECTOR
__interrupt void Timer_B( void )
{
GPIO_turn( P5, 6 );
}
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!