电子时钟课程设计.docx
《电子时钟课程设计.docx》由会员分享,可在线阅读,更多相关《电子时钟课程设计.docx(15页珍藏版)》请在冰点文库上搜索。
电子时钟课程设计
湖南工程学院
课程设计
课程名称单片机原理与应用
课题名称电子时钟设计
专业
班级
学号
姓名
指导教师_李XX
2012年5月5日
湖南工程学院
课程设计任务书
课程名称单片机原理与应用
课题电子时钟设计
专业班级
学生姓名
学号
指导老师李XX
审批
任务书下达日期2011年5月5日
任务完成日期2011年5月20日
设计内容与设计要求
设计内容:
本课题以单片机为核心,利用其定时器和6位数码管,设计一个电子时钟。
要求有以下功能:
1、开机时,显示00:
00:
00的时间开始计时;
2、要求有秒,分,时的调节。
3、具有复位功能。
设计要求:
1)确定系统设计方案;
2)进行系统的硬件设计;
3)完成必要的参数计算与元器件选择;
4)完成应用程序设计;
5)进行单元电路及应用程序的调试;
6)写出使用说明书
主要设计条件
1、MCS-51单片机实验操作台1台;
2、PC机及单片机调试软件;
3、单片机应用系统板1套;
4、制作工具1套;
5、系统设计所需的元器件。
说明书格式
1.课程设计任务书
2.目录
3.说明书内容
1)课题的设计要求、目的、意义
2)系统总体方案选择与说明
3)系统结构框图与工作原理
4)各单元硬件设计说明及计算方法
5)软件设计与说明(包括流程图)
6)调试结果与必要的调试说明
7)使用说明
8)程序清单
9)总结
10)参考文献
附录
附录A系统原理图
附录B程序清单
评分表
进度安排
设计时间为两周
第一周
星期一、上午:
布置课题任务,讲课及课题介绍
下午:
借阅有关资料,总体方案讨论
星期二、确定总体设计方案
星期三、硬件模块方案设计
星期四、软件模块方案设计
星期五、各硬件模块设计
第二周
星期一、各硬件模块设计
星期二、各软件模块设计
星期三、各软件模块设计
星期四、写说明书
星期五、上午:
写说明书,整理资料
下午:
交设计资料,答辩
参考文献
[1]付家才.单片机控制工程实践技术.北京:
化学工业出版社,2004
[2]孙育才,王荣兴,孙化芳.新型AT89S52系列单片机及其应用.北京:
清华大学出版社,20
电气信息学院课程设计评分表
项目
评价
优
良
中
及格
差
设计方案合理性与创造性(10%)
开发板焊接及其调试完成情况*(10%)
硬件设计或软件编程完成情况(20%)
硬件测试或软件调试结果*(10%)
设计说明书质量(20%)
答辩情况(10%)
完成任务情况(10%)
独立工作能力(10%)
出勤情况(10%)
综合评分
指导教师签名:
________________
日期:
________________
注:
表中标*号项目是硬件制作或软件编程类课题必填内容;
此表装订在课程设计说明书的最后一页。
课程设计说明书装订顺序:
封面、任务书、目录、正文、评分表、附件(非16K大小的图纸及程序清单)。
以下为课程设计的指导书(程序及电路图全有)
程序部分:
/**************************
按下设置键对应的位(时分秒)闪烁,再按下数字键即可设置时间,设置好后按确定退出
程序可在整点提示,无闹钟设置
**************************/
#include"reg51.h"//包含51单片机头文件
#defineucharunsignedchar
#defineuintunsignedint
sbitBuzzer=P2^7;//定义喇叭接口,用于报时
uintsec;//秒寄存器
uintmin=0;//分寄存器
uinthour=0;//小时寄存器
uinttcnt;//计数器值
uintcursor=0;
uchara=0xff;
uchartempkey,num,numclear;
ucharcodeSeg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管显示0-9的对应P0输出的16进制代码
uintcodetab[3][4]={{'1','2','3','4'},
{'5','6','7','8'},
{'9','0','S','Q'}
};//矩阵(3行4列)表示0到F的16个键值
voiddelay(uintt)//延时函数
{
uinti;
while(t--)
{for(i=0;i<125;i++);}
}
voidTdelay(unsignedinti)//短时间延时函数
{
while(i--);
}
voidKdelay()//长时间延时函数
{
uchari,j;
for(i=100;i>0;i--)
for(j=248;j>0;j--);
}
voiddisplay(ucharL9,ucharL10,ucharL11,ucharL12,ucharL13,ucharL14)//数码管显示函数,L9-L14分别为1-6个数码管显示的值即:
时分秒
{
//P2=0xFF;
if(cursor==3){P1=0x7F|a;P0=L9;delay
(1);}else{P1=0x7F;P0=L9;delay
(1);}//hour
if(cursor==3){P1=0xBF|a;P0=L10;delay
(1);}else{P1=0xBF;P0=L10;delay
(1);}//hour
if(cursor==2){P1=0xDF|a;P0=L11;delay
(1);}else{P1=0xDF;P0=L11;delay
(1);}//min
if(cursor==2){P1=0xEF|a;P0=L12;delay
(1);}else{P1=0xEF;P0=L12;delay
(1);}//min
if(cursor==1){P1=0xF7|a;P0=L13;delay
(1);}else{P1=0xF7;P0=L13;delay
(1);}//sec
if(cursor==1){P1=0xFB|a;P0=L14;delay
(1);}else{P1=0xFB;P0=L14;delay
(1);}//sec
}
charkbscan()//键盘扫描函数,若有按键函数将返回键值
{
unsignedcharhang,lie,key;
if(P3!
=0x0f)//0x0f==00001111,此处扫描是否有按键按下
delay(5);//延时用于按键消抖
if(P3!
=0x0f)
{
switch(P3&0x0f)//分析按键“列”值(矩阵键盘有行列之分)
{
case0x0e:
lie=0;break;//0x0e==00001110
case0x0d:
lie=1;break;//0x0d==00001101
case0x0b:
lie=2;break;//0x0b==00001011
case7:
lie=3;break;
}
P3=0xf0;
P3=0xf0;
switch(P3&0xf0)//分析按键“行”值
{
case0xe0:
hang=0;break;//0xe0==11100000
case0xd0:
hang=1;break;//0xd0==11010000
case0xb0:
hang=2;break;//0xb0==10110000
}
P3=0x0f;
while(P3!
=0x0f);//等待按键松开
key=tab[hang][lie];
}
else
key=0;
return(key);//键值返回给函数
}
voidSetTime1()//此定时器增加数码管动态闪烁
{
//----------定时器用1
TMOD|=0x20;//使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH1=(65536-50000)/256;//50毫秒
TL1=(65536-50000)%256;//给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
EA=1;//总中断打开
ET1=1;//定时器中断打开
TR1=1;//定时器开关打开
}
main()
{
unsignedchartemp,str[32];
TMOD=0x02;//设置模式为定时器T0的模式2(8位自动重装计数初值的计数值)
TH0=0x06;//设置计数器初值高位,靠TH0存储重装的计数值X0=256-250=6
TL0=0x06;//设置计数器初值低位
TR0=1;//启动T0
ET0=1;//开启定时器T0中断允许
EA=1;//开启中断总控制
P3=0x0f;//给P3口付初值0x0f==00001111,以便按键扫描
num=0;
Buzzer=0;//关闭蜂鸣器
while
(1)
{
if(min==0&&sec<1)Buzzer=1;elseBuzzer=0;//到整点蜂鸣器响
temp=kbscan();//扫描是否有按键操作
if(temp!
=0)
{
if(temp=='S')//判断按键是“设置键”
{
delay
(1);
if(temp=='S')//防抖动
{
++cursor;
if(cursor>3){cursor=0;TR0=1;TR1=0;}//cursor=1-3分别为设置秒、分、时3种状态
}
}
if(cursor==0&&temp=='Q'){min=0;sec=0;hour=0;}//非设置状态下按下“确定、复位”键清零时间
if(temp=='Q')//判断按键为“确定”键:
在设置时间状态下按下此键为确定设置完毕
{
delay
(1);
if(temp=='Q')
{
for(numclear=0;numclear<32;numclear++)//全部写零
{
str[numclear]=0;
}
if(min>=60)
{
min=0;
}
if(hour>=24)
{
hour=0;
}
cursor=0;
TR0=1;
TR1=0;
}
}
if(cursor!
=0&&temp!
='S'&&temp!
=0)//设置状态下改变时间
{
delay
(1);
if(cursor!
=0&&temp!
='S'&&temp!
=0)
{
TR0=0;
if(cursor==1){sec=temp-48;str[++num]=sec;sec=str[num-1]*10+sec;SetTime1();}
if(cursor==2){min=temp-48;str[++num]=min;min=str[num-1]*10+min;SetTime1();}
if(cursor==3){hour=temp-48;str[++num]=hour;hour=str[num-1]*10+hour;SetTime1();}
}
}
}
display(Seg[hour/10],Seg[hour%10],Seg[min/10],Seg[min%10],Seg[sec/10],Seg[sec%10]);//显示时间到数码管上
}
}
voidt0(void)interrupt1using0//t0的中断程序,用于时间运作
{
tcnt++;
if(tcnt==4000)//定时器的定时计数,4000次250us为1秒
{
tcnt=0;
a=~a;
sec++;
if(sec>=60)
{
sec=0;
min++;
if(min>=60)
{
min=0;
hour++;
if(hour>=24)
{
hour=0;
}
}
}
}
}
voidTime_1()interrupt3using1//中断处理函数,用于在设置时间时数码管闪烁
{
staticunsignedintn=0;
n++;
if(n==500)
{
n=0;
a=~a;
}
}
电路图(protus仿真图):