第9章 C51定时器
- 格式:pdf
- 大小:153.18 KB
- 文档页数:20
C51 T and C● 80C51单片机内部有两个定时/计数器T0和T1,其核心是计数器,基本功能是加1。
● 对外部事件脉冲(下降沿)计数,是计数器;对片内机周脉冲计数,是定时器。
● 计数器由二个8位计数器组成。
● 定时时间和计数值可以编程设定,其方法是在计数器内设置一个初值,然后加1计满后溢出。
调整计数器初值,可调整从初值到计满溢出的数值,即调整了定时时间和计数值。
● 定时/计数器作为计数器时,外部事件脉冲必须从规定的引脚Tx(P3.4、P3.5)输入。
且外部脉冲的最高频率不能超过时钟频率的1/24一、定时/计数器的结构定时/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器组成。
TMOD 是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON 是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。
二、定时/计数器的工作原理加1计数器输入的计数脉冲有两个来源,一个是由系统的时钟振荡器输出脉冲经12分频后送来;一个是T0或T1引脚输入的外部脉冲源。
每来一个脉冲计数器加1,当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使TCON 中TF0或TF1置1,向CPU 发出中断请求(定时/计数器中断允许时)。
如果定时/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。
可见,由溢出时计数器的值减去计数初值才是加1计数器的计数值。
设置为定时器模式时,加1计数器是对内部机器周期计数(1个机器周期等于12个振荡周期,即计数频率为晶振频率的1/12)。
计数值N 乘以机器周期Tcy 就是定时时间t 。
设置为计数器模式时,外部事件计数脉冲由T0或T1引脚输入到计数器。
在每个机器周期的S5P2期间采样T0、T1引脚电平。
当某周期采样到一高电平输入,而下一周期又采样到一低电平时,则计数器加1,更新的计数值在下一个机器周期的S3P1期间装入计数器。
由于检测一个从1到0的下降沿需要2个机器周期,因此要求被采样的电平至少要维持一个机器周期。
竭诚为您提供优质文档/双击可除c51定时中断实验报告篇一:51单片机定时器实验报告51单片机定时器实验实验内容:实验内容:(1)编写程序使定时器0或者定时器1工作在方式1,定时50ms触发蜂鸣器。
c语言程序#include#defineuintunsignedint#defineucahrunsignedcharsbitFm=p0^0;voidmain(){TmoD=0x01;Th0=(65535-50000)/256;Th0=(65535-50000)%256;eA=1;//开总中断eT0=1;//开定时器0中断TR0=1;while(1);}voidT0_time()interrupt1{}汇编程序oRg0000hJAmpmAInoRg000bhTh0=(65535-50000)/256;Th0=( 65535-50000)%256;Fm=~Fm;LJmpInT0_InToRg0100hmIAn:seTbeAseTbeT0AJmp$InT0_InT:moVR2,#0FAhmoVR3,#0c8hDJnZR3,$DJnZR2,InT0_InTReTI(2)编写程序使定时器0或者定时器1工作在方式1,定时500ms使两位数码管从00、01、02……98、99每间隔500ms加1显示。
#include#defineuintunsignedint#defineucahrunsignedcharuintnum,num1;sbitFm=p0^7;intshi,ge,a;voiddelay(uint);voidshumaguan();unsignedcharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0 x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳极数码管0-F编码表voidmain(){TmoD=0x01;Th0=(65535-50000)/256;Th0=(65535-50000)%256;eA=1;//开总中断eT0=1;//开定时器0中断TR0=1;while(1)}voidT0_time()interrupt1{}voidshumaguan(){p3=0x01;p2=table[shi];delay(5);p3=0x02;p2=table[ge];delay(5);Th0=(65535-50000)/256;Th0=(65535-50000)%25 6;num1++;if(num1==10){}num1=0;num++;shi=num/10;ge=n um%10;if(num==100){num=0;}{}shumaguan();voidzuoyi(){}voiddelay(uintx){}(3)编写程序使定时器0或者定时器1工作在方式2,自动重装载模式,定时500ms使两位数码管从00、01、02……98、99每间隔500ms加1显示。
1.MCS-51单片机的中断系统由哪几个特殊功能寄存器组成?MCS-51单片机的中断系统是由TCON、IE、IP组成的。
2.MCS-51单片机中与定时器/计数器有关的特殊功能寄存器有哪几个?它们的功能各是什么?和定时器/计数器有关的寄存器分别为TMOD、TCON、TH、TLTMOD寄存器是定时器/计数器工作方式设置寄存器TCON寄存器是定时器/计数器控制寄存器TH、TL是初值寄存器3.试编写一段对中断系统初始化程序,允许外部中断0、外部中断1、定时器/计数器T0溢出中断、串行口中断,且使定时器/计数器T0溢出中断为高优先级中断。
IE=0X87;IP=0X02;4.MCS-51单片机若要把外部中断源扩充为6个,可采用哪些方法?如何确定它们的优先级?可以采用两种方法。
(1)利用外部中断和查询相结合的方法扩展外部中断如果系统有多个外中断请求源,把其中最高级别的中断源直接连接到单片机外中断0辑器件通过“与”或者“或”的办法连接到单片机外中断1入/输出端口(如P0或P1)的若干引脚,用来查询判断具体是哪一个中断请求源发生的中断事件。
电路如下,利用单片机扩展5个外部中断源,中断的优先次序为S0~S4,其中S0接到外部中断0上,S1~S4通过“与”门接到外部中断1上;单片机的P1.4~P1.7接4个发光二极管用来作为输出指示;当有S1~S4其中一个外部中断发生时,相应的发光二极管D1~D4点亮;当S0外部中断发生时,4个发光二极管全亮。
C5源程序代码如下:#include<reg51.h>sbit P1_0=P1^0; //定义位变量sbit P1_1=P1^1;sbit P1_2=P1^2;sbit P1_3=P1^3;sbit P1_4=P1^4;sbit P1_5=P1^5;sbit P1_6=P1^6;sbit P1_7=P1^7;void main( ){ P1=0xFF; //熄灭LEDIT0=1; IT1=1; //外中断0、1脉冲触发方式EA=1; EX0=1; EX1=1; //中断管理for( ; ; ) //延时等待中断发生{;}}void INT0_ISR( ) interrupt 0 //外中断0中断服务函数{ P1=0x0F; //P1口高4位置0,点亮4个LED }void INT1_ISR( ) interrupt 2 //外中断1中断服务函数{ if (P1_0==0) {P1=0xef;} //如果为中断S11,点亮D1else if (P1_1==0) {P1=0xdf;}else if (P1_2==0) {P1=0xbf;}else if (P1_3==0) {P1=0x7f; } //如果为中断S44,点亮D4}(2)利用优先编码器扩展外部中断可以采用优先级解码芯片如74LS148,把多个中断源信号作为一个中断。
海南大学单片机课程设计报告专业:0 9电子信息工程姓名:田飞20091601310050指导教师:李京兵摘要单片机自 20 世纪 70 年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广泛、发展很快。
Intel公司生产的 MCS-8051 系列单片机是各单片机中最为典型和最有代表性的一种。
本次设计以 MCS-8051 芯片为核心,辅以必要的外围电路,设计了一个结构简单,功能齐全的数字时钟,它由 5V 直流电源供电。
在硬件方面,单片机外接 12MHz 晶振,使用八个七段数码管来进行显示。
LED 采用动态扫描显示,使用 74LS245 芯片进行位驱动。
通过 LED 能够准确明亮地显示时、分、秒;四个简单的按键实现对时间的调整;蜂鸣器实现闹钟响铃功能;软件方面采用 C 语言编程。
整个电子钟系统能完成时间的显示、调时和一组定时闹钟的功能。
设计过程中使用 Kei uVision 4 单片机模拟调试软件编写调试程序,并用 EDA 工具软件 Proteus ISIS 7 进行仿真。
硬件简明,程序正确,仿真结果满足设计要求。
关键词: 51单片机,定时器,中断,闹钟,LED目录摘要 (1)绪论 (3)第一章系统设计 (4)一、器件选型 (4)二、硬件接线设计 (6)三、系统综述 (9)1.3.1 上电界面 (9)1.3.2 调时界面 (9)1.3.3 闹钟设定界面 (10)1.3.4 正常走时界面 (10)1.3.5 闹钟响应 (11)四、软件部分 (11)1.4.1 主函数流程图 (11)1.4.2 定时器T0中断服务程序流程图 (12)1.4.3 闹钟响应程序流程图 (13)1.4.4 键盘扫描程序流程图 (14)第二章参数计算 (15)一、定时器T0 (15)2.1.2 定时器T0初值计算 (16)二、数码管驱动码 (16)2.2.1 位选码 (17)2.2.2 段选码 (17)第三章结论 (18)参考文献 (19)附录 (20)绪论20 世纪末,电子技术获得了飞速的发展。
51单片机的定时器_计数器的C51编程相关知识点:1、单片机的定时器/计数器,实质是按一定时间间隔、自动在系统后台进行计数的。
2、当被设定工作在定时器方式时,自动计数的间隔是机器周期(12个晶振振荡周期),即计数频率是晶振振荡频率的1/12;3、当定时器被启动时,系统自动在后台,从初始值开始进行计数,计数到某个终点值时(方式1时是65535),产生溢出中断,自动去运行定时中断服务程序;注意,整个计数、溢出后去执行中断服务程序,都是单片机系统在后台自动完成的,不需要人工干预!4、定时器的定时时间,应该是(终点值-初始值)x机器周期。
对于工作在方式1和12MHz时钟的单片机,最大的计时时间是(65535-0)x1uS=65.535ms。
这个时间也是一般的51单片机定时器能够定时的最大定时时间,如果需要更长的定时时间,则一般可累加多定时几次得到,比如需要1秒的定时时间,则可让系统定时50ms,循环20次定时就可以得到1s的定时时间。
5、定时器定时得到的时间,由于是系统后台自动进行计数得到的,不受主程序中运行其他程序的影响,所以相当精确;6、使用定时器,必须先用TMOD寄存器设定T0/T1的工作方式,一般设定在方式1的情况比较多,所以可以这样设定:TMOD=0x01(仅设T0为方式1,即16位)、TMOD=0x10(仅设T1为方式1,即16位)、TMOD=0x11(设T0和T1为方式1,即都为16位)。
7、使用定时器,必须根据需要的定时时间,装载相应的初始值,而且在中断服务程序中,很多情况下得重新装载初始值,否则系统会从零开始计数而引起定时失败;8、要使用定时器前,还必须打开总中断和相应的定时中断,并启动之:EA=1(开总中断)、ET0=1(开定时器0中断)、TR0=1(启动定时器0)、ET1=1(开定时器1中断)、TR1=1(启动定时器1);9、注意中断服务程序尽可能短小精干,不要让它完成太多任务,尤其尽量避免出现长延时,以提高系统对其他事件的响应灵敏度.//定时器基本例程-1(未使用定时器,一个灯每隔500ms亮灭一次)//这是个特意安排的例程,以便与下面的例程2进行对比#include <reg52.h>sbit led=P2^7;void delay_ms(unsigned int xms); //ms级延时子程序//=================================================void main(){led=1; //上电初始化,led灯不亮while(1){led=!led;delay_ms(500);}}//=================================================void delay_ms(unsigned int xms) //ms级延时子程序{ unsigned int x,y;for(x=xms;x>0;x--)for(y=130;y>0;y--);}//-------------------------------------------------//定时器基本例程-2(使用定时器,一个灯每隔500ms亮灭一次)#include <reg52.h>sbit led=P2^7;unsigned char num;void delay_ms(unsigned int xms); //ms级延时子程序//=================================================void main(){led=1; //上电初始化,led灯不亮TMOD=0x01; //设定定时器0为工作方式1TH0=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL0=(65536-50000)%256; //EA=1; //开总中断ET0=1; //开定时器0中断TR0=1; //启动定时器0while(1){delay_ms(8000);}}//=================================================void delay_ms(unsigned int xms) //ms级延时子程序{ unsigned int x,y;for(x=xms;x>0;x--)for(y=130;y>0;y--);}//-------------------------------------------------void led_flash() interrupt 1 //使用了定时中断0的led闪烁子函数{ TH0=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000 TL0=(65536-50000)%256; //num++;if(num==10){num=0;led=!led;}}////定时器基本例程-3//(使用定时器T1,单片机整个口接的8个灯每隔500ms亮灭一次)#include <reg52.h>#define led_port P0 //宏定义,具体的端口尽量不要出现在主函数和主函数中unsigned char num;void delay_ms(unsigned int xms); //ms级延时子程序//=================================================void main(){led_port=0xff; //上电初始化,所有led灯不亮TMOD=0x10; //设定定时器1为工作方式1(16位方式)TH1=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL1=(65536-50000)%256; //EA=1; //开总中断ET1=1; //开定时器1中断TR1=1; //启动定时器1while(1){delay_ms(8000); //这句表明定时中断的运行是在系统后台自动运行的,不需要主函数“操心”}}//=================================================void delay_ms(unsigned int xms) //ms级延时子程序{ unsigned int x,y;for(x=xms;x>0;x--)for(y=130;y>0;y--);}//-------------------------------------------------void led_flash() interrupt 3 //使用了定时中断1的8灯闪烁子函数{ TH1=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL1=(65536-50000)%256; //num++; //计数if(num==10) //计够10次,时间就是10x50ms=500ms{num=0; //清零,以便进行下一次500ms的10次计数led_port=~led_port; //整个口接的led灯亮灭状态翻转}}//-------------------------------------------------//定时器基本例程-4//(同时使用定时器T0和定时器T1,单片机某个口的灯和某个口接的8个灯每隔500ms亮灭一次)#include <reg52.h>sbit led=P2^7;#define led_port P0 //宏定义,具体的端口尽量不要出现在主函数和主函数中unsigned char num_0,num_1;void delay_ms(unsigned int xms); //ms级延时子程序//=================================================void main(){led=1; //上电初始化,led灯不亮led_port=0xff; //上电初始化,该口所有led灯不亮TMOD=0x11; //设定定时器0和定时器1都为工作方式1(16位方式)TH0=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL0=(65536-50000)%256; //TH1=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL1=(65536-50000)%256; //EA=1; //开总中断ET0=1; //开定时器0中断TR0=1; //启动定时器0ET1=1; //开定时器1中断TR1=1; //启动定时器1while(1){delay_ms(8000); //这句表明定时中断的运行是在系统后台自动运行的,不需要主函数“操心”}}//=================================================void delay_ms(unsigned int xms) //ms级延时子程序{ unsigned int x,y;for(x=xms;x>0;x--)for(y=130;y>0;y--);}//-------------------------------------------------void led_flash() interrupt 1 //使用了定时中断0的led闪烁子函数{ TH0=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL0=(65536-50000)%256; //num_0++; //计数if(num_0==10) //计够10次,时间就是10x50ms=500ms{num_0=0; //清零,以便进行下一次500ms的10次计数led=!led; //led灯亮灭状态翻转}}//-------------------------------------------------void led_all_flash() interrupt 3 //使用了定时中断1的8灯闪烁子函数{ TH1=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL1=(65536-50000)%256; //num_1++; //计数if(num_1==10) //计够10次,时间就是10x50ms=500ms{num_1=0; //清零,以便进行下一次500ms的10次计数led_port=~led_port; //整个口接的led灯亮灭状态翻转}}//-------------------------------------------------//定时器基本例程-5//设定定时器T0工作在方式1的计数应用状态,//单片机T0口(P3.4)接一个按键充当外部脉冲源,//系统对进来的脉冲(每按一次键得一脉冲)进行计数,//计数的结果用接在单片机P0口的8个LED灯表示出来//(大家也可以改成用1602LCD来显示,这样更直观)//广西民大物电学院李映超2010年4月14日#include <reg52.h>#define led_port P0 //宏定义,具体的端口尽量不要出现在主函数和主函数中//=================================================void main(){TMOD=0x05; //设定定时器0为工作方式1、计数器TH0=0; //清零TL0=250; //TR0=1; //启动定时器0进行计数while(1){led_port=TL0; //将计数结果送去显示(用8个LED灯显示),//这里仅显示16位计数器的低8位}}定时器0仍旧工作在计数器状态,增加定时器1工作在定时状态,得到1s的定时时间,定时时间到后,将定时器0计数得到的脉冲数去显示,则这个脉冲数就是所输入的外部信号的频率,从而构成一个简单而准确的频率计!!不过,这个简单的“频率计”能够计量的信号频率(脉冲数),受单片机中断响应速度的影响,一般只能达到单片机系统时钟晶振的1/24,所以要能够测量更高的频率,必须使用前置分频器,对更高频率的待测输入信号进行预分频!。
昆明理工大学信息工程与自动化学院学生实验报告( 201 —201学年第1 学期)课程名称:单片机技术开课实验室: 年月日一、实验目的1. 掌握定时器 T0、T1 的方式选择与编程方法,了解中断服务程序的设计方法, 学会实时程序的调试技巧。
2. 掌握 LED 数码管动态显示程序设计方法。
二、实验原理1.89C51 单片机有五个中断源(89C52 有六个),分别就是外部中断请求 0、外部中断请求 1、定时器/计数器 0 溢出中断请求、定时器/计数器 0 溢出中断请求及串行口中断请求。
每个中断源都对应一个中断请求位,它们设置在特殊功能寄存器 TCON 与 SCON 中。
当中断源请求中断时,相应标志分别由 TCON 与SCON 的相应位来锁寄。
五个中断源有二个中断优先级,每个中断源可以编程为高优先级或低优先级中断,可以实现二级中断服务程序嵌套。
在同一优先级别中,靠内部的查询逻辑来确定响应顺序。
不同的中断源有不同的中断矢量地址。
中断的控制用四个特殊功能寄存器 IE、IP、TCON (用六位)与 SCON(用二位), 分别用于控制中断的类型、中断的开/关与各种中断源的优先级别。
中断程序由中断控制程序(主程序)与中断服务程序两部分组成:1)中断控制程序用于实现对中断的控制;2)中断服务程序用于完成中断源所要求的中断处理的各种操作。
C51 的中断函数必须通过 interrupt m 进行修饰。
在 C51 程序设计中,当函数定义时用了 interrupt m 修饰符,系统编译时把对应函数转化为中断函数,自动加上程序头段与尾段,并按 MCS-51 系统中断的处理方式自动把它安排在程序存储器中的相应位置。
在该修饰符中,m 的取值为 0~31,对应的中断情况如下:0——外部中断 01——定时/计数器 T02——外部中断 13——定时/计数器 T14——串行口中断5——定时/计数器 T2其它值预留。
89C51 单片机内设置了两个可编程的 16 位定时器 T0 与 T1,通过编程,可以设定为定时器与外部计数方式。