ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:139.89KB ,
资源ID:11304659      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11304659.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(嵌入式系统编程实践数字钟.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

嵌入式系统编程实践数字钟.docx

1、嵌入式系统编程实践数字钟实 验 报 告课程名称 嵌入式系统编程实践 实验仪器 清华同方辰源嵌入式系统实验箱 实验名称 实验五:数字钟实验 系 别 _计算机学院_ 专 业 _ _ 班级/学号 _ _学生姓名 实验日期 成 绩 _ 指导教师 _ _ _实验五:数字钟实验一、实验问题回答(1)画出数字时钟的有限状态自动机,列出全部状态、状态转换规则,以及对应状态下的动作。 按A键按A键 按B键 设置结束 按C键 按C键 按B键(2)倒计时和正计时怎么设置? 答:先添加一个功能键,令其完成的功能是实现倒计时和正计时。 正计时实现利用if(ms=99) ms=0; if(s=59) s=0; if(m=

2、59) m=0; else m+; else s+; else ms+; 在毫秒计数满100令其置零,并向秒进1,秒计数满60令其置零,并向分钟进1。在其后面加上代码段else if(ms=0) ms=99; if(s=0) s=59; if(m=0) m=59; else m-; else s-; else ms-; 若毫秒小于等于0责令其变为0,秒计数-1,若秒小于等于0责令其变为0,分钟计数-1,即可实现倒计时功能。二、实验目的和效果 (1)学习、理解、掌握利用状态机模型实现数字钟系统实验结果及检查(1)6个数码管上显示样式改为“分钟+秒+百分之一秒”,其中各占两个数码管。(2)OLED

3、屏幕上显示和数码管一样效果,“分钟:秒:百分之一秒”各占两个字符。(3)屏幕上显示功能选单,通过键盘A-F键选择不同功能,选择后屏幕显示相关功能提示,并在数码管和OLED屏幕上显示相应功能。如:开始显示:“please choose the function:” “A: ” “B: ” “C: ” “D: ” 按下“A”键后,显示”now you choose function A”(4)按下“A”键,暂停,再按“A”键,继续。(5)按下“B”键,表示设置时钟时间,从前往后或从后往前逐次设置时钟值。(6)按下“C”键,OLED和数码管回归“00:00:00”。(7)扩展:按下“D”键,倒计时,

4、再按“D”键,正计时。 三、实验内容和步骤(重点阐述自己的思路及遇到的问题)(一)Keil开发环境中对项目Project配置 (1)建立项目 1、新建一个project; 2、选择CPU中的Luminary LM3S 8962; 3、加载库文件; 4、项目相关配置项修改。(二)新建主函数程序,并加载到项目中 (1)加载必要程序 本次实验提供了几个源程序rit128x96x4.h,rit128x96x4.c,startup.s,utility.c,utility.h,definition.h都压在work2.zip中,与实验一(二)(1)步骤类似。 其中,definition.h文件中定义了一些

5、宏定义,用于将整个工程中的宏定义放在一起,目的是为了程序的可读性更好。本例中定义了五个不同的功能模式,可以根据自己习惯进行修改。 Utility.c和utility.h中包含了数码管显示处理函数。其函数声明如下:void disp(char x,int location);使用方法:第一个参数表示要显示的字符,在本例中,就是键盘中断服务程序执行完后保存在oledkey0里的字符,第二个参数表示显示的位置,其中1表示数码管的最右端,6表示数码管的最左端,2-4依次表示中间4个数码管。新建一个文件,保存为main.c,把main.c也加载到项目中,与实验一(二)(2)步骤类似。 本次实验需要增加以

6、下头文件#include #include #include #include #include #include #include #include #include rit128x96x4.h#include utility.h#include definition.h (2)系统初始化 SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ); /*使能外设GPIO*/ SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); SysCtlPe

7、ripheralEnable(SYSCTL_PERIPH_GPIOC); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); /*配置GPIO端口为输出*/ / 7segd1(PB6);7segd2(PB4);7segd3(PB5) GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6); / bitcode0(PC5);bitcode1(PC6);bitcode2(PC7) GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE, GPI

8、O_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7); / 7segd0(PD4);7segdot(PD5);rst(PD6) GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6); /*设置GPIO为输入*/ GPIOPinTypeGPIOInput(GPIO_PORTD_BASE, GPIO_PIN_7); GPIOPinTypeGPIOInput(GPIO_PORTC_BASE, GPIO_PIN_4); /*使能中断*/ IntEnable(INT_GPIOD); Int

