版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGEPAGE158第8章STC15F2K60S2单片机的定时/计数器例题例8.1用T1方式0实现定时,在P1.0引脚输出周期为10mS的方波。解:根据题意,采用T1方式1进行定时,因此,(TMOD)=00H。因为方波周期是10mS,因此T1的定时时间应为5mS,每5mS时间到就对P1.0取反,就可实现在P1.0引脚输出周期为10mS的方波。系统采用12M晶振,分频系数为12,即定时脉钟周期为1μS,则T1的初值为:X=M计数值=655365000==60536=EC78H即:TH1=ECH,TL1=78H。(1)查询方式实现:ORG0000HMOV TMOD,#00H ;设T1为方式1定时模式MOV TH1,#0ECH ;置5mS定时的初值 MOV TL1,#78H SETB TR1 ;启动T1Check_TF1: JBC TF1,Timer1_Overflow ;查询计数溢出SJMP Check_TF1 ;未到5mS继续计数Timer1_Overflow: CPLP1.0;对P1.0取反输出 SJMPCheck_TF1 ;未到1s继续循环 END (2)中断方式实现:ORG 0000HLJMP MAIN;上电复位后,转MAINORG 001BHLJMP Timer1_ISR;T1中断响应后,转Timer1_ISRORG 0100HMAIN: MOVTMOD,#00H ;设T1为方式1定时模式MOVTH1,#0ECH ;置5mS定时的初值 MOVTL1,#78H SETBET1 SETBEA ;开放中断 SETBTR1 ;启动T1 SJMP$;原地踏步,模拟主程序Timer1_ISR: CPLP1.0;对P1.0取反输出 RETI ;中断返回,回到主程序执行SJMP$ END 例8.2用定时/计数器扩展外部中断。解:当实际应用系统中有两个以上的外部中断源,而片内定时/计数器未使用时,可利用定时/计数器来扩展外部中断源。扩展方法是,将定时/计数器设置为计数器方式,计数初值设定为满程,将待扩展的外部中断源接到定时/计数器的外部计数引脚。从该引脚输入一个下降沿信号,计数器加1后便产生定时/计数器溢出中断。因此,可把定时/计数器的外部计数引脚作为扩展中断源的中断输入端。设采用T1实现,采用工作方2,即TH1、TL1的初值均为FFH,T1中断开放,即T1引脚(P3.5)为扩展外部中断的中断请求信号输入端,触发方式为下降沿触发。其初始化程序(中断方式)如下:ORG 0000HLJMP MAIN;上电复位后,转MAINORG 001BHLJMP EX_ISR;T1中断响应后,转EX_ISRORG 0100HMAIN: MOVTMOD,#60H ;设T1为方式1计模式MOVTH1,#0FFH MOVTL1,#0FFHSETBET1SETBEA ;开放中断 SETBTR1 ;启动T1……;主程序其它指令……EX_ISR:……;扩展外部中断的中断服务程序……RETIEND思考:试将例8.2的功能用T0或T1的方式0实现。例8.3使信号灯循环点亮,首先按从左至右轮流点亮,再按从右至左轮流点亮,每个信号灯点亮的时间间隔为1秒。要求用单片机定时/计数器定时实现。解:硬件电路比较简单,采用P1口输出驱动电平,低电平有效。电路如图8.7所示。图8.7流水灯显示电路系统采用12M晶振,分频系数为12,即定时时钟周期为1μS;采用定时器T1方式0定时50mS,用R3做50ms计数单元,20次50mS定时即为1S,故R3的初始值为20。汇编语言参考程序如下:1)查询方式实现ORG 0000HLOOP: MOVR2,#07H;设置左移的次数 MOVA,#0FEH;设置信号灯的显示(左移)的起始状态值Left_Shift: MOVP1,A;送显示控制信号 LCALLDELAY;利用软件与定时器,实现1s定时RLA;改变信号灯显示状态,左移 DJNZR2,Left_Shift;判断左移流程是否结束,若结束,转入右移控制 MOVA,#7FH;设置信号灯的显示(右移)的起始状态值,可省略MOVR2,#07H;设置右移的次数Right_Shift: MOP1,A;送显示控制信号 RRA;改变信号灯显示状态,右移 LCALLDELAY;利用软件与定时器,实现1s定时 DJNZR2,Right_Shift;判断左移流程是否结束,若结束,又重新开始 SJMPLOOPDELAY: MOVR3,#20 ;置50ms计数循环初值 MOVTMOD,#00H ;设定时器1为方式1MOVTH1,#3CH ;置定时器初值 MOVTL1,#0B0H SETBTR1 ;启动T1Check_TF1: JBCTF1,Timer1_Overflow ;查询计数溢出 SJMPCheck_TF1 ;未到50ms继续计数Timer1_Overflow: DJNZR3,Check_TF1 ;未到1s继续循环 CLRTR1;关闭T1RET ;返回主程序 END中断方式实现ORG 0000HLJMP MAINORG 001BHLJMP Timer1_ISRMAIN: MOVR3,#20 ;置50ms计数循环初值MOVTMOD,#00H ;设定时器1为方式1MOVTH1,#3CH ;置50ms定时器初值MOVTL1,#0B0H MOVR2,#07H;设置左移的次数MOVP1,#0FEH;设置信号灯的显示(左移)的起始状态值MOVA,#0FEH;设置信号灯的显示(左移)的起始状态值CLR00H;设置左、右移标志位,为0左移,为1右移SETPTR1;启动T1定时器SJMP$;原地踏步,模拟主程序Timer1_ISR: DJNZ R3,Exit_Timer1_ISR;定时时间到,执行移位,否则中断结束MOVR3,#20JB00H,Right_Shift;判断左、右移控制RLA;左移控制MOVP1,ADJNZ R2,Exit_Timer1_ISR;判断左移流程是否结束,若结束,转入右移控制SETB00H;置位左、右移控制标志MOVR2,#07H;重新设置移位次数SJMPExit_Timer1_ISRRight_Shift:RRA;右移控制MOVP1,ADJNZR2,Exit_Timer1_ISR;判断左移流程是否结束,若结束,转入右移控制CLR00H;清0左、右移控制标志MOVR2,#07H;重新设置移位次数Exit_Timer1_ISR:RETIENDC51参考程序如下:1)查询方式实现#include<REG51.H> //包含52标准文件头#include<intrins.h>//包含循环左移、右移子函数#defineucharunsignedchar#defineuintunsignedintucharLED=0xfe;/*利用T1实现定时的子函数*/voidDELAY(void) //延时函数1S { uinti=0;TMOD=0x00; //T1工作模式1 TH1=0x3c; TL1=0xb0; TR1=1; while(i<20) { if(TF1==1) //查询T1溢出标志 { TF1=0; i++; } }}/*循环左移子函数*/voidLeft_Shift(void){ P1=LED; DELAY(); //延时一秒 LED=_crol_(LED,1); //循环左移一位}/*循环右移子函数*/voidRight_Shift(void){ LED=_cror_(LED,1); //循环右移一位 P1=LED; DELAY(); //延时一秒}/*主函数*/voidmain(void) { ucharj; while(1) { for(j=0;j<7;i++) { Left_Shif(); } for(j=0;j<7;i++) { Right_Shift(); } }}2)中断方式实现#include<REG52.H> //包含52标准文件头#include<intrins.h>//包含循环左移、右移子函数#defineucharunsignedchar#defineuintunsignedchar/*定义全局变量*/ucharLED=0xfe;uchari=0;uchart=0;/*T1初始化子函数*/voidTimer1_init(void) { TMOD=0x00; //T1工作模式1 TH1=0x3c; TL1=0xb0; ET1=1; EA=1; TR1=1;}/*LED循环显示子函数*/voidShift(void) { P1=LED; t++; if(t<=7) { LED=_crol_(LED,1); //循环左移一位 } elseif(t<15) { LED=_cror_(LED,1); //循环右移一位 } else{t=0;}}/*T1中断服务子函数*/voidTimer1_int(void)interrupt3using1 //定时T1中断服务程序 { i++; f(i==20) { i=0; Shift(); }}/*主函数*/voidmain(void) //主函数{ Timer1_init(); //T1初始化 while(1);}例8.4连续输入5个单次脉冲使单片机控制的LED灯状态翻转一次。要求用单片机定时/计数器计数功能实现实现。解:采用T1实现,硬件如图8.8所示。图8.8信号灯的计数控制采用T1的方式2的计数方式,初始值设置为FBH,当输入5个脉冲时,即溢出标志TF1,通过查询TF1或中断方式判断TF1标志,进而对P1.0LED灯进行控制。汇编语言参考程序如下:1)查询方式实现ORG 0000HMOVTMOD,#60H;设定定时器1模式2,计数功能MOVTH1,#0FBHMOVTL1,#0FBH;设置计数器初值(256-5)SETBTR1;启动计数Check_TF1:JBCTF1,Timer1_Overflow;查询是否计数溢出AJMPCheck_TF1Timer1_Overflow:CPLP1.0;当统计5个脉冲,LED灯状态翻转AJMPCheck_TF1END2)中断方式实现 ORG 0000H AJMP MAIN ORG 001BH AJMP Timer1_ISRMAIN: MOVTMOD,#60H;设定定时器1模式2,计数功能 MOVTH1,#0FBH MOVTL1,#0FBH;设置计数器初值(256-5) SETBTR1;启动计数 SJMP$Timer1_ISR: CPLP1.0;当统计5个脉冲,LED灯状态翻转 RETI ENDC51参考程序如下:1)查询方式实现#include<reg51.h>sbitled=P1^0;voidtimer_initial(void){ TMOD=0x60; //设定定时器1模式2,计数功能 TH1=0xfb; //5个脉冲以后溢出 TL1=0xfb; TR1=1; //开始计数器}voidmain(void) { timer_initial();while(1) { while(TF1==0);TF1=0;Led=~led; //不断查询是否溢出,没有溢出,就等待溢出了;溢出了,//清空溢出标志,led取反 }}2)中断方式实现#include<reg51.h>#defineucharunsignedchar#defineuintunsignedcharsbitLED=P1^0;/*T1初始化子函数*/voidTimer1_init(void) { TMOD=0x60; //1设定定时器1模式2,计数功能 TH1=0xfb; //设置计数器初值(计满溢出值-5) TL1=0xfb; ET1=1; EA=1; TR1=1; //启动计数}/*T1中断服务子函数*/voidTimer1_int(void)interrupt3using1 //定时计数T1中断服务程序 { LED=~LED;}/*主函数*/voidmain(void) //主函数{ Timer1_init(); //定时T1初始化 while(1);}思考:用方式0实现。例8.5利用单片机定时器/计数器设计一个秒表,由P1口连接LED灯,采用BCD码显示,发光二极管亮表示1,暗则表示0,计满100s后从头开始,依次循环。利用一只按键控制秒表的启、停。利用复位键,返回初始工作状态。解:选用P1口作输出端,控制8只发光二极管显示,设发光二极管的驱动是低电平亮,高电平灭。P3.5接秒表的启、停按键。采用T0的方式0作定时器,12M晶振,分频系数为12,即定时时钟周期为1μS汇编语言参考程序如下:ORG 0000HLJMP MAINORG 000BHLJMP Timer0_ISQMAIN:MOVTMOD,#00H ;T0方式1定时MOVTH0,#3CH ;重新置T050ms定时的初值 MOVTL0,#0B0HSETBET0SETBEAMOVR3,#14H ;置50ms计数循环初值(1s/50ms) MOVA,#00H ;计数显示初始化CPLA;满足低电平驱动要求MOVP1,ACPLA;恢复秒表计数值Check_Start_Button:JNBP3.5,StartCLRTR0SJMPCheck_Start_ButtonStart:SETBTR0SJMPCheck_Start_ButtonTimer0_ISQ:DJNZR3,Exit_Timer0_ISQADDA,#01;秒表加1DAA;十进制调整CPLA;满足低电平驱动要求MOVP1,ACPLA;恢复秒表计数值MOVR3,#14HExit_Timer0_ISQ:RETI ENDC51参考程序如下:#include<REG52.H> //包含52标准文件头#defineucharunsignedchar#defineuintunsignedcharuchardat=0; //定义BCD计数单元(范围:0~99)uchari; //定义循环变量sbitkey=P3^5; //定义按键/*T0初始化子函数*/voidTimer0_init(void) { TMOD=0X00; //T0方式1 TH0=(65535-50000)/256; //赋初始值,50ms TL0=(65535-50000)%256; //赋初始值 ET0=1; EA=1;}/*T0中断服务子函数*/voidTimer0_int(void)interrupt1using1 //T0中断服务子程序{ i++; if(i==20) //i=20时,计时1S { i=0; dat++; f(dat==100) //计时到100S时,又从0开始 { dat=0; } }}/*启动子函数*/voidStart(void) //启动定时函数{ if(key==0) //判断按键按下 { TR0=1; //开始计时} else { TR0=0; }}/*BCD码转换子函数*/ucharBCD(ucharBCDat) //BCD转换{ ucharx; x=(BCDat/10)*10+BCDat%10; return(x);}/*主函数*/voidmain(void){ Timer0_init(); //T0初始化 while(1) { Start(); //启动定时 P1=~(BCD(dat)); //送LED显示}}例8.6编程在P3.0、P3.5、P3.4引脚上分别输出115.2KHZ、51.2KHZ、38.4KHZ的时钟信号。解:设系统时钟频率为12KHZ,T0、T1工作在方式2定时状态,且工作在无分频模式,即各定时器的定时脉冲频率等于时钟频率,即(T0x12)=(T1x12)=(T2x12)=1;各根据前面可编程时钟输出频率的计算公式,计算各定时器的定时初始值:(T2H)=FFH,(T2L)=CCH,(TH0)=(TL0)=8BH,(TH1)=(TL1)=64H汇编语言参考程序T2HEQUD6HT2LEQUD7HAUXREQU8EHINT_CLKOEQU8FHORG 0000HMOVTMOD,#22H;T0、T1工作方式2定时状态ORLAUX
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2.1.2Modbus协议物联网组网技术及应用
- 宣武医院委托书
- 成品保护施工交底制度标准
- 陪护员心理疏导沟通技巧培训手册
- 合同条款审查质量控制资料指南
- 临时设施材料分类堆放标准
- 总装工艺改进确认流程制度
- 糖尿病胰岛素注射技术
- 总装工序紧固力矩标准计划
- 幕墙结构安装施工质量交底规则
- 学位外语(本23春)形成性考核5试题答案
- 安师大环境学习题集及答案
- 人文地理学课件
- 城市规划原理 课件 10 城乡区域规划
- LY/T 2837-2017云南松抚育技术规程
- GB/T 38722-2020表面活性剂界面张力的测定拉起液膜法
- 公文写作培训-课件
- 医务人员的职业安全防护课件
- 医师定期考核试题及答案
- 托育半日活动方案
- T∕ZZB 2708-2022 化妆品包装用玻璃瓶
评论
0/150
提交评论