能写出查询方式UART0接收和发送数据的C语言程序

能写出查询方式UART0接收和发送数据的C语言程序,第1张

#include<pic.h>//包含单片机内部资源预定义

#ifndef uchar

#define uchar unsigned char

#define uint unsigned int

#endif

//__CONFIG(0x2129)

bit rec_flag //串口中断标志位,有串口中断,置1

uchar uartdata //串口数据保存到此位置中

void Uart_char(uchar dat)//串口发送一个数据

/*************************************************************

函数原型:void main(void)

功能:等待串口发送中断到来,将接收到的设计再通过串口发回

*************************************************************/

void main(void)

{

TRISB1=1

TRISB2=1

SPBRG=0X19 //设置波特率为9600BPS

TXSTA=0X24 //使能串口发送,选择高速波特率

RCSTA=0X90 //使能串口工作,连续接收

RCIE=0X1 //使能接收中断

GIE=0X1 //开放全局中断

PEIE=0X1 //使能外部中断

//INTCON=0X00

/* while(1) //查询模式下

{

RCIE=1

while(RCIF==0)

RCIE=0

Send_char(RCREG)

}

*/

while(1) //中断模式下,等待中断的到来

{

if(rec_flag==1) //如果接收中断到来

{

rec_flag=0//接收标志清零

Uart_char(uartdata)//将接收来的数据发送到串口

}

}

}

/**********************************************

函数原型:void Uart_char(uchar dat)

功能:将dat数据通过串口传送出去

**********************************************/

void Uart_char(uchar dat)

{

TXREG=dat //将dat数据存入TXREG

// TXEN=1 //启动发送,TSR开始移位 *** 作。

while (TRMT==0) //判断是否TSR发送完毕,未完等待。

// TXEN=0 //关发送功能,防止TXREG空时,TXIF产生置位

}

/**********************************************

函数原型:void interrupt usart(void)

功能:串口接收到数据,接受发来的数据将接

收到数据标志位rec_flag置1

**********************************************/

void interrupt usart(void)

{

if(RCIF) //判断是否为串口接收中断

{

rec_flag = 1

//RCIF=0

uartdata = RCREG// 接收数据并存储

//TXREG=recdata //把接收到的数据发送回去

}

}

这段程序应该对你有用

/********************rec*************************

**模块名称:rec

**功能描述:uart的接收模块,接收采样率为波特率的16倍

************************************************/

module rec(clk,clkout,Dataout,RXD,RI)

input clk,RXD //时钟与数据输入

output clkout,RI //时钟输入、接收中断输出

output [7:0] Dataout //并行数据输出

reg StartF,RI //开始与接收中断标志

reg [9:0] UartBuff //接收缓存区

reg [3:0] count,count_bit //位接收计数器

reg [15:0] cnt //时钟节拍计数器

reg [2:0] bit_collect //采集数据缓存区

wire clk_equ,bit1,bit2,bit3,bit4 //连线

initial //初始化寄存器

begin

StartF=0

UartBuff=0

count=0

count_bit=0

cnt=0

bit_collect=0

end

parameter cout = 312 //时钟是48M除以16*9600的分频数为312.5,这里取整数

/*************波特率发生进程****************************/

always@(posedge clk) //时钟节拍计数器

begin

if(clk_equ)

cnt = 16'd0

else

cnt=cnt+1'b1

end

assign clk_equ = (cnt == cout) //采样时钟

assign clkout = clk_equ

assign bit1 = bit_collect[0]&bit_collect[1] //对采样数据进行判断

assign bit2 = bit_collect[1]&bit_collect[2] //对采样数据进行判断

assign bit3 = bit_collect[0]&bit_collect[2] //对采样数据进行判断

assign bit4 = bit1|bit2|bit3 //对采样数据进行判断,只要有两次相同就可以

always@(posedge clk)

begin

if(clk_equ)

begin

if(!StartF) //是否处于接收状态

begin

if(!RXD)

begin

count = 4'b0 //复位计数器

count_bit = 4'b0

RI = 1'b0

StartF = 1'b1

end

else RI = 1'b1

end

else

begin

count = count+1'b1 //位接收状态加1

if(count==4'd6)

bit_collect[0] = RXD //数据采集

if(count==4'd7)

bit_collect[1] = RXD //数据采集

if(count==4'd8)

begin

bit_collect[2] = RXD //数据采集

UartBuff[count_bit] = bit4

count_bit = count_bit+1'b1 //位计数器加1

if((count_bit==4'd1)&&(UartBuff[0]==1'b1)) //判断开始位是否为0

begin

StartF = 1'b0 //标志开始接收

end

RI = 1'b0 //中断标志位低

end

if(count_bit>4'd9) //检测是否接收结束

begin

RI = 1'b1 //中断标志为高标志转换结束

StartF = 1'b0

end

end

end

end

assign Dataout = UartBuff[8:1] //取出数据位

endmodule


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

原文地址: https://outofmemory.cn/yw/11622660.html

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

发表评论

登录后才能评论

评论列表(0条)

保存