T0作定时器汇编程序中断法
- 格式:docx
- 大小:17.74 KB
- 文档页数:4
第六章选择题(1)使80C51定时/计数器T0停止计数的C51命令为______。
A.IT0=0;B.TF0=0;C.IE0=0;D.TR0=0;(2)80C51单片机的定时器T1用作定时方式时是______。
A.由内部时钟频率定时,一个时钟周期加1 B.由内部时钟频率定时,一个机器周期加1C.由外部时钟频率定时,一个时钟周期加1 D.由外部时钟频率定时,一个机器周期加1(3)80C51单片机的定时器T0用作计数方式时是______。
A.由内部时钟频率定时,一个时钟周期加1 B.由内部时钟频率定时,一个机器周期加1C.由外部计数脉冲计数,一个脉冲加1D.由外部计数脉冲计数,一个机器周期加1(4)80C51的定时器T1用作计数方式时,______。
A.外部计数脉冲由T1(P3.5引脚)输入B.外部计数脉冲由内部时钟频率提供C.外部计数脉冲由T0(P3.4引脚)输入D.外部计数脉冲由P0口任意引脚输入(5)80C51的定时器T0用作定时方式时是______。
A.由内部时钟频率定时,一个时钟周期加1B.由外部计数脉冲计数,一个机器周期加1C.外部计数脉冲由T0(P3.4)输入定时D.由内部时钟频率定时,一个机器周期加1(6)设80C51晶振频率为12MHz,若用定时器T0的工作方式1产生1ms定时,则T0计数初值应为______。
A.0xfc18B.0xf830C.0xf448D.0xf060(7)80C51的定时器T1用作定时方式且选择模式1时,工作方式控制字为______。
A.TCON=0x01;B.TCON=0x0H;C.TMOD=0x10;D.TMOD=0x50; (8)80C51的定时器T1用作定时方式且选择模式2时,工作方式控制字为______。
A.TCON=0x60; B.TCON=0x02; C.TMOD=0x06; D.TMOD=0x20; (9)80C51的定时器T0用作定时方式且选择模式0时,C51初始化编程为______。
单片机原理与应用试题(含答案)一、单选题(共64题,每题1分,共64分)1.MCS-51单片机有( )个中断优先级别。
A、1B、2C、3D、4正确答案:B2.MCS-51单片机有中断源( )。
A、5个B、2个C、3个D、6个正确答案:A3.当外部中断1发出中断请求后,中断响应的条件是( )。
A、EX1=1B、IE=0x84C、ET1=1D、IE=0x81正确答案:B4.MCS-51单片机的4个并行I/O端口作为通用I/O端口使用,在输出数据时,必须外接上拉电阻的是( )。
A、P0口B、P1口C、P2口D、P3口正确答案:A5.MCS-51单片机指令系统中,求反指令是( )。
A、CPL AB、RLC AC、CLR AD、RRC A正确答案:A6."对两个数组a和b进行初始化Char a[ ]=" ABCDEF" Char b[ ]={ ´A´,´B´,´C´,´D´,´E´,´F´};则以下说法正确的是( )。
"A、a与b 数组完全相同B、a与b 数组长度相同C、a与b 数组中都存放字符串D、a比b 数组长度长正确答案:D7.定时/计数器0中断入口地址为( )。
A、0003HB、000BHC、0013HD、001BH正确答案:B8.定时器/计数器T0的中断服务程序入口地址是( )。
A、0003HB、000BHC、0023HD、001BH正确答案:B9.MCS-51单片机响应中断的过程是( )。
A、断点PC自动压栈,对应中断矢量地址装入PCB、关中断,程序转到中断服务程序C、断点压栈,PC指向中断服务程序地址D、断点PC自动压栈,对应中断矢量地址装入PC,程序转到该矢量地址,再转至中断服务程序首地址正确答案:D10.在MCS-51单片机系统中,若晶振频率为12MHz,一个机器周期等于( )μs。
t0中断服务函数的书写方法t0中断服务函数是嵌入式系统中用来处理定时器中断的函数,也是一个操作系统内核中最基本的中断服务函数之一。
在实际开发过程中,编写t0中断服务函数是非常重要的,因为它可以保证系统的稳定性和可靠性。
本文将介绍t0中断服务函数的书写方法。
1. 定义中断服务函数在编写t0中断服务函数之前,我们需要定义中断服务函数。
中断服务函数的定义包括函数名、返回值类型、参数类型等。
在定义t0中断服务函数时,我们需要使用特殊的关键字"__interrupt",这个关键字告诉编译器,这个函数是一个中断服务函数。
例如:__interrupt void timer0_isr(void){// 主体代码}2. 中断向量表中断向量表是一个存储中断服务函数地址的表格,每个中断向量都对应一个中断服务函数。
在t0中断服务函数中,我们需要将中断向量表的t0位置为我们定义的中断服务函数的地址。
例如:#pragma vector=T0_VECTOR__interrupt void timer0_isr(void){// 主体代码}3. 主体代码t0中断服务函数的主要功能是处理定时器中断。
在t0中断服务函数中,我们可以编写一些针对定时器中断的处理代码,例如更新计数器、清除标志位等。
由于t0中断服务函数是在中断周期内执行的,因此我们需要尽量减少中断服务函数的执行时间,以提高系统的响应速度。
例如:#pragma vector=T0_VECTOR__interrupt void timer0_isr(void){T0IFG &= ~BIT0; // 清除标志位timer_count++; // 更新计数器}4. 中断服务函数的优化在编写t0中断服务函数时,我们需要注意一些优化技巧,以提高代码的执行效率和系统的响应速度。
这些优化技巧包括:a. 尽量避免在中断服务函数中使用延时函数或长时间的循环语句,以免影响系统的响应速度。
用T0定时器实现1秒定时
T0定时器是8051单片机中的一个定时/计数器,可以用来实现定时功能。
下面是使用T0定时器实现1秒定时的C代码:
```C
#include <reg52.h>
TH0=TIMER_VALUE/256;//设置定时器初值的高8位
TL0=TIMER_VALUE%256;//设置定时器初值的低8位
void main
TMOD=0x01;//设置T0为模式1,16位定时器
TH0=TIMER_VALUE/256;//设置定时器初值的高8位
TL0=TIMER_VALUE%256;//设置定时器初值的低8位
TR0=1;//启动定时器
EA=1;//允许中断
ET0=1;//允许T0中断
while (1)
//1秒到达,执行相应的操作
//这里可以添加你需要的代码
}
}
```
以上是一个简单的示例代码,使用T0定时器实现了每隔1秒触发一
个中断,并在中断处理函数中设置了一个标志位。
在主循环中检查标志位,如果标志位为1,则表示定时器已经到达1秒,执行相应的操作,并将标
志位重置为0。
请注意,上述代码使用的定时器初值是根据传输速率设置的。
如果你
需要更准确的1秒定时,需要根据你的实际系统时钟频率进行适当的调整。
定时器中断延时程序(1)该类型的delay()函数采用的延时是通过对变量进行递减或递增实现的,很难计算精确的延时时间。
(2)由于跑马灯的状态函数和延时函数是和主任务耦合到一起的,因此主任务的执行时间要对延时的时间产生影响。
如图6-12所示,假设一个跑马灯的延时函数的延时时间是1s,但是由于主函数可能存在不同的分支,因此当主函数执行不同分支程序时,实际的跑马灯延时时间是不一样的。
图6-12 程序分支对delay()函数的影响因此,对于某些对定时精度有要求的场合,例如某项工程需要跑马灯1s更换一个状态(最典型的例子就是时钟指示),就不能采用变量递减或递增的延时方法,而要采用更加精确的中断定时方法。
中断的概念在前面的章节已经有过详细讲解,这里不再赘述,与采用递增递减延时函数相比,采用中断来进行跑马灯的状态更换有以下几个优点。
(1)采用中断函数进行延时,可以精确保证延时的精度,即有效地保证跑马灯状态更换的频率;(2)采用中断函数进行跑马灯状态的更换,在进行延时期间,并不占用单片机资源,单片机可以执行其他的任务。
采用中断延时函数来进行跑马灯状态更换的软件结构如图6-13所示,主程序和跑马灯状态变换程序是独立分开的,当中断发生时,主程序被打断,进行跑马灯状态的变换。
AT89S51单片机里有两个独立的计时器T0和T1,为了得到精确的定时中断,在这里采用T0的模式0来产生定时中断。
如图6-14所示为T0工作于模式0时的结构图。
图6-13 采用时间中断函数的程序结构图6-14 计时器T0的工作模式0当T0工作于模式0时,相关需要配置的寄存器如下:(1)TMOD寄存器:TMOD寄存器是管理计时器T0和T1工作模式和相关配置的寄存器,寄存器内各位如图6-15所示,需要配置的功能位如下所示。
·M10-M00:M10-M00用于选择T0的工作模式,工作于模式0时,T0是一个13位的定时器/计数器,如图6-14所示,THx和TLx分别为8bits和5bits长度,共为13位计数器。
//实例42:用定时器T0查询方式P2口8位控制LED闪烁#include<> // 包含51单片机寄存器定义的头文件void main(void){// EA=1; //开总中断// ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式1TH0=(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位定义为引脚void main(void){// EA=1; //开总中断// ET0=1; //定时器T0中断允许TMOD=0x10; //使用定时器T1的模式1TH1=(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; //将引脚输出电平取反TH1=(65536-921)/256; //定时器T0的高8位赋初值TL1=(65536-921)%256; //定时器T0的高8位赋初值}}://实例44:将计数器T0计数的结果送P1口8位LED显示#include<> // 包含51单片机寄存器定义的头文件sbit S=P3^4; //将S位定义为引脚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口显示}TF0=0; //计数器溢出后,将TF0清0}}//实例45:用定时器T0的中断控制1位LED闪烁)#include<> // 包含51单片机寄存器定义的头文件sbit D1=P2^0; //将D1位定义为引脚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; //启动定时器T0^while(1);}函数功能:定时器T0的中断服务程序**************************************************************/void Time0(void) interrupt 1 using 0寄存器{D1=~D1; //按位取反操作,将引脚输出电平取反TH0=(65536-46083)/256; //定时器T0的高8位重新赋初值TL0=(65536-46083)%256; //定时器T0的高8位重新赋初值}|//实例46:用定时器T0的中断实现长时间定时#include<> // 包含51单片机寄存器定义的头文件sbit D1=P2^0; //将D1位定义为引脚unsigned char Countor; //设置全局变量,储存定时器T0中断次数void main(void){EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式2;TH0=(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; //按位取反操作,将引脚输出电平取反Countor=0; //将Countor清0,重新从0开始计数}TH0=(65536-46083)/256; //定时器T0的高8位重新赋初值TL0=(65536-46083)%256; //定时器T0的高8位重新赋初值}//实例47:用定时器T1中断控制两个LED以不同周期闪烁#include<> // 包含51单片机寄存器定义的头文件)sbit D1=P2^0; //将D1位定义为引脚sbit D2=P2^1; //将D2位定义为引脚unsigned char Countor1; //设置全局变量,储存定时器T1中断次数unsigned char Countor2; //设置全局变量,储存定时器T1中断次数void main(void){EA=1; //开总中断ET1=1; //定时器T1中断允许TMOD=0x10; //使用定时器T1的模式1TH1=(65536-46083)/256; //定时器T1的高8位赋初值—TL1=(65536-46083)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1Countor1=0; //从0开始累计中断次数Countor2=0; //从0开始累计中断次数while(1);}void Time1(void) interrupt 3 using 0{Countor1++; //Countor1自加1Countor2++; //Countor2自加1。