9、MasterEnable(); GPIOPinIntEnable(GPIO_PORTD_BASE, GPIO_PIN_7); GPIOIntTypeSet(GPIO_PORTD_BASE, GPIO_PIN_7, GPIO_RISING_EDGE);(3)利用键盘GPIO Port D中断,接收键盘输入本步骤与实验(二)对应部分一样,不再重复。(4)利用系统Time0中断,来控制控制时钟速度 /*使能中断*/ IntEnable(INT_GPIOD); IntMasterEnable(); GPIOPinIntEnable(GPIO_PORTD_BASE, GPIO_PIN_7); GPIOI

10、ntTypeSet(GPIO_PORTD_BASE, GPIO_PIN_7, GPIO_RISING_EDGE); /*计时器初始化*/timerset();初始化的具体函数实现void timerset() SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER); TimerLoadSet(TIMER0_BASE, TIMER_A, SysCtlClockGet()/100); / 不除以100则1秒中断一次 IntEnable(INT_TIMER0A);

11、TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);通过对Timer0中断进行使能和屏蔽来实现秒表的暂停和恢复TimerEnable(TIMER0_BASE, TIMER_A);TimerDisable(TIMER0_BASE, TIMER_A);中断处理函数实例void Timer0IntHandler(void) unsigned long ulStatus; ulStatus = TimerIntStatus(TIMER0_BASE, true); / 获取当前中断状态 TimerIntClear(TIMER0_BASE, TIMER_TIMA

12、_TIMEOUT); / 清除全部中断状态 if (ulStatus & TIMER_TIMA_TIMEOUT) / 如果是超时中断 /补充该部分代码 /每次计时中断,相应计数值进行变化 (5)修改主函数,实现本次实验要求的功能选好A、B、F功能后,按键后在数码管上按照不同的功能显示秒表显示效果。自己设计程序逻辑并实现。注意:数码管上所有位置的数字同时显示,可以使用for循环赋值并进行显示: for(j=1;j7;j+) disp(digitsj,j); for(k=0;kdelaytime;k+) ; /设置适当的延迟,缓和显示过快的字符重合现象 计数值如m,s,ms分别表示分钟,秒,百分之

13、一秒的具体数值,是个整数,方便计数,但在OLED上显示需要转换成字符格式。char buf2;sprintf(buf,“%d”,m);再显示buf0和buf1的字符暂停的功能实现:关掉中断即可、(6)编译、连接,生成可执行程序文件(编译)(链接)(7)反复(3)-(7)步骤,直到完成 如果中间出现错误,修改代码,一直到无错,生成最后程序。(三)硬件连接(1)接上电源线,先关闭开关(2)用蓝色USB线接上仿真器,仿真器另一JTAG端接LM3S8962 CPU板(左下较大子板),USB线接电脑(3)确认连接无误后,打开电源开关(四)联调(1)在Keil uVision4中执行下载,(Flash菜单

14、-Download),即可通过仿真器将(一)步编译链接好的执行程序下载到LM3S8962芯片内的Flash中。(2)按下实验箱上LM3S8962子板屏幕上方的白色按钮Reset键,即可查看程序执行效果。若有问题,返回第一步继续修改程序,编译、链接、下载,一直到显示出满意的效果。实验代码:main.c#include #include #include #include #include #include #include #include #include rit128x96x4.h#include utility.h#include definition.hint Event_key=0;i

15、nt b_press_count=0; int c_press_count=0; int countdown_flag=0; /倒计时标记,1表示倒计时;0表示正常计时int key_i=0;/i定义为全局变量,因为只有1根线GPIO_PIN_4与CPU相联,所以一个按键(16种,4bit表示)需要四次中断才能传给CPU。unsigned char ucValue=0x00; /ucValue定义为全局变量,该值存储输入的按键值的中间结果。char oledkey2;/设置全局变量oledkey用于保存键盘输入的按键char keychar1;int key_press_flag=0;/有没有

16、按键,0表示没有,1表示有int A_flag,B_flag,C_flag,D_flag,E_flag,F_flag;/按键ABCDEF状态,0表示未选中,1表示选中int led_postion;/led位置char digits7;/6个位置的数字字符int inputnext=0;/检测有无下一个输入数字,0表示没有,1表示有。char cm3; /cm2 = cs0char cs3;char cms3;int m=0,s=0,ms=0;int E_clr=0;/时钟中断处理函数实例void Timer0IntHandler(void) unsigned long ulStatus; u

