IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STC12c-UART1 串口 通信设置 -> 正文阅读

[嵌入式]STC12c-UART1 串口 通信设置

一般情况下,编写串口通信程序的基本步骤如下:
配置串口为模式 1 ( SCON = 0x50)// 0101 0000
配置定时器 T1 为模式 2,即自动重装模式    (配置T1为 8位重装载 模式 -> 产生波特率用 )(TMOD = 0x20) //0010 0000
根据波特率计算 TH1 和 TL1 的初值,如果有需要可以使用 PCON 进行波特率加倍(因为有些晶振选用的波特率偏差太大,得加倍Baud才能缩小偏差)
打开定时器控制寄存器 TR1,让定时器跑起来产生Baud 。 // TR = 1;
Step 1.
在这里插入图片描述
Step 2.
在这里插入图片描述
在这里插入图片描述
Step 3.

定时器的重载值计算公式为:
一 12T模式时
TH1 = TL1 = 256 - 晶振值/12 /2/16 /波特率
比如
TMOD &= 0x0F; //复位定时器1控制信息0f=0000 1111
TMOD |= 0x20; //设定定时器1为模式2,8位自动重装方模式20=0010 0000
TL1 = 0xFD; //设定定时器1初值
TH1 = 0xFD; //设定定时器1重装值
TL1,TH1值0xFD的计算如下:
TH1 = TL1 = 256 - 晶振值/12 /2/16 /波特率
=256-11059200/12/2/16/9600=253=0xFD
二 1T模式时
和波特率有关的还有一个寄存器,是一个电源管理寄存器 PCON,他的最高位可以把波
特率提高一倍,也就是如果写 PCON |= 0x80 以后,计算公式就成了:

TH1 = TL1 = 256 - 晶振值/12 /16 /波特率

公式中数字的含义这里解释一下,
256 是 8 位定时器的溢出值,也就是 TL1 的溢出值,
晶振值就是 11059200,
12 是说 1 个机器周期等于 12 个时钟周期,
值得关注的是这个 16,我们来重点说明。在 IO 口模拟串口通信接收数据的时候,采集的是这一位数据的中间位置,而实际上串口模块比我们模拟的要复杂和精确一些。他采取的方式是把一位信号采集 16 次,其中第 7、8、9 次取出来,这三次中其中两次如果是高电平,那么就认定这一位数据是 1,如果两次是低电平,那么就认定这一位是 0,这样一旦受到意外干扰读错一次数据,也依然可以保证最终数据的正确性。
“晶振值/12/2/16/波特率”这个地方计算的时候,出现不能除尽,或者出现小数怎么办,出现偏差,理解我们的晶振为何使用 11.0592M 了
11.0592M晶振 可以整除大部分,所以尽量用这个,本次实验用的是12M的
Step 4.
在这里插入图片描述

TR = 1 / TCON = 0x40
程序:

(一)UART_Init.c
#include<UART_Init.h>
#include<reg52.h>

void UART_Init()
{
SCON = 0x50; //0101 0000
TMOD = 0X20; //0010 0000 配置T1为 8位重装载 模式(产生波特率用)
PCON = 0x80; //8位为SMOD ,=1为 开启倍频,=0关闭倍频

TH1 =0xF3;//4800
TL1 =0xF3;

EA = 1;     //  需要 串口中断 就要开 总中断EA  
ES = 1;     //     需要 串口中断 就开
TR1 = 1; //启动T1

}

(二)main.c (在串口中断中 写你想做的事,或用标志flag 在main中写)

#include<reg52.h>
#include<UART_Init.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED0 = P2^0;
//uchar UartRxBuffer[64] = {0}; //串口接收数据

uchar ReceiveData;
void Uart_server() interrupt 4 //串口中断 号 是 4
{
ES = 0;
RI = 0;//清除接收中断标志位

ReceiveData=SBUF;//出去,接,收到的数据
SBUF=ReceiveData;//将接收到的数据放入到发送寄存器

switch(ReceiveData)
{
    case 1:LED0=~LED0;break;
}
 ES = 1;
while(!TI);             //等待发送数据完成
TI=0;

}

//void main()
{
UART_Init();
while(1)
{
;
}
}

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-03-08 22:42:39  更:2022-03-08 22:43:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:27:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码