资源描述
资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。
嵌入式系统原理及应用课程设计报告
题 目: 电子时钟的设计与实现
班 级: 文专电0931
姓 名: 杨 阳
学 号: 90607145
试验台号: 10
指导老师: 邱秀芹
程序成绩:
报告成绩:
总 成 绩: 优 良 中 及格 不及格
2月25日
一.课程设计目的
经过该课程设计将嵌入式系统原理及应用课程中所学的处理器和接口等技术应用于实际设计中。经过中断、 PWM定时器、 串口、 SIO、 GPIO等技术在实验平台上进行综合设计, 在理论和实验的基础上进一步提高综合设计能力。
二. 课程设计内容及功能要求
1. 经过一个PWM定时计数器, 采用定时中断的功能, 设计能够在LED上进行时分秒显示的时钟;
2. 经过键盘实现对钟的功能;
3. 实现闹钟的功能, 闹钟的时间由键盘输入进行设定;
4. 将时钟在超级终端上显示; 时间的设定能够经过超级终端实现;
三.功能实现
1.总体功能框图
开始
设置中断
72
中断到
时钟运转
键盘按下
键值
时钟设置
闹钟设置
闹钟判断 显示控制
N
Y Y
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"
int Timer3INTCount=0;
int hour = 0 ;
int minute = 0 ;
#pragma import(__use_no_semihosting_swi) // ensure no functions that use semihosting
int main(void)
{
int clock_h = 23 ;
int clock_m = 59 ;
int clock_s = 0 ;
int key ;
int val=0;
ARMTargetInit(); //开发版初始化
Zlg7289_Reset();
Init_Timer3(100,16,40000, 0);
INTS_OFF();//Disable interrupt in PSR
SetISR_Interrupt(INT_TIMER3_OFFSET, Timer3_ISR,0);
Open_INT_GLOBAL();
Open_INT(BIT_TIMER3);
INTS_ON();//Enable interrupt in PSR
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); //在超级终端显示时分秒
}
//闹钟设置*************闹钟设置****************闹钟设置***************
else if( key ==1 key == 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(" time is over ! geting up now !!!! \n ");
LCD_printf(" time is over ! geting up now !!!! \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"
extern Timer3INTCount , hour , minute ;
void Init_Timer3(U8 prescaler1,U8 divider3,U16 countb3,U16 compb3)
{ U8 div;
switch(divider3)
{case 2: div=0x00;break;
case 4: div=0x01;break;
case 8: div=0x02;break;
case 16: div=0x03;break;
default: div=0x00;
}
//prescaler1 is for timer2&3
//Fre(Timer)=MCLK/(prescaler+1)/divider
rTCFG0&=~(0xff<<8);
rTCFG0|=(prescaler1<<8);
//All interrupt,select MUX input for TimerN
rTCFG1&=~(0x0f<<24|0x0f<<12);
rTCFG1|=(div<<12);
rTCMPB3=compb3;
rTCNTB3=countb3;
rTCON|=(0x01<<19);//Auto reload
}
void Start_Timer3(void)
{ rTCON|=(0x01<<17);//Manual Update
rTCON&=~(0x01<<18);//Inverter off
rTCON|=(0x01<<16);//Start Timer3
rTCON&=~(0x01<<17);//Must clear Manual update bit
}
void Stop_Timer3(void)
{rTCON&=~(0x01<<16);//Stop Timer3
}
void Timer3_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"
int Zlg7289SIOBand;
int Zlg7289SIOCtrl;
void Zlg7289_Reset()
{
ZLG7289_ENABLE();
WriteSDIO(ZLG7289_CMD_RST);
ZLG7289_DISABLE();
Delay(20);
}
unsigned int Zlg7289_ReadKey()
{
unsigned int key;
ZLG7289_ENABLE();
WriteSDIO(ZLG7289_CMD_RDKEY);
key=ReadSDIO();
ZLG7289_DISABLE();
return key;
}
void LED_Display(unsigned int value , unsigned int m , unsigned int h)
{ unsigned char LED[8];
int i ;
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); //在超级终端显示时分秒
}
//闹钟设置*************闹钟设置****************闹钟设置***************
else if( 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键””/键””*键”对闹钟的调整与查看。
③经过对实践任务的完成,更加了解熟悉了程序的编译过程以及实现过程。
④经过对试验箱的操作实践中, 使我们的动手能力有了更好的提高。
展开阅读全文