版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
定时器/计数器06介绍单片机片内3个定时器/计数器的结构与基本原理、4种工作方式以及应用。06定时器/计数器01T0与T1工作原理0203计数器的仿真实例定时器的仿真实例04T2结构与工作方式6.1T0与T1的结构与工作方式一、T0与T1的内部结构T0定时/计数器4种工作方式T1定时/计数器3种工作方式方式0:13位定时/计数器方式1:16位定时/计数器方式2:8位自动重载初值定时/计数器方式3:T0变成2个8位定时器T0/T1工作模式T0组成:SFR:TH0TL0T1组成:SFR:TH1TL1定时器计数器6.1T0与T1的结构与工作方式二、定时器/计数器的寄存器工作方式控制寄存器TMOD1位序号D7D6D5D4D3D2D1D0符号GATE
M1
M0GATE
M1
M0工作方式控制寄存器TMOD(字节地址89H,不可位寻址)设置T0设置T16.1T0与T1的结构与工作方式二、定时器/计数器的寄存器工作方式控制寄存器TMOD1位序号D7D6D5D4D3D2D1D0符号GATE
M1
M0GATE
M1
M0工作方式控制寄存器TMOD(字节地址89H,不可位寻址)设置T0设置T16.1T0与T1的结构与工作方式二、定时器/计数器的寄存器定时器/计数器控制寄存器TCON2定时器/计数器控制寄存器TCON(字节地址88H,可位寻址)6.1T0与T1的结构与工作方式三、定时器/计数器的工作方式方式0方式1方式2方式36.1T0与T1的结构与工作方式三、定时器/计数器的工作方式方式0(13位定时器/计数器方式)1兼容48系列单片机初值计算麻烦,不常用6.1T0与T1的结构与工作方式三、定时器/计数器的工作方式方式1(16位定时器/计数器方式)2方式1:M1M0=01工作模式:
软启动GATE=0;TR0=1;硬启动GATE=1;TR1=1;INT0=1;计数初值:计数个数=最大计数个数-初值定时时间=(最大计数个数-初值)*机器周期启动方式:溢出处理:TH0TL0硬件自动清0TF0硬件自动置1查询TF0TF0中断65536(88H)(89H)6.1T0与T1的结构与工作方式三、定时器/计数器的工作方式计数初值:计数器初值:计数个数=最大计数个数-初值定时器初值:定时时间=(最大计数个数-初值)*机器周期例:每计100个脉冲溢出,计算初值。TH0=0xFF;TL0=0x9C;方法1方法2TH0=(65536-100)/256;TL0=(65536-100)%256;例:50ms定时,晶振12MHz。TH0=0x3C;TL0=0xB0;方法1方法2TH0=(65536-50000)/256;TL0=(65536-50000)%256;【解】TC=65536-100=65436=0xFF9C【解】50ms=(65536-TC)*1usTC=15536=3CB0H
6.1T0与T1的结构与工作方式三、定时器/计数器的工作方式方式1(16位定时器/计数器方式)2void函数名()interrupt1
T0:void函数名()interrupt3
T1:{TH0=初值;TL0=初值;……}{TH1=初值;TL1=初值;……}6.1T0与T1的结构与工作方式三、定时器/计数器的工作方式方式2(8位自动重载初值定时器/计数器方式)3方式2:M1M0=10溢出处理:TL0自动清0TF0硬件自动置1查询TF0TF0中断TH0自动装载TL0计数初值:计数器初值:计数个数=最大计数个数-初值定时器初值:定时时间=(最大计数个数-初值)*机器周期最大计数个数:2566.1T0与T1的结构与工作方式三、定时器/计数器的工作方式方式3(2个8位定时器/计数器方式,T0有)4方式3:M1M0=11TH0+TR1+TF1定时器:8位,不能自动重载初值TL0+TR0+TF0定时器/计数器:8位,不能自动重载初值6.1T0与T1的结构与工作方式三、定时器/计数器的工作方式方式3(2个8位定时器/计数器方式,T0有)4TH0+TR1+TF1定时器:8位,不能自动重载初值TL0+TR0+TF0定时器/计数器:8位,不能自动重载初值T0方式3时T1的工作方式示意图T1作波特率发生器使用!常用方式2T1方式0T1方式1T1方式26.1T0与T1的结构与工作方式16位“加1”计数器,最大计数个数65536个。当计满时再来一个计数脉冲,计数器就会产生“溢出”即TF=1,计数器则清零。需要重复定时或计数,需要在每一次计数前不断的由软件重新预装初值,称之为“软件重装初值”。方式2:8位计数器的模式。TH0为8位定时器,溢出TF1=1,TH0清零,软件重装初值。TL0为8位定时/计数器,溢出TF0=1,TL0清零,软件重装初值。T0具有工作方式3,T1没有工作方式3。方式1:16位的计数器模式。8位“加1”计数器,最大计数个数256个,计满TF=1,计数器则清零。需要重复定时或计数,具备“硬件自动重装”初值功能。TL做计数器,TH做初值寄存器,TL,TH分别预置相同的初值。方式3:拆分、组合模式。四、定时器/计数器的应用步骤1、定时/计数器初始化(1)设置TMOD寄存器:4种工作方式,定时/计数,门控位(2)计算定时/计数的初值,装入TH0TL0或TH1TL1(3)设置TCON寄存器:启动或停止定时/计数(需要时加人)
T0启动:TR0=1;
停止:TR0=0;
T1启动:TR1=1;
停止:TR1=0;2、T0/T1中断初始化
T0中断:EA=1;ET0=1;PT0=1/0;
T1中断:EA=1;ET1=1;PT1=1/0;3、编写中断服务函数T0中断函数:void函数名(void)interrupt
1
usingm{......}
T1中断函数:void函数名(void)interrupt
3
usingm{......}
使用T0/T1中断的设计步骤四、定时器/计数器的应用步骤使用T0/T1查询的设计步骤1、定时/计数器初始化(1)设置TMOD寄存器:4种工作方式,定时/计数,门控位(2)计算定时/计数的初值,装入TH0TL0或TH1TL1(3)设置TCON寄存器:启动或停止定时/计数(需要时加人)
T0启动:TR0=1;
停止:TR0=0;
T1启动:TR1=1;
停止:TR1=0;2、查询标志位:TF0或TF1T0标志位查询:while(TF0==0);或
while(!TF0);T1标志位查询:while(TF0==0);或while(!TF1);3、清除标志位:TF0=0;
TF1=0;06定时器/计数器01T0与T1工作原理0203计数器的仿真实例定时器的仿真实例04T2结构与工作方式6.2定时器的仿真实例一、方波信号发生器仿真实例任务要求:产生频率为50Hz的的方波信号,系统晶振为12MHz。1硬件电路设计2软件设计T0方式1产生10msP2.0取反①TMOD初始化②计算初值TMOD=00000001B=0x01TH0=(65536-10000)/256;TL0=(65536-10000)%256;③查询TF0或中断6.2定时器的仿真实例一、方波信号发生器仿真实例任务要求:产生频率为50Hz的的方波信号,系统晶振为12MHz。2软件设计#include<reg52.h> sbitP20=P2^0; voidT0_init();/*************主函数************/voidmain(void) {
T0_init();while(1) {while(TF0==0);
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
P20=!P20; TF0=0;
}}voidT0_init(){
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TR0=1;
}(查询方式编程)①TMOD初始化②计算初值TMOD=00000001B=0x01TH0=(65536-10000)/256;TL0=(65536-10000)%256;③查询TF0或中断6.2定时器的仿真实例一、方波信号发生器仿真实例任务要求:产生频率为50Hz的的方波信号,系统晶振为12MHz。2软件设计#include<reg52.h> sbitP20=P2^0; voidT0_init();//定时器T0初始化voidmain(void) {T0_init();while(1); }voidT0_init(){TMOD=0x01; TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TR0=1;
ET0=1;//开T0中断
EA=1; //开总中断}(中断方式编程)voidT0_int()interrupt1{TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
P20=!P20; }6.2定时器的仿真实例一、方波信号发生器仿真实例任务要求:产生频率为50Hz的的方波信号,系统晶振为12MHz。3仿真运行周期为20ms6.1T0与T1的结构与工作方式定时器初值:定时时间=(最大计数个数-初值)*机器周期任务要求:产生频率为50Hz的的方波信号,系统晶振为12MHz。【编程小技巧】带参数的定时器初始化函数编写voidT0_init(unsignedintxus){unsignedlongtemp;//临时变量
TMOD&=0xf0;//清T0控制位,保留T1控制位
TMOD|=0x01;//设置T0为方式1定时
temp=12000000/12;//机器周期的频率1MHztemp=(temp*xus)/1000000;//定时xus的计数值
temp=65536-temp;//定时器初值
TH0_temp=(unsignedchar)(temp>>8);//计算高8位初值
TL0_temp=(unsignedchar)(temp);//计算低8位初值
TH0=TH0_temp;//置T0高8位初值
TL0=TL0_temp;//置T0低8位初值
TR0=1;//启动T0ET0=1;//开T0中断
EA=1; //开总中断}6.2定时器的仿真实例二、I/O口输出PWM波形仿真实例任务要求:按键控制输出PWM波形,频率50Hz,占空比为25%、50%、75%的。晶振12MHz。1硬件电路设计T1,方式2,定时100us中断一次T=20msHigh_num=50占空比为25%High_num=100占空比为50%High_num=150占空比为75%进入中断次数:count++PWM波:count≤High_numP2.0=1Count>High_numP2.0=0High_num获得:KEY1:High_num=50KEY2:High_num=100KEY3:High_num=150T=2006.2定时器的仿真实例任务要求:按键控制输出PWM波形,频率50Hz,占空比为25%、50%、75%的。2软件设计#include"reg52.h"#defineucharunsignedchar#defineuintunsignedintsbitPWM=P2^0;//输出PWMsbitkey1=P2^3;//占空比25%sbitkey2=P2^4;//占空比50%sbitkey3=P2^5;//占空比75%voidT1_init();//T1初始化ucharkeyscan();//设置占空比阈值ucharcount=0,High_num=0;voidmain(){
T1_init();while(1){
keyscan();}}voidT1_init()
{TMOD=0x20TH1=256-100
TL1=256-100;TR1=1;//启动T1 ET1=1;//开启T1中断
EA=1;//开总中断
}二、I/O口输出PWM波形仿真实例voidT1_int()interrupt3{
count++;//累计中断次数
if(count>=200)count=0;if(count<High_num)PWM=1;elsePWM=0;}6.2定时器的仿真实例2软件设计ucharkeyscan(){if(key1==0){delay(5);if(key1==0)
High_num=50;//KEY1=25%while(!key1);}if(key2==0){delay(5);if(key2==0)High_num=100;//KEY2=50%while(!key2);}二、I/O口输出PWM波形仿真实例
if(key3==0){delay(5);if(key3==0)
High_num=150;
while(!key3);}returnHigh_num;}任务要求:按键控制输出PWM波形,频率50Hz,占空比为25%、50%、75%的。6.2定时器的仿真实例三、基于数码管的秒表仿真实例任务要求:按键1启动秒表,数码管(共阳)显示;
按键2停止秒表,显示当前值。
再按下按键1则从0开始计时,重复上述过程。
计时范围00~59s,如果计时到59s,将从0计时。晶振12MHz。1硬件电路设计T0方式1,定时50ms中断一次进入中断20为1s,sec累计秒次数数码管显示sec分离出十位、个位按键处理KEY1:TR0=1KEY2:TR0=01s的获得shi=sec/10;ge=sec%10;6.2定时器的仿真实例2软件设计voidT0_init(){ TMOD=0x01;
TH0=(65536-50000)/256;TL0=(65536-50000)%256;ET0=1;PT0=0;EA=1;}voidEx_init(){IT0=1;
EX0=1;
PX0=1;
IT1=1;
EX1=1;PX1=1;
EA=1;}三、基于数码管的秒表仿真实例voidT0_it()interrupt1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;
count++;
if(count>=20){count=0;sec++;}if(sec>=60)sec=0;}voidkey1_int()interrupt0{
TR0=1;//启动T0sec=0x00;IE0=0;//清INT0中断标志位}voidkey2_int()interrupt2{TR0=0;//停止T0IE1=0;//清INT1中断标志位}6.2定时器的仿真实例2软件设计voiddisplay(ucharz){uintshi,ge;
shi=z/10;ge=z%10;c1=1;//选中第一个数码管
P2=seg[ge];//显示千位
delay(1);P2=0xff;//消隐
c1=0;c2=1;//选中第二个数码管
P2=seg[shi];//显示百位
delay(1);P2=0xff;//消隐
c2=0;}三、基于LED数码管的秒表仿真实例#include"reg52.h"#defineucharunsignedchar#defineuintunsignedintsbitc1=P1^0;//数码管位选端sbitc2=P1^1;//数码管位选端ucharcodeseg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
voidT0_init();//T0初始化voidEx_init();//外部中断初始化voiddelay(uintdat);//延时程序voiddisplay(uchardate);//显示程序ucharsec=0,count=0;voidmain(){
T0_init();
Ex_init();while(1){display(sec);}}6.2定时器的仿真实例【编程小技巧】定时刷新数码管显示器问题:刷新采用延时函数delay。执行延时占用CPU时间,效率不高。数码管动态显示时,多个数码管整体的动态刷新时间小于10ms,数码管才不会闪烁。
动态扫描的过程为“送位选码送段码延时消隐”定时器T1每隔1ms刷新一位数码管c1=1;//选中第一个数码管
P2=seg[ge];//显示千位
delay(1);P2=0xff;//消隐
c1=0;定时器T1初始化函数:用带参数的定时初始化函数T1_init(1000);//T1定时1ms中断服务函数:刷新显示
display(sec);//1ms显示刷新6.2定时器的仿真实例voiddisplay(ucharz){uintshi,ge;shi=z/10;ge=z%10;
c1=1;//选中第一个数码管
P2=seg[ge];//显示千位
delay(1);P2=0xff;//消隐
c1=0;c2=1;//选中第二个数码管
P2=seg[shi];//显示百位
delay(1);P2=0xff;//消隐
c2=0;}【编程小技巧】定时刷新数码管源代码voiddisplay_Time(uintz){staticuchari=0;//数码管位选索引
uintshi,ge;shi=z/10;ge=z%10;switch(i){
case0:P2=0xff;//消隐
c1=1;c2=0;//选第一个数码管
//P1=(P1&0xfC)|0x01;//选第一个数码管
P2=seg[ge];//送段码
i++;break;
case1:P2=0xff;//消隐
c2=1;c1=0;//选第二个数码管
//P1=(P1&0xfC)|0x02;//选第二个数码管
P2=seg[shi];//送段码
i=0;break;default:break;}}定时刷新代码6.2定时器的仿真实例2软件设计(定时刷新)#include"reg52.h"#defineucharunsignedchar#defineuintunsignedintucharcodeseg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳数码voidT0_init();//T0初始化voidT1_init(uintxus);//T1初始化voidEx_init();//外部中断初始化voiddisplay_Time(uintz);//显示程序ucharsec=0,count=0;//秒中断进入次数ucharTH1_temp,TL1_temp;//T1定时初值voidmain(){T0_init();//T0定时50msT1_init(1000);//T1定时1msEx_init();//中断初始化
while(1);}voidT1_int()interrupt3{
TR1=0; //关闭T1
display(sec);//1ms显示刷新
TH1=TH1_temp;//置T1高8位初值
TL1=TL1_temp;//置T1低8位初值
TR1=1;//启动T1}三、基于LED数码管的秒表仿真实例T0_init()、T1_init(uintxus)、EX_init()以及T0、外部中断0、1的中断函数与上同6.2定时器的仿真实例四、基于LCD的时钟仿真实例任务要求:key1启动秒表,key2停止秒表,key3增1,key4减1;在LCD1602上显示。计时范围00~59s,如果计时到59s,将从0计时。系统晶振为12MHz。1硬件电路设计T0方式1,定时50ms中断一次进入中断20为1s,sec累计秒次数LCD显示sec分离出十位、个位按键处理KEY1:TR0=1KEY2:TR0=01s的获得shi=sec/10;ge=sec%10;KEY3:sec++KEY4:sec--6.2定时器的仿真实例2软件设计#include"reg52.h"#defineucharunsignedchar#defineuintunsignedintsbitlcdrs=P1^0; sbitlcdrw=P1^1; sbitlcden=P1^2;
sbitkey1=P1^3;//启动sbitkey2=P1^4;//停止sbitkey3=P1^5;//增一sbitkey4=P1^6;//减一voidT0_init();//T0初始化voidkeyscan();voiddelay(uintdat);//延时程序voidlcd_init();//lcd初始化voidwrite_cmd(charcmd);voidwrite_data(uchardat);voidwrite_str(uchar*strvoiddisplay(uchardate);ucharflag=0,sec=0,count=0;voidmain(){T0_init();
lcd_init();write_cmd(0x82);write_str("sec:");while(1){
keyscan();
display(sec);}}四、基于LCD的时钟仿真实例voidT0_init(){TMOD=0x01;//定时器T0方式1,定时50msTH0=(65536-50000)/256;TL0=(65536-50000)%256;ET0=1;EA=1;}6.2定时器的仿真实例2软件设计voidT0_it()interrupt1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;count++;if(count>=20){count=0;sec++;}if(sec>=60){sec=0;flag=1;}}voidkeyscan(){if(key1==0)TR0=1;if(key2==0)TR0=0;if(key3==0){
sec++;if(sec==60)sec=60;}if(key4==0){sec--;if(sec<=0)sec=0;}}四、基于LCD的时钟仿真实例voiddisplay(uchardate){write_cmd(0x88);write_data(date/10+0x30);//显示十位
write_cmd(0x89);write_data(date%10+0x30);//显示个位}6.2定时器的仿真实例五、脉冲宽度测量仿真实例任务要求:测量信号的正脉冲宽度,并在LCD上显示。系统晶振为12MHz。测量原理①T1方式1,定时,累计机器周期的个数,1个机器周期1us利用T0/T1的硬启动方式,当门控位GATE=1,TR1=1,只有当(INT1)引脚输入高电平时,T1才启动,开始计数,累计机器周期的个数。脉冲信号②P3.3引脚上升沿(高电平)启动T1定时,下降沿(低电平)停止定时③读出T1的数值④测量范围:0~65535us6.2定时器的仿真实例二、脉冲宽度测量仿真实例任务要求:测量信号的正脉冲宽度,并在LCD上显示。系统晶振为12MHz。1硬件电路设计6.2定时器的仿真实例2软件设计#include<reg52.h>#defineuintunsignedint#defineucharunsignedcharsbitlcdrs=P1^0;//LCD1602液晶显示器数据/命令选择端口sbitlcdrw=P1^1;//LCD1602液晶显示器读/写选择端口sbitlcden=P1^2;//LCD1602液晶显示器使能端口 sbitP3_3=P3^3; //INT1测量脉冲输入引脚定义voiddelay(uintdat);//延时程序voidlcd_init();//lcd初始化voidwrite_cmd(charcmd);//写指令函数voidwrite_data(uchardat);//写数据函数voidwrite_str(uchar*str);//写字符串函数voiddisplay(uintdate);//显示uintWidth_num;//脉冲的宽度,T1的计数值任务要求:测量信号的正脉冲宽度,并在LCD上显示。系统晶振为12MHz。6.2定时器的仿真实例2软件设计voidmain(){ lcd_init();//LCD初始化
write_cmd(0x82);
write_str("PulseWidth:");while(1){TMOD=0x90;TH1=0; TL1=0;
while(P3_3==1);
TR1=1;//如果INT1为低,TR1=1,等待INT1变高启动T1
while(P3_3==0);//等待INT1变高,硬启动条件满足,T1计数
while(P3_3==1);//等待INT1变低,变低后T1停止计数
TR1=0; //复位TR1Width_num=TH1*256+TL1;//计算T1计数值,即脉冲宽度
display(Width_num); //显示脉冲宽度(机器周期个数)
}}6.2定时器的仿真实例2软件设计voiddisplay(uintdate){ucharwidth[7];//定义字符数组,存放脉冲宽度每一位的ASCIIwidth[0]=date/10000+0x30;//分离十万位,转换为ASCIIwidth[1]=date%100000/10000+0x30;//分离万位,转换为ASCIIwidth[2]=date%10000/1000+0x30;//分离千位,转换为ASCIIwidth[3]=date%1000/100+0x30;//分离百位,转换为ASCIIwidth[4]=date%100/10+0x30;//分离十位,转换为ASCIIwidth[5]=date%10+0x30; //分离个万位,转换为ASCIIwidth[6]='\0'; //数组末尾填加字符串结束的标志
write_cmd(0xc5);//在LCD第2行第5个位置写入
write_str(width);//将脉冲宽度转换为字符数组写入LCD}6.3计数器的仿真实例【知识点】计数器模式对外部输入信号频率的要求计数器模式时,计数脉冲来自外部输入引脚T0或T1。当输入信号产生负跳变时,计数值增1。
每个机器周期S5P2期间,都对外部输入引脚T0或T1进行采样。如在第1个机器周期中采得值为1,而在下一个机器周期中采得的值为0,则在紧跟着的再下一个机器周期S3P1期间,计数器加1。由于确认一次负跳变要花2个机器周期,即24个振荡周期,因此外部输入的计数脉冲的最高频率为系统振荡器频率1/24。
对外输入信号占空比没有限制,但为确保某一给定电平在变化前能被采样1次,则该电平至少保持1个机器周期。问题:选用12MHz频率晶体,则可输入外部脉冲信号的最高频率为多少?可输入外部脉冲信号的最高频率为500kHz。6.3计数器的仿真实例-频率计任务要求:测量脉冲信号的频率,并在数码管上显示,测量频率范围为0~9999Hz。系统晶振为12MHz。1硬件电路设计6.3计数器的仿真实例-频率计任务要求:测量脉冲信号的频率,并在数码管上显示,测量频率范围为0~9999Hz。系统晶振为12MHz。T0方式1,定时25ms中断一次,进入中断40次为1s①需要1s的定时测量信号的频率原理测量信号的频率就是测量每秒的脉冲个数频率是指是单位时间内完成振动的次数②需要累计脉冲个数T1方式1,计数,TH1=TL1=0③二者关联T0定时1s,读出T1的值T0定时25s读出一次T1的数值,放在数组fre[count]中,T0中断40次也就是1s,这时把读出的40次值,即fre数组的值累加就是频率值fresum。2软件设计问题:频率高,T1可能溢出6.3计数器的仿真实例2软件设计voidT0T1_init(){
TMOD=0x51;//T0方式1,
25ms,T1计数TH0=(65536-25000)/256;//T0赋初值
TL0=(65536-25000)%256;ET0=1;//开T0中断允许
TR0=1;//启动T0TR1=1;//启动T1EA=1;//开总中断
}voidT0_it()interrupt1{TR0=0;//停止T0TR1=0;//停止T1
fre[count]=(TH1<<8)|TL1;
count++;//T0累计40次为1s
TH1=0;//T125ms清0TL1=0;TH0=(65536-25000)/256;
TL0=(65536-25000)%256;TR0=1;//启动T0TR1=1;//启动T1 }6.3计数器的仿真实例2软件设计voiddisplay(u16z){u16qian,bai,shi,ge;
qian=z/1000;//分离千位
bai=z%1000/100;//分离百位
shi=z%100/10;//分离十位
ge=z%10;//分离个位
c1=0;c2=0;c3=0;c4=0;
//清位选端
c1=1;//选中第一个数码管
P0=seg[ge];//显示个位
delay(1);P0=0xff;//消隐
c1=0;c2=1;//选中第二个数码管
P0=seg[shi];//显示十位
delay(1);P0=0xff;//消隐
c2=0;c3=1;//选中第三个数码管
P0=seg[bai];//显示百位
delay(1);P0=0xff;//消隐
c3=0;
c4=1;//选中第四个数码管
P0=seg[qian];//显示千位
delay(1);P0=0xff;//消隐
c4=0;}6.3计数器的仿真实例2软件设计#include"reg52.h"#defineu8unsignedchar#defineu16unsignedintsbitc1=P2^0;//数码管位选端sbitc2=P2^1;//数码管位选端sbitc3=P2^2;//数码管位选端sbitc4=P2^3;//数码管位选端u8codeseg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90;}voiddelay(u16dat);//延时程序voidT0T1_init();//T0初始化voiddisplay(u16z);//显示u16fre[40];//存放25ms读出的T1值u16fresum=0;//计算的频率值u8count=0;//T0累计40次的变量voidmain(){
T0T1_init();//T0、T1初始化while(1){u8i=0;if(count==40)//1s时间到{TR0=0; TR1=0; count=0; fresum=0; for(i=0;i<40;i++) {
fresum=fresum+fre[i] } TR0=1;TR1=1;}display(fresum);//显示}}6.4T2的结构与工作方式T2有2个8位计数器寄存器:TH2和TL2,用于存放当前计数值T2有2个陷阱寄存器:RCAP2L和RCAP2H,用于存放备用初值或捕捉值。T2有计数和定时2种工作模式T2有捕捉、自动重新装载(递增或递减)和波特率发生器3种工作方式,6.4.2T2的捕捉方式16位计数/定时(加1计数)或捕捉(同时具有计数/定时)。计数/定时工作状态(加1计数)1
溢出:硬件使TF2=1,TL2=0,TH2=0,不能自动重装初值,软件使TF2=0溢出后处理:可查询TF2=1,TF2=1也可用于产生中断6.4.2T2的捕捉方式16位计数/定时(加1计数)或捕捉(同时具有计数/定时)。捕捉(同时具有计数/定时)2设置:捕捉:T2EX(P1.1)发生负跳变时,把TH2和TL2中的当前计数值分别“捕捉”进陷阱寄存器RCAP2L和RCAP2H中,同时T2EX(P1.1)上的负跳变将使T2CON的外部中断请求标志位EXF2=1,向CPU请求中断。溢出后处理:可查询TF2=1,EXF2=1,也都可用于产生中断6.4.2T2的捕捉方式16位计数/定时(加1计数)或捕捉(同时具有计数/定时)。捕捉(同时具有计数/定时)2设置:捕捉:T2EX(P1.1)发生负跳变时,把TH2和TL2中的当前计数值分别“捕捉”进陷阱寄存器RCAP2L和RCAP2H中,同时T2EX(P1.1)上的负跳变将使T2CON的外部中断请求标志位EXF2=1,向CPU请求中断。溢出后处理:可查询TF2=1,EXF2=1,也都可用于产生中断捕捉编程思路:
当T2EX引脚(P1.1)上的信号发生负跳变时,计数器TH2和TL2中的当前计数值分别“捕捉”进陷阱寄存器RCAP2L和RCAP2H中,并使EXF2=1,触发中断,在中断服务函数中,读出RCAP2L和RCAP2H的值,外部T2EX引脚的下一个负跳变,会产生另一个捕捉过程,再次进入中断,读出RCAP2L和RCAP2H的值,根据这2次的值,就可以计算出T2EX引脚(P1.1)上的脉冲周期。这时T2工作在定时模式下。6.4.3T2的16位自动重装载方式T2自动重新装载方式结构示意图T2递增/递减结构示意图6.4.3T2的16位自动重装载方式当EXEN2=0时的自动重新装载方式(T2计满溢出触发)1①T2增1计满溢出触发的自动重新装载方式设置:
②T2增1计满溢出触发的自动重新装载方式设置:
③T2减1溢出触发的自动重新装载方式设置:
当EXEN2=1的自动重新装载方式(T2计满溢出触发或T2EX引脚负跳变触发)2①T2增1计满溢出触发的自动重新装载方式设置:
T2EX引脚负跳变触发的增1自动重新装载方式设置:
DCEN=0;6.4.4T2的波特率发生器方式及可编程时钟输出波特率发生器方式1(1)T1用作串行口波特率发生器RCLK=0或TCLK=0时,定时器T1作为串行口波特率发生器使用。(2)T2用作串行口波特率发生器RCLK=1或TCLK=1时,定时器T2作为串行口波特率发生器使用。(3)附加的外部中断源RCLK=1或TCLK=1;EXEN2=16.4.4T2的波特率发生器方式及可编程时钟输出波特率发生器方式1(2)T2用作串行口波特率发生器①工作方式设置:
16位自动重装初值的加1定时模式②T2的波特率设置
计算出初值X,装入陷阱寄存器RCAP2H和RCAP2L中【例】串口方式1,波特率9600bps,晶振为11.0592MHz,
T2作波特率发生器使用,计算初值。
X=(65536-36)=65500RCAP2H=65500/256;RCAP2L=65500%256;③T2溢出说明TH2和TL2从初值的基础上进行加1计数,计满溢出,硬件自动将RCAP2H和RCAP2L寄存器中预置的初值重装入TH2和TL2中。但不会置位TF2向CPU请求中断。6.4.4T2的波特率发生器方式及可编程时钟输出可编程时钟信号输出2①设置工作方式:
②启动和停止:TR2=1
启动;TR2=0
停止③时钟信号输出频率
6.4.5T2捕捉方式测量脉冲宽度仿真实例任务要求:测量信号的脉冲宽度,并在LCD上显示。系统晶振为12MHz。硬件电路设计16.4.5T2捕捉方式测量脉冲宽度仿真实例任务要求:测量信号的脉冲宽度,并在LCD上显示。系统晶振为12MHz。软件设计2开放T2中断和总中断,T2溢出和T2EX引脚的负跳变都会触发中断,进入同一个中断程序,所以在中断服务程序中判断是EXF2中断,根据进入次数读出RCAP2L和RCAP2H的捕捉值,根据2次捕捉值计算脉冲宽度。①T2设置为捕捉(同时具有计数/定时):
T2设为16位定时器,从0开始计数,TH2=TL2=0;②计数初值:③T2中断:6.4.5T2捕捉方式测量脉冲宽度仿真实例2软件设计#include<reg52.h>#defineuintunsignedint#defineucharunsignedcharsfrT2MOD=0xc9sbitlcdrs=P3^5;sbitlcdrw=P3^6;sbitlcden=P3^7;voiddelay(uintdat);//延时程序voidT2_init();//T2初始化voidlcd_init();//lcd初始化voidwrite_cmd(charcmd);voidwrite_data(uchardat);//写数据函数voidwrite_str(uchar*strvoiddisplay(uintdate);//显示uintnum1;//第一次捕捉值uintnum2;//第二次捕捉值uintnum;ucharcount;voidmain(){ T2_init();//T2初始化
lcd_init();//LCD初始化
write_cmd(0x82;
write_str("PulseWidth:"); while(1){display(num);
}}任务要求:测量信号的脉冲宽度,并在LCD上显示。系统晶振为12MHz。6.4.5T2捕捉方式测量脉冲宽度仿真实例2软件设计voidT2_init(){RCLK=0;//T2不用作波特率发生器TCLK=0;//T2不用作波特率发生器CP_RL2=1;//
(捕捉)EXEN2=1;//=0(T2溢出自动重装)C_T2=0;//定时T2MOD=0x00;//DCEN=0(增1计数)TH2=0x00;//从0开始计数
TL2=0x00;//置T2低8位初值0TR2=1;//启动T2ET2=1;//开T2中断
EA=1; //开总中断}voidT2_int()interrupt5{if(EXF2==1)//T2EX负跳变触发中断
{count++;//累计进入中断次数
if(count==1)//第1次负跳变
num1=RCAP2H*256+RCAP2L;if(count==2)//第2次负跳变{ num2=RCAP2H*256+RCAP2L;
count=0; num=num2-num1;
}}EXF2=0; //EXF2标志清零}任务要求:测量信号的脉冲宽度,并在LCD上显示。系统晶振为12MHz。6.4.5T2捕捉方式测量脉冲宽度仿真实例2软件设计voiddisplay(uintdate){ucharwidth[7];width[0]=date/10000+0x30;//分离十万位,转换为ASCIIwidth[1]=date%100000/10000+0x30;//分离万位,转换为ASCIIwidth[2]=date%10000/1000+0x30;//分离千位,转换为ASCIIwidth[3]=date%1000/100+0x30;//分离百
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电力系统继电保护技术 第4版 课件 第7章 发电机保护
- 翰墨之情 课件 2024-2025学年苏少版(2024)初中美术七年级上册
- 湖北省黄石市铁山区城区四校2024-2025学年九年级上学期期中联考化学试题含答案
- 大学生网络刷课问卷调查
- 责任与担当主题班会
- 大学物理知到智慧树章节测试课后答案2024年秋三峡大学
- 有效沟通技巧
- 2024年浙江省嘉兴市小学六年级上学期期末英语试题及解答参考
- 2024-2025学年福建省漳州市高一上学期期中英语试题与参考答案
- 2024年陕西省志丹县发展改革委公务员招录考试录用193人管理单位遴选600题真题带答案(巩固)
- 上海市进才实验中学2024-2025学年九年级上学期期中英语试题
- 山东师范大学马克思主义基本原理期末复习题
- 食品安全总监、安全员考试题库2024
- 国开(河北)2024年秋《宣传工作实务》形考任务1-4答案
- 2024年新疆维吾尔自治区普通高中学业水平考试语文试题(解析版)
- 建筑工程质量风险管理制度
- 2024年中国宠物行业研究报告-艾瑞咨询-202411
- 2024年云南医师定考(开卷班)医学人文专业练习1400题答案 2024卫生学考试学习资料
- 2024秋期河南开放大学本科《行政管理理论与实践专题讲座》一平台无纸化考试(作业练习1至3+我要考试)试题及答案
- 压疮护理的新进展
- 5-18《食物的旅行》(教学设计)2023秋苏教版三年级科学上册
评论
0/150
提交评论