嵌入式系统开发
课程设计专周报告
课程设计(报告)
Ⅰ、课程设计题目:
具有日历功能的电子时钟
Ⅱ、课程设计步骤及内容
一、课程设计目标
1、培养综合运用知识和独立开展实践创新的能力;
2、培养学生将理论知识与实际应用结合在一起;
3、培养学生的自我学习能力和解决问题的能力;
4、培养学生的协作意识和团队合作能力;
5、培养学生的总结经验的能力。
二、研究方法及手段应用
1、问题解决模块化,将任务分成若干模块,分模块调试和完成任务;
2、查阅网上的相关素材,查阅相关论文资料,进行比较、研究;
3、在独立思考的基础上,请教老师,和同组同学讨论、学习;
4、反复调试、总结经验、排除差错;
5、连接PC和EDUKIT-III ARM嵌入式开发实验箱,完成整个实验环境搭建;
6、运用μVision4和超级终端软件进行软件编译和进行调试查看;
7、使用ULINK2仿真器下载至实验箱进行观察、调试。
三、课程设计预期效果
1、程序启动后,蜂鸣器响三声,8位LED数码管显示初始值“0”,1秒后显示当前日期和时间,日期格式:****年**月**日,时间格式:*(星期)-**时**分**秒。PC机超级终端同时显示相关的信息。
2、按下“D”键,可进行日期、时间的修改、设置:有按键时,把键值显示到最右侧,后续按键时,把以前的按键左移,把当前按键值显示到最右侧数码管。设置完毕后,按“FUN”键确认,退出设置,时钟显示修改后的时间。
3、显示控制和闹钟设置:
按键“*”,进行数码管闪烁/不闪烁的切换。
按键“A”,设置闹钟时间。时间到达后,闹铃(蜂鸣器)响,按“FUN”键,关闭闹铃。
按键设置时,PC的超级终端显示相应的提示信息,同时把所按的键值,通过串口发送到超级终端显示。
4、闹铃声音频率及音量控制:
按下“B”键时,进入闹铃声音的设置。
采集AIN2的ADC值,根据ADC的值,控制蜂鸣器的声音频率。控制PWM1的频率。(为100Hz 至1KHz,最低值和最高值可以根据实际效果调整)。并把实际调整的频率打印到超级终端,如“100Hz”。
采集AIN1的ADC值,根据ADC的值,控制蜂鸣器的音量。控制PWM1的占空比。(为0% 至100%,最低值和最高值可以根据实际效果调整).并把实际调整的占空比打印到超级终端上,如“50%”。
按“FUN”键结束设置。
学生姓名: 权胜 王希 严家强
专业年级: 计算机应用技术10511
目录
前言. 5
第一章系统设计. 6
第一节课题目标及总体方案. 6
第二节项目设计模块描述及流程图. 5
1、模块描述. 6
2、总体设计流程图. 6
3、功能设计流程图. 7
4、闹钟功能程序流程图. 8
一、主函数模块. 9
二、功能实现模块. 10
1、8个LED灯的按位显示程序. 10
2、获取系统时间. 11
3、*键功能实现. 12
4、按键判断函数. 12
5、时间及日期设置. 13
6、闪烁/不闪烁切换函数. 17
7、发声函数. 18
8、键值对应到键盘函数. 18
9、中断函数. 19
三、闹钟功能实现模块. 20
1、A键设置闹钟功能实现. 20
2、闹钟设置函数. 21
3、闹铃函数. 23
第二章 结果与显示. 24
结果显示. 24
心得体会. 24
参考文献. 25
前 言
近年来,随着计算机技术及集成电路技术的发展,嵌入式技术日渐普及,在通讯、网络、工控、医疗、电子等领域发挥着越来越重要的作用。嵌入式系统无疑成为当前最热门最有发展前途的IT应用领域之一。
实时时钟(RTC)器件是一种能提供日历/时钟、数据存储等功能的专用集成电路,常用作各种计算机系统的时钟信号源和参数设置存储电路。RTC具有计时准确、耗电低和体积小等特点,特别适用于在各种嵌入式系统忠记录事件发生的时间和相关信息,尤其是在通信工程、电力自动化、工业控制等自动化程度较高领域的无人职守环境。随着集成电路技术的不断发展,RTC器件的新品也不断推出。这些新品不仅具有准确的RTC,还有大容量的存储器、温度传感器和A/D数据采集通道等,已成为集RTC、数据采集和存储于一体的综合功能器件,特别适用于以微控制器为核心的嵌入式系统。
关键字:嵌入式系统、实时时钟RTC
第一章系统设计
第一节课题目标及总体方案
随着嵌入式技术的发展,我们身边充斥着各类各样的嵌入式电子产品。实时时钟(RTC)就是一种在现代电子设备中应用非常普遍,可以帮助人们实时、准确的掌握时间的器件,如手机、PDA及一些智能仪表都提供了时钟显示。
我们本次课题的目标就是要基于SAMSUNG S3C2410AL-20芯片设计出一个实时时钟,编写C语言可以通过μVision4和超级终端软件调试,然后通过ULINK2仿真器下载至实验箱内进行观察。在试验箱中的LED显示灯上显示出时间和日历。另外,我们将要实现的系统分为三个模块实现,每个模块间相对独立而又相互联系。
第二节项目设计模块描述及流程图
1.模块描述:我先进行了整个系统的规划,将整个系统分为两大模块:第一,主函数模块;第二,功能实现模块(进行时间和闹钟的设定,以及其他一些显示功能);第三,闹钟功能实现模块。
2.总体设计流程图:
3、功能设计流程图
4、闹钟功能程序流程图
一、主函数模块
int i;
int main(int argc,char **argv)
{
sys_init(); //初始化系统
iic_init_8led(); //初始化8个led灯
for(i=0;i<8;i++)
{
iic_write_8led(0x70, 0x10+i,0xfc); //8个灯全0
}
for(i=0;i<3;i++)
{
jiao(); //调用发声函数
delay(5000);
}
uart_printf("欢迎使用具有日历功能的电子时钟\n请根据提示按键操作\n0键:显示时钟\n1键:显示日期\nA键:设置闹钟\nD键:设置日期时间\n*键:数码管闪烁/不闪烁的切换\n");
rtc_init(); //实时时钟初始化
rtc_display1(); //显示时间
while(1){
rtc_init();
display();
}
}
二、功能实现模块
1、8个LED灯的按位对应显示程序
void display_Time(void) //对应到8个LED灯按位显示
{
iic_init_8led(); //显示时间
iic_write_8led(0x70, 0x10+0, num[g_nHour%16]); iic_write_8led(0x70, 0x10+1, num[g_nHour/16]);
iic_write_8led(0x70, 0x10+2, 0x02);
iic_write_8led(0x70, 0x10+3, num[g_nWeekday]);
iic_write_8led(0x70, 0x10+4, num[g_nSec%16]);
iic_write_8led(0x70, 0x10+5, num[g_nSec/16]);
iic_write_8led(0x70, 0x10+6, num[g_nMin%16]);
iic_write_8led(0x70, 0x10+7, num[g_nMin/16]);
}
void display_data(void)
{
iic_init_8led(); //显示日期
iic_write_8led(0x70, 0x10+0, num[g_nYear%4096%256%16]);//取个位
iic_write_8led(0x70, 0x10+1, num[g_nYear/16%16]);//取十位
iic_write_8led(0x70, 0x10+2, num[g_nYear/256%16]);//取百位
iic_write_8led(0x70, 0x10+3, num[g_nYear/4096]);//取千位
iic_write_8led(0x70, 0x10+4, num[g_nDate%16]);
iic_write_8led(0x70, 0x10+5, num[g_nDate/16]);
iic_write_8led(0x70, 0x10+6, num[g_nMonth%16]);
iic_write_8led(0x70, 0x10+7, num[g_nMonth/16]);
}
2、获取系统时间
void rtc_display1(void)
{ int a;
INT32T nTmp;
rRTCCON = 0x01;
ucChar=0;
st1=1; //代表正在显示时钟 st1=2代表正在显示日期
while(ucChar>29||ucChar<=0)
{
iic_init_8led();
while(1)
{
if(rBCDYEAR==0x99) //获取系统日期及时间
g_nYear = 0x1999;
else
g_nYear = 0x2000 + rBCDYEAR;
g_nMonth = rBCDMON;
g_nWeekday = rBCDDAY;
g_nDate = rBCDDATE;
g_nHour = rBCDHOUR;
g_nMin = rBCDMIN;
g_nSec = rBCDSEC;
if(g_nSec!=nTmp) // 相同时间不显示 节约资源
{
nTmp = g_nSec;
break;
}
}
3、*键功能实现
if(st2==1){ //按*键执行闪烁
for(a=0;a<8;a++){
iic_write_8led(0x70,0x10+a,0x00); //8个灯熄灭
}
delay(1000);//延时1s
display_Time(); //再显示
}else{
display_Time();//未按下不变
}
4、按键判断函数
void display(void)
{
if(ucChar==0x01){ //判断是否按下0键
uart_printf("\n按键0,数码管显示时间:\n");
rtc_display1();//显示时间函数
} else if(ucChar==0x02){ //判断是否按下1键
uart_printf("\n按键1,数码管显示日期:\n");
rtc_display2();//显示日期函数
} else if(ucChar==0x14){ //判断是否按下D键
uart_printf("\n按下键D,进入日期设置,请先输入日期(格式 年年年年月月日日)。输入完成后按fun键确认。\n");
setDate();//设置时间函数
} else if(ucChar==0x1c){ //判断是否按下*键
if(st3==1){ //若按下*键,数码管闪烁显示
uart_printf("\n按下键*,数码管停止闪烁显示。\n");
st3=0;
ss(); //调用闪烁/不闪烁切换
}else{ //再次按下*键,数码管停止闪烁
uart_printf("\n按下键*,数码管闪烁显示。\n");
st3=1;
ss();
}
} else if(ucChar==0x11){ //判断是否按下A键
uart_printf("\n按下键A,设置闹钟。请输入闹钟时间,按fun键确认。\n");
isAlam=1;//已设置了闹钟
alam_jiao();//调用闹铃函数
} else if(st1==1){ //判断当前是否显示时间,调用显示时间函数
rtc_display1();
} else if(st1==2){ //判断当前是否显示日期,调用显示日期函数
rtc_display2();
}
}
5、时间及日期设置函数
void setDate(void)
{
int i,u;
ucChar=0;
for(u=0;u<8;u++){
iic_write_8led(0x70,0x10+u,0x00); //灯灭
}
i=0;
while(1)
{
iic_init_8led();
while(g_nKeyPress--)
{keyboard_init();
g_nKeyPress = 0;//按键值置0
while(g_nKeyPress == 0);//空循环,等待有键按下
iic_read_keybd(0x70, 0x1, &ucChar); if(i==8||i==17){ //判断日期和时间输入完成
while(1){
while(g_nKeyPress--){
keyboard_init();
g_nKeyPress=0;
while(g_nKeyPress==0);
iic_read_keybd(0x70, 0x1, &ucChar);
ucChar=key_set(ucChar);
if(ucChar==0xff){ //按下FUN键确认
if(i==8){
uart_printf("\n完成日期设置,继续设置时间(格式 星期-时时分分秒秒)\n");
}else{
uart_printf("\n完成时间设置。\n");
}
i++;
break;
}
}
if(i==9||i==18){//输入超出,跳出程序
break;
}
}
}
if(ucChar != 0)//判断是否有键按下,并对应LED灯8位按位显示
{
ucChar= key_set(ucChar);
switch(i){
case 0:
iic_write_8led(0x70, 0x10+4, num[ucChar]);
g_nYear=ucChar*4096; //设置年
i++;
break;
case 1:
iic_write_8led(0x70, 0x10+5, num[g_nYear/4096]);
iic_write_8led(0x70, 0x10+4, num[ucChar]);
g_nYear=g_nYear+ucChar*256;
i++;
break;
case 2:
iic_write_8led(0x70, 0x10+6, num[g_nYear/4096]);
iic_write_8led(0x70, 0x10+5, num[g_nYear/256%16]);
iic_write_8led(0x70, 0x10+4, num[ucChar]);
g_nYear=g_nYear+ucChar*16;
i++;
break;
case 3:
iic_write_8led(0x70, 0x10+7, num[g_nYear/4096]);
iic_write_8led(0x70, 0x10+6, num[g_nYear/256%16]);
iic_write_8led(0x70, 0x10+5, num[g_nYear/16%16]);
iic_write_8led(0x70, 0x10+4, num[ucChar]);
g_nYear=g_nYear+ucChar;
i++;
break;
case 4:
iic_write_8led(0x70, 0x10+0, num[g_nYear/4096]);
iic_write_8led(0x70, 0x10+7, num[g_nYear/256%16]);
iic_write_8led(0x70, 0x10+6, num[g_nYear/16%16]);
iic_write_8led(0x70, 0x10+5, num[g_nYear%4096%256%16]);
iic_write_8led(0x70, 0x10+4, num[ucChar]);
g_nMonth=ucChar*16;//设置月
i++;
break;
case 5:
iic_write_8led(0x70, 0x10+1, num[g_nYear/4096]);
iic_write_8led(0x70, 0x10+0, num[g_nYear/256%16]);
iic_write_8led(0x70, 0x10+7, num[g_nYear/16%16]);
iic_write_8led(0x70, 0x10+6, num[g_nYear%4096%256%16]);
iic_write_8led(0x70, 0x10+5, num[g_nMonth/16]);
iic_write_8led(0x70, 0x10+4, num[ucChar]);
g_nMonth= g_nMonth+ucChar;
i++;
break;
case 6:
iic_write_8led(0x70, 0x10+2, num[g_nYear/4096]);
iic_write_8led(0x70, 0x10+1, num[g_nYear/256%16]);
iic_write_8led(0x70, 0x10+0, num[g_nYear/16%16]);
iic_write_8led(0x70, 0x10+7, num[g_nYear%4096%256%16]);
iic_write_8led(0x70, 0x10+6, num[g_nMonth/16]);
iic_write_8led(0x70, 0x10+5, num[g_nMonth%16]);
iic_write_8led(0x70, 0x10+4, num[ucChar]);
g_nDate=ucChar*16;//设置日
i++;
break;
case 7:
iic_write_8led(0x70, 0x10+3, num[g_nYear/4096]);
iic_write_8led(0x70, 0x10+2, num[g_nYear/256%16]);
iic_write_8led(0x70, 0x10+1, num[g_nYear/16%16]);
iic_write_8led(0x70, 0x10+0, num[g_nYear%4096%256%16]);
iic_write_8led(0x70, 0x10+7, num[g_nMonth/16]);
iic_write_8led(0x70, 0x10+6, num[g_nMonth%16]);
iic_write_8led(0x70, 0x10+5, num[g_nDate/16]);
iic_write_8led(0x70, 0x10+4, num[ucChar]);
g_nDate=g_nDate+ucChar;
i++;
break;
case 9:
for(u=0;u<8;u++){
iic_write_8led(0x70,0x10+u,0x00);//8个灯灭
}
i++;
break;
case 10:
iic_write_8led(0x70, 0x10+5, num[ucChar]);
iic_write_8led(0x70, 0x10+4, 0x02);
g_nWeekday=ucChar;//设置星期
i++;
break;
case 11:
iic_write_8led(0x70, 0x10+6, num[g_nWeekday]);
iic_write_8led(0x70, 0x10+5, 0x02);
iic_write_8led(0x70, 0x10+4, num[ucChar]);
g_nHour=ucChar*16;//设置小时
i++;
break;
case 12:
iic_write_8led(0x70, 0x10+7, num[g_nWeekday]);
iic_write_8led(0x70, 0x10+6, 0x02);
iic_write_8led(0x70, 0x10+5, num[g_nHour/16]);
iic_write_8led(0x70, 0x10+4, num[ucChar]);
g_nHour=g_nHour+ucChar;
i++;
break;
case 13:
iic_write_8led(0x70, 0x10+0, num[g_nWeekday]);
iic_write_8led(0x70, 0x10+7, 0x02);
iic_write_8led(0x70, 0x10+6, num[g_nHour/16]);
iic_write_8led(0x70, 0x10+5, num[g_nHour%16]);
iic_write_8led(0x70, 0x10+4, num[ucChar]);
g_nMin=ucChar*16;//设置分钟
i++;
break;
case 14:
iic_write_8led(0x70, 0x10+1, num[g_nWeekday]);
iic_write_8led(0x70, 0x10+0, 0x02);
iic_write_8led(0x70, 0x10+7, num[g_nHour/16]);
iic_write_8led(0x70, 0x10+6, num[g_nHour%16]);
iic_write_8led(0x70, 0x10+5, num[g_nMin/16]);
iic_write_8led(0x70, 0x10+4, num[ucChar]);
g_nMin=g_nMin+ucChar;
i++;
break;
case 15:
iic_write_8led(0x70, 0x10+2, num[g_nWeekday]);
iic_write_8led(0x70, 0x10+1, 0x02);
iic_write_8led(0x70, 0x10+0, num[g_nHour/16]);
iic_write_8led(0x70, 0x10+7, num[g_nHour%16]);
iic_write_8led(0x70, 0x10+6, num[g_nMin/16]);
iic_write_8led(0x70, 0x10+5, num[g_nMin%16]);
iic_write_8led(0x70, 0x10+4, num[ucChar]);
g_nSec=ucChar*16;//设置秒钟
i++;
break;
case 16:
iic_write_8led(0x70, 0x10+3, num[g_nWeekday]);
iic_write_8led(0x70, 0x10+2, 0x02);
iic_write_8led(0x70, 0x10+1, num[g_nHour/16]);
iic_write_8led(0x70, 0x10+0, num[g_nHour%16]);
iic_write_8led(0x70, 0x10+7, num[g_nMin/16]);
iic_write_8led(0x70, 0x10+6, num[g_nMin%16]);
iic_write_8led(0x70, 0x10+5, num[g_nSec/16]);
iic_write_8led(0x70, 0x10+4, num[ucChar]);
g_nSec=g_nSec+ucChar;
i++;
break;
case 18:
rRTCCON = rRTCCON & ~(0xf) | 0x1;// No reset, Merge BCD counters, 1/32768, RTC Control enable
rBCDYEAR = rBCDYEAR & ~(0xff) | g_nYear;
rBCDMON = rBCDMON & ~(0x1f) | g_nMonth;
rBCDDAY = rBCDDAY & ~(0x7) | g_nWeekday; rBCDDATE = rBCDDATE & ~(0x3f) | g_nDate;
rBCDHOUR = rBCDHOUR & ~(0x3f) | g_nHour;
rBCDMIN = rBCDMIN & ~(0x7f) | g_nMin;
rBCDSEC = rBCDSEC & ~(0x7f) | g_nSec;
rRTCCON = 0x0; rtc_display1(); //显示时间函数
break;
}
}
}
}
}
6、闪烁/不闪烁切换函数
void ss(void){
if(st3==0){//若按下*键
if(st1==1){ //判断当前是否显示时间,调用显示时间函数
st2=0;
rtc_display1();
}else if(st1==2){ //判断当前是否显示日期,调用显示日期函数
st2=0;
rtc_display2();
}
}else{//未按下键,再次判断显示日期还是时间,再进行调用当前显示函数
if(st1==1){
st2=1;
rtc_display1();
}else if(st1==2){
st2=1;
rtc_display2();
}
}
}
7、发声函数
void jiao()
{ int u;
rGPFCON=0x5500;
rGPFUP=0;
rGPBCON = rGPBCON & 0xFFFFFC|1;
rGPBDAT &= 0xFFFFFE;
rGPFDAT=0;//初始化蜂鸣器设置
for(u=0;u<100000;u++);
rGPFDAT=0xF0;
for(u=0;u<100000;u++);
delay(5000);//延时5s
rGPBDAT |= 1;
delay(5000);
rGPFCON = 0x55aa;
}
8、键值对应到键盘函数
UINT8T key_set(UINT8T ucChar)
{
switch(ucChar)
{
case 1:
case 2:
case 3:
case 4:
case 5:
ucChar-=1; break;
case 9:
case 10:
case 11:
case 12:
case 13:
ucChar-=4; break;
case 17:
case 18:
case 19:
case 20:
case 21:
ucChar-=7; break;
case 25: ucChar = 0xF; break;
case 26: ucChar = '+'; break;
case 27: ucChar = '-'; break;
case 28: ucChar = '*'; break;
case 29: ucChar = 0xFF; break;
default: ucChar = 0;
}
return ucChar;
}
9、中断函数
void __irq rtc_int0_int(void)
{
ClearPending(BIT_EINT0);
rRTCRST = (1<<3) | 3;
than 30 g_nSec
}
void __irq rtc_int(void)//到达设定闹钟时间,触发中断
{ int i;
ClearPending(BIT_RTC);
f_nIsRtcInt = 1;
}
void __irq rtc_tick(void)
{
ClearPending(BIT_TICK);
f_unTickCount++;
}
三、闹钟功能实现模块
1、A键设置闹钟功能实现
if(isAlam==1){ //按下A键设置闹钟
//在超级终端上显示 已设定的闹钟为-
uart_printf(" %x:%x:%x %s,%x/%x/%x 已设定闹钟 %x:%x:%x,%x/%x/%x\r",g_nHour,g_nMin,g_nSec,day[g_nWeekday],g_nMonth,g_nDate,g_nYear,rALMHOUR,rALMMIN,rALMSEC,rALMYEAR,rALMMON,rALMDATE);
if(f_nIsRtcInt==1){ //判断到了设定的闹钟
f_nIsRtcInt==0; //到了闹钟时间久置为初始值
isAlam=0;//将设置的闹钟置0(已设置闹钟)
uart_printf("\n闹钟叫了,请按FUN键停止。\n");
naoz();//调用闹钟函数
}
}else{ //未按下A键就不变
uart_printf(" %x:%x:%x %s,%x/%x/%x\r",g_nHour,g_nMin,g_nSec,day[g_nWeekday],g_nMonth,g_nDate,g_nYear);
}
keyboard_init();//接受键盘的输入,并且将值放在ucChar
g_nKeyPress = 0;
iic_read_keybd(0x70, 0x1, &ucChar);
}
display();//按键判断函数
rRTCCON = 0x0; // No reset, Merge BCD counters, 1/32768, RTC Control disable(for power consumption)
}
void naoz(void){//闹钟函数
int i;
while(1){ //闹钟响后,按FUN键停止
while(g_nKeyPress--){
keyboard_init();//接受键盘的输入,并且将值放在ucChar
g_nKeyPress=0;
iic_read_keybd(0x70, 0x1, &ucChar);
ucChar=key_set(ucChar);
if(ucChar==0xff){ //按下FUN键
ucChar=0; //给按键值置0
uart_printf("\n闹钟已停止。\n");
return;
}
}
iic_init_8led();
for(i=0;i<8;i++){
iic_write_8led(0x70,0x10+i,0x00);//8个LED灯全灭
}
display_Time();//调用系统时间显示
jiao();//调用发声函数
}
2、闹钟设置函数
void alam(void){
int i,u;
ucChar=0;
for(u=0;u<8;u++){
iic_write_8led(0x70,0x10+u,0x00);//8个LED灯全灭
}
i=0;
while(1)
{
iic_init_8led();
while(g_nKeyPress--)
{keyboard_init();
g_nKeyPress = 0; //接受键盘的输入,并且将值放在ucChar
while(g_nKeyPress == 0);
iic_read_keybd(0x70, 0x1, &ucChar); if(i==6){ //判断时间输入是否完成
while(1){
while(g_nKeyPress--){
keyboard_init();
g_nKeyPress=0; //接受键盘的输入,并且将值放在ucChar
while(g_nKeyPress==0);
iic_read_keybd(0x70, 0x1, &ucChar);
ucChar=key_set(ucChar);
if(ucChar==0xff){//按下FUN键确认输入时间
i++;
break;
}
}
if(i==7){//判断是否8个LED灯都设置好了
return;//跳出程序
}
}
}
if(ucChar != 0)//判断有键按下,并且在相应位上显示
{
ucChar= key_set(ucChar);
switch(i){
case 0:
iic_write_8led(0x70, 0x10+6, 0x02);
iic_write_8led(0x70, 0x10+5, 0x02);
iic_write_8led(0x70, 0x10+4, num[ucChar]);
rALMHOUR=ucChar*16;//设置闹钟的小时
i++;
break;
case 1:
iic_write_8led(0x70, 0x10+7, 0x02);
iic_write_8led(0x70, 0x10+6, 0x02);
iic_write_8led(0x70, 0x10+5, num[rALMHOUR/16]);
iic_write_8led(0x70, 0x10+4, num[ucChar]);
rALMHOUR=rALMHOUR+ucChar;
i++;
break;
case 2:
iic_write_8led(0x70, 0x10+0, 0x02);
iic_write_8led(0x70, 0x10+7, 0x02);
iic_write_8led(0x70, 0x10+6, num[rALMHOUR/16]);
iic_write_8led(0x70, 0x10+5, num[rALMHOUR%16]);
iic_write_8led(0x70, 0x10+4, num[ucChar]);
rALMMIN=ucChar*16;//设置闹钟的分钟
i++;
break;
case 3:
iic_write_8led(0x70, 0x10+1, 0x02);
iic_write_8led(0x70, 0x10+0, 0x02);
iic_write_8led(0x70, 0x10+7, num[rALMHOUR/16]);
iic_write_8led(0x70, 0x10+6, num[rALMHOUR%16]);
iic_write_8led(0x70, 0x10+5, num[rALMMIN/16]);
iic_write_8led(0x70, 0x10+4, num[ucChar]);
rALMMIN=rALMMIN+ucChar;
i++;
break;
case 4:
iic_write_8led(0x70, 0x10+2, 0x02);
iic_write_8led(0x70, 0x10+1, 0x02);
iic_write_8led(0x70, 0x10+0, num[rALMHOUR/16]);
iic_write_8led(0x70, 0x10+7, num[rALMHOUR%16]);
iic_write_8led(0x70, 0x10+6, num[rALMMIN/16]);
iic_write_8led(0x70, 0x10+5, num[rALMMIN%16]);
iic_write_8led(0x70, 0x10+4, num[ucChar]);
rALMSEC=ucChar*16;//设置闹钟的秒钟
i++;
break;
case 5:
iic_write_8led(0x70, 0x10+3, 0x02);
iic_write_8led(0x70, 0x10+2, 0x02);
iic_write_8led(0x70, 0x10+1, num[rALMHOUR/16]);
iic_write_8led(0x70, 0x10+0, num[rALMHOUR%16]);
iic_write_8led(0x70, 0x10+7, num[rALMMIN/16]);
iic_write_8led(0x70, 0x10+6, num[rALMMIN%16]);
iic_write_8led(0x70, 0x10+5, num[rALMSEC/16]);
iic_write_8led(0x70, 0x10+4, num[ucChar]);
rALMSEC=rALMSEC+ucChar;
i++;
break;
}
}
}
}
}
3、闹铃函数
int alam_jiao(){
rRTCCON = 0x01;
rALMYEAR = g_nYear ;
rALMMON = g_nMonth;
rALMDATE = g_nDate ;
alam();
f_nIsRtcInt = 0;
pISR_RTC = (unsigned int)rtc_int;
rRTCALM = 0x7f; Global,g_nYear,g_nMonth,Day,g_nHour,Minute,Second alarm enable
rRTCCON = 0x0;
rINTMSK &= ~(BIT_RTC);
}
第二章 结果与显示
结果显示
1.经过多次的调试和排查,以及总结,使用编译器编译,编译器提示编译文件正确,没有出现任何错误,没有出现任何警告,而且编译出文件容量很小,下载迅速,符合软件设计要求。
2.下面的图片是从实验箱上拍下来的,也就是我本次课程设计的成果。从图片显示上可以看出,所有预计实现的功能和界面都实现了。
心得体会
说实话, 刚开始拿到课设题目的时候感觉毫无头绪,因为到了大三了心思都在找工作上,都没有认真听课,所以做这个专周是完全不会的,我们这组的高手权胜,把程序写出来,我也是看着他一步一步的写,一步一步的调试,我也把程序从头看到尾,也是大概理解了。开始设计的时候,就画出流程图,并且按照流程图一步一步的实现功能,当然并不是完全就达到了预期的效果。在此,我们进行多次的调试,从PC到仿真器再到硬件实验箱,结果的观察,问题的解决。这一系列的步骤来一步一步的完善我们的课程专周设计,并且到最后所有功能的实现。
但不得不承认,对于嵌入式系统开发这一课程确实没有兴趣。但是在这次专周课程设计中,我还是学到了相当多的东西。至少知道嵌入式系统应用的行业相当的广泛,编程也可是基于C语言或者汇编语言等。这次的课程设计—实时时钟,只是这其中的很小的一个模块,要想确切的了解其奥妙,还得更深一步的学习才行。
参考文献
嵌入式系统技术与设计 人民邮电出版社 [20##-1]
福建工程学院嵌入式系统课程设计报告书题目基于S3C2440设备驱动及其界面设计班级姓名学号指导老师陈靖张平均李光炀2目录一设计课题…
福州大学课程设计任务书课程嵌入式课程设计题目姓名李仁煌学号011000610系别电机电器专业电气工程与自动化年级20xx起讫日期2…
嵌入式系统课程设计报告基于ARM的楼宇对讲系统设计摘要采用模块化设计方法设计出一款基于ARM微控制芯片和Linux操作系统的楼宇对…
嵌入式系统开发课程设计专周报告题目:具有日历功能的电子时钟系别及专业:计算机工程系计算机应用技术班级:10511学生姓名:XXX指…
课程设计综合实验报告20xx20xx年度第1学期名称题目院系班级学号学生姓名指导教师设计周数成绩日期年月日一课程设计的目的与要求1…
福建工程学院嵌入式系统课程设计报告书题目基于S3C2440设备驱动及其界面设计班级姓名学号指导老师陈靖张平均李光炀2目录一设计课题…
嵌入式系统课程设计报告基于ARM的楼宇对讲系统设计摘要采用模块化设计方法设计出一款基于ARM微控制芯片和Linux操作系统的楼宇对…
嵌入式课程设计实习报告设计任务一十字路口交通灯控制一设计目的1了解基于ARM7核的LPC2106的管脚功能和特点掌握IO控制寄存器…
XXXX课程设计报告课程名称嵌入式系统设计题目专业班级学生姓名学生学号指导老师二一三年一月八日目录1概述111背景112设计目标2…
河海大学计算机及信息工程学院常州课程设计报告题目专业学号通信工程0862310315授课班号学生姓名指导教师完成时间目录摘要2第一…
本学期为期一周的嵌入式课程设计在不知不觉中结束了,虽说这次课程设计时间不是很长,但是感觉自己收获颇丰,不仅学习到了一些新知识,回顾…