以下是我超声波无线传输测距从机部分,现在我加了一些串口通讯功能将距离数据,可是电脑串口收到结果却是乱码?
请大家帮忙看下串口部分有无问题
单片机源程序如下:
- #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
- }
- }
复制代码
|