一.程序功用
在上位机上用串口调试帮手发送一个字符X, 单片机收到字符后回来给上位机”I get X”,串口波特率设为9600bps.
二.程序源码
1) 法1 (头文件法, 适用于内行)
#include
#define uchar unsigned char
#define uint unsigned int
uchar flag, a, i;
uchar code table[] = “I get “; //界说一个字符类型编码数组
void init();
void main()
{
}
void init()
{
}
//串口中止服务程序
void ser() interrupt 4
{
}
2) 法2 (完好寄存器地址法)
//中止答应寄存器IE,字节地址位0xA8
//单片机复位时, IE中一切位被清0
sfr IE = 0xA8;
//EA为大局中止答应位
//EA = 1时翻开大局中止操控,在这样条件下,由各个中止操控位翻开或封闭相应的中止
//EA = 0时封闭一切中止
sbit EA = IE^7;
//ET2为定时器/计数器2中止答应位
//ET2 = 1时翻开T2中止, ET2 = 0时封闭T2中止
sbit ET2 = IE^5; //8052 only
//ES为串行口中止答应位
//ES = 1时翻开串行口中止, ES = 0时封闭串行口中止
sbit ES = IE^4;
//ET1为定时器/计数器1中止答应位
//ET1 = 1时翻开T1中止, ET1 = 0时封闭T1中止
sbit ET1 = IE^3;
//EX1为外部中止1中止答应位
//EX1 = 1时翻开外部中止1中止, EX1 = 0时封闭外部中止1中止
sbit EX1 = IE^2;
//ET0为定时器/计数器0中止答应位
//ET0 = 1时翻开T0中止, ET0 = 1时封闭T0中止
sbit ET0 = IE^1;
//EX0为外部中止0中止答应位
//EX0 = 1时翻开外部中止0中止, EX0 = 0时封闭外部中止0中止
sbit EX0 = IE^0;
//SBUF为串行数据缓冲寄存器
//51单片机中含有两个SBUF,其间一个为发送缓冲寄存器,另一个为接纳缓冲寄存器
//这两个寄存器共有一个地址0x99, 但物理上是两个独立的寄存器,有指令操作决议拜访哪个寄存器
//履行写指令时, 拜访串行发送寄存器, 履行读指令时, 拜访串行接纳寄存器
//接纳器具有双缓冲结构, 即在从接纳寄存器中读出前一个已收到的字节之前, 便能承受第二个字节
//假如第二个字节现已接纳结束,第一个字节还没有读出,则丢掉其间一个字节
//关于发送器,数据由CPU操控和发送,所以不需求考虑
sfr SBUF = 0x99;
//SCON为串行口操控寄存器
//SCON可位寻址, 即能够拜访它的详细某一位
//SCON用以设定串行口的作业方法, 接纳/发送操控以及设置状况标志
//单片机复位时SCON悉数被清0
sfr SCON = 0x98;
//SM0,SM1为作业方法挑选位, 串行口有4中作业方法, 由SM0,SM1设定
//SM0=0,SM1=0为方法0,即同步移位寄存器方法,用于扩展I/O口
//SM0=0,SM1=1为方法1,即10位异步收发,含8位数据,波特率可变,且由定时器1的溢出率操控
//SM0=1,SM1=0为方法2,即11位异步收发,含9位数据,波特率固定
//SM0=1,SM1=1为方法3,即11位异步收发,含9位数据,波特率可变,且由定时器1的溢出率操控
sbit SM0 = SCON^7;
sbit SM1 = SCON^6;
//SM2为多机通讯操控位,首要用于方法2和方法3
//当接纳机的SM2=1时,能够运用收到的RB8来操控是否激活RI,即RB8=0时不激活RI,收到的信息丢掉
//RB8=1时收到的数据进入SBUF,并激活RI,进而在中止服务中将数据从SBUF读走
//当SM0=0时,不管收到的RB8是0仍是1,均能够使收到的数据进入SBUF,并激活RI,即此刻RB8不具有操控RI激活功用
//经过操控SM2,能够完成多机通讯.
//在方法0时,SM2有必要是0
//在方法1时,若SM2=1,则只要接纳到有用中止位时,RI才置1
sbit SM2 = SCON^5;
//REN为答应串行接纳位
//REN=1时答应串行口接纳数据
//REN=0时制止串行口接纳数据
sbit REN = SCON^4;
//TB8为方法2,3中发送数据的第9位
//方法2或方法3中,时发送数据的第9位,能够用软件规则其效果,能够用作数据的奇偶校验位
//或在多机通讯中,作为地址帧/数据帧的标志位
//方法0和方法1时,该位未用
sbit TB8 = SCON^3;
//RB8为方法2,3中接纳数据的第9位
//方法2或方法3中,是接纳数据的第9位,可作为奇偶校验位或地址帧/数据帧的标志位
//方法1时,若SM2=0,则RB8是接纳到的中止位
sbit RB8 = SCON^2;
//TI为发送中止标志位
//方法0时,当串行发送第8位数据结束时,或在其他方法,串行发送中止位的开始时,
//由内部硬件使TI置1,向CPU宣布中止恳求,在中止服务程序中,有必要用软件将其清0,撤销此中止恳求
sbit TI = SCON^1;
//RI为接纳中止标志位
//方法0时,当串行接纳第8位数据结束时,或在其他方法,串行接纳中止位的中心时,
//由内部邮件使RI置1,向CPU宣布中止恳求,也有必要在中止服务程序中,用软件将其清0,撤销此中止恳求
sbit RI = SCON^0;
//TMOD为定时器/计数器作业方法寄存器
//字节地址位0x89,不能位寻址
//单片机复位时TMOD悉数被清0
//TMOD的高4位用于设置定时器1,低4位用于设置定时器0,
//其间凹凸4位均由GATE,C/T,M1,M0构成
//GATE为门操控位
//GATE=0,定时器/计数器发动与中止仅受TCON寄存器中TRX(X=0,1)来操控
//GATE=1,定时器/计数器发动与中止由TCON寄存器中TRX(X=0,1)和外部中止引脚(INT0或INT1)的电平一起操控
//C/T为定时器形式和计数器形式挑选位
//C/T=1为计数器形式,C/T=0为定时器形式
//M1M0为作业方法挑选位
//M1=0,M0=0为方法0,为13位定时器/计数器
//M1=0,M0=1为方法1,为16位定时器/计数器
//M1=1,M0=0为方法2,8位出值主动重装的8位定时器/计数器
//M1=1,M1=0为方法3,仅适用于T0,分红两个8位计数器,T1中止计数
sfr TMOD = 0x89;
//TCON为定时器/计数器操控寄存器
//TCON字节地址为88H,可位寻址
//TCON寄存器用来操控定时器的启,停,标志定时器溢出和中止
//单片机复位时TCON悉数被清0
//TCON包含的TF1,TR1,TF0,TR0用于定时器/计数器
//TCON包含的IE1,IT1,IE0,IT0用于外部中止
sfr TCON = 0x88;
//TF1为定时器1溢出标志位
//当计数器1计满溢出时,由硬件使TF1置1,而且恳求中止,进入中止服务程序后,由硬件主动清0
//假如运用定时器的中止,那么该位彻底不必人为去操作
//假如运用软件查询的方法,查询该位为1后,就需求用软件清0
sbit TF1 = TCON^7;
//TR1为定时器1运转操控位
//由软件清0封闭定时器1,当GATE=1,且INT1为高电平时,TR1置1发动定时器1
//当GATE=0时,TR1置1发动定时器1
sbit TR1 = TCON^6;
//TF0为定时器0溢出标志,功用及操作方法同TF1
sbit TF0 = TCON^5;
//TR0为定时器0运转操控位,其功用及操作方法同TR1
sbit TR0 = TCON^4;
//IE1为外部中止1恳求标志
//IT1=0时,为电平触发方法,每个机器周期的S5P2采样INT1引脚,
//若INT1脚为低电平,则置1,不然IE1清0
//IT1=1时,INT1位跳变沿触发方法,当第一个机器周期采样到INT1为低电平时,则IE1置1
//IE1=1时,表明外部中止1正在向CPU恳求中止,当CPU呼应中止,转向中止服务程序,该位由硬件清0
sbit IE1 = TCON^3;
//IT1为外部中止1触发方法挑选位
//IT1=0,电平触发方法,引脚INT1上低电平有用
//IT1=1,跳变沿触发方法,引脚INT1上的电平从高到低的负跳变有用
sbit IT1 = TCON^2;
//IE0为外部中止0恳求标志,功用及操作同IE1
sbit IE0 = TCON^1;
//IT0为外部中止0触发方法挑选位,功用及操作同IT1
sbit IT0 = TCON^0;
//定时器1初值高8位
sfr TH1 = 0x8D;
//定时器1初值低8位
sfr TL1 = 0x8B;
#define uchar unsigned char
#define uint unsigned int
uchar flag, a, i;
uchar code table[] = “I get “; //界说一个字符类型编码数组
void init();
void main()
{
}
void init()
{
}
//串口中止服务程序
void ser() interrupt 4
{
}
三.程序小结
1) 操作串行口之前,需求对单片机的一些与串口有关的特别功用寄存器进行初始化设置, 首要是设置发生波特率
的定时器1, 串行口操控和中止操控,其首要过程包含:
a. 确认T1的作业方法(变成TMOD寄存器)
b. 核算T1的初值, 装载TH1,TL1
c. 发动T1(编程TCON中的TR1位)
d. 确认串行口作业方法(编程SCON寄存器)
e. 串行口作业在中止方法时, 要进行中止设置(变成IE, IP寄存器)
2) 51单片机能够经过特别功用寄存器SBUF对串行接纳或串行发送寄存器进行拜访, 两个寄存器共用一个地址
99H,但在物理上是两个独立的寄存器, 由指令操作决议拜访哪一个寄存器. 履行写指令时, 拜访串行发送寄存器, 履行读指令时, 拜访串行接纳寄存器, 接纳器具有双缓冲结构, 即在从接纳寄存器中读出前一个已收到
的字节之前, 便能接纳第二个字节, 假如第二个字节现已接纳结束, 第一个字节还没有读出, 则丢掉其间
一个字节. 关于发送器, 由于数据由CPU操控和发送的, 所以不需求考虑.
a=SBUF;代表单片机主动将串口接纳寄存器中的数据取走给a.
SBUF=a;代表单片机将串口发送寄存器中的数据一位位从串口发送出去.
3) 此程序能够用在显现串口接纳的数据上.
4) 程序几个变量的阐明
a. 主函数main中while中ES=0能够换成EA=0,ES=1能够换成EA=1(行将串口中止的暂时操控改为大局中止的操控)
b. 初始化函数init中ET1=1不能翻开,即使主函数外有计数器1的子函数(函数为空)
c. 初始化函数init中TR1=1需求翻开(包含TMOD=0x20),由于需求定时器1溢出率决议串口波特率.
d. 初始化函数init中REN=1需求翻开,不然串口不会承受数据
e. 初始化函数SM1=1需求翻开,不然串口接纳乱码
f. 初始化函数ES=1需求翻开,不然串口不会承受数据
5) 法2中TH1的地址位0x8D, 与TCON中的TF0位地址相同, 这儿对TH1赋值时不是会对TF0发生影响吗?