电子时钟万年历设计_第1页
电子时钟万年历设计_第2页
电子时钟万年历设计_第3页
电子时钟万年历设计_第4页
电子时钟万年历设计_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机科学与技术学院硬件课程设计报告摘 要在日常生活中,手表,闹钟是不可或缺的。在实际生活生产活动中,也要考虑时间的因素,如工时的计算,霓虹灯的亮灭。因为集成电路制造技术的不断提高,出现了高性能、高可靠的集成芯片。电子时钟在工业领域,日常生活中得到了广泛的应用。电子时钟在性能方面具有精度高,实时性好,易于调整等优点。这些使得温度控制系统的研究和开发得到的各方面的广泛关注和支持。本次课程设计,我利用8254计数芯片,8255芯片,4*4小键盘,12864LCD液晶显示器,蜂鸣器制作了一个带有闹钟功能的电子时钟万年历。它可以实现由4*4小键盘输入初始时间(包括年月日时分秒星期),利用8254计数,通过程序处理进位,判断闰年,在液晶显示屏上实时显示时间。还可以由小键盘选择不同的闹钟模式,设定闹钟时间。关键词 : 电子时钟 ; 8255A芯片; 8254芯片; 12864LCD液晶显示器; 键盘输入; 蜂鸣器; 闹钟功能; 万年历目 录1.设计任务与要求6-1.1实验目的61.2具体要求62. 总体方案与说明6-2.1使用硬件62.1流程设计62.1.1系统程序模块62.1.1系统流程图73.硬件方案73.1硬件说明73.1.1计数芯片825473.1.2可编程外围接口芯片8255A83.1.2 12864字符液晶显示器113.2电路原理图与说明123.2.1键盘电路133.2.2 8254计数电路133.2.3 液晶显示电路143.3电路连接图143.3.1 8254计数芯片143.3.2 整体电路154.软件方案154.1软件主要模块流程图154.1.1输入子程序模块流程图164.1.2显示子程序模块流程图184.1.2闰年子程序模块流程图184.1.2蜂鸣器子程序模块流程图184.1.2时间进位程序模块流程图194.1.2主程序模块流程图204.2源程序清单与注释215.分析与测试386.运行结果386.1试验线路图396.2实验结果396.2.1欢迎界面396.2.2闹钟设定界面406.2.3闹钟功能实现416.2.4闰年功能实现417.结论与体会437.1结论437.2体会44参考文献45-1 设计任务与要求1.1实验目的1.复习8255芯片,8254芯片工作原理及使用方法2.学会使用12864字符液晶显示屏,蜂鸣器3.锻炼小规模逻辑电路设计4.提高分析、解决问题的能力1.2具体要求本系统要求能通过4*4键盘输入预设时间,实时反映当前时间的变化并能对闰年进行准确判断。另外,当时间与预先设置的闹钟时间相同时,能够蜂鸣,并在电脑屏幕上显示。2 总体方案与说明2.1使用硬件8255芯片、8254芯片、12864字符液晶显示器、蜂鸣器、4*4键盘2.1流程设计2.1.1系统程序模块 2.1.2 系统流程图3硬件方案3.1硬件说明3.1.1计数芯片82548254 芯片是一款使用十分广泛的可编程定时,计数芯片,其主要功能是定时和计数的功能。我们的微机内的动态存储器刷新电路,系统日时钟的技术以及发声系统的声源都是由8254芯片来完成的。结构8254 芯片的外部引脚和内部结构如下图 工作原理8254芯片共有六种工作方式,分别对应与六种不同的用途。(1)方式0:计数到0结束输出正跃变信号方式。(2)方式1:硬件可重触发单稳方式。(3)方式2:频率发生器方式。(4)方式3:方波发生器。(5)方式4:软件触发选通方式。(6)方式5:硬件触发选通方式。3.1.2可编程外围接口芯片8255A8255A是一种通用的可编程并行I/O接口芯片,它是为Intel系列微处理器设计配套电路,也可用于其他微处理器系统中。通过对它编程,芯片可工作于不同的工作方式。在微型计算机系统中,用8255A做接口时,通常不需要附加外部逻辑电路就可直接为CPU与外设之间提供数据通道,因此得到了极为广泛的应用。结构和功能8255A的外部引脚和内部结构如下图图3-3 8255外部引脚图 图3-4 8255内部功能图由图可见,8255A由数据端口A、B、C(期中,C口被分为C口上半部分和C口下半部分),A组和B组控制逻辑,数据总线缓冲器和读写控制逻辑。8255A内部包含3个8位输入输出端口,通过外部的24根输入输出线与外设进行通信联络。A口和B口可以用作8位输入口或8位输出口。C口既可以用作8位输入输出口用,也可作为两个4位的输入输出口。还常常用来配合A口和B口工作,分别用来产生A口和B口的输出控制信号和输入A口和B口的端口状态端口信号。表3-1 8255A的基本操作A1A0RDWRCS操作00010端口A数据总线01010端口B数据总线10010端口C数据总线00100数据总线端口A01100数据总线端口B10100数据总线端口C111数据总线控制字寄存器XXXX1数据总线三态11010非法状态XX110数据总线三态8255A的控制字方式选择控制字8255A具有3种基本工作方式。方式0:基本输入输出方式;方式1:选通输入输出方式;方式2:双向总线I/O方式。端口A可以工作于3种方式中的任一种;端口B只能工作于方式0和方式1,而不能工作于方式2;端口C常被分成2个4位端口,除了用做输入输出端口外,还能用来配合A口和B口工作,为这两个端口的输入输出操作提供联络信号。图3-5 8255方式选择控制字格式工作方式A.方式0基本输入输出方式,它适用于不需要应答信号的简单输入输出场合。在这种方式下,A口和B口可作为8位端口,C口的高4和低4为可作为两个4为端口。CPU与这些端口交换数据时,可以直接输入指令从端口读取数据,或用输出指令将数据写入指定端口,不需要任何其他联络信号。B方式1选通输入/输出方式。在这种方式下,A口和B口作为数据口,均可用于输入或输出方式。而且这两个8位数据口的输入、输出数据都能锁存,但它们必须在联络信号的控制下才能完成I/O操作。端口C的6根线用来产生或接受这些联络信号。C.方式2双向总线方式。只有A口可以工作于这种方式。在这种方式下,CPU与外设交换数据时,可在单一的8位端口数据线PA7-PA9上进行,既可以通过A口把数据传送到外设,又可以从A口接收从外设送来的数据,而且输入和输出的数据均能锁存,但输入和输出不能同时进行3.1.3 12864字符液晶显示器ST7920是台湾矽创电子公司生产的中文图形控制芯片,它是一种内置12864-12汉字图形点阵的液晶显示控制模块,用于显示汉字及图形12864A-1汉字图形点阵液晶显示模块集成ST7920驱动器,可显示汉字及图形,内置8192个中文汉字(1616点阵)、128个字符(816点阵)及64256点阵显示RAM(GDRAM)。结构图3-6 LCD液晶字符显示器外形尺寸 图3-7 LCD液晶字符坐标工作原理12864液晶显示器工作于并行模式。8位数据线与8255A芯片8位数据口连接,控制口(E、R/W、D/I)与8255A芯片C口四位相连。通过8255A的8位数据空向12864液晶显示器传送数据,通过C口低四位传送控制信号。控制口E为使能端,高电位有效。R/W为读写控制,低点位为写数据、高电位为读数据。D/I为数据与命令口,低电位为命令、高电位为数据。将需要显示的地址通过数据口以命令的形式送入显示器,再将需要显示的数据通过数据口以数据的形式送入显示器,即可显示内容。表3-2 LCD汉字显示坐标X坐标Line180H81H82H83H84H85H86H87HLine290H91H92H93H94H95H96H97HLine388H89H8AH8BH8CH8DH8EH8FHLine498H99H9AH9BH9CH9DH9EH9FH图3-8 LCD中文字库截图3.2电路原理图与说明3.2.1 键盘输入电路图3-9 键盘输入电路原理图3.2.2 8254计数电路图3-10 计数电路原理图3.2.3 液晶显示电路图3-11 液晶显示电路原理图3.3电路连接图3.3.1 8254计数芯片3.3.2 整体电路4 软件方案4.1软件主要模块流程图4.1.1输入子程序模块流程图图4-1 输入子程序模块流程图4.1.2显示子程序模块流程图4.1.3闰年子程序模块流程图4.1.4蜂鸣器子程序模块流程图4.1.5时间进位程序模块流程图 4.1.6主程序模块流程图4.2源程序清单与注释#include;/*头文件*/#include#include#include ApiExusb.h#pragma comment(lib,ApiExusb.lib)char lcd110=0xa3,0xa3,0xa3,0xa3,0xa3,0xa3,0xa3,0xa3,0xa3,0xa3;char lcd210=0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9;char l18=0,0xd2,0xb6,0xc8,0xcb,0xce,0xc1,0xc8;/*字符机内码数组*/char l28=0,0xbb,0xfe,0xfd,0xc4,0xe5,0xf9,0xd5;char lhy132=0xb5,0xe7,0xd7,0xd3,0xca,0xb1,0xd6,0xd3,0xcd,0xf2,0xc4,0xea,0xc0,0xfa,0xa1,0xef,0xa1,0xf1,0xbb,0xb6,0xd3,0xad,0xc4,0xfa,0xca,0xb9,0xd3,0xc3,0xa1,0xc3,0xa3,0xa9;char lhy232=0xc7,0xeb,0xca,0xb9,0xd3,0xc3,0xd0,0xa1,0xbc,0xfc,0xc5,0xcc,0xca,0xe4,0xc8,0xeb,0xa1,0xf9,0xd6,0xc6,0xd7,0xf7,0xa1,0xaa,0xcb,0xce,0xca,0xc0,0xbb,0xdb,0xa1,0xf9;char sd164=0xc7,0xeb,0xc9,0xe8,0xb6,0xa8,0xc4,0xd6,0xd6,0xd3,0xc4,0xa3,0xca,0xbd,0xa2,0xa0,0xa2,0xd9,0xca,0xb1,0xb7,0xd6,0xc3,0xeb,0xa2,0xa0,0xa2,0xa0,0xa2,0xa0,0xa2,0xa0,0xa2,0xda,0xd0,0xc7,0xc6,0xda,0xca,0xb1,0xb7,0xd6,0xc3,0xeb,0xa2,0xa0,0xa2,0xa0,0xa2,0xdb,0xc4,0xea,0xd4,0xc2,0xc8,0xd5,0xca,0xb1,0xb7,0xd6,0xc3,0xeb,0xa2,0xa0; char sd216=0xc7,0xeb,0xc9,0xe8,0xb6,0xa8,0xc4,0xd6,0xd6,0xd3,0xca,0xb1,0xbc,0xe4,0xa2,0xa0;void clear();void cmdsetup();void datasetup();void input();/*数字输入*/void show(int,int); /*数字显示*/void show1(int,int,int);/*单位显示*/void show2(int);/*星期显示*/void showhy();/*欢迎界面显示*/void showclr();/*界面清屏*/void showsd1();/*设定界面1显示*/void showsd2();int days(int,int);void clock();/*蜂鸣器闹铃*/byte i,k;int j;void main() int year,month,day,week,hour,minute,second; int flag,scheduledyear,scheduledmonth,scheduledday,scheduledweek,scheduledhour,scheduledminute,scheduledsecond; byte data; showhy();/*欢迎界面显示*/ showclr(); showsd1();/*闹钟模式界面显示*/ input(); flag=j; showclr(); showsd2();/*闹钟设定模式界面显示*/ if (flag=1) /*闹钟模式1 输入,显示预设时分秒*/ show1(0x92,0xca,0xb1); show1(0x8a,0xb7,0xd6); show1(0x9a,0xc3,0xeb); k=0x90; input(); scheduledhour=10*j; k=0x91; input(); scheduledhour=scheduledhour+j; k=0x88; input(); scheduledminute=10*j; k=0x89; input(); scheduledminute=scheduledminute+j; k=0x98; input(); scheduledsecond=10*j; k=0x99; input(); scheduledsecond=scheduledsecond+j; showclr(); if (flag=2) /*闹钟模式2 输入,显示预设星期时分秒*/ show1(0x90,0xd0,0xc7); show1(0x91,0xc6,0xda); show1(0x96,0xca,0xb1); show1(0x8a,0xb7,0xd6); show1(0x8e,0xc3,0xeb); k=0x92; input(); scheduledweek=j; k=0x94; input(); scheduledhour=10*j; k=0x95; input(); scheduledhour=scheduledhour+j; k=0x88; input(); scheduledminute=10*j; k=0x89; input(); scheduledminute=scheduledminute+j; k=0x8c; input(); scheduledsecond=10*j; k=0x8d; input(); scheduledsecond=scheduledsecond+j; showclr(); if (flag=3) /*闹钟模式3 输入,显示预设年月日时分秒*/ show1(0x94,0xc4,0xea); show1(0x97,0xd4,0xc2); show1(0x8a,0xc8,0xd5); show1(0x8e,0xca,0xb1); show1(0x9a,0xb7,0xd6); show1(0x9e,0xc3,0xeb); k=0x90; input(); scheduledyear=1000*j; k=0x91; input(); scheduledyear=scheduledyear+100*j; k=0x92; input(); scheduledyear=scheduledyear+10*j; k=0x93; input(); scheduledyear=scheduledyear+j; k=0x95; input(); scheduledmonth=10*j; k=0x96; input(); scheduledmonth=scheduledmonth+j; k=0x88; input(); scheduledday=10*j; k=0x89; input(); scheduledday=scheduledday+j; k=0x8c; input(); scheduledhour=10*j; k=0x8d; input(); scheduledhour=scheduledhour+j; k=0x98; input(); scheduledminute=10*j; k=0x99; input(); scheduledminute=scheduledminute+j; k=0x9c; input(); scheduledsecond=10*j; k=0x9d; input(); scheduledsecond=scheduledsecond+j; showclr(); k=0x80; /*输入,显示预设的年月日时分秒星期*/ input(); year=j*1000; k+; /*K储存字符显示在液晶屏的地址*/ input(); year=year+j*100; k+; input(); year=year+j*10; k+; input(); year=year+j; k+; /*显示单位汉字*/ show1(k,0xc4,0xea); k=0x90; input(); month=j*10; k+; input(); month=month+j; k+; show1(k,0xd4,0xc2); k=0x94; input(); day=j*10; k+; input(); day=day+j; k+; show1(k,0xc8,0xd5); k=0x88; show1(k,0xd0,0xc7); k+; show1(k,0xc6,0xda); k+; input(); week=j; k=0x8c; input(); hour=j*10; k+; input(); hour=hour+j; k+; show1(k,0xca,0xb1); k=0x98; input(); minute=j*10; k+; input(); minute=minute+j; k+; show1(k,0xb7,0xd6); k=0x9b; input(); second=j*10; k+; input(); second=second+j; k+; show1(k,0xc3,0xeb) printf(Press any key to begin!nn);getch(); coutyear年endl; /*在电脑上显示预设的年月日时分秒星期*/ coutmonth月endl; coutday日endl; cout星期weekendl; couthour时endl; coutminute分endl; coutsecond秒=0) /*计数累加进位显示*/ PortWriteByte(0x28b,0x82); /*10000010 ,8255B口输入*/ PortWriteByte(0x283,0x77); /*01110111,通道1,方式3,bcd计数*/ PortWriteByte(0x280,0x00); /*写入初值1000*/ PortWriteByte(0x280,0x10); PortWriteByte(0x283,0xb1); /*10110001,通道2,方式0,bcd计数*/ PortWriteByte(0x281,0x00); /*写入初值2000*/ PortWriteByte(0x281,0x20); while(!(data&0x10) /* B4检出高电平,证明1秒过去*/ PortReadByte(0x289,&data); second+; /* 时间更新进位*/ if (second=60) minute+; if (minute=60) hour+; if (hour=24) week+; if (week=7) week=1; /* 星期数归1,而不是归0*/ day+; if (daydays(month,year) /* 调用闰年子程序,计算当月应有天数*/ month+; if (month=12) year+; month=1; /* 月份数归1,而不是归0*/ day=1; /* 天数数归1,而不是归0*/ hour=0; minute=0; second=0; coutyear年endl; /* 在电脑屏幕上显示更新后的时间日期*/ coutmonth月endl; coutday日endl; cout星期weekendl; couthour时endl; coutminute分endl; coutsecond秒endl; /* 分不同模式,进行当前时间与闹钟设定时间比较*/ if (flag=1)&(hour=scheduledhour)&(minute=scheduledminute)&(second=scheduledsecond) clock(); /* 调用蜂鸣器子程序*/ if (flag=2)&(week=scheduledweek)&(hour=scheduledhour)&(minute=scheduledminute)&(second=scheduledsecond) clock(); if (flag=3)&(year=scheduledyear)&(month=scheduledmonth)&(day=scheduledday)&(hour=scheduledhour)&(minute=scheduledminute)&(second=scheduledsecond) clock(); k=0x80; /* 调用显示子程序*/ show(year/1000,k); /* 液晶屏上显示更新后的时间日期*/ k+; show(year/100%10,k); /* 逐位分离*/ k+; show(year/10%10,k); k+; show(year%10,k); k=0x90; show(month/10,k); k+; show(month%10,k); k=0x94; show(day/10,k); k+; show(day%10,k); k=0x8a; show2(week); k=0x8c; show(hour/10,k); k+; show(hour%10,k); k=0x98; show(minute/10,k); k+; show(minute%10,k); k=0x9b; show(second/10,k); k+; show(second%10,k); /*/* 数字输入 */*/void input()byte data;printf(Press any key to begin!nn);getch();if(!Startup()/* 检查设备是否正确打开*/printf(ERROR: Open Device Error!n);return; printf(请输入数字n); while(!kbhit() PortWriteByte(0x28b,0x81);/* 初始化8255*/ PortWriteByte(0x28a,0x0f); /* 向C口低4位送1111*/ PortReadByte(0x28a,&data); /* 读取C口低4位*/ i=data; if (i!=0x0f) i=data; Sleep(50); /* 延时*/ PortWriteByte(0x28b,0x88); /* 防抖动,再次读入,初始化8255*/ PortWriteByte(0x28a,0xf0); /* 向C口高4位送1111*/ PortReadByte(0x28a,&data); /* 读取C口高4位*/ i=i|data; if (i=0x77) j=0; /* 将按键值转化为数字*/ else if(i=0x7b) j=1; else if(i=0x7d) j=2; else if(i=0x7e) j=3; else if(i=0xb7) j=4; else if(i=0xbb) j=5; else if(i=0xbd) j=6; else if(i=0xbe) j=7; else if(i=0xd7) j=8; else if(i=0xdb) j=9; else; printf(%dn,j); /* 电脑屏幕显示*/ if (k=0x8a) show2(j); /* 显示星期数,使用汉字*/ Cleanup(); return;show(j,k); Cleanup(); return; /*/* LCD显示 */*/void show(int j,int k) if(!Startup()/* 检查设备是否正确打开*/printf(ERROR: Open Device Error!n);return; PortWriteByte(0x28b,0x80);/*设8255为方式0,C口输出,A口输出*/ clear(); PortWriteByte(0x288,k); /*向A口送入字符在液晶屏上显示的地址*/ cmdsetup(); Sleep(10); /*延时*/ PortWriteByte(0x288,lcd1j); datasetup(); /*向A口送入字符机内码高位*/ PortWriteByte(0x288,lcd2j); datasetup(); /*向A口送入字符机内码低位*/ return;void show1(int k,int j1,int j2) /*在液晶屏上显示单位 */ printf(请进行下一位n);getch();coutaaaaaaaaendl;if(!Startup()printf(ERROR: Open Device Error!n);return; PortWriteByte(0x28b,0x80);/*设8255为方式0,C口输出,A口输出*/ clear(); PortWriteByte(0x288,k); cmdsetup(); Sleep(10); PortWriteByte(0x288,j1); datasetup(); PortWriteByte(0x288,j2); datasetup(); Cleanup(); return;void show2(int j) /*显示星期数,一至日 */ PortWriteByte(0x28b,0x80); clear(); PortWriteByte(0x288,k); cmdsetup(); Sleep(10); PortWriteByte(0x288,l1j); datasetup(); PortWriteByte(0x288,l2j); datasetup(); return;void showhy() /*显示欢迎界面 */ printf(Press any key to begin!nn);getch();coutaaaaaaaaendl; if(!Startup()printf(E

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论