中断52单片机中断级别
INT0:由P3^2端口线引入,低电平或下降沿引起。INT1:由P3^3端口线引入,低电平或下降沿引起。T0:由T0计数器计满回零引起。
T1:由T1计数器计满回零引起。
T2:由T2计数器计满回零引起。
TI/RI:串行口发送完成一帧字符发送/接收后引起。
与中断相关的寄存器的介绍
中断允许寄存器IE
中断优先级寄存器IP
定时器/计数器工作方式寄存器TMOD
GATE=0,定时器/计数器启动与停止仅受TCON中TRX(X=0,1)来控制。
GATE=1,定时器/计数器启动与停止由TCON中的TRX(X=0,1)和INTX(X=0,1)上的电平状态来共同控制。
C/T?=0,为定时器模式;C/T?=1,为计数器模式。
M1M0-工作方式选择位
定时器/计数器控制寄存器TCON
硬件自动清零。
TRX:由软件清零关闭定时器X。当GATE=1,INTX=1时,TRX置1启动定时器X;当GATE=0时,TRX置1启动定时器X。
IEX:INTX请求标志。当ITX=0时,INTX为电平触发方式,每个机器周期的S5P2采样INTX,若INTX脚为低电平,则将IEX置1,否则IEX清零;当ITX=1时,INTX为跳变沿触发方式,当第一个机器周期采样到INTX为低电平时,则将IEX置1。IEX=1,表示INTX正在向CPU申请中断。当CPU响应中断,转向中断服务程序时,该位由硬件清零。
ITX:INTX触发方式选择位。
ITX=0,INTX为电平触发方式,引脚INTX上低电平有效。
ITX=1,INTX为跳变沿触发方式,引脚INTX上的电平从高跳到低的负跳变有效。
定时器的初始化
①对TMOD赋值,以确定T0和T1的工作方式。
②计算初值,并将初值写入TH0、TL0或TH1、TL1。
③中断方式时,对IE赋值,开放中断。
④使TR0或TR1置位,启动定时器/计数器定时或计数。
void init_T0_time()
{
TMOD=0x01; //设置定时器0为工作方式1
TH0=(65536-50000)/256; //装初值12MHZ晶振定时50ms数位50000 TL0=(65536-50000)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
}
中断函数
void T0_time()
{
TH0=(65536-50000)/256; //重装初值
TL0=(65536-50000)%256;
num++;
if(num==20) //每隔1秒将num重置为0
{
num=0;
led1=~led1; //控制led1闪烁
}
}
void main()
{
init_T0_time(); //初始化定时器0
while(1);
}
串口通信
串行通信是将数据字节分成一位一位的形式在一条传输线上逐个地传送,此时只需要一条数据线,外加一条公共信号地线和若干控制信号线。
异步串行通信是指通信的发送和接收设备使用各自的时钟控制数据的发送和接收过程。为使双方收、发协调,要求发送设备和接收设备的时钟尽可能一致。
异步通信是以字符(构成的帧)为单位进行传输,字符与字符之间的间隙是任意的,但每个字符中的各位是以固定的时间传送的。帧的组成:起始位、数据位、奇偶校验位、停止位。
在单片机与单片机之间,单片机与计算机之间通信时,通常采用异步串行通信方式。
同步串行通信时要建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步。发送方对接收方的同步可以通过外同步和自同步两种方法实现。
RS232、RS485/RS422电平与TTL电平、CMOS电平
RS232(DB9)电平,采用负逻辑。
-15v ~ -3v 代表1 +3v ~ +15v 代表0
RS485电平和 RS422电平
由于两者均采用差分传输(平衡传输)的方式,所以它们的电平方式,一般有两个引脚 A,B。发送端 AB间的电压差
+2 ~ +6v 1
-2 ~ -6v 0
接收端 AB间的电压差
大于 +200mv 1
小于 -200mv 0
定义逻辑1为B>A的状态
定义逻辑0为A>B 的状态
TTL电平,三极管逻辑。
TTL电路是电流控制器件,速度快,传输延迟时间短(5-10ns),但是功耗大。
Vcc:5v;
VOH>=2.4v; VOL<=0.5v;
VIH>=2v;VIL<=0.8v。
CMOS电平,PMOS+NMOS
CMOS电路是电压控制器件,速度慢,传输延迟时间长(25-50ns),但功耗低。
Vcc:5V;
VOH>=4.45V;VOL<=0.5V;
VIH>=3.5V;VIL<=1.5V。
RS232接口
MAX232芯片实现RS232电平与TTL电平转换
T1IN,T2IN可直接连接TTL/CMOS电平的51单片机串行发送端TXD;
T1OUT,T2OUT可直接连接PC机的RS-232串口的接收端RXD;
R1IN,R2IN可直接接连接PC机的RS-232串口的发送端TXD;
R1OUT,R2OUT可直接连接TTL/CMOS电平的51单片机的串行接收端RXD。
波特率的与定时器初值的关系
波特率:每秒传输二进制代码的位数,即1波特=1位/秒,单位bps(位/秒)。
波特率的计算:f osc为系统晶振频率,SMOD为PCON寄存器的最高位。
方式0的波特率=f osc /12 。
方式1的波特率= (2SMOD /32) x (T1溢出率)
方式2的波特率= (2SMOD /64) x f osc
方式3的波特率= (2SMOD /32) x (T1溢出率)
与串口通信相关的寄存器的介绍
电源管理寄存器PCON
倍。
PD=0:单片机处于正常工作状态;PD=1:单片机进入掉电模式。
IDL=0:单片机处于正常工作状态;IDL=1:单片机进入空闲模式。
使用T1的工作方式2,即是8位初值自动重装8位定时器/计数器来设定串口通信的波特率。反过来可以通过特定波特率来确定装入TH1、TL1的初值。
常用波特率初值表
串口控制寄存器SCON
REN=1:允许串口接收数据;REN=0:禁止串口接收数据。
TI:在方式0中,当串行发送第8位数据结束时,或在其他方式,串行发送停止位的开始时,由内部硬件将TI置1,向CPU发出中断申请。在中断服务程序中,必须用软件将其清零,取消此中断申请。
RI:在方式0时,当串行接收第8位数据结束时,或在其他方式,串行接收停止位的中间时,由内部硬件将RI置1,向CPU发出中断申请。在中断服务程序中,必须用软件将其清零。
串口方式1编程与实现
方式1数据输出时序图
方式1数据输入时序图
在操作串口之前,需要对单片机的一些与串口有关的特殊功能寄存器进行初始化设置,主要是设置产生波特率的定时器1、串口控制和中断控制。具体步骤如下:
①确定定时器1工作方式(编程TMOD寄存器);
②计算T1的初值,装载TH1、TL1;
③启动T1(编程TCON中的TR1位);
④确定串口的工作方式(编程SCON寄存器);
⑤串口工作在中断方式时,要进行中断设置(编程IE、IP寄存器)。
串口通信时T1工作在方式2,作为8位初值自动重装的8位定时器/计数器,用来设定串口的波特率,或根据方式2和已给出的波特率推出TH1、TL1的装载初值。
T1只是用来确定波特率,所以不用编写T1的中断函数。
寄存器的初始化程序
void init_serial_T1()
{ //晶振频率为12MHz,选定串口波特率为4800bps,则SMOD只能为1,装载初值为0xf3 TMOD=0x20; //设定T1定时器工作方式2
TH1=0xf3; //设定T1的装载初值
TL1 =0xf3;
TR1=1; //启动定时器T1
SM0=0; //设定串口工作在方式1:10位异步收发(8位数据),波特率可变
SM1=1;
REN=1; //允许串口接收数据
EA=1; //开总中断
ES=1; //开串口中断
PCON=0x80; //设定SMOD=1,波特率加倍
}
串口中断服务程序
void serial() interrupt 4
{
RI=0; //软件将RI清零
a=SBUF; //将串口接收寄存器SBUF中的数据取走给a
flag=1; //中断标志,表示执行了一次串口中断,即是成功接收了一个字符的数据}
只要在执行程序的过程中遇到TI=1或是RI=1,当ES=1时,都会转去执行串口中断服务程序。如果想让TI/RI=1时不去执行串口中断,则必须保证当时的ES=0。
程序例程:在上位机上用串口调试助手发送一个字符X,单片机收到字符后返回给上位机”I get X”,串口波特率设为4800,系统晶振频率为12MHz。
#define
#define uchar unsigned char
#define uint unsigned int
uchar flag,a,i;
uchar code Tab[]=”I get ”;
void main()
{
init_serial_T1();
while(1) //whle循环中一直检测上位机是否向单片机发送了一个字符
{
if(flag==1) //若flag=1,表示成功接收了一个字符的数据,执行if函数体 {
i=0;
ES=0;
while(Tab[i]!=’\0’)
{
SBUF=Tab[i];
i++;
while(!TI); //此处应特别注意分号不要搞掉了!!!
TI=0;
}
SBUF=a;
while(!TI); //此处应特别注意分号不要搞掉了!!!
TI=0;
SBUF=’\n’;
while(!TI); //此处应特别注意分号不要搞掉了!!!
TI=0;
ES=1;
flag=0;
}
}
}
//以下程序都是在VC++6.0 上调试运行过的程序,没有错误,没有警告。 //单片机是STC89C52RC,但是在所有的51 52单片机上都是通用的。51只是一个学习的基础平台,你懂得。 //程序在关键的位置添加了注释。 /****************************************************************************** * * 实验名: 串口实验 * 使用的IO : P2 * 实验效果: 将接收到发送回电脑上面。 * 注意: ******************************************************************************* / #include
51单片机串口通信,232通信,485通信,程序代码1:232通信 #include
while(1) { if(flag==1) { ES=0; for(i=0;i<6;i++) { SBUF=table[i]; while(!TI); TI=0; } SBUF=a; while(!TI); TI=0; ES=1; flag=0; } } } void ser() interrupt 4 {
RI=0; a=SBUF; flag=1; } 代码2:485通信 #include
} void main() { init_1602(); init(); while(1) { if(flag==1) { display(0,a); } } } void ser() interrupt 4 { RI=0; a=SBUF; flag=1; } Love is not a maybe thing. You know when you love someone.
《专业综合实习报告》 专业:电子信息工程 年级:2013级 指导教师: 学生:
目录 一:实验项目名称 二:前言 三:项目内容及要求 四:串口通信原理 五:设计思路 5.1虚拟串口的设置 5.2下位机电路和程序设计 5.3串口通信仿真 六:电路原理框图 七:相关硬件及配套软件 7.1 AT89C51器件简介 7.2 COMPIN简介 7.3 MAX232器件简介 7.4友善串口调试助手 7.5 虚拟串口软件Virtual Serial Port Driver 6.9八:程序设计 九:proteus仿真调试 十:总结 十一:参考文献 一:实验项目名称:
基于51单片机的单片机与PC机通信 二:前言 在国内外,以PC机作为上位机,单片机作为下位机的控制系统中,PC机通常以软件界面进行人机交互,以串行通信方式与单片机进行积极交互,而单片机系统根据被控对象配置相应的前向,后向信息通道,工作时作为主控机测对象,作为被控机接受PC机监督,指挥,定期或受命向上位机提供对象及本身的工作状态信息。 目前,随着集成电路集成度的增加,电子计算机向微型化和超微型化方向发展,微型计算机已成为导弹,智能机器人,人类宇宙和太空和太空奥妙复杂系统不可缺少的智能部件。在一些工业控制中,经常需要以多台单片机作为下位机执行对被控对象的直接控制,以一台PC机为上位机完成复杂的数据处理,组成一种以集中管理、分散控制为特点的集散控制系统。 为了提高系统管理的先进性和安全性,计算机工业自动控制和监测系统越来越多地采用集总分算系统。较为常见的形式是由一台做管理用的上位主计算机(主机)和一台直接参与控制检测的下位机(单片机)构成的主从式系统,主机和从机之间以通讯的方式来协调工作。主机的作用一是要向从机发送各种命令及参数:二是要及时收集、整理和分析从机发回的数据,供进一步的决策和报表。从机被动地接受、执行主机发来的命令,并且根据主机的要求向主机回传相应烦人实时数据,报告其运行状态。 用串行总线技术可以使系统的硬件设计大大简化、系统的体积减小、可靠性提高。同时,系统的更改和扩充极为容易。MCS-51系列单片机,由于内部带有一个可用于异步通讯的全双工的穿行通讯接口,阴齿可以很方便的构成一个主从式系统。 串口是计算机上一种非常通用的设备通讯协议,大多数计算机包容两个基于RS232的串口。串口同时也是仪器仪表设备通过用的通讯协议,很多GPIB兼容的设备也带有RS-232口。同时串口通讯协议也可以用于获取远程采集设备数据。所以,深入的理解学习和研究串口通信相关知识是非常必要的。此次毕业设计选题为“PC机与MCS-51单片机的串口通讯”,使用51单片机来实现一个主从式
51 单片机的串口,是个全双工的串口,发送数据的同时,还可以接收数据。 当串行发送完毕后,将在标志位TI 置1,同样,当收到了数据后,也会在RI 置1。无 论RI 或TI 出现了1,只要串口中断处于开放状态,单片机都会进入串口中断处理程序。在中断程序中,要区分出来究竟是发送引起的中断,还是接收引起的中断,然后分别进行处理。 看到过一些书籍和文章,在串口收、发数据的处理方法上,很多人都有不妥之处。 接收数据时,基本上都是使用“中断方式”,这是正确合理的。 即:每当收到一个新数据,就在中断函数中,把RI 清零,并用一个变量,通知主函数, 收到了新数据。 发送数据时,很多的程序都是使用的“查询方式”,就是执行while(TI ==0); 这样的语句来 等待发送完毕。 这时,处理不好的话,就可能带来问题。 看了一些网友编写的程序,发现有如下几条容易出错: 1.有人在发送数据之前,先关闭了串口中断!等待发送完毕后,再打开串口中断。 这样,在发送数据的等待期间内,如果收到了数据,将不能进入中断函数,也就不会保存的这个新收到的数据。 这种处理方法,就会遗漏收到的数据。 2.有人在发送数据之前,并没有关闭串口中断,当TI = 1 时,是可以进入中断程序的。 但是,却在中断函数中,将TI 清零! 这样,在主函数中的while(TI ==0);,将永远等不到发送结束的标志。 3.还有人在中断程序中,并没有区分中断的来源,反而让发送引起的中断,执行了接收 中断的程序。 对此,做而论道发表自己常用的方法: 接收数据时,使用“中断方式”,清除RI 后,用一个变量通知主函数,收到新数据。 发送数据时,也用“中断方式”,清除TI 后,用另一个变量通知主函数,数据发送完毕。 这样一来,收、发两者基本一致,编写程序也很规范、易懂。 更重要的是,主函数中,不用在那儿死等发送完毕,可以有更多的时间查看其它的标志。 实例: 求一个PC 与单片机串口通信的程序,要求如下: 1、如果在电脑上发送以$开始的字符串,则将整个字符串原样返回(字符串长度不是固定的)。
单片机实验报告 实验名称:串行通信实验 姓名:高知明 学号:110404320 班级:通信3 实验时间:2014-6-11 南京理工大学紫金学院电光系
一、实验目的(四号+黑体) 1、理解单片机串行口的工作原理; 2、学习使用单片机的TXD\RXD口; 3、了解MAX232芯片的作用; 二、实验原理 MCS-51单片机内部集成有一个UART,用于全双工方式的串行通信,可以发送、接收数据。他有两个相互独立的接收、发送缓冲器,这两个缓冲器同名(SBUF),共用一个地址号(99H)。发送缓冲器只能写入,不能读出,接受缓冲器只能读出,不能写入。要发送的字节数据直接写入发送缓冲器。SBUF=a;当UART接收到数据后,CPU从接收缓冲器中读取数据,a=SBUF;串行口内部有两个移位寄存器,一个用于串行发送,一个用于串行接收。定时器T1作为波特率发生器,波特率发生器的溢出信号昨接受或发送移位寄存器的位移时钟。TI与RI分别为发送完数据的中断标志,用来想CPU发中断请求。 三、实验内容 1、发送信号 1)C51程序: #include