51单片机串行口中断服务程序

合集下载

关于51系列单片机中断嵌套

关于51系列单片机中断嵌套

说最基本的,老的51单片机(80C51系列)有5个中断源,2个优先级,可以实现二级中断服务嵌套。

现在很多扩展的51单片机已经有4个优先级(或更多)和更多的中断源了。

在说到中断之前,我先来定义一下优先级,明白了什么是优先级,后面的阐述就容易明白了。

实际上很多人都是混淆了优先级的含义,所以才觉得糊里糊涂。

中断的优先级有两个:查询优先级和执行优先级。

什么是查询优级呢?我们从datasheet或书上看到的默认(IP寄存器不做设置,上电复位后为00H)的优先级:外部中断0 > 定时/计数器0 > 外部中断1 > 定时/计数器1 > 串行中断或int0,timer0,int1,timer1,serial port 或INT0、T0、INT1、T1、UART或PX0>PT0>PX1>PT1>PS>......其实都是查询优级。

首先查询优先级是不可以更改和设置的。

这是一个中断优先权排队的问题。

是指多个中断源同时产生中断信号时,中断仲裁器选择对哪个中断源优先处理的顺序。

而这与是否发生中断服务程序的嵌套毫不相干。

当CPU查询各个中断标志位的时候,会依照上述5个查询优先级顺序依次查询,当数个中断同时请求的时候,会优先查询到高优查询先级的中断标志位,但并不代表高查询优先级的中断可以打断已经并且正在执行的低查询优先级的中断服务。

例如:当计数器0中断和外部中断1(按查询优先级,计数器0中断>外部中断1)同时到达时,会进入计时器0的中断服务函数;但是在外部中断1的中断服务函数正在服务的情况下,这时候任何中断都是打断不了它的,包括逻辑优先级比它高的外部中断0计数器0中断。

而中断的执行优先级就是你对IP寄存器的设置了。

在2个优先级的情况下,某位为1,则相应的中断源为高优先级;为0,则为低优先级。

关于中断的优先级有三条原则:1、CPU同时接收到几个中断时,首先响应优先级最高的中断请求;2、正在进行的中断过程不能被新的同级或低行优优先级的中断请求所中断;3、正在进行的低行优优先级中断服务,能被高行优优先级中断请求中断;若:同一执行优先级中的中断申请不止一个时,则有一个中断优先权排队问题。

MCS-51系列单片机的中断系统

MCS-51系列单片机的中断系统
单片机原理与接口技术
大连理工大学出版社
第5章 中断
当断不断必受其乱
第5章 中断系统
5.1 概述 MCS-51系列单片机的中断系统 5.2 MCS-51系列单片机的中断系统 5.3 中断程序设计方法
第5 章
中断系统
中断控制是单片机最重要的技术之一, 实时控制及人机交互等应用都是通过中 断实现的。 本章主要介绍中断的基本概念、MCS-51 系列单片机单片机的中断机制及其简单 应用。
5.2.2中断控制 5.2.2中断控制
1.中断允许 MCS-51系列单片机中断系统通过中断允许控制 寄存器IE实现开中断和关中断的功能。 (1)IE寄存器 IE寄存器由一个中断允许总控制位和各中断源 的中断允许控制位构成,从而进行两级中断允 许控制。IE寄存器的各位定义如下:
5.2.2中断控制 IE寄存器
5.2.2中断控制 IE寄存器
EX1(IE.2)——外中断1的中断允许控 制位。中断总允许时,EX1=0,禁止外中 断1中断;EX1=1,允许外中断1中断。 ET1(IE.3)——定时器T1的中断允许控 制位。中断总允许时,EX1=0,禁止T1中 断;ET1=1,允许T1中断。
5.2.2中断控制 5.2.2中断控制 IE寄存器
5.2.1中断源和中断标志
当MCS-51系列单片机的外中断源以脉冲方式触 发时,负脉冲有效。CPU在一个机器周期采样到 INT0(或者 INT1 )引脚上为高电平,在接下 来的一个机器周期采样到INT0(或者INT1)引 脚上是低电平,即出现了下降沿的跳变(负脉 冲)时,就认为是外中断0(或者外中断1)的 一个有效的中断请求信号。因为两次检测的间 隔时间为一个机器周期,负脉冲对应的高低电 平持续时间都应至少维持一个机器周期,从而 保证CPU能够检测到电平的跳变。

MCS-51单片机的中断系统

MCS-51单片机的中断系统

MCS-51单⽚机的中断系统单⽚机中断技术概述在任何⼀款事件驱动型的CPU⾥⾯都应该会有中断系统,因为中断就是为响应某种事件⽽存在的。

中断的灵活应⽤不仅能够实现想要的功能,⽽且合理的中断安排可以提⾼事件执⾏的效率,因此中断在单⽚机应⽤中的地位是⾮常重要的。

单⽚机中断(Interrupt)是硬件驱动事件,它使得CPU暂停当前的主程序,转⽽去执⾏⼀个中断服务⼦程序。

为了更形象地理解中断,下⾯以学⽣上⾃习时接电话为例阐述⼀下中断的概念。

单⽚机的中断系统有5个中断源、2个中断优先级,可实现两级中断服务程序嵌套。

如果单⽚机没有中断系统,单⽚机的⼤量时间可能会浪费在查询是否有服务请求发⽣的定时査询操作上。

采⽤中断技术完全消除了单⽚机在査询⽅式中的等待现象,⼤⼤地提⾼了单⽚机的⼯作效率和实时性。

单⽚机中断系统结构及中断控制中断系统结构图如图5-2所⽰。

由图5-2可见,MCS-51中断系统共有5个中断请求源:INT0——外部中断请求0,中断请求信号由INT0引脚输⼊。

定时/计数器T0计数溢出发出的中断请求。

INT1——外部中断请求1,中断请求信号由INT1引脚输⼊。

定时/计数器T1计数溢出发出的中断请求。

串⾏⼝中断请求。

中断优先级从⾼到底排列。

单⽚机如何知道有中断请求信号?是否能够响应该中断?若5个中断源请求信号同时到来,单⽚机如何响应?这些问题都可以由中断寄存器来解决。

单⽚机中断寄存器有中断标志寄存器TCON和SCON、中断使能寄存器IE和中断优先级寄存器IP,这些寄存器均为8位。

