标题:
单片机串口通讯相关疑惑
[打印本页]
作者:
cooperwhj
时间:
2019-12-31 20:13
标题:
单片机串口通讯相关疑惑
以下是我超声波无线传输测距从机部分,现在我加了一些串口通讯功能将距离数据,可是电脑串口收到结果却是乱码?
请大家帮忙看下串口部分有无问题
单片机源程序如下:
#include <reg52.h>
#include "eepom52.h"
#define uchar unsigned char
#define uint unsigned int
#include "nrf24l01.H"
#include "lcd1602.h"
#include<stdio.h>
sbit K3 = P3^0; //按键定义
sbit K2 = P3^1;
sbit K1 = P3^2;
sbit beep = P1^6; //蜂鸣器IO口定义
sbit led = P1^7; //无线模块型号指示灯
uchar a_a =0;
unsigned long S=0; //距离
unsigned char code mcustudio[] ={" CeJu-System "};
unsigned char code email[] = {" ^_^ "};
unsigned char code Cls[] = {" "};
unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
unsigned int Set_d = 144;
unsigned char disbuff[4] ={ 0,0,0,0}; //显示数据数组
bit bSetFlag = 0,bTime_600ms,flag_300ms,bClrFlag;
bit flag =0;
/******************把数据保存到单片机内部eepom中******************/
void write_eepom()
{
SectorErase(0x2000);
byte_write(0x2000, Set_d % 256);
byte_write(0x2001, Set_d / 256);
byte_write(0x2058, a_a);
}
/******************把数据从单片机内部eepom中读出来*****************/
void read_eepom()
{
Set_d = byte_read(0x2001);
Set_d <<= 8;
Set_d |= byte_read(0x2000);
a_a = byte_read(0x2058);
}
/**************开机自检eepom初始化*****************/
void init_eepom()
{
read_eepom(); //先读
if(a_a != 1) //新的单片机初始单片机内问EEPOM
{
Set_d = 100;
a_a = 1;
write_eepom(); //写
}
}
/*************定时器0初始化程序***************/
void time_init()
{
EA = 1; //开总中断
TMOD = 0X01; //定时器0、定时器1工作方式1
ET0 = 1; //开定时器0中断
TR0 = 1; //允许定时器0定时
}
void KeyScanf(void) //按键处理函数
{
static bit K1_on_off;
static char add = 1; ///按键一次增加的变量
if(K1 == 0) //设置距离按键按下
{
if(K1_on_off)
{
K1_on_off = 0;
bSetFlag = ~bSetFlag; //按下标置位取反
bClrFlag = 1;
}
}
else {K1_on_off = 1;}
if(bSetFlag) //设置键按下
{
if(K2 == 0 && bTime_600ms) //设置键加按下
{
bTime_600ms = 0;
Set_d += add; //设置值加
if(Set_d >= 350)Set_d = 350; //设置值最大为3.5m
write_eepom(); //写保存
}
if(K3 == 0 && bTime_600ms) //设置键减键按下
{
bTime_600ms = 0;
Set_d -= add; //设置值减
if(Set_d <= 10)Set_d = 10; //设置值最大为0.1m
write_eepom(); //写保存
}
if ((K3 == 0 || K2 == 0) && bTime_600ms)//有设置加减键按下
{
bTime_600ms = 0;
if(++add >= 10)add = 10;
}
else if(K3 != 0 && K2 != 0)add = 1; //没有设置加减键按下
}
}
/****************报警函数***************/
void clock_h_l()
{
static unsigned char value;
if(S <= Set_d)
{
value ++; //消除实际距离在设定距离左右变化时的干扰
if(value >= 2)
{
beep = ~beep; //蜂鸣器报警
}
}
else
{
value = 0;
beep = 1; //取消报警
}
}
void SetDisplay(void)
{
DisplayListChar(0,0," Set_DIST: ");
disbuff[0]=Set_d%1000/100;
disbuff[1]=Set_d%1000%100/10;
disbuff[2]=Set_d%1000%10 %10;
DisplayOneChar(5, 1, ASCII[disbuff[0]]);
DisplayOneChar(6, 1, ASCII[10]); //显示点
DisplayOneChar(7, 1, ASCII[disbuff[1]]);
DisplayOneChar(8, 1, ASCII[disbuff[2]]);
DisplayOneChar(9, 1, ASCII[12]); //显示M
}
void DISPLAY(void)
{
if(bSetFlag == 0) //按键设置标志位
{
disbuff[0]=Set_d%1000/100;
disbuff[1]=Set_d%1000%100/10;
disbuff[2]=Set_d%1000%10 %10;
DisplayOneChar(0, 1, 'A');
DisplayOneChar(1, 1, ':');
DisplayOneChar(2, 1, ASCII[disbuff[0]]);
DisplayOneChar(3, 1, ASCII[10]); //显示点
DisplayOneChar(4, 1, ASCII[disbuff[1]]);
DisplayOneChar(5, 1, ASCII[disbuff[2]]);
DisplayOneChar(6, 1, ASCII[12]); //显示M
if((S>=700)||flag==1) //超出测量范围显示“-”
{
flag=0;
//dd(" A3.45m 2.15m ")
DisplayOneChar(10, 1, ASCII[11]);
DisplayOneChar(11, 1, ASCII[10]); //显示点
DisplayOneChar(12, 1, ASCII[11]);
DisplayOneChar(13, 1, ASCII[11]);
DisplayOneChar(14, 1, ASCII[12]); //显示M
}
else
{
disbuff[0]=S%1000/100;
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%10 %10;
DisplayOneChar(10, 1, ASCII[disbuff[0]]);
DisplayOneChar(11, 1, ASCII[10]); //显示点
DisplayOneChar(12, 1, ASCII[disbuff[1]]);
DisplayOneChar(13, 1, ASCII[disbuff[2]]);
DisplayOneChar(14, 1, ASCII[12]); //显示M
}
}
}
/*******************************************************************************
* 函数名 :UsartInit()
* 函数功能 :设置串口
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void UsartInit()
{
SCON=0X50; //设置为工作方式1
TMOD=0X20; //设置定时器器工作方式2
PCON=0X80; //波特率加倍
TH1=0XFD; //定时器初始值设置,波特率是9600的
TL1=0XFD;
TR1=1; //打开定时器
TI=1;
}
/********主函数**********/
void main()
{
LCMInit(); //LCM初始化
time_init(); //初始化定时器
UsartInit(); //串口初始化
DisplayListChar(0, 0, mcustudio);
DisplayListChar(0, 1, email); //显示^_^
CE=0;
SCK=0; //无线模块初始化
CSN=1;
RX_Mode();
delay_ms(2000);
DisplayListChar(0, 1, Cls); //清屏
init_eepom(); //开机自检eepom
while(1)
{
if(flag_300ms == 1) //300ms 处理一次测量程序
{
flag_300ms = 0;
led = 1; //无线模块的信号指示灯
if(nRF24L01_RxPacket(Rx_Buf)) //无线模块的数据接收
{
led =0 ;
if(Rx_Buf[0] == 0xa1)
S = 256 * Rx_Buf[2] + Rx_Buf[1]; //取出距离值
clock_h_l(); //报警函数
}
DISPLAY(); //显示距离
printf("%d\n",S); //串口显示距离
if(beep == 1)DisplayListChar(0, 0, mcustudio);
else DisplayListChar(0,0," Alarm ");
}
else
if(bSetFlag) //按键设置标志位
{
SetDisplay(); //按键设置显示函数
}
if(bClrFlag) //清除第二行显示标志位
{
bClrFlag = 0;
DisplayListChar(0, 1, Cls); //对第一行清屏
}
}
}
/*************定时器0中断服务程序***************/
void time0_int() interrupt 1
{
static uchar value;
TH0 = 0x3c;
TL0 = 0xb0; // 50ms
value ++;
KeyScanf(); //按键处理函数
if(value % 6 == 0)
{
flag_300ms = 1; //300ms
}
if(value == 12)
{
value = 0;
bTime_600ms = 1; //600ms
}
}
复制代码
作者:
Gan1111
时间:
2020-1-1 16:36
在线调试,找找问题
作者:
kialison
时间:
2020-1-1 19:30
换一个IO 测试,有的时候每个IO数据不稳定
作者:
jizhongbiao
时间:
2020-1-3 16:48
看看波特率有没有问题
作者:
1112y
时间:
2020-1-4 21:43
是不是串口调试助手设置不正确
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1