实验题目:计时秒表
一、实验目的:
利用 STR750 开发板的硬件资源,结合前面 9 个基础实验,制作一个
可以计时的秒表。
二、实验环境(软件与硬件):
软件环境:IAR 集成开发环境。
硬件环境:STR750 开发板。
三、设计功能描述
设计一个具有计时功能的秒表,秒表最大计时时间为 3 分钟 59 秒。
系统设置 2 个功能键,控制秒表启停。秒表启动时从 00 秒开始计数,
2 位的七段数码管显示变化的秒数(以十进制形式),计数范围为 00-59
秒。停止键按下,系统维持显示计时的最后值。
四、设计思路
开发板的 2 个数码管作为秒表的秒显示,秒表的分钟显示功能由 2 个
LED 灯(LD3 和 LD4)按二进制形式表示,即 LD4 为最低位,LD3
为最高位,当 2 个全亮时表示 3 分钟。开发板中的两个按键 Key2 为
开始键,Key3 为停止键。
五、实验内容及流程
1、硬件流程图
开始
创建工程
编辑程序
源文件
编译
配置
库文件
连接 STR750 和 PC
连接/定位
目标文件
固化到 EPROM 或下载
项目完成
调试通过
修改
2、软件流程图
开始
系统时钟MRCC
设置GPIO引脚
设置EIC终端
无按键
有键盘按下
Key2
开始计数
停止
图 1 主程序流程图
3.操作流程
TB计数器计时
有键盘按下
秒+1
秒>59
Key3
秒=0,分+1
分>3
分=0
图 3 中断服务程序流程图
七段数码管显示
秒十位和个位
两个LED灯显示
分个位
(1)在 IAR 集成开发环境下新建一个名为 sec_clk 的工程,然
后保存。
(2)向工程里添加文件:75x_conf.h、75x_it.c 和 main.c
(3)从库文件里向工程添加 startup 文件用于初始化以及中断向
量的设置以及在这个组中需要添加两个 ARM 汇编程序:75x_init.s
和 75x_vect.s。
(4)设置工程项目配置,编译连接,并将生成的目标文件下载
到试验板中进行调试,观察结果。
4、main.c 代码见附录。
四、实验结果
实验开始,按 Key2 键,秒表开始计数,秒的时间在七段数码管上显
示,当超过 60 秒时,秒重新开始计数,而分在 LED 灯上显示。当按
下 Key3 时,秒表停止计数,七段数码管和 LED 灯稳定不变,可以读
取计时数据。
五、心得体会
通过实验的练习,将开发板上的硬件资源尽可能的利用一起。但在编
写过程当中遇到了很多问题,对于时钟的控制是一个关键的问题。再
一个难点是 1 秒的产生及中断服务程序的编写。最后就是七段数码管
的显示问题。最后,感觉编程能力不是很强,还需继续磨练。
附:实验代码
* File Name : main.c
#include "75x_lib.h"
#define
#define
#define
#define
#define
#define
#define
#define
SA 0x0400
SB 0x0080
SC 0x0040
SD 0x0010
SE 0x0020
SF 0x0008
SG 0x0100
SH 0x0200
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
SB | SC
SB | SC
| SD | SE
| SG
| SG
| SF | SG
| SF | SG
| SC | SD
| SC | SD | SE | SF | SG
Digit_0 SA | SB | SC | SD | SE | SF
Digit_1
Digit_2 SA | SB
Digit_3 SA | SB | SC | SD
Digit_4
Digit_5 SA
Digit_6 SA
Digit_7 SA | SB | SC
Digit_8 SA | SB | SC | SD | SE | SF | SG
Digit_9 SA | SB | SC | SD
Digit_A SA | SB | SC
Digit_B
Digit_C SA
Digit_D
Digit_E SA
Digit_F SA
Digit_SP 0
SB | SC | SD | SE
| SF | SG
| SE | SF | SG
SC | SD | SE | SF | SG
| SD | SE | SF
| SG
| SD | SE | SF | SG
| SE | SF | SG
const u16 DigitTab[] = {Digit_0,Digit_1,Digit_2,Digit_3,
Digit_4,Digit_5,Digit_6,Digit_7,
Digit_8,Digit_9,Digit_A,Digit_B,
Digit_C,Digit_D,Digit_E,Digit_F,
Digit_SP};
unsigned char hour,min,sec;
unsigned char sec500;
unsigned char K1 = GPI2_Pin_19;//Key 2
unsigned char K2 = GPI2_Pin_18; //Key 3
TB_InitTypeDef TB_InitStructure;
ErrorStatus OSC4MStartUpStatus;
/* Private function prototypes -----------------------------------------------*/
void GPIO_Configuration(void);
void MRCC_Configuration(void);
void EIC_Configuration(void);
void TIM1_UP_IRQHandler(void);
scan_key();
void inc_sec();
void inc_min();
unsigned char
void proc_key();
static void Delay(u32 nCount);
void delayms(unsigned char ms) ;
void Display(u8 Digit,u8 position);
/* Private functions ---------------------------------------------------------*/
/******************************************************************************
*
* Function Name
* Description
* Input
* Output
* Return
*******************************************************************************
/
void main()
{
: main
: Main program
: None
: None
: None
#ifdef DEBUG
debug();
#endif
/* MRCC Configuration */
MRCC_Configuration();
/* GPIO Pins Configuration */
GPIO_Configuration();
/* EIC Configuration */
EIC_Configuration();
/* TB configuration in Timing mode ------------------------------------------*/
/* TB is configured to generate an update every 2 ms */
TB_InitStructure.TB_Mode = TB_Mode_Timing;
TB_InitStructure.TB_ClockSource = TB_ClockSource_CKTIM;
TB_InitStructure.TB_Prescaler = 239; /* TB clock = 60MHz / (239+1) = 250KHz*/
TB_InitStructure.TB_CounterMode = TB_CounterMode_Up;
TB_InitStructure.TB_AutoReload = 999; /* update each:
250 KHz/(499+1)= 500HZ */
if(scan_key())
{
delayms(10);
if(scan_key())
{
key_v = key_s;
proc_key();
{
}
}
}
scan_key()
}
unsigned char
{
key_s = 0x00;
key_s |= K2;
key_s <<= 1;
key_s |= K1;
return(key_s ^ key_v);
}
void proc_key()
{
if((key_v & 0x01) == 0)
{
inc_sec();
// K1
}
else if((key_v & 0x02) == 0) // K2
{
min++;
if(min > 3)
{
min = 0;
}
}
/* Enable TB counter */
TB_Cmd(ENABLE);
TB_Init(&TB_InitStructure);
/* Enable TB update interrupt */
TB_ITConfig(TB_IT_Update, ENABLE);
while(1)
}
/******************************************************************************
*
* Function Name
* Description
* Input
* Output
* Return
*******************************************************************************
/
void TIM1_UP_IRQHandler(void)
{
: TIM1_UP_IRQHandler
: This function handles TIM1 Update interrupt request.
: None
: None
: None
sec500++;
if(sec500 >= 500)
{
sec500 = 0;
inc_sec();
}
}
void inc_sec()
{
sec++;
if(sec > 59)
{
sec = 0;
inc_min();
}
Display(sec / 10,1);// 秒十位
Display(sec % 10,0);// 秒个位
}
void inc_min()
{
min++;
if(min > 7)
{
min = 0;
}
if(min==1)
{
/* Turn on leds connected to P0.08 pin */
GPIO_WriteBit(GPIO0, GPIO_Pin_8, Bit_SET);
GPIO_WriteBit(GPIO0, GPIO_Pin_9, Bit_RESET);
GPIO_WriteBit(GPIO0, GPIO_Pin_12, Bit_RESET);
GPIO_WriteBit(GPIO0, GPIO_Pin_13, Bit_RESET);
/* Insert delay */
Delay(0xFFFF);
}
if(min==2)
{
/* Turn on leds connected to P0.09 pin */
GPIO_WriteBit(GPIO0, GPIO_Pin_8, Bit_RESET);
GPIO_WriteBit(GPIO0, GPIO_Pin_9, Bit_SET);
GPIO_WriteBit(GPIO0, GPIO_Pin_12, Bit_RESET);
GPIO_WriteBit(GPIO0, GPIO_Pin_13, Bit_RESET);
/* Insert delay */
Delay(0xFFFF);
}
if (min==3)
{
/* Turn on leds connected to P0.09 P0.08 pin */
GPIO_WriteBit(GPIO0, GPIO_Pin_8, Bit_SET);
GPIO_WriteBit(GPIO0, GPIO_Pin_9, Bit_SET);
GPIO_WriteBit(GPIO0, GPIO_Pin_12, Bit_RESET);
GPIO_WriteBit(GPIO0, GPIO_Pin_13, Bit_RESET);
/* Insert delay */
Delay(0xFFFF);
}
}
static void Delay(u32 nCount)
u32 j = 0;
for(j = nCount; j != 0; j--);
}
void delayms(unsigned char ms)
// 延时子程序
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 120; i++);
{
}
}
/******************************************************************************
*
* Function Name
* Description
* Input
*
* Output
* Return
*******************************************************************************
/
void Display(u8 Digit,u8 position)
{
: Display
: Display digit LED
: Digit: value to be displayed, 0-16.
: Position: 1 or 0, 0 select digit 10, 1 select digit 0
: None
: None
u16 i;
GPIO0->PD &= 0xFFF0;
Digit &= 0x0F;
GPIO_Write(GPIO1, DigitTab[Digit]);
if (position == 0)
GPIO0->PD |= 0x0004;
// P02= COMM of digit 10
else
GPIO0->PD |= 0x0002;
// P01= COMM of digit 1
for(i=0; i<0x100; i++);
}
/******************************************************************************
*
* Function Name
* Description
* Input
* Output
* Return
*******************************************************************************
/
void MRCC_Configuration(void)
{
: MRCC_Configuration
: Configures the system clocks.
: None
: None
: None
/* MRCC system reset(for debug purpose) */
MRCC_DeInit();
/* Wait for OSC4M start-up */
OSC4MStartUpStatus = MRCC_WaitForOSC4MStartUp();
if(OSC4MStartUpStatus == SUCCESS)
{
/* Set HCLK to 60 MHz */
MRCC_HCLKConfig(MRCC_CKSYS_Div1);
/* Set CKTIM to 60 MHz */