中断标志寄存器5个中断请求源的中断请求标志分别由TCON和SCON的相应位锁存,单⽚机通过这些中断标志位的状态便能知道具体是哪个中断源正在申请中断。

TCON寄存器TCON寄存器为定时/计数器的控制寄存器,字节地址为88H,可位寻址。

特殊功能寄存器TCON的格式如图5-3所⽰。

TCON各标志位功能如下。

TF1——定时/计数器T1的溢出中断请求标志位。

AT89S51单片机串行口的内部结构及工作原理介绍

AT89S51单片机串行口的内部结构及工作原理介绍

AT89S51单片机串行口的内部结构及工作原理介绍AT89S51单片机串行口的内部结构如下图所示。

它有两个物理上独立的接收、发送缓冲器SBUF(属于特殊功能寄存器),可同时发送、接收数据。

发送缓冲器只能写入不能读出,接收缓冲器只能读出不能写入,两个缓冲器共用一个特殊功能寄存器字节地址(99H)。

串行口的控制寄存器共有两个:特殊功能寄存器SCON 和PCON。

下面介绍这两个特殊功能寄存器各位的功能。

1、串行口控制寄存器SCON串行口控制寄存器SCON,字节地址988H,可位寻址,位地址为98H~9FH。

SCON的格式如下图所示。

下面介绍SCON中各位的功能。

(1) SM0、SMl:串行口4种工作方式选择位。

SM0、SM1两位的编码所对应的4种工作方式见下表。

表串行口的4种工作方式(2) SM2:多机通信控制位。

因为多机通信是在方式2和方式3下进行的,因此SM2位主要用于方式2或方式3中。

当串行口以方式2或方式3接收时,如果SM2=1,则只有当接收到的第9位数据(RB8)为1时,才使RI置l,产生中断请求,并将接收到的前8位数据送人SBUF;当接收到的第9位数据(RB8)为0时,则将接收到的前8位数据丢弃。

而当SM2=0时,则不论第9位数据是l还是0,都将前8位数据送入SBUF中,并使RI置1,产生中断请求。

在方式1时,如果SM2=1,则只有收到有效的停止位时才会激活RI。

在方式0时,SM2必须为0。

(3)REN:允许串行接收位。

由软件置1或清0。

REN=1,允许串行口接收数据。

REN=O,禁止串行口接收数据。

(4)TB8:发送的第9位数据。

在方式2和方式3时,TB8是要发送的第9位数据,其值由软件置l或清O。

在双机串行通信时,TB8一般作为奇偶校验位使用;在多机串行通信中用来表示主机发送的是地址帧还是数据帧,TB8=1为地址帧,TB8=0为数据帧。

(5) RB8:接收的第9位数据。

工作在方式2和方式3时,RB8存放接收到的第9位数据。

51单片机串口通信程序。。含详细例子

51单片机串口通信程序。。含详细例子
while(RI == 0); RI = 0; c = SBUF; // 从缓冲区中把接收的字符放入 c 中 SBUF = c; // 要发送的字符放入缓冲区 while(TI == 0); TI = 0; } }
4.//////////////// /////////////////////////////////////////////////////////
pw.fpReadSign(); SendData();//通知上位机,送出读出器件特征字 }
void Erase()//擦除器件 {
pw.fpErase(); SendData();//通知上位机,擦除了器件 }
void Write()//写器件 {
BYTE n; pw.fpInitPro();//编程前的准备工作 SendData();//回应上位机表示进入写器件状态,
{
unsigned char c;
TMOD = 0x20; // 定时器 1 工作于 8 位自动重载模式, 用于产生波特率
TH1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));
TL1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate))); SCON = 0x50; PCON = 0x00; TR1 = 1; IE = 0x00; // 禁止任何中断 while(1) {
///////////////////////////////////////////////////////////////////////////////// //所支持的 FID,请在这里继续添加
///////////////////////////////////////////////////////////////////////////// extern void PreparePro00();//FID=00:AT89C51 编程器 extern void PreparePro01();//FID=01:AT89C2051 编程器 extern void PreparePro02();//FID=02:AT89S51 编程器

51单片机中断程序大全

51单片机中断程序大全

