嵌入式实验三.基于通用定时器秒表的实现
3.3基于通用定时器秒表的实现
一、实验目的
学会编写中断程序
学会应用LM3S9b92的通用定时器
比较通用定时器和systick的特性
二、实验设备
计算机、LM3S9B92开发板、USB A型公口转 Mini B型 5Pin 数据线1 条
三、实验原理
在Stellaris系列ARM内部通常集成有4个通用定时器模块(General-Purpose Timer Module,GPTM),分别称为Timer0、Timer1、Timer2和Timer3。它们的用法是相同的:每个Timer模块都可以配置为一个32位定时器或一个32位RTC定时器;也可以拆分为两个16位的定时/计数器TimerA和TimerB,它们可以被配置为独立运行的定时器、事件计数器或PWM等。
四、实验要求
参照systick设计秒表的思路,应用通用定时器进行计时,实现秒表功能。开发板上的按键SW1起秒表的起始和停止作用,按下SW1键,表示秒表的启动,开始计时,再按下SW1键,则表示秒表的停止。秒表时间的显示,可以采用LED1灯的闪烁方式,或者直接显示在液晶屏上。
五、实验步骤
1、 连接实验设备:使用USB mini B线缆的mini端与开发板ICDI口相连,另一端接到PC机的USB插口上。
2、 根据实验要求编写、调试、运行程序。并要求在代码上附上相关的注释。
3、 书写实验报告,要求附上程序流程图。
实验代码:
#include "systemInit.h"
#include <timer.h>
// 定义 LED
#define LED_PERIPH SYSCTL_PERIPH_GPIOF
#define LED_PORT GPIO_PORTF_BASE
#define LED_PIN GPIO_PIN_3
#define KEY_PERIPH SYSCTL_PERIPH_GPIOJ
#define KEY_PORT GPIO_PORTJ_BASE
#define KEY_PIN GPIO_PIN_7
unsigned char count=0;
unsigned char flag=0;
void LED(unsigned int n) //根据n值控制LED闪烁次数
{
while(n>0)
{
GPIOPinWrite(LED_PORT, LED_PIN, 0xFF); // 点亮 LED
SysCtlDelay(150 * (TheSysClock / 3000)); // 延时约 150ms
GPIOPinWrite(LED_PORT, LED_PIN, 0x00); // 熄灭 LED
SysCtlDelay(850 * (TheSysClock / 3000)); // 延时约 850ms
n=n-1;
}
}
int main(void)
{
//jtagWait( ); // 防止 JTAG 失效,重要!
clockInit( ); // 时钟初始化:晶振, 6MHz
SysCtlPeriEnable(LED_PERIPH); // 使能 LED 所在的 GPIO 端口
GPIOPinTypeOut(LED_PORT, LED_PIN); // 设置 LED 所在的管脚为输出
SysCtlPeriEnable(KEY_PERIPH); // 使能 KEY 所在的 GPIO 端口
GPIOPinTypeIn(KEY_PORT, KEY_PIN); // 设置 KEY 所在管脚为输入
SysCtlPeriEnable(SYSCTL_PERIPH_TIMER0); // 使能 Timer 模块
TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER); // 配置 Timer 为 32 位周期定时器
// TimerPrescaleSet(TIMER0_BASE, TIMER_A, 199); // 预先进行 200 分频
TimerLoadSet(TIMER0_BASE, TIMER_A, 16000000); // 设置 Timer 初值,定时 1s
TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); // 使能 Timer 超时中断
IntEnable(INT_TIMER0A); // 使能 Timer 中断
GPIOIntTypeSet(KEY_PORT, KEY_PIN, GPIO_LOW_LEVEL); // 设置 KEY 管脚的中断类型
GPIOPinIntEnable(KEY_PORT, KEY_PIN); // 使能 KEY 所在管脚的中断
IntEnable(INT_GPIOJ); // 使能 GPIOJ 端口中断
IntMasterEnable( ); // 使能处理器中断
for (;;)
{
}
}
// SysTick 计数器的中断服务函数
void Timer0A_ISR(void)
{
unsigned long ulStatus;
ulStatus = TimerIntStatus(TIMER0_BASE, true); // 读取中断状态
TimerIntClear(TIMER0_BASE, ulStatus); // 清除中断状态,重要!
if (ulStatus & TIMER_TIMA_TIMEOUT) // 如果是 Timer 超时中断
{
count++; //计数器加1
return;
}
}
// GPIOJ 的中断服务函数
void GPIO_Port_J_ISR(void)
{
unsigned char ucVal;
unsigned long ulStatus;
// IntMasterDisable( ); //关闭中断
ulStatus = GPIOPinIntStatus(KEY_PORT, true); // 读取中断状态
GPIOPinIntClear(KEY_PORT, ulStatus); // 清除中断状态,重要
if (ulStatus & KEY_PIN) // 如果 KEY 的中断状态有效
{
if(flag==0){
TimerEnable(TIMER0_BASE, TIMER_A); // 使能 Timer 计数
flag=1;
SysCtlDelay(50 * (TheSysClock / 3000));
}
else if(flag==1)
{
TimerDisable(TIMER0_BASE, TIMER_A); // 使能 Timer 计数
flag=0;
LED(count); //闪烁LED
count=0; //计数置零
SysCtlDelay(10 * (TheSysClock / 3000));
}
}
// IntMasterEnable( ); //使能中断
}
流程图:
六、实验心得
通过本次试验,我学会了编写中断程序,学会应用LM3S9b92的通用定时器
,比较通用定时器和systick的特性.
第二篇:单片机原理与应用实验报告5——秒表定时器实验
大连理工大学软件学院
《单片机原理与应用》实验报告
姓 名: 学号:
姓 名: 学号:
组 号: 班级: 班级: 实验箱编号:
月 日 实验室: 嵌入式实验室 实验台: Embest Edukit-III平台 指导教师: 侯刚 成绩:
实验五:秒表定时器实验
一、实验目的和要求
题目:秒表定时器实验
实验目的
1. 学习单片机的基本接口技术。
2. 学习74HC595、74HC138使用及与51单片机的控制方法。
实验要求
1. 通过按键控制,完成数码管的显示计数控制。
2. 用汇编语言设计程序,完成8个数码管的显示控制。当按下INT 按钮时,数码管开始快速计时,高五位为秒数,低三位为ms 数,每1ms 刷新一次显示内容。当再次按下INT 按钮时,停止计数。
二、实验原理和内容
实验内容:
用汇编语言设计程序,完成8个数码管的显示控制。当按下INT 按钮时,数码管开始快速计时,高五位为秒数,低三位为ms 数,每1ms 刷新一次显示内容。当再次按下INT 按钮时,停止计数。
实验原理:
1. 根据原理图,分析工作原理,有P0进行取段码,P2.0 P2.1 P2.2进行取位码。
2. 使用定时器进行计时。根据所给开发板上的晶振频率,计算出计时器所付初值,设置计时器TO在模式下工作,每次计时100ms后,转入数码管显示中断处理程序。
3. 实验板为共阴极数码管显示,将对应的显示0~9的电信号依次存储在“数组表”中。
4. 使用key1,key2两个按键,按下key1,开始计时。按下key2,计时停止。
5. 根据实验要求,采用T0,T1两个定时器,其中T0用来增加时间显示,T1为按暂停键时为LED显示管循环上电所用。
6. 每部分中断程序用寄存器间接寻址的方式获取显示数字的电信号量。并进行循环上电,保证数字的亮度。
三、主要仪器设备及软件编程环境
主要仪器:计算机编程软件,51电路开发板
编程环境:uVision2 ,progisp烧写软件
四、实验步骤与编程
实验步骤:编写代码,编译,调试,烧写,完成实验。
编程:
ORG 0000H AJMP MAIN ORG 000BH AJMP IT0P ORG 001BH AJMP IT1P ORG 0100H
MAIN:
MOV SP,#60H
MOV TMOD,#01H MOV TL1,#18H MOV TH1,#0FCH
SETB TR1 SETB ET1 SETB EA
LOOP:
JNB
JNB JMP
P3.0,LP00 ;开始 P3.1,LP01 LOOP LP00:
ACALL DELAY
LP01: JB P3.0,LOOP ;去抖动 ACALL PT0M0 JMP LOOP
ACALL DELAY
JB P3.1,LOOP ACALL PT0M1 JMP ;开始计时,用T0~ OOP PT0M0:
CLR
CLR CLR EA ET1 TR1 MOV TL0,#18H MOV TH0,#0FCH SETB
SETB
SETB
RET
PT0M1:
CLR
CLR
CLR
MOV
MOV
SETB
SETB
SETB
RET
IT0P: TR0 ET0 EA EA ET0 TR0 TL1,#18H TH1,#0FCH TR1 ET1 EA
CLR
IT1P: RETI EA PUSH PSW PUSH Acc MOV TL0,#18H MOV TH0,#0FCH INC R0 ;中断次数,间接表示八个管位数 MOV A,R0 MOV B,#8 DIV AB ;用余数来控制哪位显示 MOV A,B MOV P2,A MOV R0,A ACALL CHANGE ACALL SHOW POP POP Acc PSW SETB EA
CLR EA
PUSH PSW PUSH Acc MOV TL1,#18H MOV TH1,#0FCH INC R0 MOV A,R0 MOV B,#8 DIV AB MOV A,B MOV R0,A MOV P2,A MOV P0,#00H ACALL SHOW POP POP Acc PSW SETB EA RETI
DELAY: MOV R2,#60 DELAY1:
MOV R3,#250 DJNZ R3,$
DJNZ R2,DELAY1 RET
CHANGE:
C1:
INC MOV R1,#4FH MOV R7,#09H R1 MOV A,@R1 INC A MOV B,#10 DIV AB MOV @R1,B CJNE A,#1,OVER DJNZ R7,C1
OVER: RET
SHOW: CJNE R0,#0,BP10
MOV P0,#00H MOV A,57H
MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A AJMP OVER BP10:
CJNE
MOV MOV MOV MOVC MOV AJMP BP20:
CJNE
MOV MOV MOV MOVC MOV AJMP BP30:
CJNE R0,#1,BP20 P0,#00H A,56H DPTR,#TABLE A,@A+DPTR P0,A OVER R0,#2,BP30 P0,#00H A,55H DPTR,#TABLE A,@A+DPTR P0,A OVER R0,#3,BP40
MOV P0,#00H MOV A,54H MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A AJMP
BP40:
CJNE
MOV
MOV
MOV
MOVC MOV
AJMP
BP50:
CJNE
MOV
MOV
MOV
MOVC MOV
AJMP OVER R0,#4,BP50 P0,#00H A,53H DPTR,#TABLE A,@A+DPTR P0,A OVER R0,#5,BP60 P0,#00H A,52H DPTR,#TABLE A,@A+DPTR P0,A OVER
BP60:
CJNE R0,#6,BP70
MOV P0,#00H MOV A,51H MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A AJMP OVER
BP70:
MOV A,50H
MOV P0,#00H MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A AJMP OVER
TABLE: DB 0x3F,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
END
五、实验数据与结果分析
数码管实现了计时(由于采用定时器编写,不会仿真,所以无截图)。
六、讨论、建议
在上次试验的帮助下,这次许多问题都已经避免了,但是这次的问题是如何使用按键,我们计时只是初略估计,需要改进。