蓝桥杯笔记之 串口中断程序设计(六)

蓝桥杯串口中断程序设计

一、寄存器信息

1.串行控制寄存器SCON

D7D6D5D4D3D2D1D0
SM0SM1SM2RENTB8RB8TIRI

SM0与SM1:决定串行口的四种工作方式

SM0SM1方式功能说明
000同步移位寄存器
01110位异步收发(8位数据),波特率可变(由定时器1溢出率决定)
10211位异步收发(9位数据),波特率固定
11311位异步收发(波特率可变),由定时器1的溢出率控制

SM2:在方式2和3中,若SM2=1且接收到的第九位数据(RB8)为1,才将接收到的前8位数据送入接收SBUF中,并置位RI产生中断请求;否则丢弃前8位数据。若SM2=0,则不论第九位数据(RB8)为1还是为0,都将前8位送入接收SBUF中,并产生中断请求。

REN:允许接收位,REN置0 禁止接收数据:REN置1 允许接收数据

TB8:在方式2和方式3中,是被发送的第9位数据,可根据需要由软件置1或清零,也可以作为奇偶校验位,在方式1中是停止位。

RB8:在方式2和方式3中,是被接收的第9位数据(来自第TB8位);在方式1中,RB8收到的是停止位,在方式0中不用。

TI:串行口发送中断请求标志位:,当发送完一帧串行数据后,由硬件置1;在转向中断服务程序后,用软件清0。

RI:串行口接收中断请求标志位: 当接收完一帧串行数据后,由硬件置1;在转向中断服务程序后,用软件清0。

2.电源管理寄存器PCON

考虑第一位SMOD就行,该位置1时波特率加倍,置0时波特率正常

3.定时/计数器工作模式寄存器TMOD

B7B6B5B4B3B2B1B0
GATEC/T’M1M0GATEC/T’M1M0

高四位设置定时器1;低四位设置定时器0
GATA:置0时 定时/计数器工作;置1时 需要在INT0(P32)为高电平条件下才工作

C/T’:置0时 定时模式;置1时计数模式

M1和M0:工作方式控制位,共四种工作方式

M1M0工作模式
0016位自动重新加载模式
0116位不可重新加载模式,溢出时需软件重新写入TH1,TL1初值
10八位自动重新加载模式
11,,,

二、波特率计算

不同定时器模式对应的波特率
方式0的波特率 = fosc/12
方式2的波特率 =(2SMOD/64)· (T1溢出率)
方式1的波特率 =(2SMOD/32)·(T1溢出率)
方式3的波特率 =(2SMOD/32)·(T1溢出率)

T1 溢出率计算公式
T1 溢出率 = fosc /{12×[256 -(TH1)]}

三、STC-ISP的使用

初始化程序可直接由该软件生成(注意串口1的中断号是4)
在这里插入图片描述

四、程序例程

向PC机发送数据

void main()
{
	UartInit();
	EA=1;
	ES=1;
	while(1)
	{
		if(s4==0)	//加个软件延时最好
		{
			SBUF=dat;	//送数据出去要放到缓冲区里
 			while(!TI); 	//如果T1值1说明有数据要送,就一直等数据发完就可以退出循环
 			TI=0;
		}
	}
}

void UartInit(void)		//9600bps@11.0592MHz
{
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x01;		//串口1选择定时器2为波特率发生器
	AUXR |= 0x04;		//定时器2时钟为Fosc,即1T
	T2L = 0xE0;		//设定定时初值
	T2H = 0xFE;		//设定定时初值
	AUXR |= 0x10;		//启动定时器2
}

PC机向下位机发送数据

void main()
{
	UartInit();
	EA=1;
	ES=1;

	while(1)
	{
		P2=0x80;	//译码器输出选择Y4 ,p27,p27,p25控制译码器输出
		P0=dat;		//用八个led查看结果
	}
}

void UartInit(void)		//9600bps@11.0592MHz
{
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x01;		//串口1选择定时器2为波特率发生器
	AUXR |= 0x04;		//定时器2时钟为Fosc,即1T
	T2L = 0xE0;		//设定定时初值
	T2H = 0xFE;		//设定定时初值
	AUXR |= 0x10;		//启动定时器2
}