//实例42:用定时器T0查询方式P2口8位控制LED闪烁#include<reg51.h> // 包含51单片机寄存器定义的头文件void main(void){// EA=1; //开总中断// ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式1TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值{//实例43{// EA=1;//{while(TF1==0);TF1=0;sound=~sound; //将P3.7引脚输出电平取反TH1=(65536-921)/256; //定时器T0的高8位赋初值TL1=(65536-921)%256; //定时器T0的高8位赋初值}}//实例44:将计数器T0计数的结果送P1口8位LED显示#include<reg51.h> // 包含51单片机寄存器定义的头文件sbit S=P3^4; //将S位定义为P3.4引脚void main(void){// EA=1; //开总中断// ET0=1; //定时器T0中断允许TMOD=0x02; //使用定时器T0的模式2TH0=256-156; //定时器T0的高8位赋初值TL0=256-156; //定时器T0的高8位赋初值TR0=1; //启动定时器T0while(1)//无限循环等待查询{while(TF0==0) //如果未计满就等待{if(S==0) //按键S按下接地,电平为0P1=TL0; //计数器TL0加1后送P1口显示}//实例45{EA=1;{}//实例46#include<reg51.h> // 包含51单片机寄存器定义的头文件sbit D1=P2^0; //将D1位定义为P2.0引脚unsigned char Countor; //设置全局变量,储存定时器T0中断次数void main(void){EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式2TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0Countor=0; //从0开始累计中断次数while(1);}/************************************************************** 函数功能:定时器T0的中断服务程序**************************************************************/ void Time0(void) interrupt 1 using 0{Countor++; //中断次数自加1if(Countor==20) //若累计满20次,即计时满1s{D1=~D1; //按位取反操作,将P2.0引脚输出电平取反Countor=0; //将Countor清0,重新从0开始计数}//实例47{EA=1;}{Countor2++; //Countor2自加1if(Countor1==2) //若累计满2次,即计时满100ms{D1=~D1; //按位取反操作,将P2.0引脚输出电平取反Countor1=0; //将Countor1清0,重新从0开始计数}if(Countor2==8) //若累计满8次,即计时满400ms{D2=~D2; //按位取反操作,将P2.1引脚输出电平取反Countor2=0; //将Countor1清0,重新从0开始计数}TH1=(65536-46083)/256; //定时器T1的高8位重新赋初值TL1=(65536-46083)%256; //定时器T1的高8位重新赋初值}//实例50-1:输出50个矩形脉冲#include<reg51.h> //包含51单片机寄存器定义的头文件sbit u=P1^4; //将u位定义为P1.4/*************************************************函数功能:延时约30ms (3*100*100=30 000μs =30m*************************************************/void delay30ms(void){ unsigned char m,n;for(m=0;m<100;m++)for(n=0;n<100;n++);}{u=1;//实例{//实例51-2#include<reg51.h> //包含51单片机寄存器定义的头文件sbit ui=P3^2; //将ui位定义为P3.0(INT0)引脚,表示输入电压void main(void){TMOD=0x0a; // TMOD=0000 1010B,使用定时器T0的模式2,GATE置1 EA=1; //开总中断ET0=0; //不使用定时器T0的中断TR0=1; //启动T0TH0=0; //计数器T0高8位赋初值TL0=0; //计数器T0低8位赋初值while(1) //无限循环,不停地将TL0计数结果送P1口{while(ui==0) : //INT0为低电平,T0不能启动TL0=0; //INT0为高电平,启动T0计时,所以将TL0清0 while(ui==1): //在INT0高电平期间,等待,计时P1=TL0; //将计时结果送P1口显示} }//实例53:用外中断0的中断方式进行数据采集#include<reg51.h> //包含51单片机寄存器定义的头文件sbit S=P3^2; //将S位定义为P3.2,void main(void){EA=1; //开放总中断EX0=1; //允许使用外中断IT0=1; //选择负跳变来触发外中断P1=0xff;{P1=~P1;//实例54-1sbit u=P1^4;{EA=1;{u=~u; //}//实例54-2sbit u=P3^2;{TMOD=0x02; //TMOD=0000 0010B,使用定时器T0的模式2EA=1; //开放总中断EX0=1; //允许使用外中断IT0=1; //选择负跳变来触发外中断ET0=1; //允许定时器T0中断TH0=0; //定时器T0赋初值0TL0=0; //定时器T0赋初值0TR0=0; //先关闭T0while(1) ; //无限循环,不停检测输入负脉冲宽度}void int0(void) interrupt 0 using 0 //外中断0的中断编号为0{ TR0=1; //外中断一到来,即启动T0计时TL0=0; //从0开始计时while(u==0) //低电平时,等待T0计时;P1=TL0; //将结果送P1口显示TR0=0; //关闭T0}//实例55:方式0控制流水灯循环点亮#include<reg51.h> //包含51单片机寄存器定义的头文件#include<intrins.h> //包含函数_nop_()定义的头文件unsigned char code Tab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码,该数组被定义为全局变量sbit P17=P1^7;/**************************************************************{{P17=0;_nop_();_nop_();P17=1;;TI=0; //}******************************************/void main(void){unsigned char i;SCON=0x00; //SCON=0000 0000B,使串行口工作于方式0while(1){for(i=0;i<8;i++){Send(Tab[i]); //发送数据delay(); //延时}}}。

51单片机串口通信程序。。含详细例子

51单片机串口通信程序。。含详细例子

