我看的是郭天祥老师的51单片机C语言教程,关于“串行口打印在调试程序中的应用”一节中

我看的是郭天祥老师的51单片机C语言教程,关于“串行口打印在调试程序中的应用”一节中,第1张

我首先声明我没看完郭天祥的视频,不过我可以告诉你

puts(“turn on ad!”)这句是让串口输出“turn on ad!”的,puts这个函数和c++中的cout差不多

TI=1,这个我不知道为什么,清除之前的中断?没必要吧,因为每次退出中断都会清除这一位的。

while(!TI)TI = 0这两句的意思很简单,等待串口输出数据完成呗,当串口把数据都传输完成之后,硬件是自动置位TI中断位,用于通知CPU串口传输完成。

然后TI=0是软件清除TI位,不然下次串口传输就无法继续下去。

以上理解仅代表我个人,在此不评论郭天祥

#include "Include/c8051f120.h"// SFR declarations

#include "Include/system.h"// SFR declarations

void UART0_Init (void)

{

unsigned char T1_PRESCALE

unsigned char T1_RELOAD

unsigned long BAUD

BAUD = 38400

if ((SYSCLK/BAUD/32/1)<256)

{

T1_PRESCALE = 0x10

T1_RELOAD = -((SYSCLK/BAUD/16/1+1)/2)

}

else if ((SYSCLK/BAUD/32/4)<256)

{

T1_PRESCALE = 0x01

T1_RELOAD = -((SYSCLK/BAUD/16/4+1)/2)

}

else if ((SYSCLK/BAUD/32/12)<256)

{

T1_PRESCALE = 0x00

T1_RELOAD = -((SYSCLK/BAUD/16/12+1)/2)

}

else if ((SYSCLK/BAUD/32/48)<256)

{

T1_PRESCALE = 0x02

T1_RELOAD = -((SYSCLK/BAUD/16/48+1)/2)

}

SFRPAGE = UART0_PAGE

SCON0 = 0x50 // SCON0: 8-bit variable bit rate

// RX enabled

// SCON0 |= 0xd0 // SCON0: 8-bit variable bit rate

SFRPAGE = TIMER01_PAGE

CKCON &= ~0x1B // clear T1M, SCA1, SCA0

CKCON |= T1_PRESCALE // set T1M, SCA1, SCA0 according to BAUD

TH1 = T1_RELOAD // reload value calculated from BAUD

TL1 = T1_RELOAD // also load into TL1

TMOD &= ~0xf0 // clear T1 bits in TMOD

TMOD |= 0x20 // set TMOD for 8 bit reload

TR1 = 1 // START Timer1

//added by edward to test the priority settings of UART0. If this line is here, means good.

IP |= 0x10

SFRPAGE = UART0_PAGE

TI0 = 1 // Indicate TX0 ready

ES0 = 1

}

void UartRun(void)

{

unsigned char Receive_userData

if (RI0)

{

Receive_userData = SBUF0

UART0_SEND(Receive_userData)

RI0 = 0

}

if (TI0)

{

TI0 = 0

}

}

void UART0_ISR (void) interrupt 4

{

_push_(SFRPAGE)

SFRPAGE = UART0_PAGE

UartRun()

_pop_(SFRPAGE)

}

这个是串口输入什么就显示什么的例子,如果需要打印的话你可以加入打印的函数print()

{UartRun()

}

放在主函数体里就可以

12288的十六进制是3000H

12544的十六进制是3100H

如果你送的是“2“,那打印出来的就是3200H了,也就是12800.

因此(其实我也不怎么知道,推断的):0的asc2码是48,也就是30H,1的asc2码是49,也就是31H……就是说:存储asc2码值的是sbuf的高8位,如果想打印真正的asc2码,就用高八位输出吧~


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存