logo资料库

嵌入式平台的计时秒表.docx

第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
资料共9页,剩余部分请下载后查看
实验题目:计时秒表 一、实验目的: 利用 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 */
分享到:
收藏