{ P3_4=0; P3_3=1;
} void RstPro()//编程器复位 {
pw.fpProOver();//直接编程结束 SendData();//通知上位机,表示编程器就绪,可以直接用此函数因为协议号(ComBuf[0])还没被修改,下同 }
void ReadSign()//读特征字 {
} void serial () interrupt 4 using 3 //串口接收中断函数 {
if (RI) { RI = 0 ; ch=SBUF; read_flag= 1 ; //就置位取数标志 }
} main()
{ init_serialcom(); //初始化串口 while ( 1 ) { if (read_flag) //如果取数标志已置位,就将读到的数从串口发出 { read_flag= 0 ; //取数标志清 0 send_char_com(ch); } }
while(RI == 0); RI = 0; c = SBUF; // 从缓冲区中把接收的字符放入 c 中 SBUF = c; // 要发送的字符放入缓冲区 while(TI == 0); TI = 0; } }
4.//////////////// /////////////////////////////////////////////////////////
SendData(); } else break;//等待回应失败 } pw.fpProOver();//操作结束设置为运行状态 ComBuf[0]=0;//通知上位机编程器进入就绪状态 SendData(); }
void Lock()//写锁定位
{
pw.fpLock();
SendData();

第3章MCS-51单片机的中断系统

第3章MCS-51单片机的中断系统
某人看书执行主程序日常事务电话铃响中断信号int0中断请求暂停看书暂停执行主程序中断响应书中作记号当前pc入栈保护断点电话谈话执行io程序中断服务继续看书返回主程序中断返回执行主程序主程序继续执行主程序断点中断请求中断响应执行中断处理程序中断返回中断与转子的区别中断是随机的转子事先编程决定断点
3.3 MCS-51的中断系统 的中断系统
4、中断响应过程 、 关中断:屏蔽其它中断请求信号。 关中断:屏蔽其它中断请求信号。 保护断点:将断点地址压入堆栈保存,即当前 值入栈 值入栈。 保护断点:将断点地址压入堆栈保存,即当前PC值入栈。 寻找中断源:中断服务程序入口地址送 ,转入中断服务。 寻找中断源:中断服务程序入口地址送PC,转入中断服务。 保护现场:将中断服务程序使用的所有寄存器内容入栈。 保护现场:将中断服务程序使用的所有寄存器内容入栈。 中断处理:执行中断源所要求的程序段。 中断处理:执行中断源所要求的程序段。 恢复现场:恢复被使用寄存器的原有内容。 恢复现场:恢复被使用寄存器的原有内容。 开中断:允许接受其它中断请求信号。 开中断:允许接受其它中断请求信号。 中断返回:执行 指令, 中断返回:执行RETI指令,栈顶内容 指令 栈顶内容→PC,程序跳转回断点。 ,程序跳转回断点。
当前PC入栈 书中作记号 当前 入栈
主程序 执行主程序 中断请求 断点 继续执行主程序 中断返回 执行中断 处理程序 中断响应
中断与转子的区别 中断是随机的, 中断是随机的,转子事先编程决定
3.3.1 中断的定义 2、几个术语 、 主程序:原来正常运行的程序称为主程序。 主程序:原来正常运行的程序称为主程序。 断点: 主程序被断开的位置(或地址)称为“断点” 断点 主程序被断开的位置(或地址)称为“断点”。 中断源:引起中断的原因,或发出中断申请的来源。 中断源 引起中断的原因,或发出中断申请的来源。 引起中断的原因 中断请求:中断源要求服务的请求称为“中断请求” 中断请求 中断源要求服务的请求称为“中断请求” 。 中断源要求服务的请求称为 中断响应: 终止当前执行的程序, 中断响应:CPU终止当前执行的程序,去执行相应中断源 终止当前执行的程序 的中断请求。 的中断请求。 中断服务或中断处理程序: 中断服务或中断处理程序: “中断”之后所执行的相应的处理程序。 中断”之后所执行的相应的处理程序。 中断系统:能够实现中断处理功能的部件。 中断系统:能够实现中断处理功能的部件。

51单片机中断系统详解

51单片机中断系统详解

51单片机中断系统详解51 单片机中断系统详解(定时器、计数器)51 单片机中断级别中断源INT0---外部中断0/P3.2 T0---定时器/计数器0 中断/P3.4 INT1---外部中断1/P3.3 T1----定时器/计数器1 中断/P3.5 TX/RX---串行口中断T2---定时器/计数器 2 中断第5 最低4 5 默认中断级别最高第2 第3 第4 序号(C 语言用) 0 1 2 3 intrrupt 0中断允许寄存器IE位序号符号位EA/0 ------ET2/1 ES ET1 EX1 ET0 EX0 DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 EA---全局中允许位。

EA=1,打开全局中断控制,在此条件下,由各个中断控制位确定相应中断的打开或关闭。

EA=0,关闭全部中断。

-------,无效位。

ET2---定时器/计数器2 中断允许位。

ET2=1, 打开T2 中断。

ET2=0,关闭T2 中断。

关,。

ES---串行口中断允许位。

关,。

ES=1,打开串行口中断。

关,。

ES=0,关闭串行口中断。

关,。

ET1---定时器/计数器1 中断允许位。

关,。

ET1=1,打开T1 中断。

ET1=0,关闭T1 中断。

EX1---外部中断1 中断允许位。

EX1=1,打开外部中断1 中断。

EX1=0,关闭外部中断1 中断。

ET0---定时器/计数器0 中断允许位。

ET0=1,打开T0 中断。

EA 总中断开关,置1 为开;EX0 为外部中断0 (INT0) 开关,。

ET0 为定时器/计数器0(T0)开EX1 为外部中断1(INT1)开ET1 为定时器/计数器1(T1)开ES 为串行口(TX/RX)中断开ET2 为定时器/计数器2(T2)开ET0=0,关闭T0 中断。

EX0---外部中断0 中断允许位。

EX0=1,打开外部中断0 中断。

EX0=0,关闭外部中断0 中断。

中断优先级寄存器IP位序号位地址------PS/0 PT1/0 PX1/0 PT0/0 PX0/0 DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 -------,无效位。

51单片机外部中断实验

51单片机外部中断实验

实验6 外部中断实验(仿真部分)一、实验目的1. 学习外部中断技术的基本使用方法。

2. 学习中断处理程序的编程方法。

二、实验内容在INT0和INT1上分别接了两个可回复式按钮,其中INT0上的按钮每按下一次则计数加一,其中INT1上的按钮每按下一次则计数减一。

P1.0~ P1.3接LED 灯,以显示计数信号。

三、实验说明编写中断处理程序需要注意的问题是:1.保护进入中断时的状态,并在退出中断之前恢复进入时的状态。

2.必须在中断处理程序中设定是否允许中断重入,即设置EX0位。

3.INT0和INT1分别接单次脉冲发生器。

P1.0~ P1.3接LED 灯,以查看计数信号.四、硬件设计利用以下元件:AT89C51、BOTTON 、CAP 、CAP-POL 、CRYSTAL 、RES 、NOT 、LED-Yellow 。

设计出如下的硬件电路。

晶振频率为12MHz 。

五、参考程序框图主程序框图 INT0中断处理程序框图开始 设置有关中断控制寄存器开外中断INT0、INT1 设置P1.0~ 3初始状态 显示循环等待中断 INT0中断入口 计数加一 保护现场 恢复现场 中断返回实验6 外部中断实验(实验箱部分)1.实验目的认识中断的基本概念学会外部中断的基本用法学会asm和C51的中断编程方法2.实验原理图按键中断【硬件接法】P1.1控制LED,低电平点亮P3.3/INT1接按键,按下时产生低电平【运行效果】程序工作于中断方式,按下按键K2后,LED点亮,1.5秒后自动熄灭。

8051单片机有/INT0和/INT1两条外部中断请求输入线,用于输入两个外部中断源的中断请求信号,并允许外部中断源以低电平或下降沿触发方式来输入中断请求信号。

/INT0和/INT1中断的入口地址分别是0003H和0013H。

TCON寄存器(SFR地址:88H)中的IT0和IT1位分别决定/INT0和/INT1的触发方式,置位时为下降沿触发,清零时为低电平触发。

c51单片机定时器中断的执行过程

c51单片机定时器中断的执行过程

c51单片机定时器中断的执行过程
C51单片机定时器中断的执行过程可以分为以下几个步骤:
1. 初始化定时器:首先需要对定时器进行初始化,设置定时器的计数模式、计数值、溢出方式等参数。

这些参数可以通过编程实现,也可以通过硬件电路进行调整。

2. 启动定时器:初始化完成后,需要启动定时器。

启动定时器后,定时器开始按照预设的参数进行计数。

当计数值达到预设的溢出值时,定时器会产生一个溢出信号。

3. 设置中断服务程序:为了在定时器溢出时执行特定的操作,需要设置一个中断服务程序 ISR)。

中断服务程序是一段特殊的代码,它会在定时器溢出时被自动调用。

4. 开启中断:在中断服务程序设置完成后,需要开启相应的中断。

开启中断后,当定时器溢出时,CPU会自动跳转到中断服务程序执行。

5. 执行中断服务程序:当定时器溢出时,CPU会暂停当前任务,跳转到中断服务程序执行。

在中断服务程序中,可以执行一些特定的操作,如更新显示、读取传感器数据等。

6. 返回主程序:中断服务程序执行完成后,CPU会自动返回到主程序继续执行。

这样,通过定时器中断,可以实现对单片机的周期性控制和数据采集等功能。

51单片机串行口中断服务程序

51单片机串行口中断服务程序

