找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1529|回复: 1
打印 上一主题 下一主题
收起左侧

单片机串口二波特率250000接收,转串口-9600到电脑串口助手

[复制链接]
跳转到指定楼层
楼主
串口二波特率250000接收,转串口一9600到电脑串口助,使用STC8H1K08单片机,IRC时钟30MHz。由于存储空间有限,串口缓存是20字节。15.6ms 以内的数据判断为一包,超过15.6毫秒的数据,判断为下一包数据,下次再打印到串口助手。


单片机源程序如下:
  1. #include "all.h"

  2. u8 xdata Uart_2R_1T_Buffer[Down_MAX];//串口缓存数组,串口2接收,串口1发送

  3. void Timer0_Init()
  4. {
  5.         AUXR &= 0x7F;                                                //定时器时钟12T模式
  6.         TMOD &= 0xF0;                                                //设置定时器模式
  7.         TMOD |= 0x02;                                                //设置定时器模式
  8.         TL0 = 0x83;                                                        //设置定时初始值
  9.         TH0 = 0x83;                                                        //设置定时重载值
  10.         TF0 = 0;                                                        //清除TF0标志
  11.         TR0 = 1;                                                        //定时器0开始计时
  12.         ET0=1;
  13.         EA=1;                                                                //中断总开关必须闭合导通
  14. }

  15. //*********************************《人人学会单片机》视频教程,祁绪电子2021-10
  16. //时间管理函数,用于数据包区分头尾,可以用定时器中断代替本函数。
  17. //*********************************《人人学会单片机》视频教程,祁绪电子2021-10
  18. void Timer0_Rountine(void) interrupt 1
  19. {
  20.         static u8 idata count1;
  21.         count1++;
  22.         if(count1>20)                                                //调整count值,使Uart_Timer每大约每1ms增加1。
  23.         {        
  24.                 count1=0;               
  25.                 Uart_Timer++;                                        //需要确保大约每1ms增加1
  26.                 if(Uart_Timer==15)                                //用于识别帧间隔,50ms定时
  27.                 {
  28.                         Uart1_Flag=1;                                //标志位允许发送下一次发送
  29.                         Uart1_Up_Data_Drive();                //调用串口发送函数(但不是每次都发送数据)
  30.                 }
  31.                 if(Uart_Timer==50)                                //用于识别帧间隔,50ms定时
  32.                 {
  33.                         Down_Count=0;                                //一帧数据包字节的位置归0,表示首字节
  34.                 }
  35.                 if(Uart_Timer>50)                                //用于识别帧间隔,50ms定时
  36.                 {
  37.                         Uart_Timer=51;                                //超时等待,防止大于255归0
  38.                 }
  39.         }
  40.         Uart1_Up_Data_Drive();                                //调用串口发送函数(但不是每次都发送数据)
  41. }

  42. void main()
  43. {
  44.         P1M0=0;P1M1=0;
  45.         Timer0_Init();
  46.         Uart1_Init();
  47.         Uart2_Init();
  48.         while(1)
  49.         {
  50.                
  51.         }
  52. }
复制代码
  1. #include "all.h"                                                                                         //从工程目录下》c_and_h文件夹查找all文件
  2. bit Uart1_Flag=1;

  3. void Uart1_Init()
  4. {
  5.         SCON = 0x50;                //8位数据,可变波特率
  6.         AUXR &= 0xBF;                //定时器时钟12T模式
  7.         AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  8.         TMOD &= 0x0F;                //设置定时器模式
  9.         TL1 = 0xBF;                //设置定时初始值
  10.         TH1 = 0xFF;                //设置定时初始值
  11.         ET1 = 0;                //禁止定时器%d中断
  12.         TR1 = 1;                //定时器1开始计时
  13.         
  14.         ES=1;                                                                                                        //允许 串口1 向CPU申请中断
  15.                                                                                                                         //总中断控制开关闭合EA=1;
  16. }//*/


  17. void Uart1_Up_Data_Drive()
  18. {
  19.         static u8 xdata count=0;
  20.         if(Uart1_Flag)                                                //标志允许,发送一个字节
  21.         {
  22.                 Uart1_Flag=0;                                        //标志位翻转,只允许发送一个字节,避免拥挤
  23.                 if(count<=Down_Count)
  24.                 {
  25.                         SBUF=Uart_2R_1T_Buffer[count];//每次只发送一个字节
  26.                         count++;                                        //字节编号增加。
  27.                 }
  28.                 else
  29.                 {
  30.                         Uart1_Flag=0;                                //大于最多发送数量,不发送了
  31.                         count=0;                                        //串口TI不会置1,所以不再发送
  32.                 }
  33.         }
  34. }


  35. void Uart1_Routine() interrupt 4
  36. {
  37.         if(RI)                                                                                                        //如果是接收中断
  38.         {
  39.                 RI=0;                                                                                                //清0标志
  40.         }
  41.         if(TI)                                                                                                        //否则应该是发送后的中断
  42.         {
  43.                 TI=0;                                                                                                //清发送中断标志
  44.                 Uart1_Flag=1;                                                                                //标志位允许发送下一次发送
  45.                 Uart1_Up_Data_Drive();                                                                //马上发送下一位数据
  46.         }
  47. }//*/
复制代码
Keil5代码下载:
STC8H单片机串口2转串口1.zip (44.81 KB, 下载次数: 14)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:884042 发表于 2022-7-29 21:55 | 只看该作者
您好,请问可以做一个STC单片机sram扩展的教程吗?STC单片机内部的sram太少了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表