当前位置:首页 > 天道酬勤 > 正文内容

()

张世龙2021年12月21日 09:53天道酬勤1330

-------------请参见

更新中~~~~~~~ 2020/5/8

根据惯例,还是先报告进展情况。 I2C已经学过了,但是没有效果。 只能说把I2C的使用方法背成了程序。 虽然我能用就写,但是不能理解具体的详细情况。 因此,在编译和烘烤调试时出现了一些问题。 至今也不能理解。 我只知道问题在哪里。 最终开发板实现了我的程序想实现的效果,但是还不能理解问题。 所以I2C篇打算做成问题篇。 在每个问题下面附加编译调试视频。 我也想请观看的伙伴们讨论一下I2C的问题。

继续正文阶段~

波特率到底是什么? 在串行通信中扮演什么样的角色呢? 波特率怎么通过写程序自己设定? 这是我在学习UART时遇到的问题,这里我也大致写一下以前留下的问题。 为什么12Mhz的石英振动在串行通信中有误差,而11.0592Mhz的石英振动却没有误差? 接下来,我要谈谈我对UART的认识,谈谈我对UART的理解不严谨。

串行通信、串行通信,一听名字就知道是一种通信方式。 通信是指一个设备向另一个设备发送数据。 一个设备向两个设备发送数据,一个设备接收数据,从常识上来说,要想成功,不能乱搞。 两个机器之间必须有一个协议规定。 波特率就像两个设备之间的协议。 波特率(所以,通信时两个设备预先决定,可能意味着多长时间的高电平表示1,多长时间的低电平表示0。

那么,怎么设定波特率呢? 我学习的方法通过计时器1实现了,但目前只有这个方法。 如果将T1用作波特率发生器,典型的用法是自动重载T1的8位计时器方法。 也就是说,以方式2且TCON的TR1=1启动计时器。

波特率的计算公式可以通过手册得知

通常使用的串行端口的波特率为300、600、1200、4800、9600、19200………

这次程序使用的波特率是9600,另一个地方不太清楚什么时候使用什么波特率。 我接触的大多是9600,使用蓝牙模块的时候也用9600。 没有使用过其他波特率~

如果有想要设定的波特率,从这个式子就能知道应该在计时器的TH1中放什么。 12Mhz水晶振动的单片机曾说过串行通信时会产生误差,但11.0592Mhz水晶振动的单片机却不是。

变换公式后,得到了福克斯、baud和t初期的关系。 如果计算一下,就会发现波特率为9600、石英振动频率为12Mhz时计算出的t初期不是整数,波特率为9600、石英振动频率为11.0592Mhz时计算出的初始值正好是整数。 误差也是这个原因~

用单片机的神奇宝贝可以清晰地看到9600波特率,但12Mhz的石英振动误差相当大,推测发送10次数据会出错一次,错误率可能更高。

# #包括reg 52.h

# #定义符号无符号符号

# # define uint无符号int

比特杜比=P2 ^ 6;

sbit WE=P2^7;

车号;

语音时间0初始化()

{

EA=1;

ET0=1;

TR0=1;

//REN=1; //1

TMOD |=0x01;

TH0=0xF3;

TL0=0x66;

}

void UartInit (

{

ES=1;

REN=1;

TR1=1;

SM0=0;

SM1=1;

TMOD |=0x20;

TH1=0xfd;

TL1=0xfd;

}

uchar code SMGduan[]={0x3F,0x 06,0x5b,0x4F,0x 66,0x6d,0x 07,0x7f,0x6F,};

字符代码符号

ei[]= {0xfe, 0xfd, 0xfb}; void display(uchar i) { uchar wei; P0 = 0xFF; WE = 1; P0 = SMGwei[wei]; WE = 0; DU = 1; switch(wei) { case 0: P0 = SMGduan[i / 100]; break; case 1: P0 = SMGduan[i % 100 / 10]; break; case 2: P0 = SMGduan[i % 10]; DU = 0; break; } DU = 0; wei++; if(wei == 3) wei = 0; } void main() { Time0Init(); UartInit(); while(1); } void Time0() interrupt 1 { TH0 = 0xF3; TL0 = 0x66; display(num); } void UART1() interrupt 4 { if(RI) { num = SBUF; RI = 0; } }

视频加载中...

上边程序调试效果


好啦,串口定时器加数码管显示部分终于算是写完了,写的不是很详细,也肯定存在一些错误,不过收获还是很多的,从老师向我输入知识到我向外输出知识,这个过程经历之后感觉学到的东西更加扎实了,串口通信以及以前的内容,在我的学习里我是把它们分成一个部分,从I2C通信到最后的电子万年历,我是把它们分为第二部分。第一部分的内容我是觉得比较偏基础简单的,程序也是挺好写的,后边的内容感觉是比前面的难挺多的,希望我能加油学好,也希望和我一块学习51单片机的小白们也一块努力加油!

最近几天因为rydcg13号复试,他的电脑坏掉了,只能在最近一段时间用我的了,这几天关于单片机写程序还有总结更新的事情要停一停了,这几天,我还是将主要精力放在数学上,我现在也在看pid方面的一些资料,后续学会了也会写进来。还有一件事,以后每一篇的更新我都会把调试视频上传到这,在视频里我也会说明调试的问题,不光光只是文字,这几天我会好好学一下手机剪映软件的~

好啦,第一大部分就到这,虽然我I2C的总结已经写完了,不过也不今天上传了,毕竟排版啥的也挺耗时间的,后边的第二大部分内容隔段时间更新,大家也要做到每天学习哈!

--------------------------------------------------------------------------------------------

持续更新中~~~~~~~

扫描二维码推送至手机访问。

版权声明:本文由花开半夏のブログ发布,如需转载请注明出处。

本文链接:https://www.zhangshilong.cn/work/26236.html

分享给朋友:

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。