51单片机串行口中断服务程序单片机串行口中断服务程序是指在单片机进行串行通信时,当接收到数据时会触发中断,然后执行相应的中断服务程序。

下面是一个示例的单片机串行口中断服务程序,共计1200字以上。

#include <reg51.h> // 引入reg51.h头文件//定义串行口中断标志sbit RI_FLAG = P3^0; // 数据接收中断标志sbit TI_FLAG = P3^1; // 数据发送中断标志//定义串行口接收数据缓冲区unsigned char receiveBuffer[10];unsigned char receiveCount = 0;//定义串行口发送数据缓冲区unsigned char sendBuffer[10];unsigned char sendCount = 0;//串行口中断服务函数void serialInterrupt( interrupt 4if(RI_FLAG) // 判断是否是数据接收中断receiveBuffer[receiveCount] = SBUF; // 读取串行口接收数据receiveCount++; // 接收计数加1RI_FLAG=0;//清除中断标志位}if(TI_FLAG) // 判断是否是数据发送中断if(sendCount < 10) // 判断是否还有数据需要发送SBUF = sendBuffer[sendCount]; // 发送串行口数据sendCount++; // 发送计数加1}elsesendCount = 0; // 重置发送计数TI_FLAG=0;//清除中断标志位}}//主函数void mainES=1;//允许串行口中断TMOD=0x20;//设置定时器1为模式2,串行口使用定时器1 TH1=0xFD;//设置波特率为9600,定时器初值为0xFDTL1=0xFD;//定时器初值为0xFDSCON=0x50;//设置串行口工作在方式1,允许接收TR1=1;//启动定时器1while(1)//主程序逻辑//将数据存入发送缓冲区sendBuffer[0] = 'H';sendBuffer[1] = 'e';sendBuffer[2] = 'l';sendBuffer[3] = 'l';sendBuffer[4] = 'o';sendBuffer[5] = '\r'; // 发送回车符sendBuffer[6] = '\n'; // 发送换行符while(sendCount != 0) //等待数据发送完毕//主程序逻辑}}。

《单片机》判断题题库答案

《单片机》判断题题库答案

《单片机原理及应用》判断题题库答案三、判断正误(请在你认为正确的题后括号中填入“√”,否则填入“×”。

每题2分)1、堆栈指针SP当前的内容为50H,当执行完PUSH ACC指令后其内容变为4FH。

(×)2、为了读入P1口引脚电平的高低,需要先向P1口写入0FFH。

(√)3、当T0做为定时器使用时其对单片机内部的脉冲进行计数。

(√)4、单片机是在一片硅片上集成了中央处理器和各种输入输出接口。

(×)5、MCS-51单片机其外部中断1(INT1)的中断服务程序入口地址是0003H。

(×)6、堆栈指针SP当前的内容为60H,当执行完PUSH DPH指令后其内容变为61H。

(√)7、在MCS-51单片机中变址寻址方式用于寻址数据存储器地址空间。

(×)8、MCS-51单片机共有111条指令,其中需要4个机器周期执行时间的有2条。

(√)9、在MCS-51单片机中定时/计数器T1有四种工作方式。

(×)10、MCS-51单片机的P0口做为I/O口时,需要外接上拉电阻才能驱动MOS电路。

(√)11、当执行MOV P1,#0FFH和MOV A,P1指令后,累加器A里的内容一定是0FFH。

(×)12、在允许串口中断的情况下,当CPU响应串口的中断请求后自动将RI标志复位。

(×)13、当PSW的值为88H时,8031片内工作寄存器R0-R7相对应的片内RAM的地址为08H-0FH。

(√)14、MCS-51系列单片机采用的是哈佛结构。

(×)15、8031单片机在访问外部数据存储器时,ALE信号在两个机器周期中只出现一次。

(√)16、8031单片机外部可配置ROM的最大空间是64k字节。

(√)17、堆栈指针SP的内容是50H,当执行完指令POP ACC后其内容变为51H。

(√)18、寄存器寻址方式也可以用来访问外部数据存储器。

(×)19、MCS-51系列单片机的内部定时/计数器T1具有四种工作方式。

单片机讲义(第五章MCS-51的中断系统)

单片机讲义(第五章MCS-51的中断系统)


5.6.2 跳沿触发方式(下降沿触发方式)
如果相继连续两次采样,一个机器周期采样到外部中断输入为高, 下一个机器周期采样为低,则置1中断申请触发器,直到CPU响应此 中断时,该标志才清0。这样不会丢失中断,输入的负脉冲宽度至少保
持12个时钟周期(若晶振频率为6 MHZ,则为2μs),才能被CPU采样到。
(2)用字节操作指令
MOV IP,#05H ;000 00101 或者用: MOV 0B8H,#05H ;B8H为IP寄存器的字节地址
5.5 外部中断的响应时间


从外部中断请求有效(外部中断请求标志置1)到转 向中断入口地址所需要的响应时间。 外部中断的最短响应时间为3个机器周期。其中中断
请求标志位查询占1个机器周期,而这个机器周期恰好是处于指令 的最后一个机器周期,在这个机器周期结束后,中断即被响应, CPU接着执行1条硬件子程序调用指令 LCALL以转到相应的中断服 务程序入口,则需要2个机器周期。

外部中断响应的最长时间为8个机器周期。执行RETI或
是访问IE或IP的指令,最长需要2个机器周期。而接着再执行的1条 指令,按最长的指令(乘法指令MUL和除法指令DIV)来算,需4 个机器周期。再加上硬件子程序调用指令LCALL的执行,需要2个 机器周期,所以,外部中断响应最长时间为8个机器周期。
5.3.3中断允许寄存器IE

IE中各位的功能如下:
(l)EA——中断允许总控制位 EA=0,CPU屏蔽所有的中断请求(CPU关中 断); EA=1,CPU开放所有中断(CPU开中断)。 (2)ES——串行口中断允许位 ES=0,禁止串行口发送/接收中断; ES=1,允许串行口发送/接收中断。 (3) ET1——定时器/计数器T1的溢出中断允许 位 ET1= 0,禁止T1计数溢出中断; ET1= 1,允许T1计数溢出中断。

51单片机中断详解

51单片机中断详解

