单片机8279电子日历课程设计报告.docx
- 文档编号:4280396
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:18
- 大小:240.14KB
单片机8279电子日历课程设计报告.docx
《单片机8279电子日历课程设计报告.docx》由会员分享,可在线阅读,更多相关《单片机8279电子日历课程设计报告.docx(18页珍藏版)》请在冰豆网上搜索。
单片机8279电子日历课程设计报告
湖南科技大学
信息与电气工程学院
《单片机课程设计报告》
题目:
电子日历
专业:
电子信息工程
班级:
2班
姓名:
ABC
学号:
**********
指导教师:
***
任务书
题目
电子日历
时间安排
2012年6月11——6月22日(第17、18周)
目的:
通过《单片机原理与应用》这门课的课程设计,学生应能对MCS-51单片机有一个全面的认识,掌握以MCS-51单片机为核心的电子电路的设计方法和应用技术。
1.进一步掌握8279键盘显示电路的编程方法。
2.进一步掌握定时器的使用和编程方法。
3.进一步掌握中断处理程序的编程方法。
要求:
(1)利用8031作为主控器组成一个电子日历和电子钟。
(2)利用LED分别显示当前时间和日历。
(3)利用尽可能少的开关实现:
校正日历和时间。
总体方案实现:
用8031作为主控制器,并采用8279作为辅助芯片,控制键盘、LED数码管等的操作和显示。
指导教师评语:
评分等级:
()
指导教师签名:
一、课程设计的目的
通过《单片机原理与应用》这门课的课程设计,学生应能对MCS-51单片机有一个全面的认识,掌握以MCS-51单片机为核心的电子电路的设计方法和应用技术。
1.进一步掌握8279键盘显示电路的编程方法。
2.进一步掌握定时器的使用和编程方法。
3.进一步掌握中断处理程序的编程方法。
二、实验要求
(1)利用8031作为主控器组成一个电子日历和电子钟。
(2)利用LED分别显示当前时间和日历。
利用实验机上提供的8279键盘电路,数码显示电路,设计一个电子钟(日历),用小键盘控制电子钟(日历)的启停及初始值的预值。
电子钟做成如下两种格式(按F键两种格式可以切换):
XX-XX-XX由左向右分别为:
时、分、秒
XX-XX-XX由左向右分别为:
年、月、日
1.C键:
清除,显示00-00-00。
2.A键:
启动,电子钟(日历)计时。
3.D键:
停止,电子钟(日历)停止计时。
4.B键:
设置初值:
由左向右依次输入预置的时、分、秒(年、月、日)值,同时应具有判断输入错误的能力,若输入有错,则显示:
00-00-00按B键即可重新输入预置值:
5.F键:
实现电子钟和日历的切换。
6.E键:
程序退出。
三、设计方案的描述
本实验采用8031作为主控制器,并采用8279作为辅助芯片,控制键盘、LED数码管等的操作和显示。
8279主要特点:
(1)、可同时进行键盘扫描及文字显示;
(2)、键盘扫描模式(ScannedKeyboardMode);
(3)、传感器扫描模式(ScannedSensorMode);
(4)、激发输入模式(StrobeInputEntryMode);
(5)、8乘8键盘FIFO(先进先出);
(6)、具有接点消除抖动,2键锁定及N键依此读出模式;
(7)、双排8位数或双排16位数的显示器;
(8)、右边进入或左边进入。
16位字节显示存储器。
8031芯片图如下:
8279芯片:
四、硬件原理图
硬件原理图如下:
PCB图如下:
五、基本原理说明
8279显示部分按扫描的方式工作。
可以显示8或16位LED显示块。
8279电路工作原理:
1.I/O控制及数据缓冲器
数据缓冲器是双向缓冲器,连接内、外总线,用于传送CPU和8279之间的命令或数据;I/O控制线是
CPU对8279进行控制的引线。
CS是8279的片选信号,CS=0时,8279才被允许读出或写入信息。
WR、RD为来自
CPU的控制信号。
A0用于区别信息特性:
A0=1时,表示数据缓冲器输入为指令、输出为状态字;A=0时,输入、输出皆为数据。
2.控制与定时寄存器及定时控制
控制与定时寄存器用来寄存键盘及显示的工作方式,以及由CPU编程的其它操作方式。
这些寄存器一旦接受并锁存送来的命令,就通过译码产生相应的信号,从而完成相应的控制功能。
定时控制包含基本记数键。
首级计数器是一个可编程的N级计数器。
N可以2~31之间由软件编程,以便
从外界时钟CLK分频得到内部所需要的100KHZ时钟。
然后再经过分频为键盘扫描提供适当的逐行扫描频率和显示扫描时间。
3.扫描计数器
扫描计数器有两种工作方式。
按编码方式工作时,计数器作二进制记数。
4位记数状态从扫描线SL0~SL3
输出,经外部译码器译码后,为键盘和显示器提供扫描线;按译码方式工作时,扫描计数器的最低二位被译码后,从SL0~SL3输出。
因此,SL0~SL3提供了4中取1的扫描译码。
4.回复缓冲器、键盘去抖及控制
来自RL0~RL3的8根回复线的回复信号,由回复缓冲器缓冲并锁存。
在键盘工作方式中,回复线作为行列式键盘的行列输入线。
在逐行列输入时,在逐行列扫描时,回复线用来搜索每一行列中闭合的键。
当某一键闭合时,去抖电路被置位,延时等待10ms后,再检验该键是否继续闭和,并将该键的地址和附加的移位、控制状态一起形成键盘数据被送入8279内部FIFO(先进先出)存储器。
键盘数据格式如下:
D7D6D5D4D3D2D1D0
控制
移位
扫描
回复
控制和移位(D6、D7)的状态由两个独立的附加开关决定,而扫描(D5、D4、D3)和回复(D2、D1、D0)则是被按键置位的数据。
D5、D4、D3来自动扫描计数器,是按下键的行列编码,而(D7D7D7)则来自行/列计数器,它们是根据回复信号而确定的行/列编码。
在传感器开关状态矩阵方式中,回复线的内容直接被送往和相应的传感器RAM(即FIFO存储器)。
在选通输入方式中,回复线的内容在CNTL/STB线的脉冲上升沿被送入FIFO存储
5.FIFO/传感器及其状态寄存器
FIFO/传感器RAM是一个双重功能的8×8RAM。
在键盘或选通方式工作时,它是FIFO存储器,其输入或读出遵循先入先出的原则。
FIFO状态寄存器用于存放FIFO的工作状态。
例如,RAM是满还是空;其中存有多少数据;是否操作出错等。
当FIFO存储器不空,状态逻辑将产生IRQ=1信号向CPU申请中断。
在传感器矩阵方式工作时,这个存储器以是传感器不是存储器。
它存放着传感器矩阵中的每一个传感器状态。
在此方式中,若检索出传感器的变化,IRQ信号变为高电平,向CPU申请中断。
6.显示RAM和显示地址寄存器
显示RAM用来存储显示数据。
容量为16×8位。
在显示过程中,存储的显示数据轮流从显示寄存器输出。
显示寄存器分别为A、B两组,OUTA0~3和OUTB0~3可以单独送数,也可以组成一个8位的字。
显示寄存器的输出与显示扫描配合,不断从显示RAM中读出显示数据,同时轮流驱动被选中的显示器件,以达到多路复用的目的,使显示器件呈现稳定的显示状态。
显示地址寄存器用来寄存由CPU进行读/写显示RAM的地址,它可以由命令设定,也可以设置成每次读写或写入之后自动递减。
六、程序流程图
七、源程序清单
//---8279键盘显示实验(电子秒表)---
/******************************************************************************
利用实验机上提供的8279键盘电路,数码显示电路,设计一个电子钟(日历),用小键盘控制电子钟(日历)的启停及初始值的预值。
电子钟做成如下两种格式(按F键两种格式可以切换):
XX-XX-XX由左向右分别为:
时、分、秒
XX-XX-XX由左向右分别为:
年、月、日
1.C键:
清除,显示00-00-00.
2.A键:
启动,电子钟(日历)计时
3.D键:
停止,电子钟(日历)停止计时
4.B键:
设置初值:
由左向右依次输入预置的时、分、秒(年、月、日)值,同时应具有判断输入错误的能力,若输入有错,则显示:
00-00-00按B键即可重新输入预置值:
5.F键:
实现电子钟和日历的切换
5.E键:
程序退出。
******************************************************************************/
//-----头文件引用------
#include
#include
#include
//-----宏声明-----
#defineD8279XBYTE[0xF238]//8279数据口地址
#defineC8279XBYTE[0xF239]//8279状态/命令口地址
#defineucharunsignedchar
#defineuintunsignedint
#defineTimeDisp1
#defineDateDisp0
//-----变量定义-----
ucharidatatime[]={0,0,0,12};//10毫秒,秒,分,十
ucharidataday[3]={18,6,8};
ucharidatadiss[8]={0x20,0x20,0,0,0,0,0,0};//显示缓冲区
ucharcodeledseg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5E,0x79,0x71,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,
0xFF,0xEF,0xF7,0xFC,0xB9,0xDE,0xF9,0xF1,0x00,0x40};//LED显示常数表
bitbdatasbz,wbz,kbz;//定义秒标志、键值合法标志、读键标志
bitbdataflag=TimeDisp;
//-----取键值函数-----
uchargetkey()
{ucharkey;
if((C8279&0x07)==0x00)
{kbz=0;}
//无键按下,置标志
else
{
kbz=1;
C8279=0x40;//读FIFORAM命令
key=D8279;
key=(key&0x3f);//取键盘数据低6位
return(key);
}
}
//-----显示函数-----
voiddisled(d)
ucharidata*d;
{
uchari;C8279=0x90;
for(i=0;i<8;i++)
{
C8279=i+0x80;
D8279=ledseg[*d];
d++;
}
}
//-----显示缓冲区内容显示-----
voiddisp(void)
{
disled(diss);
}
//----8279初始化子程序-----
voidinit8279()
{
C8279=0;//置8279工作方式
C8279=0x2f;//置键盘扫描速率
C8279=0xc1;//清除LED显示
//while(com&0x80);//等待清除结束
}
//-----毫秒显示-----
voiddisms()
{
diss[0]=time[0]%10;
diss[1]=time[0]/10;
disp();
}
//-----显示处理-----
voiddisplay()
{
if(flag==1)
{diss[0]=time[1]%10;
diss[1]=time[1]/10;
diss[2]=33;
diss[3]=time[2]%10;
diss[4]=time[2]/10;
diss[5]=33;
diss[6]=time[3]%10;
diss[7]=time[3]/10;
}
else
{
diss[0]=day[0]%10;
diss[1]=day[0]/10;
diss[2]=33;
diss[3]=day[1]%10;
diss[4]=day[1]/10;
diss[5]=33;
diss[6]=day[2]%10;
diss[7]=day[2]/10;
}
disp();
}
//-----初始化-----
voidfirst(void)
{
init8279();//初始化8279
sbz=1;//标志
TMOD=0x10;
TH1=0xdc;//10毫秒的时间常数
TL1=0x00;
disms();
ET1=1;EA=1;//允许中断
}
//-----INT_T1中断服务子程序-----
voidInt_T1(void)interrupt3
{
TR1=0;
TH1=0xdc;//10毫秒定时常数
TL1=0x00;
TR1=1;
time[0]=time[0]+1;//10毫秒数加1
if(time[0]==100)//判断10毫秒=100
{
time[0]=0;
sbz=1;//置秒标志
}
//disms();
if(time[0]==0)
{
time[1]=time[1]+1;//秒加1
if(time[1]==60)//判断秒=60
{
time[1]=0;
time[2]=time[2]+1;//分加1
if(time[2]==60)//判断分=60
{
time[2]=0;
time[3]=time[3]+1;//时加1
if(time[3]==24)//判断时=23
{
time[3]=0;
day[0]+=1;
if(day[0]==30)
{
day[0]=0;
day[1]+=1;
if(day[1]==12)
{
day[1]=0;
day[2]++;
}
}
}
}
}
}
}
//-----读数子程序-----
voidgetword()
{
uchari;
for(i=8;i>0;i--)
{
do
{
getkey();//读键盘
}
while(kbz==0);//无键输入,则再读
if((getkey()>9)||(getkey()<0))//判断输入是否大于9,小于0
{
wbz=0;//置非法输入标志
return;
}
else
{
wbz=1;//置合法输入标志
if((i==6)||(i==3))
{
i--;
diss[i-1]=getkey();
disp();//显示输入的字符
}
else
{
diss[i-1]=getkey();
disp();//显示输入的字符
}
}
}
}
//-----时间清零子程序-----
voidcleart()
{
TR1=0;//关计数器
time[0]=0;//10毫秒清零
time[1]=0;//秒清零
time[2]=0;//分钟清零
time[3]=0;//小时清零
disms();//显示毫秒
sbz=1;//置秒标志
}
//-----设置初值子程序-----
voidsett()
{
getword();//读数
if(wbz==1)//判断输入合法性
{if(flag==1)
{
time[3]=(diss[7]*10+diss[6]);
if(time[3]<24)//判断输入小时值<24
{
time[2]=(diss[4]*10+diss[3]);
if(time[2]<60)//判断输入分钟数<60
{
time[1]=(diss[1]*10+diss[0]);
if(time[1]<60)//判断输入秒值<60
{
;
}
else
{
cleart();
}//时间清零
}
else
{
cleart();
}//时间清零
}
else
{
cleart();
}//时间清零
}
else
{
day[2]=(diss[7]*10+diss[6]);
if(day[2]<32)//判断输入小时值<24
{
day[1]=(diss[4]*10+diss[3]);
if(day[1]<13)//判断输入分钟数<60
{
day[0]=(diss[1]*10+diss[0]);
if(day[0]<100)//判断输入秒值<60
{
;
}
else
{
cleart();
}//时间清零
}
else
{
cleart();
}//时间清零
}
else
{
cleart();
}//时间清零
}
}
else
{
cleart();
}//时间清零
display();//显示时间
}
//-----主程序-----
voidmain()
{
uintcounter=0;first();//初始化
while
(1)//循环
{
counter++;
if(counter==10000)
{//flag=!
flag;
counter=0;
}
getkey();//读键盘
if(kbz==1)//判断是否有键输入
{
switch(getkey())
{
case0x0c:
cleart();//输入键是'C',转CLEART
break;
case0x0a:
TR1=1;//输入键是'A',电子钟计时
break;
case0x0d:
TR1=0;//输入键是'D',电子钟停止计时
break;
case0x0b:
TR1=0;//输入键是'B',转SETT
sett();
break;
case0x0e:
_nop_();//输入键是'E',
case0x0f:
flag=!
flag;
break;
while
(1)//等待回到监控
{}
}
}
else
if(sbz==1)
{display();//显示时间
sbz=0;//清标志
}
}
}
八、心得体会
通过这次单片机电子日历的课程设计,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。
创新可以是在原有的基础上进行改进,使之功能不断完善,成为真己的东西。
这个设计过程中,我们通过在原有的系统进行了改进,使之增添了年、日等的三个显示功能,使之成为一个更加适用,功能更加完备的属于自己的一个日历系统。
设计结果能够符合题意,成功完成了此次实习要求,我们不只在乎这一结果,更加在乎的,是这个过程。
这个过程中,我们花费了大量的时间和精力,更重要的是,我们在学会创新的基础上,同时还懂得合作精神的重要性,学会了与他人合作。
收获颇多,达到了实验的目的。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 8279 电子 日历 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)