#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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)