一、中断的概念CPU在处理某一事件A时,发生了另一事件B请求C PU迅速去处理(中断发生);CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);待C PU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断二、中断源在51单片机中有5个中断源中断号优先级中断源中断入口地址0 1(最高)外部中断0 0003H1 2 定时器0 000BH2 3 外部中断1 0013H3 4 定时器1 0018H4 5 串口总段0023H三、中断寄存器单片机有10个寄存器主要与中断程序的书写控制有关1.中断允许控制寄存器IE2.定时器控制寄存器TC ON3.串口控制寄存器SCON4.中断优先控制寄存器IP5.定时器工作方式控制寄存器TMOD6.定时器初值赋予寄存器(TH0/TH1,TL0/TL1)四、寄存器功能与赋值说明注:在用到中断时,必须要开总中断EA,即EA=1。

//开总中断1.中断允许控制寄存器IEEX0(EX1):外部中断允许控制位EX0=1 外部中断0开关闭合//开外部0中断EX0=0 外部中断0开关断开ET0(ET1):定时中断允许控制位ET0=1 定时器中断0开关闭合//开内部中断0ET0=0 定时器中断0开关断开ES: 串口中断允许控制位ES=1 串口中断开关闭合//开串口中断ES=0 串口中断开关断开2.定时器控制寄存器TCON //控制外部中断和定时器中断外部中断:IE0(IE1):外部中断请求标志位当INT0(INT1)引脚出现有效的请求信号,此位由单片机自动置1,cpu开始响应,处理终端,而当入中断程序后由单片机自动置0.//外部中断,即外部中断相应的引脚接入低电平或下降沿信号时,中断开始响应。

IT0(IT1):外部中断触发方式控制位//选择有效信号IT0(IT1)=1:脉冲触发方式,下降沿有效。

IT0(IT1)=0:电平触发方式,低电平有效。

MCS-51单片机的串行口及串行通信技术

MCS-51单片机的串行口及串行通信技术

MCS-51单⽚机的串⾏⼝及串⾏通信技术数据通信的基本概念串⾏通信有单⼯通信、半双⼯通信和全双⼯通信3种⽅式。

单⼯通信:数据只能单⽅向地从⼀端向另⼀端传送。

例如,⽬前的有线电视节⽬,只能单⽅向传送。

半双⼯通信:数据可以双向传送,但任⼀时刻只能向⼀个⽅向传送。

也就是说,半双⼯通信可以分时双向传送数据。

例如,⽬前的某些对讲机,任⼀时刻只能⼀⽅讲,另⼀⽅听。

全双⼯通信:数据可同时向两个⽅向传送。

全双⼯通信效率最⾼,适⽤于计算机之间的通信。

此外,通信双⽅要正确地进⾏数据传输,需要解决何时开始传输,何时结束传输,以及数据传输速率等问题,即解决数据同步问题。

实现数据同步,通常有两种⽅式,⼀种是异步通信,另⼀种是同步通信。

异步通信在异步通信中,数据⼀帧⼀帧地传送。

每⼀帧由⼀个字符代码组成,⼀个字符代码由起始位、数据位、奇偶校验位和停⽌位4部分组成。

每⼀帧的数据格式如图7-1所⽰。

⼀个串⾏帧的开始是⼀个起始位“0”,然后是5〜8位数据(规定低位数据在前,⾼位数据在后),接着是奇偶校验位(此位可省略),最后是停⽌位“1”。

起始位起始位"0”占⽤⼀位,⽤来通知接收设备,开始接收字符。

通信线在不传送字符时,⼀直保持为“1”。

接收端不断检测线路状态,当测到⼀个“0”电平时,就知道发来⼀个新字符,马上进⾏接收。

起始位还被⽤作同步接收端的时钟,以保证以后的接收能正确进⾏。

数据位数据位是要传送的数据,可以是5位、6位或更多。

当数据位是5位时,数据位为D0〜D4;当数据位是6位时,数据位为D0〜D5;当数据位是8位时,数据位为D0〜D7。

奇偶校验位奇偶校验位只占⼀位,其数据位为D8。

当传送数据不进⾏奇偶校验时,可以省略此位。

此位也可⽤于确定该帧字符所代表的信息类型,“1"表明传送的是地址帧,“0”表明传送的是数据帧。

停⽌位停⽌位⽤来表⽰字符的结束,停⽌位可以是1位、1.5位或2位。

停⽌位必须是⾼电平。

接收端接收到停⽌位后,就知道此字符传送完毕。

第六章 51系列单片机中断系统

第六章  51系列单片机中断系统
第6章
51系列单片机的中断系统
本章主要介绍51系列单片机中断系统问题, 本章将介绍以下具体内容:
中断系统----中断源、中断方式 、中断控制寄 存器、中断响应、中断请求的撤除。
6.1
中断系统的概念
6.1.1 中断系统
中断应用在: 处理实时控制、故障自动诊断、计算机与 外围设备之间进行数据传送、进行人机对话等场合。 中断:是计算机的一种资源共享技术。中断技术就是解决这 种多项任务共享一个CPU资源的最好办法。
一般加装所示电路,并通过响应软件来撤销电平请求信号。
Q输出端
SD为置1端, 高电平有效 D端是逻辑输入端, 固定为低电平 CP为时钟输入端, 接外中断信号
当外中断请求发生时,将D端的低电平送到Q端,形成中断请求信 号。中断响应后,由软件对SD进行操作,将Q端恢复为高电平。 在中断服务程序中增加如下指令: (1) SETB P1.0 ; P1.0输出高电平,始终将Q端置1,永久封锁外中
中断请求标志
触发方 0 低电平 式选择 1 下降沿
定时控制寄存器TCON(字节地址88H)
外中断0 (1)请求标志 当CPU采样到INT0 (1)出现有效中断请求时,该 位由硬件自行设置为1,待中断响应后,该位自动清0。 该位一般为单片机硬件查询用,也可以软件查询。
8FH TF1
8EH TR1
8DH TF0
EA
ES
ET1
EX1
ET0 EX0
EA —— 中断允许总控制 位 (CPU开中断控制位) EA = 0 中断全部关闭 EA = 1 中断开启,各中 断由各自的控制位控制。
ET0(ET1) —— 定时器0(或 定时器1)中断允许控制位 ET0(ET1) = 0 定时器0 (或定时器1)中断禁止 ET0(ET1) = 1 定时器0 (或定时器1)中断允许

51单片机(STC89C52)的中断和定时器

51单片机(STC89C52)的中断和定时器

