单片机8051串行接口的C编程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

五、串行口应用举例
例1:发送字符串程序 #include<reg51.h> #define uchar unsingned char #define uint unsigned int uchar idata trdata[10]= {„M‟,„C‟,„S‟,„-‟,„5‟,„1‟,0x0d,0x0a,0x00};
2.电源控制寄存器PCON D7 D6 D5 SMOD D4 D3 D2 D1 D0 GF1 GF0 PD IDL
SMOD:串行口波特率加倍位。 1 方式1,3波特率=定时器1溢出率/16; 方式2波特率=fosc/32。 0 方式1,3波特率=定时器1溢出率/32; 方式2波特率=fosc/64。
for(;;) { if(cmdok) { cmdok=0; if(string_compare(“start",5)!=0) … //处理启动命令 else if(string_compare(“stop",4)!=0) … //处理停止命令 else if(string_compare(“pause",5)!=0) … //处理暂停命令 } } }
0 禁止 1 允许 (软件设置)
D0 RI
中断标志
(硬件置位, 软件清0)
工作方式控制位SM0、SM1 SM0 SM1 0 0 0 1 1 0 1 1 工作方式 方式0 方式1 方式2 方式3
说明 波特率 同步移位寄存器 fosc/12 10位异步收发 由定时器控制 11位异步收发 fosc/32或fosc/64 11位异步收发 由定时器控制
void serial() interrupt 4 using 1 { uchar a; if(RI) { RI=0; a=SBUF; if(a==„#‟){cmdbegin=1;comrxdwrite=0;} else if(a==„*‟){cmdbegin=0;cmdok=1;} else if(cmdbegin==1) { comrxdbuf[comrxdwrite]=a; comrxdwrite++; if(comrxdwrite>=buffer_size)comrxdwrite=0; } } }
main() { /*在12MHz下,设置4800波特率,方式1*/ TMOD=0x20; //设置定时器1的方式 TH1=0xf3; //设置定时器1的初值 TL1=0xf3; SCON=0x50; //设置串行口方式1,并允许接收 PCON=0x80; TR1=1; //启动定时器1 ES=1; EA=1;
四、串行口的初始化
1.串行口波特率
使用单片机串口时,选用的晶振比较固定 6MHz,12MHz,11.0592MHz。常用于和计算机的 通信;选用的波特率也相对固定。串行口常用 的波特率及相应的设置见表8-3。
2.初始化步骤 设置产生波特率的定时器1、串行口控制和中断控制。 具体步骤: (1)确定定时器1的工作方式,编程TMOD寄存器; (2)计算定时器1的初值,装载TH1和TL1; (3)启动定时器1,编程TCON中的TR1位; (4)确定串行口的控制,编程SCON和PCON; (5)开CPU和源中断,编程IE中的ES和EA位。
SBUF=hex;
while(TI==0);
TI=0;
}
例3:发送字符串子函数 void send_string(uchar *string) { while(*string!=0) { send_char(*string); string++; }
}
例4:发送字符串程序。例1的程序可以改写成 调用子函数的方式。
§6.2 51单片机串行口
一、串行口结构
8051系列单片机片上有UART(通用异步收发) 用于串行通信,发送时数据由TXD端发出,接收时 数据由RXD端输入。
TTL电平:短距离机间通信 RS232电平:与计算机通信。(驱动芯片MAX232)
二、串行口的控制寄存器
与串行口有关的控制寄存器有: 1.串行口控制寄存器SCON D7 D6 D5 D4 D3 D2 D1 SM0 SM1 SM2 REN TB8 RB8 TI 工作方式控制位 接收允许位
main() { uchar i; uint j; /*在11.0592MHz下,设置9600波特率,方式1*/ TMOD=0x20; //设置定时器1的方式 TH1=0xfd; //设置定时器1的初值 TL1=0xfd; SCON=0x50; //设置串行口方式1,并允许接收 PCON=0x00; TR1=1; //启动定时器1
命令类型: (1)启动 #start* (2)停止 #stop* (3)暂停 #pause*
#include<reg51.h> #define uchar unsigned char #define buffer_size 8 //缓冲区大小 uchar comrxdbuf[buffer_size];//串口接收缓冲区 uchar comrxdwrite; bit cmdbegin,cmdok; //命令起始和结束标志
接收:?=SBUF; 例子:serial_data=SBUF;
接收条件REN=1;(软件置位) 收到数据RI=1; (硬件置位) 读数完毕RI=0; (软件清0)
波特率=2SMOD*(定时器1的溢出率)/32 例子:波特率=9600,fosc=11.059M,则设置 PCON=0x00; //SMOD=0; TMOD=0x20; TH1=0xfd; TL1=0xfd; TR1=1; //启动定时器1 ES=1; //开串行口中断 EA=1; //开CPU中断
第 6章
8051串行口的C编程
本章主要介绍串行通信概念及51系列单片机 的串行口问题,将具体介绍以下内容:
计算机串行通信基础----基本概念。
51单片机串行口----串行口结构、串行口的控制 寄存器、串行口的工作方式、串行口的初始化、 应用举例。
§6.1 计算机串行通信基础
基本概念
通 信 方 式
并行通信方式—空间上区分各位数据 及联络控制信号。占 用传输线多,速度快。 串行通信方式—时间上区分各位数据 及联络控制信号。占 用传输线少,速度慢。
ቤተ መጻሕፍቲ ባይዱ
main() { uint j; while(1) { send_string(trdata); for(j=0;j<12500;j++); } }
或者:
main() { uint j; while(1) { send_string(“MCS-51”); send_char(0x0d); send_char(0x0a); for(j=0;j<12500;j++); } }
while(1) { while(RI==0); RI=0; a=SBUF; SBUF=a; while(TI==0); TI=0; } }
例6:单片机fosc=11.0592MHz,波特率9600, 设置8个字节的队列缓冲区用于接收。根据接 收到的命令执行不同的操作。 计算机端发送的命令格式:‘#‟+命令+„*‟
while(1) { i=0; while(trdata[i]!=0x00) //发送字符串 { SBUF=trdata[i]; while(TI==0); TI=0; i++; } for(j=0;j<12500;j++); //延时 } }
例2:发送单字符子函数 void send_char(uchar hex) {
三、串行口的工作方式
串行口共有四种工作方式 方式1—10位异步通信方式 10位=1位起始位(0)+8位数据位+1位停止位(1)
其中起始位和停止位在发送时是自动插入的。
发送:SBUF=?; 例子:SBUF=“a”; SBUF=“abc”;
SBUF=0x61;
发送条件TI=0;(软件清0) 发送完毕TI=1;(硬件置位)
例5:串行口发送接收程序,将接收到的字符 发送出去。 main() { unsigned char a; /*在11.0592MHz下,设置19200波特率,方式1*/ TMOD=0x20; //设置定时器1的方式 TH1=0xfd; //设置定时器1的初值 TL1=0xfd; SCON=0x50; //设置串行口方式1,并允许接收 PCON=0x80; TR1=1; //启动定时器1
uchar string_compare(uchar *string,uchar number) //串口字符串比较 { uchar b,c; for (b=0;b<number;b++) { c=comrxdbuf[b]; if(c!=(*string))return(0); string++; } return(1); }
相关文档
最新文档