void uart() interrupt 4
{
	if(RI)
	{
	 	RI=0;
		dat=SBUF;
	}
}
中断服务程序设计实验 2.7.1 实验目的 1、 熟悉中断的概念、中断响应过程、中断向量表以及系统是如何根据中断类型号在中断向量表中得到该中断对应的中断服务程序的入口地址等内容。 2、 掌握中断服务程序的设计方法。 2.7.2 实验预习要求 1、 复习中断的有关内容。 2、 复习中断服务程序设计方法。 3、 读懂“2.7.4 实验内容”中给出的源程序,以便上机调试。 4、 从“2.7.5 实验习题”中任选道题目,编写源程序,以便上机调试。 2.7.3 中断服务程序设计方法简介 由2.6节中的中断向量表可以看出,PC中断系统中中断类型可分为三类: 磁盘操作系统DOS提供的中断服务程序,中断类型号从20H到2FH; 系统主板BIOS芯片提供的BIOS中断服务程序,包括系统内部中断中断类型号从00H到07H;系统8级外部中断中断类型号从08H到0FH,它们对应于接在可编程中断控制器8259A的8个中断请求输入端IR0IR7的8个外部中断,其中IR2(中断类型号0AH)为系统保留,用户可通过该引脚实现对用户所需的外部硬件中断的管理;设备驱动程序,中断类型号从10H到1FH等; 用户定义的中断中断类型号从60H到7FH、F1H到FFH。用户可根据实际需要将某些通用性强的子程序功能通过中断服务程序来实现。旦设好了这样的中断服务程序,在其他应用程序中就可以调用这些中断服务程序。 设计中断服务程序的步骤如下: 1、 选择中断类型号 如果采用硬件中断,则要使用硬件决定的中断类型号。在PC机系统中,使用了片可编程中断控制器8259A来对外部硬件中断进行管理,具体内容参见教材264页“8259A应用举例”,可以看出IR2为系统保留,其中断类型号为0AH。若用户需要,可将用户所需的外部中断源发来的中断请求信号接到IR2,编写该中断所需的中断服务程序,并将该中断服务程序的入口地址写到中断向量表0AH4AH4+3四个单元中,这样,当接在IR2上的外部中断源发来中断请求信号时,系统就会根据得到的类型号(0AH)到中断向量表中找出其入口地址,并转去执行该中断服务程序。 如果采用软件中断,即利用执行int n指令的方式执行中断服务程序,则可从系统预留给用户的中断类型号60H7FH、F1HFFH中选择个。 2、 将中断服务程序的入口地址中断向量表的相应的四个存储单元中 确定了中断类型号,还要把中断服务程序入口地址中断向量表,以保证在中断响应时CPU能自动转入与该类型号相对应的中断服务程序。下面介绍两种将中断服务程序入口地址中断向量表的方法。 (1) 直接装入法 用传送指令直接将中断服务程序首地址入矢量表中。设中断类型号为60H(此类型号对应的矢量表地址为从00180H开始的四个连续存储单元)。 PUSH DS XOR AX,AX MOV DS,AX ;将数据寄存器清零 MOV AX,OFFSET INT60 ;将中断服务程序INT60所在段内的偏移地址送AX MOV DS:[0180H],AX ;将中断服务程序偏移地址送中断向量表00180H和00181单元 MOV AX,SEG INT60 ;将中断服务程序INT60所在段的段地址送AX MOV DS:[0180H+2],AX ;将中断服务程序所在代码段的段地址送00182H和00183单元 POP DS (2) DOS系统功能调用法 功能号(AH)=25H; 入口参数:(AL)=中断类型号, (DS)=中断服务程序入口地址的段地址 (DX)=中断服务程序入口地址的偏移地址 下面程序段完成中断类型号为60H的入口地址入。 PUSH DS ;保护DS MOV DX,OFFSET INT60 ;取服务程序偏移地址 MOV AX,SEG INT60 ;取服务程序段地址 MOV DS,AX MOV AH,25H ;送功能号 MOV AL,60H ;送中断类型号 INT 21H ;DOS功能调用 POP DS ;恢复DS 3、 使中断服务程序驻留内存,以便其他应用程序调用 实现这步骤的必要性在于:中断服务程序驻留内存后,般程序员使用这新增的中断调用就如同调用DOS或BIOS的中断子程序样,只要了解其入口要求和返回参数就可调用。程序驻留在内存后,它占用的存储区就不会被其他软件覆盖。使程序驻留内存,要求该程序以 .COM形式运行,这种种结构的程序要求入口定位于100H,并且数据和代码均在同个段内,这样,.COM程序就被定位于低地址区,DOS常在低地址区增加驻留程序,而 .EXE程序被定位于高地
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值