1、10.2.2 定时溢出中断编程汇编程序例 为了理解定时器的基本功能,这里给出利用定时器溢出编写定时的例子,并把“时分秒”发送到PC机,以便比较。同时,在PC机方,用一个十分简明的程序,接收MCU发送来“时分秒”并显示,同时还可以将PC机的当前时间发送到MCU,作为时间基准值。通过这个例子,理解定时器溢出中断的编程方法和系统时间的产生方法。 (1)MCU方程序 实例编号:A05_1 路径:\ASM\A05_1定时器溢出中断 (T1main.asm) *------------------------------------------------------* *文 件 名:T1m
2、ain.asm * *硬件连接:无 * *程序描述:1.从串口接收表示时间的3字节数据 * * 2.利用定时器溢出中断修改时间,并发送新时间 * *目 的:学习定时器基本功能 * *---------《嵌入式应用技术基础教程》教学实例-----------* *[头文件] $include "GP32ASM.H
3、" ;包含GP32的头文件 *[两个起始地址名] RAMstartAddr equ $0040 ;RAM的起始地址 FlashStartAddr equ $8000 ;程序开始地址 *[相应标志位定义] TSTOPBit equ 5 ;定时器计数停止位 TOFBit equ 7 ;定时器溢出标志位 ORG RAMstartAddr ;RAM的起始地址 Time rmb 3 ;存放"时分秒" *==============
4、 *[主程序] ORG FlashStartAddr ;程序起始地址 MainInit: SEI ;关总中断 LDHX #$023F ;堆栈初始化为RAM最高端 TXS JSR GP32Init ;调系统初始化子程序GP32Init JSR SCIInit
5、 ;调串口初始化子程序 JSR Timer1init ;调定时器1初始化子程序 BSET 5,SCC2 ;设置接收中断允许 CLI ;开总中断 ;给Time[0-2]"时分秒"赋初值0、0、0 LDA #$0 STA Time STA {Time+1} STA {Time+2} ;[程序总循环入口] ;主程序
6、功能:每秒发送一次时间单元 MainLoop: CMP {Time+2} ;与秒单元比较 BEQ Main1 ;"秒"没有更新,转 ;数据已经更新,发送"时分秒" LDA #$3 LDHX #Time JSR SCISendN LDA {Time+2} ;A中值更新 Main1: JMP MainLoop
7、 *[内部直接调用子程序存放处] *Timer1init:定时器1初始化子程序------------------------* *功能:对定时器1初始化 * *入口:无 * *出口:无 * *------------------------------------------------------* Timer
8、1init: PSHH ;保护HX、A PSHX PSHA ;允许溢出中断、不启动计数、分频因子=64 LDA #%01100110 STA T1SC ;计数寄存器初值=$0000 LDHX #$0000 STHX T1CNTH ;1产生1次溢出中断,预置寄存器设定值=$9600 LDHX #$9600 STHX T1MODH
9、 ;允许定时器1计数寄存器计数 BCLR TSTOPBit,T1SC PULA ;恢复HX、A PULX PULH RTS *Timer1Int:定时器1溢出中断子程序-----------------------* *功能:给内存单元Time[0-2](时分秒)赋值 * *------------------------------------------------------* Timer1Int:
10、SEI ;关总中断 PSHH ;保护H INC {Time+2} ;秒数加1 LDA {Time+2} CMP #!60 BNE Timer1Int_1 ;秒数未增加到60,转 LDA #!0 ;秒数增加到60,清0 STA {Time+2} INC {Time+1} ;分钟数加1 LDA {Time+1} CMP #!60
11、 BNE Timer1Int_1 ;分钟数未增加到60,转 LDA #!0 ;分钟数增加到60,清0 STA {Time+1} INC Time ;小时数加1 LDA Time CMP #!24 BNE Timer1Int_1 ;小时数未增加到24,转 LDA #!0 ;小时数增加到24,清0 STA Time Timer1Int_1: LDA T1SC
12、 BCLR TOFBit,T1SC ;清除定时器溢出标志位 PULH ;恢复H CLI ;开总中断 RTI *SCIRecINT:SCI接收中断子程序---------------------------* *功能:接收3字节基准时分秒放入内存单元Time[0-2] * *------------------------------------------------------* SCIRecINT:
13、 SEI ;关总中断 PSHH ;保护H LDA #$3 LDHX #Time JSR SCIReN ;接收3字节数据 PULH ;恢复H CLI ;开总中断 RTI ;中断返回 *[外部子程序存放处] $include "GP32Init.ASM" $include "H08SCI.ASM"
14、 $include "SCIInit.ASM" *[中断向量] ORG $FFF2 ;定时器1溢出中断向量 DW Timer1Int ORG $FFE4 ;SCI接收中断向量 DW SCIRecINT ORG $FFFE ;复位向量 DW MainInit (2)PC方VB程序 PC机方的界面见图10-2。程序主要功能是:接收MCU发送来“时分秒”并显示,也可以单击“发送”按钮,发送PC
15、机的当前时间。 图10-2 定时器溢出中断实验PC机方VB程序 实例编号:A05_1 路径:\ASM\A05_1定时器溢出中断\ VB_Timer1 '程序描述: ' (1)把当前系统时间从COM1发送出去 ' (2)把接收到的数据显示在接收窗口中 '------------------------------------------------------- Option Explicit '检查未经声明的变量 Dim TimData() As Byte '原始时间数组 Dim
16、SendData(2) As Byte '发送数据数组 Dim RecvData() As Byte '接收数据数组 Private Sub Form_Load() '串行口初始化 Call SCIinit(MSComm1, 1, "9600,N,8,1") '清空有关文本框 TxtSEND.Text = "" TxtRECV.Text = "" '开放串行中断 MSComm1.RThreshold = 1 '计时器开始计时 Timer1.Enabled = True End Sub
17、 Private Sub Timer1_Timer() TxtSEND.Text = Format$(Time(), "HH:MM:SS") End Sub Private Sub CmdSEND_Click() '单击"发送"按钮 SendData(0) = Val(Mid$(TxtSEND.Text, 1, 2)) SendData(1) = Val(Mid$(TxtSEND.Text, 4, 2)) SendData(2) = Val(Mid$(TxtSEND.Text, 7, 2)) MSComm1.Output = SendDat
18、a End Sub Private Sub ComStop_Click() '单击"暂停/继续"按钮 If ComStop.Caption = "暂停" Then ComStop.Caption = "继续" Timer1.Enabled = False Else ComStop.Caption = "暂停" Timer1.Enabled = True End If End Sub Public Sub MSComm1_OnComm() '串行接收中断 Dim i As Int
19、eger Dim S1 As String MSComm1.RThreshold = 0 '关闭串行中断 Do DoEvents Loop Until MSComm1.InBufferCount >= 3 RecvData = MSComm1.Input For i = LBound(RecvData) To UBound(RecvData) S1 = S1 & Format$(RecvData(i), "00") & ":" Next i S1 = Mid$(S1, 1, 8) TxtRECV.Text = S1 MSComm1.RThreshold = 1 '开放串行中断 End Sub Private Sub CmdEXIT_Click() '单击"退出"按钮 If MSComm1.PortOpen = True Then MSComm1.PortOpen = False Timer1.Enabled = False End End Sub






