51单片机 串口程序

51单片机 串口程序,第1张

首先要确定串口调试助手的波特率也是2400,并接收要以十六进制数显示,最好发送也以十六进制数发送。

程序没有问题,是因为发送的num1在0-255之间,而用串口调试助手的字符显示方式不是全部都能显示出来的,有一部分就是显示乱码的,而显示十六进制数就没有问题了。

串口收发,要有通信协议。也就是什么时候开始接收,接收到指令后,转发什么数据。这个要知道,才可以写。而且使用不同的51单片机,其内部寄存器配置是不同的。

一般来说,过程如下:

1,配置串口参数、波特率等,开启串口中断;

void Init_UART()

{

}

2,中断函数里写中断响应函数,根据接收的指令或者数据,执行相应的动作;

程序一般为:

void UART_ISR() interrupt x using y

{

串口中断处理函数

}

x - 单片机的C51中断号

y - 指定使用的当前工作寄存器组号(0-3 PSW中的RS0,RS1组合)

3,主程序

int main(void)

{

Init_UART()

while(1)

{

//数据发送函数

}

}

#include <REG52.H>

#define uchar unsigned char

#define uint unsigned int

sbit ring=P3^7

sbit CASE1=P2^0

sbit CASE2=P2^1

sbit CASE3=P2^2

sbit CASE4=P2^3

uchar se=0,re=0

uchar temp=0

void wait(uint cnt)

{

while(--cnt)

}

//串口发送程序

void send(uchar se)

{

SBUF=se //发送数据

while(TI == 0)

TI = 0

}

//串口接收程序

uchar receive(void)

{

re=SBUF //接收数据

while(RI==0)

RI=0

return re

}

//串口初始化

void sinti(void)

{

SCON = 0x50

TMOD |= 0x20

TH1 = 0xFD

TR1 = 1

EA= 1

ES= 1

}

void delay(int cnt)

{

while(--cnt)

}

//主程序

int main (void)

{

int i

sinti() //串口初始化程序

ring=1

while(1)

{

while (1)

{

if(CASE1==0)

{

send('a')

ring=0

break

}

if(CASE2==0)

{

send('b')

ring=0

break

}

if(CASE3==0)

{

send('c')

ring=0

break

}

if(CASE4==0)

{

send('d')

ring=0

break

}

}

if(ring==0)

{

wait(60000)

ring=1

}

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

}

}

//串口中断程序

void UART_SER (void) interrupt 4 //串行中断服务程序

{

if(RI)//判断是接收中断产生

{

RI=0 //标志位清零

temp=SBUF

}

if(TI)//如果是发送标志位,清零

TI=0

}


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

原文地址: http://outofmemory.cn/yw/11079940.html

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

发表评论

登录后才能评论

评论列表(0条)

保存