嵌入式系统原理及应用课程设计.docx

上传人:b****1 文档编号:15229545 上传时间:2023-07-02 格式:DOCX 页数:18 大小:36.67KB
下载 相关 举报
嵌入式系统原理及应用课程设计.docx_第1页
第1页 / 共18页
嵌入式系统原理及应用课程设计.docx_第2页
第2页 / 共18页
嵌入式系统原理及应用课程设计.docx_第3页
第3页 / 共18页
嵌入式系统原理及应用课程设计.docx_第4页
第4页 / 共18页
嵌入式系统原理及应用课程设计.docx_第5页
第5页 / 共18页
嵌入式系统原理及应用课程设计.docx_第6页
第6页 / 共18页
嵌入式系统原理及应用课程设计.docx_第7页
第7页 / 共18页
嵌入式系统原理及应用课程设计.docx_第8页
第8页 / 共18页
嵌入式系统原理及应用课程设计.docx_第9页
第9页 / 共18页
嵌入式系统原理及应用课程设计.docx_第10页
第10页 / 共18页
嵌入式系统原理及应用课程设计.docx_第11页
第11页 / 共18页
嵌入式系统原理及应用课程设计.docx_第12页
第12页 / 共18页
嵌入式系统原理及应用课程设计.docx_第13页
第13页 / 共18页
嵌入式系统原理及应用课程设计.docx_第14页
第14页 / 共18页
嵌入式系统原理及应用课程设计.docx_第15页
第15页 / 共18页
嵌入式系统原理及应用课程设计.docx_第16页
第16页 / 共18页
嵌入式系统原理及应用课程设计.docx_第17页
第17页 / 共18页
嵌入式系统原理及应用课程设计.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

嵌入式系统原理及应用课程设计.docx

《嵌入式系统原理及应用课程设计.docx》由会员分享,可在线阅读,更多相关《嵌入式系统原理及应用课程设计.docx(18页珍藏版)》请在冰点文库上搜索。

嵌入式系统原理及应用课程设计.docx

嵌入式系统原理及应用课程设计

嵌入式系统原理及应用课程设计报告

 

题目:

电子时钟的设计与实现

班级:

文专电0931

*****

学号:

**********45

试验台号:

10

*******

程序成绩:

报告成绩:

总成绩:

优良中及格不及格

 

2012年2月25日

一.课程设计目的

通过该课程设计将嵌入式系统原理及应用课程中所学的处理器和接口等技术应用于实际设计中。

通过中断、PWM定时器、串口、SIO、GPIO等技术在实验平台上进行综合设计,在理论和实验的基础上进一步提高综合设计能力。

二.课程设计内容及功能要求

1.通过一个PWM定时计数器,采用定时中断的功能,设计能够在LED上进行时分秒显示的时钟;

2.通过键盘实现对钟的功能;

3.实现闹钟的功能,闹钟的时间由键盘输入进行设定;

4.将时钟在超级终端上显示;时间的设定可以通过超级终端实现;

三.功能实现

1.总体功能框图

 

N

YY

 

2.详细设计:

(将所设计的各部分的功能程序框图及相关程序代码进行详细的描述)

①.

#include"uhal.h"

#include"myuart.h"

#include"KeyBoard.h"

#include"Timer.h"

#include"Isr.h"

#include"44b.h"

#include"Zlg7289.h"

#include"def.h"

#include"lcd320.h"

intTimer3INTCount=0;

inthour=0;

intminute=0;

#pragmaimport(__use_no_semihosting_swi)//ensurenofunctionsthatusesemihosting

intmain(void)

