大连民族学院机电信息工程学院自动化系
单片机系统课程设计汇报
| |
班级: | 106 |
| |
学生姓名:
指导老师:
设计完成日期: 11 月30 日 |
课程设计任务书 | ||
题目:电子万年历 | ||
课程设计时间: .11.12~.11.30 | ||
一、设计任务 设计万年历电路和闹钟报时电路,完成相关软件设计并进行万年历显示。 | ||
二、设计内容及要求
| ||
www.taodocs.co三、设计关键 | ||
四、课程设计进度要求 | ||
五、参阅书目 |
目 录
1任务分析和性能指标.......................................................1
1.1任务分析.............................................................11.2性能指标.............................................................11.3显示部分.............................................................11.4键盘部分.............................................................2
2总体方案设计.............................................................2
2.1硬件方案图:.........................................................22.2设计过程.............................................................3
2.4 整个系统步骤框图图:.................................................3 |
3.1显示电路图:.........................................................53.2控制电路.............................................................63.3 芯片功效特征简述.....................................................8
4软件设计和实现...........................................................9
4.1主程序...............................................................94.2子程序..............................................................10
5调试及性能分析.........................................................20
5.1 调试原理图图:....................................................20 |
5.3硬件调试...........................................................205.4 系统性能分析.......................................................20
六总 结................................................................21
七参考文件..............................................................21
八附录..................................................................21
附录1元器件清单.......................................................21附录2调试系统照片.....................................................23
1任务分析和性能指标
1.1 任务分析 设计一个含有报时功效、停电正常运行(来电无需校时)、闹钟功效、带有年月日、 时分秒及星期显示电子日历。 |
腕表,大到公共场所悬挂大型电子日历,另外,眼下我们还常能在宾馆、饭店等场所见到一个带有年、月、日、时、分、秒、星期甚至节气等信息电子日历牌。
电子日历关键功效是给大家提供时间和日期信息,不管其形式怎样,从外部全部可分为显示和校准两部分。为使电子日历协调工作,整个系统从功效上可分为实时时钟、显示和键盘三个模块,分别完成时间和日期计算和人机交互管理等。
1.2性能指标
实时时钟(RTC:RealTime Clock)是系统关键,其运行精度直接影响产品质量。实时时钟实现有两种方案可选,一是利用单片机系统时钟和中止完成时间和日期计算;
二是利用专用时钟芯片。前者不用附加芯片,系统简单,不过累计误差较大,只有短时 |
脉冲源,内部15位计数器刚好产生标准秒脉冲。该类芯片除时钟计时外,还有年月日和星期计算功效,而且还可计算闰年。芯片初始化后可脱离CPU自动运行,有些芯片内部带有电池,出厂时芯片即开始运行。专用时钟芯片种类很多,和CPU通信方法有并行,也有串行。常见芯片有DALLAS企业生产DS1302和DS12C887,前者为串行,需要外加后备电池;后者为并行,芯片内置锂电池和晶体振荡器,无外加电源情况下可运行。另外,还有很多时钟芯片,如Epson、Holtek、深圳兴威帆等企业全部推出自己时钟芯片。这次我们选择芯片是DS12C887。
1.3显示部分
简单数据显示常采取液晶显示或数码管显示。液晶显示有耗电低、外形美观优点,而且,点阵液晶可显示较复杂字符或图案。其缺点是通用液晶显示器显示方案构建不够灵活,在较暗环境下液晶需要背光,而且,液晶显示成本较高。相对液晶显示器来讲,
因为数码管种类繁多,其显示方案构建灵活,成本较低。因为本身即是发光体,所以, 数码管显示无需额外光源。数码管不能显示复杂字型。
值得一提是,数码管串行静态显示和并行动态显示在位数较多时全部会出现显示不稳定现象。所以这次我们选择LED1602液晶。
1.4键盘部分
时钟设置虽包含数字,不过我们不提议使用数字键盘,应为数字键盘将增加系统复杂程度。为使系统尽可能简化,键盘部分设计在能够完成系统要求前提下,越简单越好。
所以,时钟系统键盘能够设置四个键:功效选择键、加1键、减1键,闹钟键。
2总体方案设计
2.1 硬件方案图:
显示系统
DS12C887 | 单片机 | 键盘 |
图1电子万年历系统框图
2.2设计过程
⒈认真领会设计要求:
确定系统功效,包含显示信息、按键个数、报时功效、闹钟功效等; ⒉样品外观设:
确定系统显示信息,显示器种类(液晶、数码管)、显示器尺寸等;
选定DS12C887 芯片、选定显示方法(动态、静态、串行、并行)、按键个数; |
⒌系统软件设计
系统软件可分为键盘管理、显示管理、报时管理和DS12C887管理三部分。软件可由汇编语言完成,也可由C语言完成,我选择C语言。
2.3合理分配内存
内存是系统宝贵资源之一,为合理利用内存,应对内存使用通盘考虑,并反复修改使用方案,使之达成最合理利用。应尽可能少使用全局变量,以提升内存利用率。有效利用CPU内存和外围器件内存,通常情况下不提议扩展系统内存。
2.4整个系统步骤图
开始
N
上电复位
Y
Y
内存变量初始化:
报时点、显示缓冲区等
系统硬件初始化:
系统硬件初始化:
显示器、DS12C887芯片等
扫描键盘
键盘分析处理
显示管理
图2软件部分程序步骤图
2.5 软 | 件 | 方案 |
C语言编属于高级语言,含有可移植性,能够结构化编程。使用标准C语言程序,
几乎全部能够不作改变移植到不一样微机平台上,对于嵌入式等微控制芯片,属于标准C
语言部分也极少需要修改,而且程序很轻易读懂。
C语言编写程序结构清楚,移植性好,轻易维护和修改。
汇编语言针对不一样操作系统平台,不一样微控制器,指令全部是完全不一样,即使指令相同,也不含有可移植性。不过汇编语言是针对专门控制器,所以运行速度能够正确到一个指令周期。汇编语言程序读懂需要借助微控制器指令手册和各个寄存器说明,所以极难读懂。
汇编语言编写代码实时性强,能够直接控制硬件工作状态,不过不含有可移植性,维护和修改困难。
经过我们三人讨论我们决定使用c语言来编写程序,因为c语言程序轻易学,也很轻易读懂,编写程序结构清楚,易于我们组员之间讨论和学习。而且相对于汇编我们愈加擅长c语言。
3 硬件设计和实现
计,有12 小时制和24 小时制两种模式。在 12小时制模式中,用 AM 和PM 区分早晨和下午;时间表示方法也有两种,一个用二进制数表示,一个是用BCD 码表示;DS12C887 中带有128 字节 RAM,其中有11 字节 RAM 用来存放时间信息,4字节 RAM 用来存放DS12C887 控制信息,称为控制寄存器,113字节通用RAM 使用户使用;另外用户还可对DS12C887 进行编程以实现多个方波输出,并可对其内部三路中止经过软件进行屏蔽。使用其于单片机C52控制DS12C877就能很好实现时钟需要基础功效。而显示部分我们采取LCD液晶显示器,液晶显示器显示功效强大,可显示文字,图形,显示多样,清楚可见,而其体积较小,使用方便,能够使电路愈加简练,所以选择了液晶显示器。
3.1显示电路图:
图3 LED 液晶显示
3.2控制电路
图5 时钟芯片原理图 | |
| ||||
P1.2 | 3 | 38 | P0.1 | |
P1.3 | 4 | 37 | P0.2 | |
P1.4 | 5 | 36 | P0.3 | |
P1.5 | 6 | 35 | P0.4 | |
P1.6 | 7 | 34 | P0.5 | |
P1.7 | 8 | STCC52 | 33 | P0.6 |
RST/VPD | 9 | 32 | P0.7 | |
P3.0/RXD | 10 | 31 | EA/VPP | |
P3.1/TXD | 11 | 30 | ALE/PROG | |
P3.2/INT0 | 12 | 29 | PSEN | |
P3.3/INT1 | 13 | 28 | P2.7 | |
P3.4/T0 | 14 | 27 | P2.6 | |
P3.5/T1 | 15 | 26 | P2.5 | |
P3.6/WR | 16 | 25 | P2.4 | |
P3.7/RD | 17 | 24 | P2.3 | |
XTAL2 | 18 | 23 | P2.2 | |
XTAL1 | 19 | 22 | P2.1 | |
VSS | 20 | 21 | P2.0 | |
图7 单片机引脚 |
| |||
| ||||
STCC52是一个低功耗、高性能CMOS8位微控制器,含有8K在系统可编程Flash存放器。使用高密度非易失性存放器技术制造,和工业80C51产品指令和引脚完全兼容。片上Flash许可程序存放器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧8位CPU和在线系统可编程Flash,使得STCC52为众多嵌入式控制应用系统提供高灵活、超有效处理方案。STCC52含有以下标准功效:8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中止结构,全双工串行口,片内晶振立即钟电路。另外,STCC52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,许可RAM、定时器/计数器、串口、中止继续工作。掉电保护方法下,RAM内容被保留,振荡器被冻结,单片机一切工作停止,直到下一个中止或硬件复位为止。8
4 软件设计和实现 |
#defineuint unsigned int
sbitS1=P1^0;
sbitS2=P1^1;
sbitS3=P1^2;
sbitS4=P1^3;
sbitrs=P3^5; // 数据/命令选择端(H/L)
sbitlcden=P3^4; //使能信号
sbitbeep=P3^6;
sbit dscs=P1^4; | //片选端,低电平有效 | |
sbit dsas=P1^5; | |
sbitdsrw=P1^6;
sbitdsds=P1^7; //数据选择或读输入引脚
sbitdsirq=P3^3;//中止请求输出,低电平有效
bitflag1,flag_ri; //定义两个变量
ucharcount,s1num,flag,t0_num;
charmiao,shi,fen,year,month,day,week,amiao,afen,ashi; uchar codetable[]=" -11-16 " ;
ucharcode table1[]=" 20:06:12" ;
voidwrite_ds(uchar,uchar);
voidset_alarm(uchar,uchar,uchar);
void read_alarm(); void set_time(); | |
void delay(uint z) uchar read_ds(uchar); | |
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voiddi() //蜂鸣器报警声音
{
beep=0;
delay(100); | |
}
voidwrite_com(uchar com) //写液晶命令函数
{
rs=0;
lcden=0;
P2=com;
delay(3);
lcden=1;
delay(3);
lcden=0;
void write_date(uchar date)//写液晶数据函数 | |
{ | rs=1; |
P2=date;
delay(3);
lcden=1;
delay(3);
lcden=0;
}
void init() | //初始化函数 | |
{ | ||
uchar num; | ||
|
EA=1; | //总中止 |
EX1=1; // 外部中止1
IT1=1; //负跳变沿触发中止
flag1=0;//变量初始化
t0_num=0;
s1num=0;
week=1;
lcden=0;
write_ds(0x0a,0x20);//打开振荡器
//set_time(); |
write_com(0x01);
write_com(0x80);
for(num=0;num<15;num++) //写入液晶固定部分显示
{
write_date(table[num]);
delay(1);
}
write_com(0x80+0x40); for(num=0;num<10;num++) | |
{
write_date(table1[num]);
delay(1);
}
}
voidwrite_sfm(uchar add,char date) //1602液晶刷新时分秒函数2为时,5为分,8为秒
{
charshi,ge;
shi=date/10;
ge=date%10; | |
| |
}
voidwrite_nyr(uchar add,char date) //1602液晶刷新年月日函数3为年,6为月,9为日
{
charshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+add); | |
write_date(0x30+ge);
}
voidwrite_week(char we) //1602 液晶刷新星期函数
{
write_com(0x80+12);
switch(we)
{
case1:
write_date('M');delay(5); write_date('O');delay(5);
write_date('N');
case 2: | write_date('T');delay(5); |
break; | |
case 3: | write_date('W');delay(5); |
write_date('E');delay(5);
write_date('D');
break;
case4: write_date('T');delay(5);
write_date('H');delay(5);
write_date('U');
case 5: | break; | |
write_date('F');delay(5); | ||
|
write_date('R');delay(5);
write_date('I');
break;
case6: write_date('S');delay(5);
write_date('A');delay(5);
write_date('T');
break;
case7: write_date('S');delay(5);
write_date('U');delay(5);
write_date('N');
break; | |
} } | |
{
if(flag_ri==1)
{
if((S1==0)||(S2==0)||(S3==0)||(S4==0))
{
delay(5);
if((S1==0)||(S2==0)||(S3==0)||(S4==0))
{ | while((S1==0)||(S2==0)||(S3==0)||(S4==0)); | |
|
di();
flag_ri=0;//清除报警标志
}
}
}
if(S1==0) //检测S1
{
delay(5);
if(S1==0)
{ | s1num++; | |
s1num=1; | ||
flag=1;
while(S1==0);
di();
switch(s1num) //光标闪烁点定位
{
case1: write_com(0x80+0x40+8);
write_com(0x0f);
case 2: | break; | |
write_com(0x80+0x40+5); | ||
|
break;
case3: write_com(0x80+0x40+2);
break;
case4: write_com(0x80+12);
break;
case5:
write_com(0x80+9); break;
case6: write_com(0x80+6);
break;
case 7: | write_com(0x80+3); | |
break; case 8:s1num=0; | | |
flag=0; | ||
write_ds(2,fen);
write_ds(4,shi);
write_ds(6,week);
write_ds(7,day);
write_ds(8,month);
write_ds(9,year);
break;
} | |
}
if(s1num!=0)//只有当S1按下后,才检测S2和S3
{
if(S2==0)
{
delay(1);
if(S2==0)
{
while(S2==0);
di(); |
miao=0;
write_sfm(8,miao);
write_com(0x80+0x40+8);
break;
case2: fen++;
if(fen==60)
fen=0;
write_sfm(5,fen);
write_com(0x80+0x40+5) | ; | |
break; | |
case 3: | shi++; |
if(shi==24)
shi=0;
write_sfm(2,shi);
write_com(0x80+0x40+2);
break;
case4: week++;
if(week==8)
week=1;
write_week(week);
break; |
write_nyr(9,day);
write_com(0x80+9);
break;
case6: month++;
if(month==13)
month=1;
write_nyr(6,month);
write_com(0x80+6) ; | |
case 7: | year++; |
if(year==100)
year=0;
write_nyr(3,year);
write_com(0x80+3);
break;
}
}
}
if(S3==0) |
while(S3==0);
di();
switch(s1num)
{
case1: miao--;
if(miao==-1)
miao=59;
write_sfm(8,miao);
write_com(0x80+0x40+8) | ; | |
break; | |
case 2: | fen--; |
if(fen==-1)
fen=59;
write_sfm(5,fen);
write_com(0x80+0x40+5);
break;
case3: shi--;
if(shi==-1)
shi=23;
write_sfm(2,shi);
break; |
write_week(week);
write_com(0x80+12);
break;
case5: day--;
if(day==0)
day=31;
write_nyr(9,day);
write_com(0x80+9) ; | |
case 6: | month--; |
if(month==0)
month=12;
write_nyr(6,month);
write_com(0x80+6);
break;
case7: year--;
if(year==-1)
year=99;
write_nyr(3,year);
break; |
}
if(S4==0)
{
delay(5);
if(S4==0)
{
flag1=~flag1;
while(S4==0); | |
if(flag1==0)
{
flag=0;
write_com(0x80+0x40);
write_date('');
write_date('');
write_com(0x0c);
write_ds(1,miao);
write_ds(3,fen);
write_ds(5,shi);
} | |
{ | |
fen=afen;
shi=ashi;
write_com(0x80+0x40);
write_date('L'); //显示标志
write_date('');
write_com(0x80+0x40+3);
write_sfm(2,ashi); | //送液晶显示闹钟时间 | |
write_sfm(5,afen); | ||
write_sfm(8,amiao); | ||
|
}
}
}
}
void write_ds(uchar add,uchar date) //12C887 函数{
dscs=0;
dsas=1;
dsds=1;
dsrw=1;
P2=add; //先写地址dsas=0; | |
dsrw=0; | |
dsas=1;
dscs=1;
}
uchar read_ds(uchar add) //读12C887函数
{
uchards_date;
dsas=1;
dsds=1; | |
dscs=0;
P2=add; //先写地址
dsas=0;
dsds=0;
P2=0xff;
ds_date=P2; //再读数据
dsds=1;
dsas=1;
dscs=1;
returnds_date;
} | | |
{ | write_ds(1,0); | |
write_ds(2,0);
write_ds(3,0);
write_ds(4,0);
write_ds(5,0);
write_ds(6,0);
write_ds(7,0);
write_ds(8,0);
write_ds(9,0); | |
voidread_alarm()
{
amiao=read_ds(1);
afen=read_ds(3);
ashi=read_ds(5);
}
voidmain()
{
init();
while(1)
{ | |
{ | |
delay(100);
di();
delay(500);
}
if(flag==0&&flag1==0) //正常工作时进入这里
{
keyscan(); //按键扫描
year=read_ds(9); //读取12C887 数据month=read_ds(8); | |
day=read_ds(7);
week=read_ds(6);
shi=read_ds(4);
fen=read_ds(2);
miao=read_ds(0);
if(fen==0&&miao==0)
{
di();
delay(100);
di();
delay(500); | |
write_sfm(2,shi); | |
write_week(week);
write_nyr(3,year);
write_nyr(6,month);
write_nyr(9,day);
}
}
}
void exter()interrupt 2 //外部中止1 服务程序 { | |
uchar c; | //进入中止表示闹钟时间到 |
c=read_ds(0x0c);//读取12C887C寄存器表示响应了中止
}
5调试及性能分析
5.1 调试原理图图:
|
软件调试时,开始出现了很多错误,关键是液晶屏乱码,不显示数字。以后经过调试找出原因并更正得到想要结果。
5.3硬件调试
硬件关键是单片机,液晶,DS12C887芯片,我们任务是关键将她们各个引脚作用和芯片功效搞清楚,经过软件操控它们,根据PCB原理图焊接到板上。
5.4系统性能分析
功效关键有整点报时,掉电免校验,闹钟,按键校对功效等,经过键盘和软件设置来控制时钟功效,我们是根据次序一个一个进行调试,这么层次清楚写起程序来也轻易。
六总结
这次课程设计,我们组三个人分工合作。从一开始选题,然后确定方案、买零件,到最终设计调试,我们组员全部在一起研究讨论。经过这次设计,我们三个人全部有了很大收获,对单片机编程控制有了深入了解。
该设计包含到了单片机时序控制,数据接口同时用到了控制按键、数据显示处理等。这次设计,基础上包含到了全部单片机控制功效模块。所以,经过这次设计,基础能掌握单片机全部基础控制,这也是我们组选择该题目标一个关键原因。
七参考文件
[1] 郭天祥.新概念51 单片机C 语言教程[M].北京:电子工业出版社,. |
[5]马忠梅,刘滨等.单片机C语言Windows环境编程宝典[M].北京:北京航空航天大学出版社..
八附录
附录1元器件清单
|
电位器 | 10K | 1 |
瓷片电容 | 22pF | 2 |
瓷片电容 | 0.1uF | 2 |
电源接口 | 5V | 1 |
杜邦线 | | 30 |
排针 | | 5 |
蜂鸣器 | | 1 |
按键 | | 4 |
总计 | | 25 |
附录2调试系统照片
整体显示图:
显示部分图:
图10 显示时间部分 | |
Copyright © 2019- qianxingmanyou.cn 版权所有
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务