51单⽚机(STC89C52)的中断和定时器STC89C51/STC89C52 Timer内部不带振荡源, 必须外接晶振采⽤11.0592MHz,或22.1184MHz,可⽅便得到串⼝通讯的标准时钟.STC89和STC90系列为12T, STC11/STC12系列为1T, 也就是⼀个指令⼀个机器周期, 这些都需要外置晶振; STC15系列有内置晶振.中断中断允许控制寄存器 IE字节地址A8H, CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的D7D6D5D4D3D2D1D0EA—ET2ES ET1EX1ET0EX0EA (IE.7): 整体中断允许位, 1:允许ET2(IE.5): T2中断允许位, 1:允许(for C52)ES (IE.4): 串⼝中断允许位, 1:允许ET1(IE.3): T1中断允许位, 1:允许EX1(IE.2): 外部中断INT1允许位, 1:允许ET0(IE.1): T0中断允许位, 1:允许EX0(IE.0): 外部中断INT0允许位, 1:允许52单⽚机⼀共有6个中断源, 它们的符号, 名称以及各产⽣的条件分别如下1. INT0 - 外部中断0, 由P3.2端⼝线引⼊, 低电平或下降沿引起2. INT1 - 外部中断1, 由P3.3端⼝线引⼊, 低电平或下降沿引起3. T0 - 定时器/计数器0中断, 由T0计数器计满回零引起4. T1 - 定时器/计数器1中断, 由T1计数器计满回零引起5. T2 - 定时器/计数器2中断, 由T2计数器计满回零引起 <--这个是52特有的6. TI/RI - 串⾏⼝中断, 串⾏端⼝完成⼀帧字符发送/接收后引起定时器中断51单⽚机内部共有两个16位可编程的定时器,即定时器T0和定时器T1, 52单⽚机内部多⼀个T2定时器. 它们既有定时功能,也有计数功能。

可通过设置与它们相关的特殊功能寄存器选择启⽤定时功能还是计数功能. 这个定时器系统是单⽚机内部⼀个独⽴的硬件部分,它与CPU和晶振通过内部某些控制线连接并相互作⽤,CPU⼀旦设置开启定时功能后,定时器便在晶振的作⽤下⾃动开始计时,但定时器的计数器计满后,会产⽣中断。

第4章 MCS-51单片机中断、定时系统及串行数据通信

第4章 MCS-51单片机中断、定时系统及串行数据通信

表4-2 中断源入口地址表 中断源 外部中断0 中断服务程序入口地址 0003H
定时器/计数器T0 外部中断1 定时器/计数器T1 串行口中断
000BH 0013H 001BH 0023H
单片机的两个相邻中断源中断服务程序入口地址 相距只有8个单元,一般中断服务程序容纳不下,因此 在该中断的入口地址处放一条长跳转指令LJMP,这 样就可以转到64KB的任何可用区域了。在2KB范围内 转移可用短跳转AJMP指令。
表4-1 同级中断源优先级排列顺序
中断源
外部中断0(IE0) 定时器/计数器T0中断(TF0) 外部中断1(IE1) 定时器/计数器T1中断(TF1)
同级内的优先级
最低级
串行口中断(RI+TI)
最高级
当单片机系统复位后,IE中各位均被清0,所有 中断源禁止;IP中各位均被清0,5个中断源均为低优 先级。
SET SET
SET
ET0 ET1
EA
;定时器/计数器0允许中断 ;定时器/计数器1允许中断
;CPU开中断
用字节操作指令 MOV IE,#8AH 或 MOV A8H,#8AH
(2)中断优先级控制寄存器(IP) MCS-51单片机系统的中断源有两个优先级,每 个中断源均可由中断优先级寄存器IP来设置优先级别。 IP的字节地址为0B8H,位地址为0B8H~0BFH。与 中断有关的控制位如下: 位地址 0BFH 0BEH 0BDH 0BCH 0BBH 0BAH 0B9H 0B8H
TMOD是定时器的工作方式寄存器,TCON是控制 寄存器,用于对T0和T1的管理和控制。
2.定时器/计数器的结构的工作原理 16位定时器/计数器的核心是一个加1计数器,如图 4-4所示。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

51单片机串行口中断服务程序----------------------------------------------------------------------------//串口中断服务程序,仅需做简单调用即可完成串口输入输出的处理//编程:聂小猛。

该资料来自“51单片机世界”/~dz2000,欢迎访问。

//出入均设有缓冲区,大小可任意设置。

//可供使用的函数名://char getbyte(void);从接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。

//getline(char idata *line, unsigned char n); 获取一行数据回车结束,已处理backspce和delete,必须定义最大输入字符数//putinbuf(uchar c);模拟接收到一个数据//putbyte(char c);放入一个字节到发送缓冲区//putbytes(unsigned char *outplace,j);放一串数据到发送缓冲区,自定义长度//putstring(unsigned char code *puts);发送一个字符串到串口//puthex(unsigned char c);发送一个字节的hex码,分成两个字节发。

