万年历报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于MSP430的万年历实时系统
专业班级电子一班
姓名
学号
一.设计内容
1.设计目的
万年历是日常生活中必不可少的工具,但是每个人都知道如何使用,却很少人知道如何实现它。
本次设计是利用所学的单片机知识,将其具体化,做成实物展现出来。
2.设计思路
A.利用G2系列和DS1302模块实现万年历。
DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高。
B.利用5529系列,通过定时器编程直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。
采用此种方案虽然减少芯片的使用,节约成本。
方案B编程虽然麻烦,但是很锻炼逻辑思路和编程的能力,由于时间较紧,对于1302模块了解不够深入,最终确定利用定时器来编写万年历。
A方案器件关系
B方案器件关系
3.软件编程
B部分源程序
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗定时器
TA0CTL = TASSEL_1 + MC_1 + TACLR + TAIE; // 选择aclk为时钟,增计数模式, TA0CCR0 = 32767; //原数32767 // 计数设置
//-----配合机械按键,启用内部上拉电阻-----
P1REN |= BIT7;
P1OUT |= BIT7;
//-----配置P1.7中断参数-----
P1DIR &= ~BIT7;
P1IES |= BIT7;
P1IE |= BIT7 ;
//-----配合机械按键,启用内部上拉电阻-----
P2REN |= BIT2;
P2OUT |= BIT2;
//-----配置P2.2中断参数-----
P2DIR &= ~BIT2;
P2IES |= BIT2;
P2IE |= BIT2 ;
P1DIR |= BIT0; //蜂鸣器输出端口
Dogs102x6_init();
Dogs102x6_backlightInit();
Dogs102x6_setBacklight(10);
Dogs102x6_setContrast(10);
Dogs102x6_clearScreen();
Dogs102x6_imageDraw(tubiao,0,25);
_delay_cycles(5000000);
Dogs102x6_clearScreen();
_EINT(); // 打开全局中断
while(1)
{ //年,月,日,时,分,秒十位,各位分离
sec1=(sec/10)+48;//十位
sec2=(sec%10)+48;//个位
min1=(min/10)+48;//十位
min2=(min%10)+48;//个位
hour1=(hour/10)+48;//十位
hour2=(hour%10)+48;//个位
year1=(year/1000)+48;
year2=((year-1000*(year1-48))/100)+48;
t=year-1000*(year1-48)-100*(year2-48);
year3=(t/10)+48;
year4=(t%10)+48;
month1=(month/10)+48;
month2=(month%10)+48;
day1=(day/10)+48;
day2=(day%10)+48;
week1=week+48;
display(); //调用函数完成显示
//--------------教师上课实时提醒部分---------------------- if(hour==8&&min==00)
{Dogs102x6_clearScreen();
Dogs102x6_stringDraw(7, 12, "time for class", 0);
}
else
{Dogs102x6_clearScreen();
display();
}
if(hour==12&&min==00)
{Dogs102x6_clearScreen();
Dogs102x6_stringDraw(7, 12, "time for eating", 0); }
else
{Dogs102x6_clearScreen();
display();
}
if(hour==17&&min==00)
{Dogs102x6_clearScreen();
Dogs102x6_stringDraw(7, 12, "time for home", 0); }
else
{Dogs102x6_clearScreen();
display();
}
//------------------闹钟音乐部分---------------------- if(hour==17&&min==02)
yinyue(); // 调用音乐函数,播放音乐Else
P1OUT &= ~ BIT0;
}
}
//-----------------------按键控制及定时器中断部分----------------
#pragma vector=TIMER0_A1_VECTOR
__interrupt void TIMER0_A1_ISR(void)
{
if(__even_in_range(TA0IV,14)) //查询是否中断溢出
{ sec3++;
sec=sec+1;
if(sec==60)
{ sec=0;
min++;
if(min==60)
{min=0;
hour++;
if(hour==24)
{
h our=0;
day++;
switch(month){
case 1 : {
if(day==32)
{day=1;
month++;}
} break;
case 2 :{
if((year%400==0)||((year%400!=0)&&(year%4==0))) //闰年设置
{ if(day==30)
{day=1;
month++;
}
}
else
{if(day==29)
{day=1;
month++;
}
}
} break;
case 3 : {
if(day==32)
{day=1;
month++;}
} break;
case 4 : {
if(day==31)
{day=1;
month++;}
} break;
case 5 : {
if(day==32)
{day=1;
month++;}
} break;
case 6 : {
if(day==31)
{day=1;
month++;}
} break;
case 7 : {
if(day==32)
{day=1;
month++;}
} break;
case 8 : {
if(day==32)
{day=1;
month++;}
} break;
case 9 : {
if(day==31)
{day=1;
month++;}
} break;
case 10 : {
if(day==32)
{day=1;
month++;}
} break;
case 11 : {
if(day==31)
{day=1;
month++;}
} break;
case 12 : {
if(day==32)
{day=1;
month=1;
year++;
}
} break;
default :
break;
}
}
}
}
}
}
#pragma vector = PORT1_VECTOR
__interrupt void PORT1_ISR(void) {
unsigned int Push_Key=0;
Push_Key=P1IFG&(~P1DIR);
__delay_cycles(10000);
if((P1IN&Push_Key)==0)
{ flag01++;
if(flag01==7)
{flag01=0;}
}
P1IFG=0;
}
#pragma vector = PORT2_VECTOR
__interrupt void PORT2_ISR(void) {
unsigned int Push_Key=0;
Push_Key=P2IFG&(~P2DIR);
__delay_cycles(10000);
if((P2IN&Push_Key)==0)
{
switch(flag01){
case 0 : { year++;if(year==2020){year=2010;}};break;
case 1 : { P8REN |= BIT1;P8OUT |= BIT1;month++;
if(month==13){month=1;} };break;
case 2 : { P8REN |= BIT2;P8OUT |= BIT2;day++ ;
if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)| |(month==12)){if(day==32){day=1;}}
if((month==4)||(month==6)||(month==9)||(month==11)){if(day==31){day=1;}} if(month==2)
{ if((year%400==0)||((year%400!=0)&&(year%4==0)))
{if(day==30){day=1;}}
else
if(day==29){day=1;}
}
};break;
case 3 : { P1REN |= BIT1;P1OUT |=
BIT1;hour++;if(hour==24){hour=0;}};break;
case4 : { P1REN |= BIT2;P1OUT |= BIT2;min++;if(min==60){min=0;}};break;
case 5 :{ P1REN |= BIT3;P1OUT |=
BIT3;week++;if(week==8){week=1;}};break;
default : break;
}
}
P2IFG=0;
}
其余子文件工程中有,在此不再列出。
二.功能及成果显示
本设计完成的功能有:
1.万年历的年,月,日,星期,时,分,秒的实时显示。
2.通过按键可调节时间
3.闹铃设置
4.音乐发声
5.教师上课实时提醒系统
成果展示:
基于定时器:
1.显示名字
2.万年历实时显示
3.教师上课提醒
设置八点提醒,超过八点则提醒自动消失(还有十二点,五点均有不同提醒,在此不再贴出)
4.总的硬件图
设定时间,到达时间(在此设置17:02)蜂鸣器播放《我是粉刷匠》音乐,焊接功放电路,使音质更好。
基于DS1302模块:
1.星期正确显示
2.日期正确显示
3.时间显示稍有差错(继续研究)
通过按键进行显示的切换
三.心得体会
本此设计困难较多,但是收获不少。
最开始的想法是利用DS1302模块来实现万年历的设计。
初始认为不太难,但是经过真正地着手去做才发现真的没有想象中那么容易。
首先,DS1302模块和数码管都是新器件,之前的程序都要做不少改动,但在老师的帮助下还是顺利完成了日期和星期的显示。
但最终,时间秒的显示还是有问题,由于时间太紧,这一点还未改正,时间显示不对影响我后续附加功能的实现,因此我又重新用定时器编了新的万年历。
DS1302最终实现的功能是利用按键控制日期,星期,时间的显示和切换,自己的这一改动主要利用知识是按键的添加和中断的产生机理。
通过对它们的研究,我对按键中断有了进一步了解。
这一模块时间显示问题未解决,是个遗憾,但在后续的学习中,我还要对其进行研究,争取将问题解决。
最后两天的时间,利用定时器编写万年历,并实现了闹钟,音乐,提醒,设置时间等多附加功能,还是很开心的。
初始由于1302模块时钟调不好,对自己的能力产生了质疑,觉得自己很挫败,但是能在两天内克服坏情绪,又成功实现自己想到的各种功能,对自己又恢复了信心。
也渐渐明白,任何事都是需要时间的,只要时间足够,自己就能做的很好。
本部分主要利用Timer A定时器,来实现时间的计时。
一开始学单片机,定时器是一大难点,但是经过这次实练,对其有了进一步的了解。
虽然至今还是不能将其阐述的太清楚,但是知道如何用就是一个很大的突破。
这里的难点是按键的控制,要考虑周全,且逻辑清楚,知道谁控制着谁。
由于f5529只有p1和p2可以作为按键输入口,所以外加的按键不能行,现在找到这个原因,可以外加按键了,这充分说明读说明书的重要性。
本次还尝试了音乐的播放,之前不懂音乐的简谱,现在也略知一二,并将其转化成单片机语言,即改变其频率,有很大收获。
真的很感谢老师耐心的帮助和鼓励,让我在有困难的时候仍能继续坚持,我会继续努力。