《智能仪表课程设计》设计报告
课题名称 数字电子时钟
姓名 杨磊
学号 081302138
班级名称 测控0801
指导教师 唐鸿儒 黄亚忠
扬州大学能源与动力工程学院
二〇一一年九月
目录
0.任务书--------------------------------------------------------1~2
1.仪表的功能要求及性能指标-------------------------------3
2.硬件设计
2.1 MCS-51单片机------------------------------------------4~5
2.2LED驱动芯片ZLG7290--------------------------------5~7
3.软件设计
3.1软件设计功能需求--------------------------------------8
3.2 软件设计框图------------------------------------------9~12
4.设计实物图---------------------------------------------------13
5.课程设计总结------------------------------------------------14~15
6.附录:
6.1参考文献------------------------------------------------16
6.2器件清单------------------------------------------------16
6.3设计程序-------------------------------------------------17~42
《智能仪表课程设计》任务书
一、课题名称
时钟设计
二、设计内容及设计要求
1)由2个4位型数码管组成,分别显示时,分,秒,可以切换显示年,月,日以及星期
2)能够随时对时间日期进行调整
3)能够随时输入定时闹钟
4)定时时间到,闹钟发出信号
5)具有整点报时功能
6)闹钟提醒信号为断续形式,时间为1分钟
三、时间安排
第一周:
星期一~星期二:布置任务,熟悉资料,确定仪表的功能要求、性能指标。熟悉实验板原理图和印刷板图。
星期三~星期五:进行仪表的方案选择,确定主要芯片、工作方式、输入输出信号的接口方式、键盘和显示方式、以及通信方式。进行硬件设计和元器件选择,画出硬件原理图。
第二周:
星期一~星期五:根据硬件原理图,焊接硬件电路;测试硬件电路的功能;软件设计,包括软件需求说明、软件结构框图、主要软件功能模块的流程图;编写程序。
第三周:
星期一~星期三:调试程序,联调软件和硬件。
星期四~星期五:写课程设计报告。
四、应交成果
应交成果包括:
n 纸质课程设计报告和电子文档;
n 硬件原理图的Protel文件,程序;
n 可以演示的硬件和软件成果
1仪表的功能要求、性能指标要求
1.1 初级要求:
1)用单片机的定时器产生1s的定时时间,作为秒计数时间
2)当1s产生时,秒计数加1,到60s时归0并向分钟进1,分钟到60时归0并向时进1,时到24时归0并向日进1,日通过计算当时月份进行计数
3)开机时,显示00-00-00,并开始计时。闹钟初始设置为00-00-00,日期为11-9-15-5,并开始计时。
1.2 中级要求
在以上基础上,在单片机的p1.0--p1.3加入4个键
1)p1.0 时间设置键,按一次对时进行校对,按第二次对分进行校对,第三次对秒进行校对,再按一下正常显示。
2)P1.1 闹钟及日期设置键,按下后开始对闹钟进行设置,按一,二,三次分别是对时,分,秒进行设置四,五,六,七次分别是对年,月,日,星期进行设置,再次按下恢复正常显示时间。
3)P1.2 加键,时间设置或者闹铃设置时加键,每按一次加一。
4)P1.3 显示切换键,在时间正常显示时,按下一次后,切换为显示日期,再次按下则显示时间。
2硬件设计
2.1 MCS-51单片机
MCS-51单片机的内部总体结构其基本特性如下:8位CPU、片内振荡器、4k字节ROM、128字节RAM、21个特殊功能寄存器、32根I/O线、可寻址的64k字节外部数据、程序存贮空间、2个16位定时器、计数器中断结构:具有二个优先级、五个中断源一个全双口串行口位寻址(即可寻找某位的内容)功能,适于按位进行逻辑运算的位处理器。除128字节RAM、4k字节ROM和中断、串行口及定时器模块外,还有4组I/O口P0~P3,余下的就是CPU的全部组成。把4kROM换为EPROM就是8751的结构,如去掉ROM/EPROM部分即为8031,如果将ROM置换为Flash存贮器或EEPROM,或再省去某些I/O,即可得到51系列的派生品种,如89C51、AT89C2051等单片机。单片机各部分是通过内部的总线有机地连接起来的。
1、运算器 运算器以完成二进制的算术/逻辑运算部件ALU为核心,再加上暂存器TMP、累加器ACC、寄存器B、程序状态标志寄存器PSW及布尔处理器。
2、控制器 控制器是CPU的神经中枢,它包括定时控制逻辑电路、指令寄存器、译码器、地址指针DPTR及程序计数器PC、堆栈指针SP等。这里程序计数器PC是由16位寄存器构成的计数器。要单片机执行一个程序,就必须把该程序按顺序预先装入存储器ROM的某个区域。单片机动作时应按顺序一条条取出指令来加以执行。
3、存储器是单片机的又一个重要组成部分,每个存储单元对应一个地址,如256个单元共有256个地址,用两位16进制数表示,即存储器的地址(00H~FFH)。
2.2LED驱动芯片ZLG7290B
ZLG7290B 是广州周立功单片机发展有限公司自行设计的数码管显示驱动及键盘扫描管理芯片。能够直接驱动8 位共阴式数码管(或64 只独立的LED),同时还可以扫描管理多达64 只按键。其中有8 只按键还可以作为功能键使用,就像电脑键盘上的Ctrl、Shift、Alt 键一样。另外ZLG7290B 内部还设置有连击计数器,能够使某键按下后不松手而连续有效。采用I2C 总线方式,与微控制器的接口仅需两根信号线。该芯片为工业级芯片,抗干扰能力强,在工业测控中已有大量应用。
附:ZLG7290B 引脚功能表
引脚序号 引脚名称 功能描述
1 SC/KR2 数码管c 段/键盘行信号2
2 SD/KR3 数码管d 段/键盘行信号3
3 DIG3/KC3 数码管位选信号3/键盘列信号3
4 DIG2/KC2 数码管位选信号2/键盘列信号2
5 DIG1/KC1 数码管位选信号1/键盘列信号1
6 DIG0/KC0 数码管位选信号0/键盘列信号0
7 SE/KR4 数码管e 段/键盘行信号4
8 SF/KR5 数码管f 段/键盘行信号5
9 SG/KR6 数码管g 段/键盘行信号6
10 DP/KR7 数码管dp 段/键盘行信号7
11 GND 接地12 DIG6/KC6 数码管位选信号6/键盘列信号6
13 DIG7/KC7 数码管位选信号7/键盘列信号7
14 INT 键盘中断请求信号,低电平(下降沿)有效
15 RST 复位信号,低电平有效
16 Vcc 电源,+3.3~5.5V
17 OSC1 晶振输入信号
18 OSC2 晶振输出信号
19 SCL I2C 总线时钟信号
20 SDA I2C 总线数据信号
21 DIG5/KC5 数码管位选信号5/键盘列信号5
22 DIG4/KC4 数码管位选信号4/键盘列信号4
23 SA/KR0 数码管a 段/键盘行信号0
24 SB/KR1 数码管b 段/键盘行信号1
总设计框图
3软件设计
3.1软件设计功能需求
1)用单片机的定时器产生1s的定时时间,作为秒计数时间
2)当1s产生时,秒计数加1,到60s时归0并向分钟进1,分钟到60时归0并向时进1,时到24时归0并向日进1,日通过计算当时月份进行计数
3)开机时,显示00-00-00,并开始计时。闹钟初始设置为00-00-00,日期为11-9-05,并开始计时。
3.2主要功能模块的软件框图。
T0中断服务
键盘扫描程序
时钟计时框图
总设计框图
4.实物图
5.课程设计总结
通过此次课程设计,使我更加扎实的掌握了有关单片机方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。
过而能改,善莫大焉。在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于游逆而解。在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!
课程设计诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门辩思课,给了我许多道,给了我很多思,给了我莫大的空间。同时,设计让我感触很深。使我对抽象的理论有了具体的认识。通过这次课程设计,我掌握了常用元件的识别和测试;熟悉了常用仪器、仪表;了解了电路的连线方法;以及如何提高电路的性能等等,掌握了焊接的方法和技术,通过查询资料,也了解了数字时钟的构造及原理。
我认为,在这学期的实验中,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。更重要的是,在实验课上,我们学会了很多学习的方法。而这是日后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。这对于我们的将来也有很大的帮助。以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。就像中国提倡的艰苦奋斗一样,我们都可以在实验结束之后变的更加成熟,会面对需要面对的事情。
回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,但可喜的是最终都得到了解决。
实验过程中,也对团队精神的进行了考察,让我们在合作起来更加默契,在成功后一起体会喜悦的心情。果然是团结就是力量,只有互相之间默契融洽的配合才能换来最终完美的结果。
此次设计也让我明白了思路即出路,有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识,收获颇丰。
6.附录
6.1参考文献
《单片机电路设计分析与制作》 机械工业出版社 周景润
《单片机系统设计与应用实例》 机械工业出版社 韩志军
6.2 器件清单
ZLG7290
STC89C51单片机
MAX232
4位数码管2个
按钮4个
面板
蜂鸣器
导线若干
电阻,电容若干
6.3 源程序
#include <reg52.h>
#include "I2C.h"
#include "ZLG7290.h"
#define tl 0xba;
#define th 0x3c;
sbit time=P1^0; //时间设置
sbit timer=P1^1; //闹钟设置
sbit add=P1^2; //加
sbit dec=P1^3; //减
sbit speaker=P3^5; //闹钟输出
bit disp_sd; //数码管闪动显示标志位
bit disp_ms; //数码管显示时间/闹钟标志位
bit disp_sdt; //数码管闪动间隔反转标志位
bit zhengdian=0; //整点报时标志位
bit b=0,a=0;
unsigned char time_cc,timer_cc; //调时计数器
unsigned char count0,count1,second,minit,hour; //时间时分秒
unsigned char second1,minit1,hour1; //闹钟时分秒
unsigned char year,month,day,week,n;
unsigned char hour_zd; //整点小时记录
void delay(void)
{
unsigned int i;
for(i=0;i<200;i++);
}
/*
函数:SystemInit()
功能:系统初始化
*/
void SystemInit()
{
I2C_Init();
TMOD = 0x01;
Delay(); //等待ZLG7290复位完毕
}
void display(void)
{
unsigned dat;
if(a==0)
{
if(disp_ms==0)
{
if(disp_sd==0)
{
dat=hour/10;
ZLG7290_Download(7,0,0,dat);
dat=hour%10;
ZLG7290_Download(6,0,0,dat);
ZLG7290_Download(5,0,0,31);
dat=minit/10;
ZLG7290_Download(4,0,0,dat);
dat=minit%10;
ZLG7290_Download(3,0,0,dat);
ZLG7290_Download(2,0,0,31);
dat=second/10;
ZLG7290_Download(1,0,0,dat);
dat=second%10;
ZLG7290_Download(0,0,0,dat);
}
else
{
if(time_cc==0x01)
{
dat=hour/10;
ZLG7290_Download(7,0,1,dat);
dat=hour%10;
ZLG7290_Download(6,0,1,dat);
ZLG7290_Download(5,0,0,31);
}
else
{
dat=hour/10;
ZLG7290_Download(7,0,0,dat);
dat=hour%10;
ZLG7290_Download(6,0,0,dat);
ZLG7290_Download(5,0,0,31);
}
if(time_cc==0x02)
{
dat=minit/10;
ZLG7290_Download(4,0,1,dat);
dat=minit%10;
ZLG7290_Download(3,0,1,dat);
ZLG7290_Download(2,0,0,31);
}
else
{
dat=minit/10;
ZLG7290_Download(4,0,0,dat);
dat=minit%10;
ZLG7290_Download(3,0,0,dat);
ZLG7290_Download(2,0,0,31);
}
if(time_cc==0x03)
{
dat=second/10;
ZLG7290_Download(1,0,1,dat);
dat=second%10;
ZLG7290_Download(0,0,1,dat);
}
else
{
dat=second/10;
ZLG7290_Download(1,0,0,dat);
dat=second%10;
ZLG7290_Download(0,0,0,dat);
}
}
}
else
{
if(b==0)
{
if(disp_sd==0)
{
dat=hour1/10;
ZLG7290_Download(7,0,0,dat);
dat=hour1%10;
ZLG7290_Download(6,0,0,dat);
ZLG7290_Download(5,0,0,31);
dat=minit1/10;
ZLG7290_Download(4,0,0,dat);
dat=minit1%10;
ZLG7290_Download(3,0,0,dat);
ZLG7290_Download(2,0,0,31);
dat=second1/10;
ZLG7290_Download(1,0,0,dat);
dat=second1%10;
ZLG7290_Download(0,0,0,dat);
}
else
{
if(timer_cc==0x01)
{
dat=hour1/10;
ZLG7290_Download(7,0,1,dat);
dat=hour1%10;
ZLG7290_Download(6,0,1,dat);
ZLG7290_Download(5,0,0,31);
}
else
{
dat=hour1/10;
ZLG7290_Download(7,0,0,dat);
dat=hour1%10;
ZLG7290_Download(6,0,0,dat);
ZLG7290_Download(5,0,0,31);
}
if(timer_cc==0x02)
{
dat=minit1/10;
ZLG7290_Download(4,0,1,dat);
dat=minit1%10;
ZLG7290_Download(3,0,1,dat);
ZLG7290_Download(2,0,0,31);
}
else
{
dat=minit1/10;
ZLG7290_Download(4,0,0,dat);
dat=minit1%10;
ZLG7290_Download(3,0,0,dat);
ZLG7290_Download(2,0,0,31);
}
if(timer_cc==0x03)
{
dat=second1/10;
ZLG7290_Download(1,0,1,dat);
dat=second1%10;
ZLG7290_Download(0,0,1,dat);
}
else
{
dat=second/10;
ZLG7290_Download(1,0,0,dat);
dat=second%10;
ZLG7290_Download(0,0,0,dat);
}
}
}
else
{
if(disp_sd==0)
{
dat=year/10;
ZLG7290_Download(7,0,0,dat);
dat=year%10;
ZLG7290_Download(6,0,0,dat);
dat=month/10;
ZLG7290_Download(5,0,0,dat);
dat=month%10;
ZLG7290_Download(4,0,0,dat);
dat=day/10;
ZLG7290_Download(3,0,0,dat);
dat=day%10;
ZLG7290_Download(2,0,0,dat);
ZLG7290_Download(1,0,0,31);
dat=week;
ZLG7290_Download(0,0,0,dat);
}
else
{
if(timer_cc==0x04)
{
dat=year/10;
ZLG7290_Download(7,0,1,dat);
dat=year%10;
ZLG7290_Download(6,0,1,dat);
}
else
{
dat=year/10;
ZLG7290_Download(7,0,0,dat);
dat=year%10;
ZLG7290_Download(6,0,0,dat);
}
if(timer_cc==0x05)
{
dat=month/10;
ZLG7290_Download(5,0,1,dat);
dat=month%10;
ZLG7290_Download(4,0,1,dat);
}
else
{
dat=month/10;
ZLG7290_Download(5,0,0,dat);
dat=month%10;
ZLG7290_Download(4,0,0,dat);
}
if(timer_cc==0x06)
{
dat=day/10;
ZLG7290_Download(3,0,1,dat);
dat=day%10;
ZLG7290_Download(2,0,1,dat);
}
else
{
dat=day/10;
ZLG7290_Download(3,0,0,dat);
dat=day%10;
ZLG7290_Download(2,0,0,dat);
}
if(timer_cc==0x07)
{
ZLG7290_Download(1,0,0,31);
dat=week;
ZLG7290_Download(0,0,1,dat);
}
else
{
ZLG7290_Download(1,0,0,31);
dat=week;
ZLG7290_Download(0,0,0,dat);
}
}
}
}
}
else
{
dat=year/10;
ZLG7290_Download(7,0,0,dat);
dat=year%10;
ZLG7290_Download(6,0,0,dat);
dat=month/10;
ZLG7290_Download(5,0,0,dat);
dat=month%10;
ZLG7290_Download(4,0,0,dat);
dat=day/10;
ZLG7290_Download(3,0,0,dat);
dat=day%10;
ZLG7290_Download(2,0,0,dat);
ZLG7290_Download(1,0,0,31);
dat=week;
ZLG7290_Download(0,0,0,dat);
}
}
void key_scan(void)
{
unsigned int i;
if(time==0)
{
speaker=1;
for(i=0;i<10;i++)
display();
if(time==0)
{
TR0=0;
do
display();
while(time==0);
disp_sd=1;
disp_ms=0;
time_cc++;
if(time_cc==4)
{
TR0=1;
time_cc=0;
disp_sd=0;
}
}
}
if(timer==0)
{
speaker=1;
for(i=0;i<10;i++)
{
display();
}
if(timer==0)
{
do
display();
while(timer==0);
disp_sd=1; //数码管闪动显示
disp_ms=1; //显示模式为闹钟时间
timer_cc++;
if(timer_cc==4)
{b=1;}
if(timer_cc==8)
{
b=0;
timer_cc=0;
disp_sd=0; //闪动关闭
disp_ms=0; //切换到时间模式
}
}
}
if(dec==0)
{
for(i=0;i<10;i++)
{
display();
}
do
display();
while(dec==0);
a=~a;
}
if(add==0)
{
for(i=0;i<10;i++)
{
display();
}
if(add==0)
{
do
display();
while(add==0);
if(disp_ms==0)
{
switch(time_cc)
{
case (0x01): { hour++; if(hour>23) hour=0; break;}
case (0x02): { minit++; if(minit>59) minit=0; break;}
case (0x03): { second++;if(second>59) second=0; break;}
default: break;
}
}
else
{
switch(timer_cc)
{
case (0x01): {if(hour1==24) hour1=0; else hour1++; break;}
case (0x02): {if(minit1==60) minit1=0; else minit1++; break;}
case (0x03): {if(second1==60) second1=0; else second1++; break;}
case (0x04): {year++;break;}
case (0x05): {if(month==12) month=1;else month++;break;}
case (0x06): {if(day==31) day=1;else day++;break;}
case (0x07): {if(week==7) week=1;else week++;break;}
default:break;
}
}
}
}
}
void timer_alam(void)
{
if((disp_ms==0)&&(disp_sd==0)) //正常运行时间的状态下
{
if((hour1==hour)&&(minit1==minit))
{
speaker=disp_sdt;
}
else
{
if(zhengdian==1)
{
speaker=disp_sdt;
}
else
speaker=1;
}
}
}
//******************************主函数*************************************************
void main(void)
{
second=0x00; //时间初始化为00:00:00
minit=59;
hour=23;
second1=0x00;
minit1=0x00;
hour1=12;
year=11;
month=9;
day=16;
week=5;
count0=0x00;
count1=0x00;
TMOD=0x11;
TL0=tl;
TH0=th;
TL1=tl;
TH1=th;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
SystemInit();
while(1)
{
key_scan();
display();
timer_alam();
}
}
//*********************************中断服务函数**************************************
/***********************************************************************
* 函数名称:leap()
* 功 能:计算二月份天数
* 入口参数:year
* 出口参数:无
*******************************************************************/
unsigned leap(unsigned year) //判断是否闰年并返回二月份的天数
{ //闰年返回29,平年返回28
if(year%4==0)
return 29;
else return 28;
}
/*******************************************************************
* 函数名称:mon()
* 功 能:计算并返回每个月的天数
* 入口参数:month
* 出口参数:无
*******************************************************************/
unsigned mon(unsigned month) //计算并返回每个月的天数
{
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:return 31;break; //1,3,5,7,8,10,12月每月31天
case 4:
case 6:
case 9:
case 11:return 30;break; //4,6,9,11月每月30天
case 2: return leap(year);break;//返回二月份的天数
default:break;
}
}
//*********************************中断服务函数**************************************
void time0_int(void) interrupt 1
{
TL0=tl;
TH0=th;
TR0=1;
count0++;
if(count0==20)
{
count0=0;
second++;
if(hour_zd==second) //报时到小时数后关闭报时标志。
zhengdian=0;
if(second==60)
{
second=0;
minit++;
if(minit==60)
{
zhengdian=1; //开启整点报时
minit=0;
hour++;
hour_zd=hour;
if(hour_zd>12)
hour_zd=hour_zd-12; //12小时制报时方式
if(hour==24)
{
hour=0;
day++;
week++;
if(week==7)
{
week=1;
week++;
}
n=mon(month);
if(day>n)
{
day=1;
month++;
if(month==13)
{
month=1;
year++;
}
}
}
}
}
}
}
//*********************************中断服务函数**************************************
void time1_int(void) interrupt 3
{
TL1=tl;
TH1=th;
TR1=1;
count1++;
if(count1==10)
{
count1=0;
disp_sdt=~disp_sdt;
}
}
华东交通大学课程设计华东交通大学课程设计课程设计题目计算器设计课程题目年级专业学号姓名组员指导教师Java程序设计信息一班1华东交…
计算机综合课程设计报告小组编号06课题名称趣味贪吃蛇小组成员20xx年10月计算机综合课程设计报告目录目录11项目背景112系统目…
MFC计算器课程设计报告计算机应用3班黄锦湫罗洁饶益指导老师蒋鹏20xx315一题目利用MFC框架编写简易计算器要求使用MFC框架…
计算机网络课程设计报告一.课程设计的题目、目的及要求.......................................…
武汉理工大学专业课程设计2课程设计说明书目录1基本功能描述12设计思路13软件设计431设计步骤44结论与心得体会127附设计中的…
实验一AD转换实验实验目的1熟悉ADC0809与单片机的接口电路连接2掌握ADC0809AD转换的编程实验内容应用ICDE5208…
智能仪器设计实验报告题目生物医疗仪器实验姓名学号专业测控技术与仪器班级日期20xx1129地点12407A一实验目的1心电测试学习…