//putchar(uchar c,uchar j);发送一个字节数据的asc码表达方式,需要定义小数点的位置//putint(uint ui,uchar j);发送一个整型数据的asc码表达方式,需要定义小数点的位置//CR;发送一个回车换行//*************************************************************************#include <w77e58.h> //该头文件包括了51,52,80320的特殊寄存器,用在51,52上也可#define uchar unsignedchar #define uint unsigned int #define OLEN 64/* size of serial transmission buffer */idata unsigned char outbuf[OLEN];/* storage for transmission buffer */unsigned char idata *outlast=outbuf; //最后由中断传输出去的字节位置unsigned char idata *putlast=outbuf;//最后放入发送缓冲区的字节位置#define ILEN 2 /* size of serial receiving buffer */idata unsigned char inbuf[ILEN];unsigned char idata *inlast=inbuf; //最后由中断进入接收缓冲区的字节位置 unsignedchar idata *getlast=inbuf; //最后取走的字节位置 bit outbufsign; //输出缓冲区非空标志有=1 bit inbufsign;//接收缓冲区非空标志有=1bit inbufful;//输入缓冲区满标志满=1#define CR putstring("\r\n") //CR=回车换行//*****************************//放入一个字节到发送缓冲区putbyte(char c) {uchar i,j; ES=0;/*暂停串行中断,以免数据比较时出错? */if (outlast==putlast ){ i=(0-TH1);do{i--;j=36;do {j--;}while(j!=0);}while(i!=0);//延时一个字节发送时间}*putlast=c; //放字节进入缓冲区putlast++; //发送缓冲区指针加一 if(putlast==outbuf+OLEN) putlast=outbuf; //指针到了顶部换到底部if (!outbufsign){outbufsign=1;TI=1;} //缓冲区开始为空置为有,启动发送ES=1; }//****************************** //放一串数据到发送缓冲区putbytes(unsigned char *outplace,unsigned char j){ int i; for(i=0;i<j;i++){putbyte(*outplace);outplace++;}}//******************************//putchar(uchar c,uchar j);发送一个字节数据的asc码表达方式,需要定义小数点的位置putchar(uchar c,uchar j){uchar idata free[4];uchar data i;i=0;free[i++]=(c/100+0x30);if (j==3) free[i++]='.';free[i++]=(c%100)/10+0x30;if (j==2) free[i++]='.';if (j==2 && free[i-3]==0x30) free[i-3]=0x20;free[i++]=(c%10)+0x30;if (j==1 && free[i-3]==0x30) free[i-3]=0x20;if (j==1 && free[i-3]==0x20 && free[i-2]==0x30) free[i-2]=0x20;putbytes(free,i);}//******************************//putint(uint ui,uchar j);发送一个整型数据的asc码表达方式,需要定义小数点的位置putint(uint ui,uchar j){uchar idata free[6];uchar data i;//i=0;free[i++]=(ui/10000+0x30);if (j==5) free[i++]='.';free[i++]=((ui%10000)/1000+0x30);if (j==4) free[i++]='.';if (j==4 && free[i-3]==0x30) free[i-3]=0x20;free[i++]=((ui%1000)/100+0x30);if (j==3) free[i++]='.';if (j==3 && free[i-4]==0x30) free[i-4]=0x20;if (j==3 && free[i-4]==0x20 && free[i-3]==0x30) free[i-3]=0x20;free[i++]=((ui%100)/10+0x30);if (j==2) free[i++]='.';if (j==2 && free[i-5]==0x30) free[i-5]=0x20;if (j==2 && free[i-5]==0x20 && free[i-4]==0x30) free[i-4]=0x20;if (j==2 && free[i-5]==0x20 && free[i-4]==0x20 && free[i-3]==0x30) free[i-3]=0x20;free[i++]=(ui%10+0x30);if (j==1 && free[i-5]==0x30) free[i-5]=0x20;if (j==1 && free[i-5]==0x20 && free[i-4]==0x30) free[i-4]=0x20;if (j==1 && free[i-5]==0x20 && free[i-4]==0x20 && free[i-3]==0x30) free[i-3]=0x20;if (j==1 && free[i-5]==0x20 && free[i-4]==0x20 && free[i-3]==0x20 && free[i-2]==0x30) free[i-2]=0x20; putbytes(free,i);}//***************************************//发送一个字符串到串口putstring(unsigned char *puts){for (;*puts!=0;puts++) //遇到停止符0结束putbyte(*puts);}//*************************************//发送一个字节的hex码,分成两个字节发。

unsigned char code hex_[]={"0123456789ABCDEF"};puthex(unsigned char c){int ch;ch=(c>>4)&0x0f; putbyte(hex_[ch]); ch=c&0x0f; putbyte(hex_[ch]); } //************************************* //从接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。

uchar getbyte (void){ char idata c; while (!inbufsign); //缓冲区空等待ES=0; c= *getlast; //取数据getlast++; //最后取走的数据位置加一inbufful=0; //输入缓冲区的满标志清零if (getlast==inbuf+ILEN) getlast=inbuf; //地址到顶部回到底部if (getlast==inlast) inbufsign=0; //地址相等置接收缓冲区空空标志,再取数前要检该标志ES=1; return (c);//取回数据 }//***************************************** //接收一行数据,必须定义放数据串的指针位置和大小del=0x7f,backspace=0x08,cr=0x0d,lf=0x0avoid getline (uchar idata *line, unsigned char n){ unsigned char cnt = 0; //定义已接收的长度char c;do{ if ((c = getbyte ()) == 0x0d)c = 0x00; //读一个字节,如果是回车换成结束符if (c == 0x08 || c == 0x7f) //BACKSPACE 和 DEL 的处理{if (cnt != 0) //已经输入退掉一个字符{cnt--; //总数目减一line--; //指针减一putbyte (0x08); //屏幕回显的处理putbyte (' ');putbyte (0x08);}}else{ putbyte (*line = c);//其他字符取入,回显line++; //指针加一cnt++; //总数目加一}} while (cnt < n - 1 && c != 0x00 && c!=0x1b); //数目到了,回车或ESC停止*line = 0; //再加上停止符0 }//****************************//模拟接收到一个数据putinbuf(uchar c){ES=0; if(!inbufful){*inlast= c; //放入数据 inlast++;//最后放入的位置加一if (inlast==inbuf+ILEN)inlast=inbuf;//地址到顶部回到底部if (inlast==getlast)inbufful=1; //接收缓冲区满置满标志inbufsign=1;}ES=1;}//*****************************************//串口中断处理serial () interrupt 4 { if (TI ){TI = 0;if (outbufsign) //if (putlast==outlast)outbufsign=0; //else {SBUF=*outlast; //未发送完继续发送outlast++; //最后传出去的字节位置加一if (outlast==outbuf+OLEN)outlast=outbuf;//地址到顶部回到底部if (putlast==outlast)outbufsign=0; //数据发送完置发送缓冲区空标志}}if (RI){RI = 0; if(!inbufful){ *inlast= SBUF; //放入数据inlast++; //最后放入的位置加一inbufsign=1;if (inlast==inbuf+ILEN)inlast=inbuf;//地址到顶部回到底部if (inlast==getlast)inbufful=1; //接收缓冲区满置满标志}}}//*****************************//串口初始化 0xfd=19200,0xfa=9600,0xf4=4800,0xe8=2400,0xd0=1200 serial_init (){SCON = 0x50; /* mode 1: 8-bit UART, enable receiver */TMOD |= 0x20; /* timer 1 mode 2: 8-Bit reload */PCON |= 0x80;TH1 = 0xfd;//fa, //baud*2/* reload value 19200 baud */TR1 = 1; /* timer 1 run */ES = 1;REN=1;EA=1;SM2=1; //SM2=1时收到的第9位为1才置位RI标志//TMOD |=0x01; //th1 auto load 2X8,th0 1X16 //TH0=31;TL0=0; //X 32 =1S //TR0=1; ET0=1; }。

相关文档
最新文档