资源描述
10.2.2 定时溢出中断编程汇编程序例
为了理解定时器的基本功能,这里给出利用定时器溢出编写定时的例子,并把“时分秒”发送到PC机,以便比较。同时,在PC机方,用一个十分简明的程序,接收MCU发送来“时分秒”并显示,同时还可以将PC机的当前时间发送到MCU,作为时间基准值。通过这个例子,理解定时器溢出中断的编程方法和系统时间的产生方法。
(1)MCU方程序
实例编号:A05_1 路径:\ASM\A05_1定时器溢出中断 (T1main.asm)
*------------------------------------------------------*
*文 件 名:T1main.asm *
*硬件连接:无 *
*程序描述:1.从串口接收表示时间的3字节数据 *
* 2.利用定时器溢出中断修改时间,并发送新时间 *
*目 的:学习定时器基本功能 *
*---------《嵌入式应用技术基础教程》教学实例-----------*
*[头文件]
$include "GP32ASM.H" ;包含GP32的头文件
*[两个起始地址名]
RAMstartAddr equ $0040 ;RAM的起始地址
FlashStartAddr equ $8000 ;程序开始地址
*[相应标志位定义]
TSTOPBit equ 5 ;定时器计数停止位
TOFBit equ 7 ;定时器溢出标志位
ORG RAMstartAddr ;RAM的起始地址
Time rmb 3 ;存放"时分秒"
*======================================================*
*[主程序]
ORG FlashStartAddr ;程序起始地址
MainInit:
SEI ;关总中断
LDHX #$023F ;堆栈初始化为RAM最高端
TXS
JSR GP32Init ;调系统初始化子程序GP32Init
JSR SCIInit ;调串口初始化子程序
JSR Timer1init ;调定时器1初始化子程序
BSET 5,SCC2 ;设置接收中断允许
CLI ;开总中断
;给Time[0-2]"时分秒"赋初值0、0、0
LDA #$0
STA Time
STA {Time+1}
STA {Time+2}
;[程序总循环入口]
;主程序功能:每秒发送一次时间单元
MainLoop:
CMP {Time+2} ;与秒单元比较
BEQ Main1 ;"秒"没有更新,转
;数据已经更新,发送"时分秒"
LDA #$3
LDHX #Time
JSR SCISendN
LDA {Time+2} ;A中值更新
Main1:
JMP MainLoop
*[内部直接调用子程序存放处]
*Timer1init:定时器1初始化子程序------------------------*
*功能:对定时器1初始化 *
*入口:无 *
*出口:无 *
*------------------------------------------------------*
Timer1init:
PSHH ;保护HX、A
PSHX
PSHA
;允许溢出中断、不启动计数、分频因子=64
LDA #%01100110
STA T1SC
;计数寄存器初值=$0000
LDHX #$0000
STHX T1CNTH
;1产生1次溢出中断,预置寄存器设定值=$9600
LDHX #$9600
STHX T1MODH
;允许定时器1计数寄存器计数
BCLR TSTOPBit,T1SC
PULA ;恢复HX、A
PULX
PULH
RTS
*Timer1Int:定时器1溢出中断子程序-----------------------*
*功能:给内存单元Time[0-2](时分秒)赋值 *
*------------------------------------------------------*
Timer1Int:
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
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
BCLR TOFBit,T1SC ;清除定时器溢出标志位
PULH ;恢复H
CLI ;开总中断
RTI
*SCIRecINT:SCI接收中断子程序---------------------------*
*功能:接收3字节基准时分秒放入内存单元Time[0-2] *
*------------------------------------------------------*
SCIRecINT:
SEI ;关总中断
PSHH ;保护H
LDA #$3
LDHX #Time
JSR SCIReN ;接收3字节数据
PULH ;恢复H
CLI ;开总中断
RTI ;中断返回
*[外部子程序存放处]
$include "GP32Init.ASM"
$include "H08SCI.ASM"
$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机的当前时间。
图10-2 定时器溢出中断实验PC机方VB程序
实例编号:A05_1 路径:\ASM\A05_1定时器溢出中断\ VB_Timer1
'程序描述:
' (1)把当前系统时间从COM1发送出去
' (2)把接收到的数据显示在接收窗口中
'-------------------------------------------------------
Option Explicit '检查未经声明的变量
Dim TimData() As Byte '原始时间数组
Dim 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
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 = SendData
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 Integer
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
展开阅读全文