如何用pic单片机写利用串口调试程序给单片机发送数据再反读回给电脑显示

如何用pic单片机写利用串口调试程序给单片机发送数据再反读回给电脑显示,第1张

#include<pic.h>//利用串口调试程序给单片机发送数据再反读回给电脑显示,接收用中断法,发送不用

#define uchar unsigned char//宏定义

#define uint unsigned int

__CONFIG(0x3b31)//设置配置位

void init()

void main()

{

init()

TXREG=0x31//发送寄存器发送0x31对应的’叫什么码的‘就是1这一步是指一上电或复位时会先发送一个数检验是否有发送及接收

while(!TRMT)//判断TRMT是否自动置1,如果为1则说明发传送完毕,取反退出if循环

while(1)//停在此等待电脑给单片机发送数据

}

void init()

{

TRISC=0xff//注意这里一定要设置RC端口为输入状态,输入是一个高阻态如果设为输出则会不停地发送

//当设置了串口模式后会自动输出输入,不用理会其值

TXSTA=0x24//设置发送状态寄存器选择异步串口传输和高速波特率

RCSTA=0x90//设置接收状态寄存器选择8位传输

SPBRG=25//写十进制或十六进制都可以,设置x的值是25则波特率为9600

GIE=1//开总中断

PEIE=1//开外设中断

RCIE=1//接收中断使能置1,因为接收用中断法,发送不用

}

void interrupt com()

{

if(RCIE&&RCIF)//如果串行接收使能为1允许并且标志为1置位溢出,则要把接收到的数据发送走,或者直接判断RCIF标志位if(RCIF==1)也可以

{

TXREG=RCREG//要把接收到寄存器的数据附给发送寄存器

while(!TRMT)//判断TRMT是否自动置1,如果为1则说明发传送完毕,取反退出if循环

}

}

#include <pic.h>

#define FOSC 18432000L

#define BAUD 115200

#define NONE_PARITY 0 //无校验位

#define ODD_PARITY 1 //奇校验

#define EVEN_PARITY 2 //偶校验

#define MARK_PARITY 3 //标记校验

#define SPACE_PARITY4 //空校验

#define PARITYBIT EVEN_PARITY

#define S2RI 0x01

#define S2TI 0x02

#define S2RB8 0x04

#define S2TB8 0x08

sfr AUXR = 0x8e

sfr S2CON = 0x9a

sfr S2BUF = 0x9b

sfr BRT = 0x9c

sfr IE2 = 0xaf

bit busy

void SendData(char dat)

void SendString(char *s)

void main()

{

#if (PARITYBIT == NONE_PARITY)

S2CON = 0x5a //8位可变波特率 (无校验位)

#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)

S2CON = 0xda //9位可变波特率,校验位初始为1

#elif (PARITYBIT == SPACE_PARITY)

S2CON = 0xd5 //9位可变波特率,校验位初始为0

#endif

BRT = -(FOSC/32/BAUD) //设置独立波特率发生器的重载初值

AUXR = 0x14 //独立波特率发生器工作在1T模式

IE2 = 0x01//使能串口2中断

EA = 1//开总中断

SendString("STC12C5A60S2\r\nUart2 Test !\r\n")

while(1)

}

void Uart2() interrupt 8 using 1

{

if (S2CON &S2RI)

{

S2CON &= ~S2RI//清除接收完成标志

P0 = S2BUF//P0显示串口数据

P2 = (S2CON &S2RB8) //P2.2显示校验位

}

if (S2CON &S2TI)

{

S2CON &= ~S2TI//清除发送完成标志

busy = 0

}

}

void SendData(char dat)

{

while (busy) //等待上个数据发送完成

ACC = dat //取得偶校验位P

if (P) //根据P来设置串口数据的校验位

{

#if (PARITYBIT == ODD_PARITY)

S2CON &= ~S2TB8 //置校验位为0

#elif (PARITYBIT == EVEN_PARITY)

S2CON |= S2TB8//置校验位为1

#endif

}

else

{

#if (PARITYBIT == ODD_PARITY)

S2CON |= S2TB8//置校验位为1

#elif (PARITYBIT == EVEN_PARITY)

S2CON &= ~S2TB8 //置校验位为0

#endif

}

busy = 1

S2BUF = ACC //发送数据

}

void SendString(char *s)

{

while (*s) //判断字符串结束标志

{

SendData(*s++)//发送字符

}

}

//串口初始化

void usart_init()

{

TRISC = 0xFF//设置C口方向全为输入

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

TXSTA = 0x24//设定TXSTA寄存器。

SPBRG = 0x19//4MHZ, BRGH=1, 9600BPS

INTCON = 0xC0//开放全局中断,使能外部中断

RCIE = 0x1//使能USART接收中断

}

这样配置 还有就是中断配置了 这个我认为你的接受与发送的数据一样说明你的中断在你加一处理以前动作了 明白吗?在仔细看一下,尤其是PIC的中断系统结构!


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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存