嵌入式系统原理及应用课程设计.docx
- 文档编号:4520611
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:17
- 大小:148.39KB
嵌入式系统原理及应用课程设计.docx
《嵌入式系统原理及应用课程设计.docx》由会员分享,可在线阅读,更多相关《嵌入式系统原理及应用课程设计.docx(17页珍藏版)》请在冰豆网上搜索。
嵌入式系统原理及应用课程设计
嵌入式系统原理及应用课程设计
嵌入式系统原理及应用课程设计报告
题目:
电子时钟的设计与实现
班级:
文专电0931
姓名:
杨阳
学号:
200990607145
试验台号:
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键”“/键”“*键”对闹钟的调整与查看。
③通过对实践任务的完成,更加了解熟悉了程序的编译过程以及实现过程。
④通过对试验箱的操作实践中,使我们的动手能力有了更好的提高。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 系统 原理 应用 课程设计