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的十六进制是3000H12544的十六进制是3100H
如果你送的是“2“,那打印出来的就是3200H了,也就是12800.
因此(其实我也不怎么知道,推断的):0的asc2码是48,也就是30H,1的asc2码是49,也就是31H……就是说:存储asc2码值的是sbuf的高8位,如果想打印真正的asc2码,就用高八位输出吧~
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)