17、lStatus = TimerIntStatus(TIMER0_BASE, true); / 获取当前中断状态 TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT); / 清除全部中断状态 if (ulStatus & TIMER_TIMA_TIMEOUT) / 如果是超时中断 if(countdown_flag=0) if(ms=99) ms=0; if(s=59) s=0; if(m=59) m=0; else m+; else s+; else ms+; else if(ms=0) ms=99; if(s=0) s=59; if(m1; ucVal

18、ue = ucValue + ucKey; ucValue = ucValue4)4) + 48; else oledkey0 = (ucValue4) - 10 + A; /计时器初始化函数void timerset()SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER);TimerLoadSet(TIMER0_BASE, TIMER_A, SysCtlClockGet()/100); / 不除以100则1秒中断一次IntEnable(INT_TIMER0A

19、);TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);/更新led/暂停或者继续void goOn_pause(int i) /如果是奇数次(第一次)按B就是暂停,偶数次(第二次)就是恢复 if(i%2)=1) TimerEnable(TIMER0_BASE, TIMER_A); /恢复 else TimerDisable(TIMER0_BASE, TIMER_A);/暂停/倒计时void countdown(int i) if(i%2)=1) countdown_flag=1; else countdown_flag=0;void displed

20、() int i,k; for(i=1;i=6;i+) disp(digitsi,i); for(k=0;k200;k+) ; void clear() int i; for(i=1;i=6;i+) digitsi=0;/主函数int main() char buf5; SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ); RIT128x96x4Init(1000000); RIT128x96x4Clear(); /*使能外设GPIO*/ SysCtlPeripheralEn

21、able(SYSCTL_PERIPH_GPIOB); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); /*配置GPIO端口为输出*/ / 7segd1(PB6);7segd2(PB4);7segd3(PB5) GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6); / bitcode0(PC5);bitcode1(PC6);bitcode2(PC7) GPIOPin

22、TypeGPIOOutput(GPIO_PORTC_BASE, GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7); / 7segd0(PD4);7segdot(PD5);rst(PD6) GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6); /*设置GPIO为输入*/ GPIOPinTypeGPIOInput(GPIO_PORTD_BASE, GPIO_PIN_7); GPIOPinTypeGPIOInput(GPIO_PORTC_BASE, GPIO_PIN_4);

23、 /*使能中断*/ IntEnable(INT_GPIOD); IntMasterEnable(); GPIOPinIntEnable(GPIO_PORTD_BASE, GPIO_PIN_7); GPIOIntTypeSet(GPIO_PORTD_BASE, GPIO_PIN_7, GPIO_RISING_EDGE); /*计时器初始化*/ timerset(); /默认 RIT128x96x4StringDraw(2011011374, 0, 0, 15); RIT128x96x4StringDraw(pengxin, 0, 10, 15); RIT128x96x4StringDraw(Wo

24、rk5 , 0, 20, 15); RIT128x96x4StringDraw(please choose, 0, 30, 15); RIT128x96x4StringDraw(A:start, 5, 40, 15); RIT128x96x4StringDraw(B:input char, 5, 50, 15); /RIT128x96x4StringDraw(B:pause, 5, 50, 15); RIT128x96x4StringDraw(C:clear, 5, 60, 15); RIT128x96x4StringDraw(D:count down, 5, 70, 15); /RIT128

25、x96x4StringDraw(B:input char, 5, 70, 15); while(1) if(Event_key) Event_key = 0; if(A=oledkey0 & oledkey0=F) /显示按下的字母 keychar0=oledkey0; RIT128x96x4StringDraw(keychar, 90, 30, 15); /只要按ABCDEF中任意一个都必须先把A_flag,B_flag,D_flag,F_flag置0,避免混乱。 A_flag=B_flag=D_flag=E_flag=F_flag=0; switch(oledkey0) case A:A_

26、flag=1;/开始 TimerEnable(TIMER0_BASE, TIMER_A); b_press_count=b_press_count+1; TimerDisable(TIMER0_BASE, TIMER_A); goOn_pause(b_press_count); break; case B:E_flag=1;/ input E_clr=1; m=s=ms=0; TimerDisable(TIMER0_BASE, TIMER_A); clear(); led_postion=6; break; case C:D_flag=1;/qing 0 TimerDisable(TIMER0_BASE, TIMER_A); m=s=m

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1