文档详情

单片机项目教学:定时器计数器的应用—音乐门铃的制作(汇编语言)精要.ppt

发布:2017-03-23约5.43千字共42页下载文档
文本预览下载声明
* 2.定时/计数器应用 例 设系统振荡频率为12MHz,编程在P1.0上输出一个周期为2ms的方波。 方波的周期用T0来确定,让T0每隔1ms计数溢出1次(每1ms产生一次中断),CPU响应中断后,在中断服务程序中对P1.0取反。 即要使P1.0每隔1ms取反一次。 * 第一步: 确定工作方式 方式0 (13位)最长可定时 8.192ms; 方式1 (16位)最长可定时 65.536ms; 方式2 (8位)最长可定时 256?s。 T0为方式0, ? M1M0=00 定时工作状态, ? C/T=0 GATE=0,不受INT0控制, T1不用全部取“0”值。 故TMOD=00H * 第二步: 计算1ms定时的初值X 设初值为X,则有: (213-X) ×12×10-6 ×1/12=1×10-3 可求得:X=8192-1000=7192 X化为16进制, 即X=1C18H=1,1100,000 1,1000B。 所以,T0的初值为: TH0=E0H TL0=18H TH0 1 1 1 0 0 0 0 0 TL0 × × × 1 1 0 0 0 第三步: 程序初始化 * 中断服务程序 主程序 第四步:程序设计 对各个寄存器相应位进行正确设置,将计数初值送入定时器中。 中断服务程序除产生方波外,还要注意将计数初值重新装入定时器中,为下一次中断作准备。 ORG 0000H RESET: AJMP MAIN ;转主程序 ORG 000BH ;T0的中断入口 AJMP IT0P ;转T0中断处理程序IT0P ORG 0100H MAIN: MOV SP,#60H ;设堆栈指针 MOV TMOD,#00H ;设置T0为方式1 ACALL PT0M0 ;调用子程序PT0M0 HERE: AJMP HERE ;自身跳转 ACALL PT0M0 ;调用子程序PT0M0 HERE: AJMP HERE ;自身跳转 PT0M0: MOV TL0,#18H ;T0置初值 MOV TH0,#0E0H SETB TR0 ;启动T0 SETB ET0 ;允许T0中断 SETB EA ;CPU开中断 RET ITOP: MOV TL0,#18H ;T0中断服务子程序,T0置初值 MOV TH0,#0E0H CPL P1.0 ;P1.0的状态取反 RETI 本题还可以采用查询方式编程 ORG 0100H MAIN: MOV TMOD, #00H ;设置T0为方式0 MOV TL0, #18H ;送计数初值 MOV TH0, #0E0H ;送计数初值 SETB TR0 ;启动T0 LOOP: JBC TF0, NEXT ;查询定时时间到,转NEXT,同时清TF0 SJMP LOOP ;重复循环 NEXT: MOV TL0, #18H ;T0重置初值 MOV TH0, #0E0H ;T0重置初值 CPL P1.0 ;P1.0的状态取反 SJMP LOOP ;重复循环 END * 查询法更简便,但占用CPU 例 将上一例题中的输出方波周期改为1秒。 分析: 周期为1s的方波要求500ms的定时。 (1) T0工作方式的确定 因定时时间较长,采用哪一种工作方式?由各种工作方式的特性,可计算出: 方式0 (13位)最长可定时 8.192ms; 方式1 (16位)最长可定时 65.536ms; 方式2 (8位)最长可定时 256?s。 所以采用定时器定时加软件计数的方法来实现延长定时。 选方式1,定时50ms,循环10次。 50ms ×10=500ms。 所以,TMOD=01H * 以上各方式 都不满足要求 (2) 计算计数初值 因为: (216-X)×12×10-6 ×1/12=50×
显示全部
相似文档