{

intclock_h=23;

intclock_m=59;

intclock_s=0;

intkey;

intval=0;

ARMTargetInit();//开发版初始化

Zlg7289_Reset();

Init_Timer3(100,16,40000,20000);

INTS_OFF();//DisableinterruptinPSR

SetISR_Interrupt(INT_TIMER3_OFFSET,Timer3_ISR,0);

Open_INT_GLOBAL();

Open_INT(BIT_TIMER3);

INTS_ON();//EnableinterruptinPSR

Start_Timer3();

Uart_Printf("\n");

//lcd屏*************lcd屏*****************lcd屏**********

LCD_Init();

LCD_ChangeMode(DspTxtMode);//转换LCD显示模式为文本显示模式

//lcd屏*************lcd屏*****************lcd屏**********

while

(1)

{

//****************对钟************************//

while(!

(rPDATG&ZLG7289_KEY))//有按键按下时进入while死循环,松开时跳出

{

key=Zlg7289_ReadKey();//按键值赋给key。

//Stop_Timer3();//防止中断影响键盘扫描,关掉中断。

Delay(100);//延时防止时序错误。

if(key==18|key==10|key==2)//对钟键按下是。

{

if(key==18)//秒设置,键盘3按下时扫描值为18

{

Delay(1000);Delay(1000);Delay(1000);//延时让数码管频率显示可见。

Delay(1000);Delay(1000);Delay(1000);

Timer3INTCount=Timer3INTCount+1;

if(Timer3INTCount>59)

Timer3INTCount=0;

}

if(key==10)//秒设置,键盘2按下时扫描值为10

{

Delay(1000);Delay(1000);Delay(1000);//延时让数码管频率显示可见。

Delay(1000);Delay(1000);Delay(1000);

minute=minute+1;//分钟加一

if(minute>59)//分钟大于59时清零

minute=0;

//Timer3INTCount=0;//秒清零

}

if(key==2)//原理同分钟

{

Delay(1000);Delay(1000);Delay(1000);

Delay(1000);Delay(1000);Delay(1000);

Delay(1000);Delay(1000);Delay(1000);

hour=hour+1;

if(hour>23)

hour=0;

//Timer3INTCount=0;

}

Delay(1000);

LED_Display(Timer3INTCount,minute,hour);//在数码管显示时分秒

Uart_Printf("%d:

%d:

%d\n",hour,minute,Timer3INTCount);//在超级终端显示时分秒

}

//闹钟设置*************闹钟设置****************闹钟设置***************

elseif(key==1key==9|key==17)//原理参照对钟设置

{

if(key==1)

{

Delay(1000);Delay(1000);Delay(1000);

Delay(1000);Delay(1000);Delay(1000);

Delay(1000);Delay(1000);Delay(1000);

Delay(1000);Delay(1000);Delay(1000);

clock_h=clock_h+1;

if(clock_h>23)

clock_h=0;

}

if(key==9)

{

Delay(1000);Delay(1000);Delay(1000);

Delay(1000);Delay(1000);Delay(1000);

Delay(1000);Delay(1000);Delay(1000);

Delay(1000);Delay(1000);Delay(1000);

clock_m=clock_m+1;

if(clock_m>59)

clock_m=0;

}

if(key==17)

{

Delay(1000);Delay(1000);Delay(1000);

Delay(1000);Delay(1000);Delay(1000);

Delay(1000);Delay(1000);Delay(1000);

Delay(1000);Delay(1000);Delay(1000);

}

Delay(1000);

LED_Display(clock_s,clock_m,clock_h);

Uart_Printf("%d:

%d:

%d\n",hour,minute,Timer3INTCount);

}

else;

//闹钟设置*************闹钟设置****************闹钟设置***************

//Start_Timer3();

}

//闹钟判断*************闹钟判断****************闹钟判断***************

while(hour==clock_h&minute==clock_m&

key!

=1&key!

=9&key!

=17&

key!

=2&key!

=10&key!

=18)//闹钟时间到且闹钟启动时,进入下面的闹钟显示

{

//Uart_Printf("timeisover!

getingupnow\n");

LCD_printf("timeisover!

getingupnow\n");

Delay(1000);

LED_Display(clock_s,clock_m,clock_h);

}

//闹钟判断*************闹钟判断****************闹钟判断***************

Uart_Printf("%d:

%d:

%d\n",hour,minute,Timer3INTCount);

Delay(1000);

LED_Display(Timer3INTCount,minute,hour);

//Uart_Printf("\r%d",rTCNTO3);

Delay(1000);Delay(1000);Delay(1000);

Delay(1000);Delay(1000);Delay(1000);

}

}

②.

#include"Timer.h"

#include"44b.h"

#include"def.h"

#include"ZLG7289.h"

externTimer3INTCount,hour,minute;

voidInit_Timer3(U8prescaler1,U8divider3,U16countb3,U16compb3)

{U8div;

switch(divider3)

{case2:

div=0x00;break;

case4:

div=0x01;break;

case8:

div=0x02;break;

case16:

div=0x03;break;

default:

div=0x00;

}

//prescaler1isfortimer2&3

//Fre(Timer)=MCLK/(prescaler+1)/divider

rTCFG0&=~(0xff<<8);

rTCFG0|=(prescaler1<<8);

//Allinterrupt,selectMUXinputforTimerN

rTCFG1&=~(0x0f<<24|0x0f<<12);

rTCFG1|=(div<<12);

rTCMPB3=compb3;

rTCNTB3=countb3;

rTCON|=(0x01<<19);//Autoreload

}

voidStart_Timer3(void)

{rTCON|=(0x01<<17);//ManualUpdate

rTCON&=~(0x01<<18);//Inverteroff

rTCON|=(0x01<<16);//StartTimer3

rTCON&=~(0x01<<17);//MustclearManualupdatebit

}

voidStop_Timer3(void)

{rTCON&=~(0x01<<16);//StopTimer3

}

voidTimer3_ISR(void)

{

Timer3INTCount++;

if(Timer3INTCount>59)//秒累加到59时清零

{

Timer3INTCount=0;

minute=minute+1;

}

if(minute>59)//分钟累加到59时清零

{

minute=0;

hour=hour+1;

}

if(hour>23)//小时累加到23时清零

{

hour=0;

}

//LED_Display(Timer3INTCount,minute,hour);

//Uart_Printf("\r%d",Timer3INTCount);

}

③.

#include"44b.h"

#include"uhal.h"

#include"zlg7289.h"

#include"def.h"

intZlg7289SIOBand;

intZlg7289SIOCtrl;

voidZlg7289_Reset()

{

ZLG7289_ENABLE();

WriteSDIO(ZLG7289_CMD_RST);

ZLG7289_DISABLE();

Delay(20);

}

unsignedintZlg7289_ReadKey()

{

unsignedintkey;

ZLG7289_ENABLE();

WriteSDIO(ZLG7289_CMD_RDKEY);

key=ReadSDIO();

ZLG7289_DISABLE();

returnkey;

}

voidLED_Display(unsignedintvalue,unsignedintm,unsignedinth)

{unsignedcharLED[8];

inti;

if(value>9999)return;//无用

////////////////秒显示*****************************

for(i=0;i<2;i++)

{LED[i]=value%10;//分离秒个位

value=value/10;//分离秒十位

if(value==0)break;

}

ZLG7289_ENABLE();

Delay(5);

WriteSDIO(ZLG7289_CMD_HIDE);

WriteSDIO(~(0xff<<(i+1)));

Delay

(1);

for(;i>=0;i--)//八位循环显示

{WriteSDIO(ZLG7289_CMD_DATA0|i);

WriteSDIO(LED[i]);

Delay

(1);

}

////////////////秒显示*****************************

//分钟显示aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

for(i=3;i<5;i++)

{LED[i]=m%10;//分离分钟个位

m=m/10;//分离分钟十位

if(m==0)break;

}

ZLG7289_ENABLE();

Delay(5);

WriteSDIO(ZLG7289_CMD_HIDE);

WriteSDIO(~(0xff<<(i+1)));

Delay

(1);

for(;i>=0;i--)//八位循环显示

{

LED[2]=10;

LED[5]=10;

WriteSDIO(ZLG7289_CMD_DATA0|i);

WriteSDIO(LED[i]);

Delay

(1);

}

//分钟显示aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

//小时显示aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

LED[7]=0;

for(i=6;i<8;i++)

{LED[i]=h%10;//分离小时个位

h=h/10;//分离小时十位

if(h==0)

{

i=7;

break;

}

}

ZLG7289_ENABLE();

Delay(5);

WriteSDIO(ZLG7289_CMD_HIDE);

WriteSDIO(~(0xff<<(i+1)));

Delay

(1);

for(;i>=0;i--)//八位循环显示

{

LED[2]=10;//时钟横杠显示

LED[5]=10;//时钟横杠显示

WriteSDIO(ZLG7289_CMD_DATA0|i);

WriteSDIO(LED[i]);

Delay

(1);

}

//小时显示aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

ZLG7289_DISABLE();

}

四.总结

(1)任务要求:

①把时钟设置中调整原小时1键改成0键,把原调整分钟2键改成.键,把原调整秒3键改成ENTER键

②把闹钟设置中调整原小时4键改成num键,把原调整5键改成/键,把原显示闹钟6键改成*键

(2)调整后的程序为

//****************对钟************************//

while(!

(rPDATG&ZLG7289_KEY))//有按键按下时进入while死循环,松开时跳出

{

key=Zlg7289_ReadKey();//按键值赋给key。

//Stop_Timer3();//防止中断影响键盘扫描,关掉中断。

Delay(100);//延时防止时序错误。

if(key==26|key==19|key==11)//对钟键按下是。

{

if(key==26)//秒设置,键盘ENTER按下时扫描值为26

{

Delay(1000);Delay(1000);Delay(1000);//延时让数码管频率显示可见。

Delay(1000);Delay(1000);Delay(1000);

Timer3INTCount=Timer3INTCount+1;

if(Timer3INTCount>59)

Timer3INTCount=0;

}

if(key==19)//秒设置,键盘.按下时扫描值为19

{

Delay(1000);Delay(1000);Delay(1000);//延时让数码管频率显示可见。

Delay(1000);Delay(1000);Delay(1000);

minute=minute+1;//分钟加一

if(minute>59)//分钟大于59时清零

minute=0;

//Timer3INTCount=0;//秒清零

}

if(key==11)//原理同分钟

{

Delay(1000);Delay(1000);Delay(1000);

Delay(1000);Delay(1000);Delay(1000);

Delay(1000);Delay(1000);Delay(1000);

hour=hour+1;

if(hour>23)

hour=0;

//Timer3INTCount=0;

}

Delay(1000);

LED_Display(Timer3INTCount,minute,hour);//在数码管显示时分秒

Uart_Printf("%d:

%d:

%d\n",hour,minute,Timer3INTCount);//在超级终端显示时分秒

}

//闹钟设置*************闹钟设置****************闹钟设置***************

elseif(key==4|key==12|key==20)//原理参照对钟设置

{

if(key==4)

{

Delay(1000);Delay(1000);Delay(1000);

Delay(1000);Delay(1000);Delay(1000);

Delay(1000);Delay(1000);Delay(1000);

Delay(1000);Delay(1000);Delay(1000);

clock_h=clock_h+1;

if(clock_h>23)

clock_h=0;

}

if(key==12)

{

Delay(1000);Delay(1000);Delay(1000);

Delay(1000);Delay(1000);Delay(1000);

Delay(1000);Delay(1000);Delay(1000);

Delay(1000);Delay(1000);Delay(1000);

clock_m=clock_m+1;

if(clock_m>59)

clock_m=0;

}

if(key==20)

{

Delay(1000);Delay(1000);Delay(1000);

Delay(1000);Delay(1000);Delay(1000);

Delay(1000);Delay(1000);Delay(1000);

Delay(1000);Delay(1000);Delay(1000);

}

Delay(1000);

LED_Display(clock_s,clock_m,clock_h);

Uart_Printf("%d:

%d:

%d\n",hour,minute,Timer3INTCount);

}

else;

(3)①通过中断、PWM定时器、串口、SIO、GPIO等技术在实验平台上进行综合设计使自己提高了对这门课程的认识,同时更加深了对PWM定时器所实现的功能的了解。

②通过以上程序的修改实现了利用“0键”“、键”“ENTER键”对时钟的调整,以及利用“number键”“/键”“*键”对闹钟的调整与查看。

③通过对实践任务的完成,更加了解熟悉了程序的编译过程以及实现过程。

④通过对试验箱的操作实践中,使我们的动手能力有了更好的提高。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2