将一个字节数据8位经P4.4口串行输出,一个完整的数据帧格式要求

将一个字节数据8位经P4.4口串行输出,一个完整的数据帧格式要求,第1张

串行口控制寄存器SCON

SCON的字节地址是98H,其格式如下:

SM0、SM1:串行口工作方式控制位:

SM0、SM1 工作方式 功能 波特率

00 方式0 同步移位寄存器 fosc/12

01 方式1 8位UART 可变(T1溢出率)

10 方式2 9位UART fosc/64或fosc/32

11 方式3 9位UART 可变(T1溢出率)

其中,fosc为振荡器的频率,UART为通用异步接收和发送器的英文缩写。

串行口工作方式0:

当设定SM0、SM1为00时,串行口工作于方式0,它又叫同步移位寄存器输出方式。在方式0下,数据从RXD(P30)端串行输出或输入,同步信号从TXD(P31)端输出,发送或接收的数据为8位,低位在前,高位在后,没有起始位和停止位。数据传输率固定为振荡器的频率1/12,也就是每个机器周期传送一位数据。方式0可以外接移位寄存器,将串行口扩展为并行口,也可以外接同步输入/输出设备。

执行任何一条以SBUF为目的寄存器指令,就开始发送。

串行口工作方式1:

当设定SM0、SM1为01时,串行口工作于方式1,为数据传输率可变的8位异步通信方式,由TXD发送,RXD接收,一帧数据为10位,1位起始位(低电平),8位数据位(低位在前),1位停止位(高电平)。数据传输率取决于定时器1或2的溢出速率(1/溢出周期)和数据传输率是否加倍的选择位SMOD。

对于有定时器/计数器2的单片机,当T2CON寄存器中RCLK和TCLK置位时,用定时器2作为接收和发送数据传输率发生器,而RCLK=TCLK=0时,用定时器1作为接收和发送的数据传输率发生器。2个定时器/计数器可以交叉使用,即发送和接收采用不同的数据传输率。

发送过程是由执行任何一条以SBUF为目的的寄存器指令引起的。

串行口工作方式2:

当设定SM0、SM12位为10时,串行口工作于方式2,此时串行口被定义为9位异步通信接口。采用这种方式可接收或发送11位数据,以11位为一帧,比方式1增加了一个数据位,其余相同。第9个数据即D8位可用作奇偶校验或地址/数据选择,可以通过软件来控制它,再加特殊功能寄存器SCON中的SM2位的配合,可使MCS-51单片机串行口适用于多机通信。发送时,第9位数据为TB8,接收时,第9位数据送入RB8。方式2数据传输率固定,只有2个选择,为振荡器的1/64或1/32,可由PCON的最高位选择。

串行口工作方式3:

当设定SM0、SM1二位为11时,串行口工作于方式3。方式3与方式2类似,唯一的区别是方式3的数据传输率是可变的,而帧格式与方式2一样为11位一帧。方式3也适用于多机通信。

SM2:多机通信控制位多机通信时工作于方式2和方式3,SM2位主要用于方式2和方式3。接收状态,当串行口工作于方式2或方式3,以及SM2=1时,只有当接收到第9位数据(RB8)为1时,才把接收到的前8位数据送入SBUF,且置位RI发出中断请求,否则会将接收到的数据放弃。当SM2=0时,就不管第9位数据是0还是1,都将数据送入SBUF,并发出中断请求。

工作于方式0,SM2必须为0。

REN:允许接收位

REN用于控制数据接收的允许和禁止,REN=1允许接收,REN=0禁止接收。

TB8:发送数据位8

在方式2和方式3中,TB8是要发送的第9位数据位,在多机通信中同样需要传输这一位,TB8=0表示传输的为数据,TB8=1代表传输的为地址。

RB8:接收数据位8

在方式2和方式3中,RB8存放接收到的第9位数据,用以识别接收到的数据特征。

TI:发送中断标志位

可寻址标志位。方式0时,发送完第8位数据后,由硬件置位,其他方式下,在发送或停止位之前由硬件置位,TI=1表示帧发送结束, 向CPU发中断申请。在中断服务程序中,必须用软件将其清0,取消此中断申请。

RI:接收中断标志位

可寻址标志位。方式0时,接收完第8位数据后,该位由硬件置位,在其他工作方式下,该位由硬件置位,RI=1表示帧接收完成,向CPU发中断申请。在中断服务程序中,必须用软件将其清0,取消此中断申请。

思想如下:时钟频率肯定是外部输入的,具体的输出采样数据的频率控制可以另外加一个时钟使能信号来加以控制,然后在每个时钟上升沿进行判断,输出数据赋值并且输入并行数据进行移位 *** 作,里面有两个计数器来控制时序,一个计数器cnt2由另外一个cnt1触发,下面的是从低到高的输出,如果你想从高到底的输出,可以将data[7]输出,然后将移位反向,思想是这样的,没经过仿真,只是想着写的

module shift(rst_n,clk,data_in,data_out);

input rst_n;

input clk;

input [7:0]data_in;

output data_out;

//下面clk_en为控制输出数据以及并行数据移位的频率控制,比如外部时钟为25us,那么你说的

//5s就是200个cycle,要传送8bit数据,就是25个时钟传送一位,输入数据的频率得由外面保证

reg [4:0]cnt1;

reg [3:0cnt2;

reg [7:0]data;

//计数器cnt1的作用是产生25个时钟一变的时钟使能,控制内部变化频率

always @(posedge clk or negedge rst_n)

begin

if(rst_n == 1'b0)

cnt1 <=0;

else if(cnt=24)

cnt1 <=0;

else

cnt 1<=cnt1+1;

end

always @(posedge clk or negedge rst_n)

begin

if(rst_n == 1'b0)

cnt2 <=0;

else if(cnt2=4'b1000)

cnt2 <=0;

else if(cnt1=24)

cnt 2<=cnt2+1;

end

always @(posedge clk or negedge rst_n)

begin

if(rst_n == 1'b0)

data <= 8'b0;

else if(cnt2==4'b0)

data <= data_in;

else if(cnt1==24)

data <={1'b0,data[7:1]};

end

always@(posedge clk or negedge rst_n)

begin

if(rst_n == 1'b0)

data_out <= 1'b0;

else if(cnt1=0)

data_out <= data[0];

end

always @(posedge clk or negedge rst_n)

begin

f(rst_n == 1'b0)

data <= 1'b0;

else if(cnt1=0)

data_out <= data[0];

end

endmodule

以上就是关于将一个字节数据8位经P4.4口串行输出,一个完整的数据帧格式要求全部的内容,包括:将一个字节数据8位经P4.4口串行输出,一个完整的数据帧格式要求、verilog 并行输入转 串行输出、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9311824.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存