能写出查询方式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 //把接收到的数据发送回去

}

}

这段程序应该对你有用

二进制数组不像字符串一样有结束标志,不能直接用发送数组的函数发送,

作如下修改就可以了(仿真输出结果见代码后面的图):

#include<reg52.h>//注意:11.0592M晶振 波特率9600

sbit key1=P2^0

sbit key2=P2^1

unsigned char code J50_2[ ]={0X00,0X00,0XFF,0X09,0X09,0XFF,0XFF,0X4B,0X22,0X01,0X03,0X01,0X0A,0X0A,0X7C,0X00} //如何发送出去

unsigned char code J50_3[ ]={0X00,0X00,0XFF,0X09,0X09,0XFF,0XFF,0XAC,0X22,0X02,0X03,0X01,0X0A,0X0A,0X1A,0X00} //如何发送出去

unsigned char code String1[ ]={"Test 1 Pass !\r\n"}

unsigned char code String2[ ]={"Test 2 Pass !\r\n"}

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

函数功能:延时若干毫秒

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

void delayms(unsigned int ms) 

{

 unsigned int i

 while(ms--) 

 for(i=0i<600i++) 

}

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

函数功能:向PC发送一个字节数据

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

void SendByte(unsigned char dat)

{

 SBUF=dat

 while(TI==0)

 TI=0

}

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

函数功能:向PC发字符串

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

void SendStr(unsigned char *str) //第2种发送字符串函数

{

while(*str!=0)

 {

 SendByte(*str)

 str++

 delayms(1) //延时 N ms

 }

}

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

函数功能:向串口发n个字节数据

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

void SendnBytes(unsigned char *str,unsigned int n) //发送n个字节函数

{

while(n--!=0)

 {

 SendByte(*str)

 str++

 delayms(1) //延时 N ms

 }

}

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

函数功能:串口初始化

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

void UartInit(void)

 SCON=0x50 //串口工作方式1,8位UART,波特率可变 

TH2=0xFF 

 TL2=0xFD //波特率:115200 晶振=11.0592MHz 

 RCAP2H=0xFF 

 RCAP2L=0xFD //16位自动再装入值

TCLK=1 

 RCLK=1 

 C_T2=0 

 EXEN2=0 //波特率发生器工作方式

TR2=1  //定时器2开始 

}

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

函数功能:主函数

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

void main(void)

{

 UartInit()

 SendStr("How are you!\r\n")

 while(1)

 { 

 //SendStr(J50_2) //发送不成功

 SendnBytes(J50_2,sizeof(J50_2)) //发送成功

if(key1==0)

 {

 P1=0xFE

 SendStr(String1) //发送数据

delayms(10) //10ms发送一次数据 

P1=0XFF

 delayms(10)

 } 

 //SendStr(J50_3) //发送不成功

 SendnBytes(J50_3,sizeof(J50_3)) //发送成功

if(key2==0)

 {

 P1=0xFD

 SendStr(String2) //发送数据

delayms(10) //10ms发送一次数据 

P1=0XFF

 delayms(10)

 }

 }

}


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

原文地址:https://54852.com/yw/12055483.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存