当前位置:网站首页>gpio模拟串口通信
gpio模拟串口通信
2022-08-01 13:21:00 【四季帆】
1. 串口的传输协议
UART使用异步模式工作,不需要时钟信号,其一般格式为:起始位+数据位+校验位+停止位。其中起始位1位,数据位5~8位,校验位0或1位,停止位1、1.5或2位。不过最常用的格式是1位起始位、8位数据位、没有奇偶校验、1位停止位,简记为8/N/1。
8/N/1格式的时序图如下:

空闲时数据线上规定为逻辑1。
开始传输数据时先发送起始位,规定为逻辑0,接收端会检测这个下降沿,以便之后开始采样接收数据。
起始位之后是数据位,规定先发送最低位,即LSB First。因为UART没有时钟信号,故使用波特率来确定每一位的长度,不过为保证检测的准确性,实际采样频率会高于波特率,一般每一位会进行若干次采样,取中间的采样值作为这一位的结果。
奇偶校验位一般不使用。
停止位一般使用1位,规定为逻辑1,除了表示传输结束外,停止位还可以起到时钟同步的作用。
需要注意的是,这里的逻辑0并不一定是0V,这与使用的电平标准有关。对于TTL电平而言,逻辑0是0V,逻辑1是高电平(一般为3.3V或5V);对于RS-232电平而言,逻辑0是3V~15V,逻辑1是-3~-15V。
2. gpio模拟串口通信
以晶振频率11.0592M为时钟的芯片为例,实现波特率为9600BPS的串口通信(即传输一个位需要1/9600秒),定时时间=定时器计数值*机器周期=定时器计数值*12/晶振频率,现在定时时间为1/9600秒,定时器计数值=定时时间*晶振频率/12=110592/1152=96
补充:机器周期表示执行一条cpu指令所需时间,时钟周期是1/晶振频率,一个机器周期一般由多个时钟周期组成,比如51单片机的一个机器周期由12个时钟周期组成。
#define TM0_FLAG 0 //设传输标志位
#define RXD P1_0 //通过P1_0 IO脚来模拟RXD功能引脚
#define TXD P1_1 //通过P1_0 IO脚来模拟TXD功能引脚
/* 计数器及中断初始化 */
void S2INI(void)
{
TMOD |= 0x02; //计数器0,方式2
TH0 = 0xA0; //预值为256-96=140,十六进制A0
TL0 = TH0;
TR0 = 0; //在发送或接收才开始使用
TF0 = 0;
ET0 = 1; //允许定时器0中断
EA = 1; //中断允许总开关
}
/* 从串口读一个字符 */
uchar RByte()
{
uchar Output = 0;
uchar i = 8;
TR0 = 1; //启动Timer0
TL0 = TH0;
WaitTF0(); //等过起始位
//发送8位数据位
while(i--)
{
Output >>= 1;
if(RXD) Output |= 0x80; //先收低位
WaitTF0(); //位间延时
}
while(!TM0_FLAG)
{
if(RXD) break; //收到结束位
}
TR0 = 0; //停止
Timer0
return Output;
}
/* 往串口写一个字节 */
void WByte(uchar input)
{
uchar i = 8;
TXD = (bit)0; //发送启始位
WaitTF0();
//发送8位数据位
while(i--)
{
TXD = (bit)(input & 0x01); //先传低位
WaitTF0();
input = input >> 1;
}
TXD = (bit)1; //发送结束位
WaitTF0();
}
/* 中断1处理程序 */
void IntTimer0() interrupt 1
{
TM0_FLAG = 1; //设置标志位。
}
/* 查询传输标志位 */
void WaitTF0( void )
{
while(!TM0_FLAG);
TM0_FLAG = 0; //清标志位
}边栏推荐
- 如何降低Istio服务网格中Envoy的内存开销
- 2022-07-25 网工进阶(二十一)BGP-路由反射器、联盟、聚合
- 华盛顿大学、Allen AI 等联合 | RealTime QA: What's the Answer Right Now?(实时 QA:现在的答案是什么?)
- SQL function SQUARE
- 10年稳定性保障经验总结,故障复盘要回答哪三大关键问题?|TakinTalks大咖分享
- 软件设计师考点汇总(室内设计师个人总结)
- formatdatetime function mysql (date sub function)
- 论文详读《基于改进 LeNet-5 模型的手写体中文识别》,未完待补充
- opencv 保存图片imwrite
- 求方阵的无穷范数「建议收藏」
猜你喜欢
随机推荐
8. SAP ABAP OData 服务如何支持创建(Create)操作
【码蹄集新手村600题】判断一个数字是否为完全平方数
使用open3d可视化3d人脸
并发编程10大坑,你踩过几个?
全球都热炸了,谷歌服务器已经崩掉了
AI目标分割能力,无需绿幕即可实现快速视频抠图
Based on 10 years of experience in stability assurance, what are the three key questions to be answered in failure recovery?|TakinTalks big coffee sharing
[Cloud Enjoying Freshness] Community Weekly Vol.73- DTSE Tech Talk: 1 hour in-depth interpretation of SaaS application system design
一文带你彻底厘清 Isito 中的证书工作机制
iPhone难卖,被欧洲反垄断的服务业务也难赚钱了,苹果的日子艰难
SQL函数 SQRT
模型运营是做什么的(概念模型数据库)
Grafana9.0发布,Prometheus和Loki查询生成器、全新导航、热图面板等新功能!
opencv 保存图片imwrite
芝加哥丰田技术学院 | Leveraging Natural Supervision for Language Representation Learning and Generation(利用自然监督进行语言表示学习和生成)
kubernetes之DaemonSet以及滚动更新
六石编程学:问题要面对,办法要技巧,做不好的功能要想办法
【每日一题】592. 分数加减运算
Data Mining-04
iframe tag attribute description detailed [easy to understand]









![leetcode: 1201. Ugly Number III [Dichotomy + Mathematics + Inclusion and Exclusion Principle]](/img/44/bf1d9b9d85939e73bc44be2f9701e1.png)