
void AT_Send_String(u8 *string) //string为指向u8类型的指针
{while(*string)//知道string指针指向字符串
结束符'\0',才退出循环
{Sent_ZF(*string++)//发送string指针指向的
字符,并将string指针后移一位
Delay_ms(5)
}
}ASCII码在单片机中也是用16进制来表示的,只是解码后显示的是字符,你要是随便发一个字符,串口调试助手选择字符显示接收就可以显示一个字符出来(可能我们不认识这个字符)。发送一个字符串就是不停的发送直到发送完毕,51单片机有自己的串行发送端口P3.0和P3.1端口,但是它是一个字节一个字节发送的,发送完一个字节会产生一个中断(也可以用判断TI的方式判断是否发送完),中断响应后再次启动发送SBUF=0Xxx,就会自动连续的发送,再加上判断就可以控制发送的字节数。
串口初始化:
void uart_init()
{
TMOD=0x20//定时器1,模式2
SCON=0x50//串口通讯方式1
TH1=0xfd//波特率9600
TL1=0xfd
button=0
delay(1)
TI=0//发送中断标志位清零
RI=0//接收中断标志位清零
TR1=1//启动定时器1
EA=1//使能全局中断
ES=1 //启动串口中断
}
}
void main()
{ P1=0xff
uart_init()
while(1)
{
}
// 串行中断程序
void commIntProc() interrupt 4
{
if(TI)
{
TI = 0
if(sendPosi <sendCount) //判断是否发送完成
{
sendPosi++//发送一次计数器加一
SBUF = sendBuf[sendPosi]//启动发送
}
像这种发送字符串的,需要有一个字符串结束标志,不能用0作为字符串结束标志了!这里以回车作0xd为结束标志!
#include <reg51.h>
typedef unsigned char uint8
bit flag = 0
uint8 idata buf[30]
uint8 ct
void InitUART(void) //串口初始化 9600bps
{
TMOD = 0x20
SCON = 0x50
TH1 = 0xFD
TL1 = TH1
PCON = 0x00
EA = 1
ES = 1
TR1 = 1
}
void Send(uint8 c)
{
SBUF = c
while(!TI)
TI = 0
}
void main(void)
{
char j
InitUART()
while(1)
{
if(flag) //是否接收到回车 字符串发送完
{
flag = 0
for(j = ct j >0 j--)
{
Send(buf[j-1])
}
}
}
}
void UARTInterrupt(void) interrupt 4
{
static uint8 i = 0
if(RI)
{
RI = 0
buf[i++] = SBUF
if(SBUF == 0x0d) //接受到回车
{
ct = i-1
flag = 1
i = 0
}
}
else
TI = 0
}
仿真结果
程序作为参考 希望 你自己能理解程序!只有自己掌握了才能很好地用!


评论列表(0条)