搜档网
当前位置:搜档网 › 单片机定时器中断原理和C语言代码详解

单片机定时器中断原理和C语言代码详解

单片机定时器中断原理和C语言代码详解
单片机定时器中断原理和C语言代码详解

单片机定时器中断原理和C语言代码详解

我之前都是用ARM7,单片机基本不会。但一个项目要用到51,所以克了一下51还是有点模糊,今天调了这个代码之后,对51定时器中断有些心得,拿来和大家共享。废话不说了,上代码。

#define _1231_C_

#include "reg51.h"

#include "1231.h"

//sbit OE=P2^3;

unsigned int SystemTime;

void timer0(void) interrupt 1 using 3 //中断部分代码,见下文的释疑

{

TH0 = 0xdb;

TL0 = 0xff;

// TF0 = 0;

SystemTime++;

}

void main()

{

TMOD &= 0xF0;

TMOD |= 0x01; //TMOD的值表示定时器工作方式选择

TH0 = 0xdb; //写入初始值,初始值可以决定定时多久

TL0 = 0xff;

//根据下文的木桶比喻的话,如果TH0 = 0x00;TL0 = 0x00;则表示从桶底开始装水。

//TH0 = 0xdb;TL0 = 0xff;可以这样子理解相当于木桶里已经有部分液铅在里面,

//TH0和TL0这个两个值表示木桶里液铅的高度,即此时桶里只能从液铅的高度以上开始装

水,

//TH0 = 0xff;TL0 = 0xff;即表示桶的最高位置.

TF0 = 0; //计数到时TF0为1,即当TH0 = 0xff;TL0 = 0xff;再运行一步TF0 = 1;

TR0 = 1; //开始计数,从这时起,每运行一步TH0和TL0都会增加,直到TH0 = 0xff;TL0 = 0xff;

//相当于开水龙头,如TR0=0则TH0和TL0不变

ET0 = 1; //允许定时器0中断

EA=1; //开总中断

//下面是个死循环,程序里每运行一步TH0和TL0都会增加,当增加到TH0 = 0xff;TL0 = 0xff;

//单片机会从死循环里退出,去执行中断部分的代码,即开始运行void timer0(void) interrupt 1 using 3{}

//运行完中断部分的代码后,接着继续执行死循环里的代码。

//注意:当TH0 = 0xff;TL0 = 0xff;再运行,TF0并没有从0变为1,个人猜测TF0=1;时触发了中断,并重新被置零。

//如把ET0 = 1;和EA=1;注释掉,当TH0 = 0xff;TL0 = 0xff;再运行,TF0会变为1,此时不会再执行中断部分代码。

while(1)

{

if ((SystemTime%100)

释疑:void Timer0() interrupt 1 using 1

Timer0 是函数名,随便取的

interrupt xx using y

跟在interrupt 后面的xx 值得是中断号,就是说这个函数对应第几个中断端口,一般在51中

0 外部中断0

1 定时器0

2 外部中断1

3 定时器1

4 串行中断

实际上编译的时候就是把你这个函数的入口地址方到这个对应中断的跳转地址

using y 这个y是说这个中断函数使用的那个寄存器组,51里面一般有4

组 r0 -- r7寄存器,一共有32个,如果你的终端函数和别的程序用的不是同一个寄存器组则进入中断的时候就不会将寄存器组压入堆栈返回时也不会谈出来节省代码和时间

初始值算法:定时器是当总数达到FFFFH后产生中断吧!那你要让它计数10000,是不是用FFFF(16进制)减去10000(十进制)的数当计数初值啊?TH0=-(10000/256);

TL0=-(10000%256)跟FFFF(16进制)减去10000(十进制)的数是一样的。从

TH0=-(10000/256); TL0=-(10000%256)开始计数,计数到10000刚好满。跟用FFFF (16进制)减去10000(十进制)的数一样!!!写起来更简单,不用算!!!

看看原码、补码就知道。正数的补码是对应的二进制数,符号位为零,负数的补码是它的绝对值对应的二进制数按位取反再加一,符号位为一。无符号数不考虑符号,那么这个结果就跟用FFFF减去它的绝对值一样

中断的理解。

这里将涉及到单片机中断的应用,在cpu的一步步按照指令运行的过程中(主程序),可能会有其它的更紧急的需要做的事情(中断服务程序),需要cpu暂时停止当前的程序(主程序),做完了(中断服务程序)之后,又可以继续去运行先前的程序(主程序)。就像你正在吃饭,一边又在给水桶里放水,吃着吃着,水满了,你就得赶快去把水龙头关掉或者换一个空的水桶,再回来吃饭。

单片机的定时器就像是一个水桶,你让它启动了,也就是水龙头打开了;开始装水了;定时在每个机器周期不断自动加1,最后溢出了;水桶的水不断增加,最也就满出来了;定时器溢出时,你就要去做处理了;水桶的水满了,你也应该处理一下了;处理完后,单片机又可以回到刚刚开停止的地方继续运行;水桶处理了,先前你在做什么也可以继续去做什么了。

单片机的主程序是从0x0000开始运行的,单片机服务程序从哪里开始运行呢?在51里,有多个中断服务程序入口,0号入口是外中断0,地址在0x0003;1号入口是定时器0,在

0x000B;2号入口是外中断1;地址在0x0013,3号入口是定时器2;地址在0x001B,等等。当中断发生时,程序就记下当前运行的位置,跳到对应的中断入口去运行中断服务程序,运行完之后,又跳回到原来的位置继续运行。

在C51中,你不用理会中断服务程序放在哪里,会怎么跳转。你只要把某个函数标识为几号

中断服务函数就可以了。在发生了对应的中断时,就会自动的运行这个函数。

请看一下相关的51的硬件的书,对定时器工作的寄存器设置做进一步的了解。也可以做完试验再了解,因为例程中都已经为您设置好了。

请看程序,主程序里的循环里是个死循环,什么也没有做,在实际应用中这里是放的主程序。在定时器服务函数里,需要重新置入定时器的值,这样才能保证每次溢出时,都是你指定的时间。这里置入的是0x0006,还需要走0x10000-0x0006个机器周期才溢出。换成10进制也就是每65530个机器周期中断一次。我们仿真的晶振是22118400HZ,每12个时钟一个机器周期。65530×12/22118400=0.036秒。也就是差不多28HZ的闪烁频率。

因为51的定时器最大只有0xffff,溢出的速度很快,无法做出更久的闪烁频率来,这一课就先观察一下这个28HZ左右频率。在下一课我们会用静态变量的办法,做一个长达1秒钟的LED闪烁频率。

另外,由于51从中断发生到进入中断的时间不定,是3至8个机器周期,我们在进入了中断后才重新置新的定时器初始值,这样就会存在定时误差。也就是不是精确定时,如果要精确定时,需要使用定时器自动装载方式,也就是在定时器溢出的同时,硬件逻辑就自动把定时器初始值装载进去了,而不是在中断服务程序里赋初始值,这样就可以实现精确定时,误差只出现晶振的频率上。这是下一颗的内容。

现在请仔细研究一下程序,并编译,进入仿真,全速运行,观察运行结果。我们可以看到P10上的LED在快速闪烁。

顺便,也请再练习一下停止,单步,断点等等的调试方法。

一个特殊的地方,使用DX516在单步时运行时,可能无法进入到中断服务函数中。这是因为中断函数可能在单步处理的瞬间已经运行过去了。如果要单步调试中断服务函数,请在中断服务函数内设置断点,再点全速。稍后就会停止在断点上,就可以继续单步运行了。

作业习题 中断及定时器

中断及定时器、串行口习题 一、填空 1.MCS-51的Po口作为输出端口时,每位能驱动个SL型TTL负载. 2.MCS-51有个并行I\O口,其中P0~P3是准双向口,所以由输出转输入时必须先 写入 3.设计8031系统时,_ 口不能用作一般I\O口. 4.MCS-51串行接口有4种工作方式,这可在初始化程序中用软件填写特殊功能寄存 器__ _加以选择. 5.当使用慢速外设时,最佳的传输方式是。 6.当定时器To工作在方式时,要占定时器T1的TR1和TF1_两个控制位. 7.MCS-51有个中断源,有2 个中断优先级,优先级由软件填写特殊功能寄存器加以选择.. 8.用串口扩并口时,串行接口工作方式应选为方式。 9.在串行通信中,有数据传送方向、、三种方式. 10.外部中断入口地址为_ 。 二、判断 1.MCS-51的5个中断源优先级相同。() 2.要进行多机通信,MCS-51串行接口的工作方式应为方式1。() 3.MCS-51上电复位时,SBUF=00H。()。 4.MCS-51有3个中断源,优先级由软件填写特殊功能寄存器IP加以选择.. () 5.用串口扩并口时,串行接口工作方式应选为方式1. () 6.外部中断INTO 入口地址为_0013H() 7.MCS-51外部中断0的入口地址是0003H。(). 8.TMOD中的GATE=1时,表示由两个信号控制定时器的启停。()。 9.使用8751且=1时,仍可外扩64KB的程序存储器。() 10.PC存放的是当前执行的指令。() 11.MCS-51的特殊功能寄存器分布在60H~80H地址范围内。() 12.MCS-51有4个并行I\O口,其中P0~P3是准双向口,所以由输出转输入时必须先写入"0"() 三、选择 1.在中断服务程序中,至少应有一条( ) (A)传送指令(B)转移指令(C)加法指法(D)中断返回指令 2.要使MCS-51能够响应定时器T1中断、串行接口中断,它的中断允许寄存器IE的内容应是() (A)98H (B)84H (C)42 (D)22H 3.D MCS-51在响应中断时,下列哪种操作不会发生( ). (A)保护现场(B)保护PC (C)找到中断入口若悬河(D)保护PC转入中断入口 4.用MCS-51串行接口扩展并行I\O口时,串行接口工作方式应选择( ) (A)方式0 (B)方式1 (C)方式2 (D)方式3 5.MCS-51有中断源() (A)5个(B)2个(C)3个(D)6个 6.MCS-51响应中断时,下面哪一个条件不是必须的() (A)当前指令执行完毕(B)中断是开放的确 (C)没有同级或高级中断服务须(D)必须有RET1指令 7.使用定时器T1时,有几种工作模式() (A)1种(B)2种(C)3种(D)4种 8.计算机在使用中断方式与外界交换信息时,保护现场的工作方式应该是( ) (A)由CPU自动完成(B)在中断响应中完成功之路 (C)应由中断服务程序完成(D)在主程序中完成 9.下面哪一种传送方式适用于处理外部事件( ) (A)DMA (B)无条件传递进(C)中断(D)条件传递 四、编程 1. 1. 8225A控制字地址为300FH,请按:A口方式0输入,B口方式1输出,C口高位输出,C口低位输入,确定8225A控制字并编初始化程序. 2. 2. 编定一个软件延时1S和1min的子程序.设fosc=6Hz,则一个机器周期1μs。

8051单片机中断系统结构及中断控制原理

8051单片机中断系统结构及中断控制原理 当几个中断源同时向CPU请求中断时,按所发生的实时事件的轻重缓急排队,优先处理最紧急事件的中断请求,于是单片机规定每个中断源的优先级别。 当CPU正在处理一个中断请求,又发生另一个优先级比它高的中断请求,CPU暂时中止对前一中断处理,转而去处理优先级更高的中断请求,待处理完后,再继续执行原来的中断处理程序,这样的过程称为中断嵌套,这样的中断系统称为多级中断系统。 由于外界异步事件中断CPU正在执行的程序时随机的,CPU转向去执行中断服务程序时,除了硬件会自动把断电地址,即16位PC程序计数器的值压入堆栈之外,用户还得注意保护有关工作寄存器,累加器,标志位等信息,这个过程通常称为保护现场。以便在完成中断服务程序后,恢复原工作寄存器,累加器,标志位等的内容,这个过程称恢复现场;最后执行中断返回指令,自动弹出断电到PC,返回主程序,继续执行被中断的程序。 下面我们看看8051中断系统结构及中断控制: 8051单片机有五个中断请求源,四个用于中断控制的寄存器IE.IP.TCON和SCON,用于控制中断的类型,中断允许,中断起停和各种中断源的优先级别。 五个中断源有两个优先级,每个中断源可以编程为高优先级或低优先级中断,可以实现二级中断服务程序嵌套。8051的中断源包括:INT0,INT1引脚输入的外部中断源;三个内部的中断源,即定时器T0的溢出中断源,定时器T1的溢出中断源和串行口的发送/接收中断源。 从INT0,INT1引脚输入的两个外部中断源和它们的触发方式控制位锁存在特殊功能寄存器TCON的低四位,其格式如下: IE1,即TCON.3:外部中断INT1请求标志位。当CPU检测到在INT1引脚上出现的外部中断信号时,由硬件置位IE1=1,请求中断。CPU执行中断服务程序后,IE1位被硬件自动清0. IT1,即TCON.2:外部中断INT1请求类型,触发方式控制位,由软件来置1或清0,以

嵌入式定时器基本功能(定时器中断)c语言代码

定时器基本功能实验(定时器中断) 1.实验内容 使用定时器0 实现1 秒定时,控制蜂鸣器蜂鸣。采用中断方式实现定时控制。 备注:EasyARM2131实验板上的系统时钟默认为11.0592MHz;系统中已定义了符号常量Fpclk = 11059200 ; 2.实验步骤 ①启动ADS 1.2,使用ARM Executable Image for lpc2131工程模板建立一个工程 TimeOut_C。 ②在user 组中的main.c 中编写主程序代码。 ③主程序中使用IRQEnable( )使能IRQ 中断。 ④选用DebugInExram 生成目标,然后编译连接工程。 ⑤将LPC2131实验板上的Beep跳线短接到P0.7。 ⑥选择【Project】->【Debug】,启动AXD 进行JTAG 仿真调试。 ⑦全速运行程序,蜂鸣器会响一秒,停一秒,然后再响一秒……依次循环。 3.实验参考程序 程序清单错误!文档中没有指定样式的文字。-1 定时器实验参考程序#include "config.h" #define BEEP 1 << 7 /* P0.7控制BEEP,低电平蜂鸣 */ /***************************************************************************************** ** 函数名称:IRQ_Timer0() ** 函数功能:定时器0中断服务程序,取反LED9控制口。 ** 入口参数:无 ** 出口参数:无 ****************************************************************************************** */ void __irq IRQ_Timer0 (void) { if ((IO0SET & BEEP) == 0) IO0SET = BEEP; /* 关闭BEEP */ else IO0CLR = BEEP; T0IR = 0x01; /* 清除中断标志*/ VICVectAddr = 0x00; /* 通知VIC中断处理结束*/ } /* ***************************************************************************************** ** 函数名称:main() ** 函数功能:使用定时器实现1秒钟定时,控制LED9闪烁。中断方式。

单片机中断程序大全

单片机中断程序大全公司内部编号:(GOOD-TMMT-MMUT-UUPTY-UUYY-DTTI-

//实例42:用定时器T0查询方式P2口8位控制L E D闪烁#include // 包含51单片机寄存器定义的头文件void main(void) { // EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式1 TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 TR0=1; //启动定时器T0 TF0=0; P2=0xff; while(1)//无限循环等待查询 { while(TF0==0) ; TF0=0; P2=~P2; TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 //实例43:用定时器T1查询方式控制单片机发出1KHz音频

#include // 包含51单片机寄存器定义的头文件sbit sound=P3^7; //将sound位定义为P3.7引脚 void main(void) {// EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x10; //使用定时器T1的模式1 TH1=(65536-921)/256; //定时器T1的高8位赋初值 TL1=(65536-921)%256; //定时器T1的高8位赋初值 TR1=1; //启动定时器T1 TF1=0; while(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 // 包含51单片机寄存器定义的头文件sbit S=P3^4; //将S位定义为P3.4引脚

51单片机汇编语言编程:用定时器控制输出矩形波

80C51单片机的时钟频率为12MHz,利用定时器T1和P1.0输出矩形脉冲。 波形只画出了2段:一段为100us 另一段为50us。 要完全的、完整的、详细的编写此程序的过程!谢谢 ------------------------ 最佳答案: 用一个定时器定时50us,也可以达到题目要求。 在我的空间里面有类似的问题和解答。 ORG 0000H SJMP START ORG 001BH ;T1中断入口. SJMP T1_INT START: MOV TMOD, #20H ;设置T1定时方式2 MOV TH1, #206 ;自动重新装入方式. MOV TL1, #206 ;定时时间 MOV IE, #10001000B ;开放总中断和T1中断. SETB TR1 ;启动T1 MOV R2, #3 ;周期是3×50us SJMP $ ;等着吧. T1_INT: SETB P1.0 ;输出高.

DJNZ R2, T1_END ;R2-1 CLR P1.0 ;减到0,就输出低电平. MOV R2, #3 T1_END: RETI ;中断返回. END ;完. ------------------------ 已知51单片机系统晶振频率为12MHz,请利用定时器1工作方式1,中断方式在P2.3输出频率为10Hz的方波。 写出定时设计过程及完整代码 问题补充:用汇编的麻烦写一下 ------------------------ 最佳答案: ORG 0000H SJMP START ORG 001BH ;T1中断入口. SJMP T1_INT START: MOV TMOD, #10H ;设置T1定时方式1 MOV TH1, #(65536-50000) / 256 ;送入初始值.

51单片机定时中断C语言的写法步骤

51单片机定时中断C语言的写法步骤 程序说明:51单片机定时器0工作于方式一,定时50ms中断一次 晶振为12M #include void main { TOMD = 0X01;//配置定时器0工作于方式一 TH1 = (65536-50000)/256; //高八位装入初值 TL1 = (65536-50000)%256; //低八位装入初值 ET0 = 1; //开定时器0中断 EA = 1; //开总中断 TR0 = 1; //启动定时器0 while(1) { ; } } void Timer0_int() interrupt 1 { //重新装初值 TH1 = (65536-50000)/256; //高八位装入初值 TL1 = (65536-50000)%256; //低八位装入初值 } /****************************************************************************** *********************************/ 上面是比较好理解的。如果实在要求简洁的话,看下面的,跟上面功能一样 #include void main { TOMD = 0X01;//配置定时器0工作于方式一 TH1 = 0x3c; //高八位装入初值 TL1 = 0xb0; //低八位装入初值 IE = 0x82;//开总中断并开定时器0中断 TR0 = 1; //启动定时器0 while(1) { ; } }

void Timer0_int() interrupt 1 { //重新装初值 TH1 = 0x3c; //高八位装入初值TL1 = 0xb0; //低八位装入初值}

定时器中断程序设计实验

实验一定时器/中断程序设计实验 一、实验目的 1、掌握定时器/中断的工作原理。 2、学习单片机定时器/中断的应用设计和调试 二、实验仪器和设备 1、普中科技单片机开发板; 2、Keil uVision4 程序开发平台; 3、PZ-ISP 普中自动下载软件。 三、实验原理 805l 单片机内部有两个 16 位可编程定时/计数器,记为 T0 和 Tl。8052 单片机内除了 T0 和 T1 之外,还有第三个 16 位的定时器/计数器,记为 T2。它们的工作方式可以由指令编程来设定,或作定时器用,或作外部脉冲计数器用。定时器 T0 由特殊功能寄存器 TL0 和 TH0 组成,定时器 Tl 由特殊功能寄存器 TLl 和 TH1 组成。定时器的工作方式由特殊功能寄存器 TMOD 编程决定,定时器的运行控制由特殊功能寄存器 TCON 编程控制。T0、T1 在作为定时器时,规定的定时时间到达,即产生一个定时器中断,CPU 转向中断处理程序,从而完成某种定时控制功能。T0、T1 用作计数器使用时也可以申请中断。作定时器使用时,时钟由单片机内部系统时钟提供;作计数器使用时,外部计数脉冲由 P3 口的 P3.4(或 P3.5)即 T0(或 T1)引脚输入。 方式控制寄存器 TMOD 的控制字格式如下: 低 4 位为 T0 的控制字,高 4 位为 T1 的控制字。GATE 为门控位,对定时器/计数器的启动起辅助控制作用。GATE=l 时,定时器/计数器的计数受外部引脚输入电平的控制。由由运行控制位 TRX (X=0,1)=1 和外中断引脚(0INT 或 1INT)上的高电平共同来启动定时器/计数器运行;GATE=0时。定时器/计数器的运行不受外部输入引脚的控制,仅由 TRX(X=0,1)=1 来启动定时器/计数器运行。 C/-T 为方式选择位。C/-T=0 为定时器方式,采用单片机内部振荡脉冲的 12 分频信号作为时钟计时脉冲,若采用 12MHz 的振荡器,则定时器的计数频率为 1MHZ,从定时器的计数值便可求得定时的时间。 C/-T=1 为计数器方式。采用外部引脚(T0 为 P3.4,Tl 为 P3.5)的输入脉冲作为计数脉冲,当 T0(或 T1)输入信号发生从高到低的负跳变时,计数器加 1。最高计数频率为单片机时钟频率的 1/24。 M1、M0 二位的状态确定了定时器的工作方式,详见表。

单片机原理_期末考试试题_(含答案解析)

单片机原理及应用期末考试试题汇总 1、单片机是将微处理器、一定容量的RAM 和ROM以及(I/O)口、定时器等电路集成在一块芯片上而构成的微型计算机。 2、单片机89C51片内集成了(4)KB的FLASH ROM,共有(5)个中断源。 3、两位十六进制数最多可以表示(256)个存储单元。 4、89C51是以下哪个公司的产品?( C ) A、INTEL B、AMD C、ATMEL D、PHILIPS 5、在89C51中,只有当EA引脚接(高)电平时,CPU才访问片内的Flash ROM。 6、是非题:当89C51的EA引脚接低电平时,CPU只能访问片外ROM,而不管片内是否有程序存储器。T 7、是非题:当89C51的EA引脚接高电平时,CPU只能访问片内的4KB空间。F 8、当CPU访问片外的存储器时,其低八位地址由(P0)口提供,高八位地址由(P2)口提供,8位数据由(P0)口提供。 9、在I/O口中,(P0)口在接LED时,必须提供上拉电阻,(P3)口具有第二功能。 10、是非题:MCS-51系列单片机直接读端口和读端口锁存器的结果永远是相同的。F 11、是非题:是读端口还是读锁存器是用指令来区别的。T 12、是非题:在89C51的片内RAM区中,位地址和部分字节地址是冲突的。F WORD格式整理

13、是非题:中断的矢量地址位于RAM区中。F 14、MCS-51系列单片机是属于(B)体系结构。 A、冯诺依曼 B、普林斯顿 C、哈佛 D、图灵 15、89C51具有 ( 64 ) KB的字节寻址能力。 16、是非题:在89C51中,当CPU访问片内、外ROM区时用MOVC指令,访问片外RAM区时用MOVX指令,访问片内RAM 区时用MOV指令。T 17、在89C51中,片内RAM分为地址为00H~7FH 的真正RAM区,和地址为80H~FFH的特殊功能寄存器(SFR) 区两个部分。18、在89C51中,通用寄存器区共分为(4)组,每组(8)个工作寄存器,当CPU复位时,第(0)组寄存器为当前的工作寄存器。 19、是非题:工作寄存器区不允许做普通的RAM单元来使用。F 20、是非题:工作寄存器组是通过置位PSW中的RS0和RS1来切换的。T 21、是非题:特殊功能寄存器可以当作普通的RAM单元来使用。F 22、是非题:访问128个位地址用位寻址方式,访问低128字节单元用直接或间接寻址方式。T 23、是非题:堆栈指针SP的内容可指向片内00H~7FH的任何RAM单元,系统复位后,SP初始化为00H。F WORD格式整理

51单片机C语言中断程序定时计数器

51单片机C语言中断程序定时/计数器 程序一 利用定时/计数器T0从P1.0输出周期为1s 的方波,让发光二极管以1HZ闪烁, #include //52单片机头文件 #include //包含有左右循环移位子函数的库#define uint unsigned int //宏定义 #define uchar unsigned char //宏定义 sbit P1_0=P1^0; uchar tt; void main() //主函数 { TMOD=0x01;//设置定时器0为工作方式1 TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1;//开总中断 ET0=1;//开定时器0中断 TR0=1;//启动定时器0 while(1);//等待中断产生 }

void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; tt++; if(tt==20) { tt=0; P1_0=~P1_0; } } 程序二 利用定时/计数器T1产生定时时钟, 由P1口控制8个发光二极管, 使8个指示灯依次一个一个闪动, 闪动频率为10次/秒(8个灯依次亮一遍为一个周期),循环。#include //52单片机头文件 #include //包含有左右循环移位子函数的库 #define uint unsigned int //宏定义 #define uchar unsigned char //宏定义

单片机原理复习简答题答案

一、简述题 1.MCS-51单片机芯片包含哪些主要逻辑功能部件?(习题2-1) (1)中央处理器(CPU):运算器--用于实现算术和逻辑运算;控制器:产生计算机所需的时序,控制程序自动执行 (2)内部数据存储器:用于存放可读写的数据 (3)内部程序存储器:用于存放程序的机器代码和常数 (4)并行I/O口:实现数据的输入/输出 (5)定时/计数器:用于实现定时和计数功能 (6)串行口:一个全双工的口,可实现数据的串行传送 (7)中断控制:实现单片机的中断判优、中断响应、中断查询等控制 (8)时钟电路:为单片机提供时钟脉冲序列 2.程序计数器PC的作用是什么?什么情况下会使用PC的值?(习题2-4) 程序计数器PC是位于片内的一个16位的寄存器,它专门用来存放当前要执行的指令地址,且能够自动加1,具有特殊功能。是一个不可寻址的特殊功能寄存器。其低8位地址经P0口输出,高8为地址经P2口输出。 3.MCS-51单片机设置有四组工作寄存器,这样做的目的是什么?请举例说明。?? 如何选择MCS-51单片机的当前工作寄存器组?(习题2-7) MCS-51的当前工作寄存器组是由程序状态寄存器PSW中的RS1、RS2位的状态决定的。工作寄存器区的选择: RS1,RS0=00 则选择了工作寄存器组0区R0~R7对应的单元地址:00H~07H RS1,RS0=01 则选择了工作寄存器组1区R0~R7对应的单元地址:08H~0FH RS1,RS0=10 则选择了工作寄存器组2区R0~R7对应的单元地址:10H~17H RS1,RS0=11 则选择了工作寄存器组3区R0~R7对应的单元地址:18H~1FH 4.简述MCS-51单片机的位寻址空间。(习题2-11) MCS-51单片机的位寻址空间由两部分构成:一部分为内部RAM位寻址区的20-2FH的16个单元的128位,位地址范围:00~7FH;另一部分为单元地址尾数为0和8的SFR中的位构成的位寻址区,共83位,位地址范围是80~0FFH。 MCS-51单片机位寻址空间共有211个位,位地址范围:00H~0FFH 5.什么是时钟周期、机器周期、指令周期?如何计算机器周期?晶振频率为12M时,计 算时钟周期、机器周期。(习题2-9) 时钟信号的周期称为S状态,它是晶振周期的两倍,即一个时钟周期(TS)包含2个晶振周期;指令周期(TI):执行一条指令所用的时间; 机器周期(TM):CPU完成一个基本操作所用的时间。(每12个时钟周期为1个机器周期)当晶振频率为12MHz时,时钟周期TS=2/f=0.17μs,机器周期TM=12/f=1μs 6.简单说明MCS-51单片机PSW寄存器各标志位的含义。(习题2-15) CY(PSW.7) 进位/借位标志位;AC(PSW.6)半进位/借位标志位;F0(PSW.5) 用户标志位;RS1(PSW.4)、RS0(PSW.3) 工作寄存器组选择位;OV(PSW.2) 溢出标志位; PSW.1 未定义;P(PSW.0) 奇偶标志位

定时器中断综合实验

实验2 定时器、中断综合实验 一、实验目的 熟悉MCS-51定时器,串行口和中断初始化编程方法,了解定时器的应用,时钟程序的设计与调试技巧。 二、实验内容 编写程序,用定时器中断现实LED跑马灯实验。 实验内容1: 1).用查表法实现LED跑马灯实验; 2).采用定时器控制跑马灯的变化速度。 三、流程框图 四、实验步骤及程序 ORG 0000H LJMP MAIN ORG 000BH ; T0 中断入口地址 MOV TH0,#0BH ; 62.5毫秒定时 MOV TL0,#0DCH DJNZ R2,T0OUT ; 中断16次为1秒 MOV R2,#16 PUSH ACC ; 保存数据 MOVC A,@A+DPTR ; 查表法LED 左右移 MOV P0,A POP ACC INC A CJNE A,#24,T0OUT ; 24种"花样" CLR A T0OUT: RETI ORG 0050H MAIN: MOV SP,#6FH ; MOV R2,#16 ; 定时器中断次数,@12M MOV A,#00H ; 查表起始值 MOV DPTR,#TABLE MOV TMOD,#00000001B ; 定时器方式1 MOV TH0,#0BH ; 62.5MS MOV TL0,#0DCH SETB EA ; 中端总允许 SETB ET0 ; 允许T0 中断 SETB TR0 ; 启动定时 WAIT: SJMP $ ;原地等待中断

RET TABLE:DB 0FEH,0FDH,0FBH,0F7H ;LED 左右移数据表,共有24种"花样" DB 0EFH,0DFH,0BFH,07FH DB 00H,55H,0AAH,00H DB 7FH,0BFH,0DFH,0EFH DB 0F7H,0FBH,0FDH,0FEH DB 00H,0AAH,55H,00H END 思考:换用T1定时器,定时方式2。 用汇编语言编辑8个LED灯,实现第一秒只有L1不亮,其余七个全亮,第二个L2不亮,其余七个全亮 ORG 0000H SJMP START ORG 000BH SJMP T0_INT START: MOV TMOD, #01H MOV TH0, #3CH ; (65536 - 50000) / 256; MOV TL0, #0B0H ; (65536 - 50000) % 256; SETB TR0 SETB ET0 SETB EA MOV A, #01H MOV R2, #20 SJMP $ T0_INT: MOV TH0, #3CH ; (65536 - 50000) / 256; MOV TL0, #0B0H ; (65536 - 50000) % 256; DJNZ R2, T0_END MOV R2, #20 MOV P0, A RL A T0_END: RETI END 实验内容2: 设计一个实时时钟,用42H显示秒单元,用41H显示分单元,用40H显示时单元。要求每满1秒,秒单元内容加1;秒满60,分单元加1,分满60,时单元加1。时满24 ,时分秒全部清0。 从秒到分,从分到时,通过软件累加现实。P115。 ORG 0000H LJMP MAIN ;上电,跳向主程序 ORG 000BH ;T0的中断入口

单片机原理课后习题整理1.0

第1章思考题及习题1参考答案 一、填空 1. 除了单片机这一名称之外,单片机还可称为或。答:微控制器,嵌入式 控制器. 3. AT89S52单片机工作频率上限为 MHz。答:33 MHz。 三、判断对错 1. STC系列单片机是8051内核的单片机。对 2. AT89S52与AT89S51相比,片内多出了4KB的Flash程序存储器、128B的RAM、1个中断 源、1个定时器(且具有捕捉功能)。对 3. 单片机是一种CPU。错 4. AT89S52单片机是微处理器。错 5. AT89C52片内的Flash程序存储器可在线写入,而AT89S52则不能。错 6. 为AT89C51单片机设计的应用系统板,可将芯片AT89C51直接用芯片AT89S51替换。对 7. 为AT89S51单片机设计的应用系统板,可将芯片AT89S51直接用芯片AT89S52替换。对 8. 单片机的功能侧重于测量和控制,而复杂的数字信号处理运算及高速的测控功能则是DSP 的长处。对 四、简答 4. 解释什么是单片机的在系统编程(ISP)与在线应用编程(IAP)。 答:单片机的在系统编程ISP(In System Program),也称在线编程,只需一条与PC机USB口或串口相连的ISP下载线,就可把仿真调试通过的程序代码从PC机在线写入单片机的Flash存储器内,省去了编程器。在线应用编程(IAP)就是可将单片机的闪存内的应用程序在线修改升级。

第2章思考题及习题2参考答案 一、填空 1. 在AT89S52单片机中,如果采用6MHz晶振,一个机器周期为。答:2μs 2. AT89S52单片机的机器周期等于个时钟振荡周期。答:12 9. AT89S52单片机程序存储器的寻址范围是由程序计数器PC的位数所决定的,因为AT89S52单片机的PC是16位的,因此其寻址的范围为 KB。答:64 10. AT89S52单片机复位时,P0~P3口的各引脚为电平。答:高 11. AT89S52单片机使用片外振荡器作为时钟信号时,引脚XTAL1接,引脚XTAL2的接法是。答:片外振荡器的输出信号,悬空 二、判断对错 1. 使用AT89S52单片机且引脚EA=1时,仍可外扩64KB的程序存储器。错 2. 区分片外程序存储器和片外数据存储器的最可靠的方法是看其位于地址范围的低端还是高端。错 3. AT89S52单片机共有32个特殊功能寄存器,它们的位都是可以用软件设置的,因此,都

《PIC16系列单片机C程序设计与proteus仿真》学习之2----TMR0定时器中断

/**用TMR0延时中断,产生脉冲**/ /** 设定时器TMR0延时10MS,8位pic单片机晶振4MHZ,则指令周期Tcy=1us,计算如下:1.设预分频比为K,则256*K*Tcy=10_000us,得K=39.06,要取大于此值的最小分频比,即K=64 2.计算延时常数X,(256-X)*64*Tcy=10_000us,得X=99.75,四舍五入取整,得X=100. */ #include __CONFIG(0x3f71); #define LED RB0 #define T0_10MS 100 //定义TMR0延时10MS的时间常数 char A; void interrupt ISR(void); void main(void) { RISB0=0; //设定RB0位输出,其余B口未设置,采用上电默认值,为输入 OPTION=0b10000101;//RBPU=1:B口上拉使能,INTEDG=0:下降沿触发,T0CS=0:对内部指令周期计数,T0SE=0:RA4/T0CKI的上升沿计数,PSA=0:预分频分配位给TMRO,PS2PS1PS0=101:TMR0比率为1:64 INTCON=0b10100000;//GIE=1:允许全局中断使能,PEIE=0:禁止外设中断使能,T0IE/TMR0IE=1:允许TMR0溢出中断使能,INTE=0:禁止INT引脚中断使能//RBIE=0:禁止RB口高4位电平变化使能,T0IF/TMR0IF=0:TMR0溢出中断标志位--未溢出 //INTF=0:未发生INT中断,RBIF=0:RB7:RB4引脚的逻辑状态未发生变化 TMR0=T0_10MS; //TMR0赋初值 LED=1; A=1; while(1); //原地等待 } void interrupt ISR(void) { if(T0IF==1) { T0IF=0; TMR0=T0_10MS;//TMR0赋初值,必须 if(A==1) { A=0; LED=0; } else { A=1; LED=1;

实验五 8051单片机定时中断实验

实验五8051单片机定时中断实验 一实验目的: 了解8051系列单片机的定时中断基本工作原理。掌握8051系列单片机定时中断的用法。 二实验原理: 在上一个实验里我们介绍了8051单片机的外中断应用,本实验要介绍的是定时器中断的应用。 8051系列单片机至少有两个16位的内部定时器/计数器,既可以编程为定时器使用,也可以作为计数器使用。如果是计数内部晶振驱动时钟,它是定时器,如果是计数8051的输入管脚的信号,就是计数器。 MCS-51单片机内部的定时/计数器的结构如图5-1所示,定时器T0特性功能寄存器TL0(低8位)和TH0(高8位)构成,定时器T1由特性功能寄存器TL1(低8位)和TH1(高8位)构成。特殊功能寄存器TMOD控制定时寄存器的工作方式,TCON则用于控制定时器T0和T1的启动和停止计数,同时管理定时器T0和T1的溢出标志等。程序开始时需对TL0、TH0、TL1和TH1进行初始化编程,以定义它们的工作方式和控制T0和T1的计数。 图5-1 TMOD特殊功能寄存器的格式参见下表(表5-1): 表5-1 高4位为定时器/计数器1的控制字,低4位为定时器/计数器0的控制字。其中GATE 为门控信号,C/T为定时器或计数器的选择,而M1,M0是工作方式选择位。 当M1M0=00时,T/C工作在方式0。方式0为13位的T/C,其计数器由TH的8位和TL的5

位构成,计数器的计数值范围是: 1—8192(213),但是启动前可以预置计数初值。当C/T为 0时,T/C为定时器,计数脉冲为振荡源12分频的信号;当C/T为1时,T/C为计数器,对输入端T0或T1输入的脉冲进行计数。计数脉冲加到计数器上与否决定于启动信号。当GATE=0时,TR=1时T/C便启动,当GATE=1时,启动受到TR与INT的双重控制,即二者同时为高 时才启动。当计数满时,TH向高位进位,这时中断溢出标志TF置1,即产生中断请求。而当CPU转向中断服务程序时,TF自动清零。 当M1M0=01时,T/C工作在方式1。方式1和方式0的区别仅在于方式0的计数器位数为13位,而方式1的为16位。 当M1M0=10时,T/C工作在方式2。区别于前面的两种工作方式的是,方式2具有自动重装载的功能。TH和TL作为两个8位的计数器,TH中的8位初值始终保持不变,由TL进行8位计数。在计数溢出时不但会产生中断请求,而且自动将TH中的值加载至TL 中,即自动重装载。 当M1M0=11时,T/C工作在方式3。但是这种工作方式只存在于T/C0中,这时TH0与TL0成为两个独立的计数器。只有在T/C1作为串行口的波特率发生器使用,而造成定时器不够用时,T/C0才能工作在方式3。 下面是定时器时间常数计算公式,这个公式在方式1,即16 位定时或计数模式可用。 THX=(65536-定时时长[μS]/(机器周期数/时钟频率[MHz])/256; TLX=(65536-定时时长[μS]/(机器周期数/时钟频率[MHz])%256; 在定时器重装载过程中因为TL1=0可以不写。 三实验内容: 利用中断方式在LED上输出10HZ方波,系统晶体频率11.059MHz。 四实验电路图:

单片机定时器汇编

我们在学单片机时我们第一个例程就是灯的闪烁,那是用延时程序做的,现在回想起来,这样做不很恰当,为什么呢?我们的主程序做了灯的闪烁,就不能再干其它的事了,难道单片机只能这样工作吗?当然不是,我们能用定时器来实现灯的闪烁的功能。例1:查询方式ORG 0000H AJMP START ORG 30H START: MOV P1,#0FFH ;关所灯 MOV TMOD,#00000001B ;定时/计数器0工作于方式1 MOV TH0,#15H MOV TL0,#0A0H ;即数5536 SETB TR0 ;定时/计数器0开始运行 LOOP: JBC TF0,NEXT ;如果TF0等于1,则清TF0并转NEXT处(LOOP:JNB TF0,$) AJMP LOOP ;不然跳转到LOOP处运行 NEXT: CPL P1.0 MOV TH0,#15H MOV TL0,#9FH;重置定时/计数器的初值 AJMP LOOP END 键入程序,看到了什么?灯在闪烁了,这可是用定时器做的,不再是主程序的循环了。简单地分析一下程序,为什么用JBC呢?TF0是定时/计数器0的溢出标记位,当定时器产生溢出后,该位由0变1,所以查询该位就可知宇时时间是否已到。该位为1后,要用软件将标记位清0,以便下一次定时是间到时该位由0变1,所以用了JBC指令,该指位在判1转移的同时,还将该位清0.以上程序是能实现灯的闪烁了,可是主程序除了让灯闪烁外,还是不能做其他的事啊!不对,我们能在LOOP:……和AJMP LOOP指令之间插入一些指令来做其他的事情,只要保证执行这些指令的时间少于定时时间就行了。那我们在用软件延时程序的时候不是也能用一些指令来替代DJNZ吗?是的,但是那就要求你精确计算所用指令的时间,然后再减去对应的DJNZ循环次数,很不方便,而现在只要求所用指令的时间少于定时时间就行,显然要求低了。当然,这样的办法还是不好,所以我们常用以下的办法来实现。程序2:用中断实现 ORG 0000H AJMP START ORG 000BH ;定时器0的中断向量地址 AJMP TIME0 ;跳转到真正的定时器程序处 ORG 30H START: MOV P1,#0FFH ;关所灯 MOV TMOD,#00000001B ;定时/计数器0工作于方式1 MOV TH0,#15H MOV TL0,#0A0H ;即数5536 SETB EA ;开总中断允许 SETB ET0 ;开定时/计数器0允许 SETB TR0 ;定时/计数器0开始运行 SJMP $ ;LOOP: AJMP LOOP ;真正工作时,这里可写任意程序 TIME0:

C语言的定时器中断程序

C语言的定时器中断程序 #include #define uint unsigned int #define uchar unsigned char uchar code table[]= {0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; uchar aa,num; void main() { aa=0; num=0; TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1;

TR0=1; P2=0xf0; P0=0x3f; while(1) { if(aa==10) { aa=0; num++; if(num==10) { num=0; } P2=0xf0; P0=table[num]; } } } void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256;

aa++; } void timer0(void) interrupt 1 using 3 //中断部分代码,见下文的释疑{ …………… } 释疑:void Timer0() interrupt 1 using 1 Timer0 是函数名,随便取的 interrupt xx using y 跟在interrupt 后面的xx 值得是中断号,就是说这个函数对应第几个中断端口,一般在51中 0 外部中断0 1 定时器0 2 外部中断1 3 定时器1 4 串行中断 实际上编译的时候就是把你这个函数的入口地址方到这个对应中断的跳转地址 using y 这个y是说这个中断函数使用的那个寄存器组,51里面一般有4组 r0 -- r7寄存器,一共有32个,看看原码、补码就知道。正数的补码是对应的二进制数,符号位为零,负数的补码是它的绝对值对应的二进制数按位取反再加一,符号位为一。

单片机60s定时器程序c语言

单片机60s定时器程序c语言 #include /////变量定义 sbit led0=P1^0; sbit led1=P1^1; sbit led2=P1^2; sbit led3=P1^3; int tion=0; int tey[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90}; int cx=0; int kx=0; ///子函数 void time(int x); //延时函数定义 void LED(); //显示函数定义 ///////////// ////////主函数/// ///////// void main() {TMOD=0X1; TH0=0X3C; TL0=0XB0; IE=0X82; TR0=1; while(1) {LED();}} //延时子函数// void time(int x) {for(x=0;x<200;x++);} //显示子函数// void LED() {led0=0; led1=1; led2=1; led3=1; P0=0XBF; time(1); led1=0; led2=1; led0=1;

led3=1; P0=tey[kx]; time(1); led2=0; led1=1; led0=1; led3=1; P0=tey[cx]; time(1); led3=0; led0=1; led1=1; led2=1; P0=0xBF; time(1); } //中断函数// void teyond()interrupt 1 {TH0=0X3C; TL0=0XB0; tion++; if(tion==20) {tion=0; cx++; P0=tey[cx]; if(cx==10) {cx=0; kx++; P0=tey[kx]; if(kx==6) {cx=0; kx=0; TR0=0;}}}}

单片机定时器中断时间误差的解决方案

单片机定时器中断时间误差的解决方案 时间:2012-06-12 14:04:04 来源:作者: 1 前言 单片机内部一般有若干个定时器。如8051单片机内部有定时器0和定时器1。在定时器计数溢出时,便向CPU发出中断请求。当CPU正在执行某指令或某中断服务程序时,它响应定时器溢出中断往往延迟一段时间。这种延时虽对单片机低频控制系统影响甚微,但对单片机高频控制系统的实时控制精度却有较大的影响,有时还可能造成控制事故。为扩大单片机的应用范围,本文介绍它的定时器溢出中断与CPU响应中断的时间误差、补偿误差的方法和实例。 2 误差原因、大小及特点 产生单片机定时器溢出中断与CPU响应中断的时间误差有两个原因。一是定时器溢出中断信号时,CPU正在执行某指令;二是定时器溢出中断信号时,CPU正在执行某中断服务程序。 2.1. CPU正在执行某指令时的误差及大小 由于CPU正在执行某指令,因此它不能及时响应定时器的溢出中断。当CPU执行此指令后再响应中断所延迟的最长时间为该指令的指令周期,即误差的最大值为执行该指令所需的时间。由于各指令都有对应的指令周期,因此这种误差将因CPU正在执行指令的不同而不同。如定时器溢出中断时,CPU正在执行指令MOV A, Rn,其最大误差为1个机器周期。而执行指令MOV Rn, direct时,其最大误差为2个机器周期。当CPU正在执行乘法或除法指令时,最大时间误差可达4个机器周期。在8051单片机指令系统中,多数指令的指令周期为1~2个机器周期,因此最大时间误差一般为1~2个机器周期。若振荡器振荡频率为fosc,CPU正在执行指令的机器周期数为Ci,则最大时间误差为Δtmax1=12/fosc× Ci(us)。例如fosc=12MHZ,CPU正在执行乘法指令(Ci=4),此时的最大时间误差为: Δtmax1=12/fosc×Ci=12/(12×106)×4=4×10-6(s)=4(μs)

相关主题