课程设计报告
课程设计名称: 三位数字显示计时定时器设计
专 业 班 级 : 0212112
学 生 姓 名 : 黎林
学 号 : 021211219
同 组 人 员 :
指 导 教 师 : 李洪芹
课程设计时间: 2周
目 录
1 设计任务、要求以及文献综述 1
2 原理叙述和设计
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
1
2.1 设计方案选择和论证 1
2.2 电路的功能框图及其说明 1
2.3 功能块及单元电路的设计、计算与说明 2
2.4 总体电路原理图 4
3 电路的仿真与调试 4
3.1 电路仿真 4
3.2 调试中出现的问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
及解决方法 5
4 制作与调试 6
4.1元件清单、实物照片 6
4.2制作与调试过程中遇到的问题及解决办法 7
5
心得体会
决胜全面小康心得体会学党史心得下载党史学习心得下载军训心得免费下载党史学习心得下载
8
6 参考文献 8
附录 8
三位数字显示计时定时器设计
1 设计任务、要求以及文献综述
3位数字显示计时定时器是一个典型的利用数字系统的例子。所谓数字系统,是指由若干数字电路及逻辑部件组成并且能够进行采集、加工、处理及传送数字信号的设备。一个完整的数字系统通常由输入电路、输出电路、控制电路、若干个子系统和时基电路等部分组成。设计要求如下:
1、计时功能。能任意启停,保持计时结果;
2、开机自动复位;
3、最大计时显示为9分59秒;
4、定时报警。
2 原理叙述和设计方案
2.1 设计方案选择和论证
方案一:设计的3位数字显示计时定时器则分别有4个子系统组成:秒脉冲时间标准产生电路、计数器、译码器和显示器、开机自动清零电路、计时启停控制电路
方案二:实现一个三位数字显示的秒
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
系统,单片机,lcd1602显示屏,矩阵键盘等组成部分。秒计数电路满60向分计数电路进位(显示00~59s),分计数电路满足10(显示0~9)后停止并且灯亮,等待重新复位计时。
论证:方案二比方案一好。
理由一:方案二显示的最终结果比较直观。
理由二:方案二可更改性好,方便日后的改进。
2.2 电路的功能框图及其说明
根据原理正确、易于实现、且实验室有条件实现的原则确定设计方案,画出总体设计功能框图,如图2.1所示。
图2.1 三位数字显示计时定时器功能框图
单片机:对LCD1602的显示控制,还能实现计时启停的控制。
LCD1602:将结果以直观的形式表现出来。
2.3 功能块及单元电路的设计、计算与说明
4×4矩阵键盘
当键盘中按键数量较多时,为了减少对I/O口的占用,通常将按键排列成矩阵形式,也称为行列键盘,这是一种常见的连接方式。矩阵式键盘由行线和列线组成,按键位于行、列的交叉点上。当键被按下时,其交点的行线和列线接通,相应的行线或列线上的电平发生变化,MCU通过检测行或列线上的电平变化可以确定哪个按键被按下。如图2.2所示。
图2.2 4×4矩阵键盘
显示程序
本系统使用LCD1602实现显示,只要参照LCD1602的使用手册进行初始化和程序编写就可以显示,即在程序编写中添加LCD1602的驱动程序。这里的驱动程序主要包括:初始化函数、设置显示坐标、写字符函数及写字符串函数。用LCD1602实现对时间的显示。LCD1602的部分读写控制时序程序如图2.3所示:
图2.3 LCD1602显示屏
2.4 总体电路原理图
图2.4三位数字显示计时定时器电路原理图
如图2.4所示,通过对单片机编程,对LCD1602显示屏先初始化,然后开始进行走数。矩阵键盘就用右边的三个按键,分别实现启停,对数字加,对数字减的功能。当时间到达9分59时,灯亮并且计时停止。
3 电路的仿真与调试
3.1 电路仿真
利用电子线路仿真软件Protues,将所设计的电路原理图在Protues界面下创建并用其仪器库中的模拟仪表进行仿真测试。若发现问题,立即修改参数,重新调试直至得到满意的设计。如图3.1
图3.1三位数字显示计时定时器仿真结果
3.2 调试中出现的问题及解决方法
将编好的程序导入到单片机,调试时有时候发现,显示的时间走的太快,这个时候对程序进行修改便可。
有时候会发现找不到我需要的元器件,这个时候就要上网查找相似的元器件进行代替。
4 制作与调试
4.1元件清单、实物照片
元件清单:
图4.1三位数字显示计时定时器元件清单
实物:
图4.2三位数字显示计时定时器实物
4.2制作与调试过程中遇到的问题及解决办法
焊接元件时期:
一:焊接是没有严格按照仿真图焊接,导致运行结果出不来,后来去实验室把实物板的焊接改回来。
二:焊接单片机时候,因为管脚难插进板子,用力太猛,导致某些管脚不能用。解决方法是换其他好的管脚继续焊接。
三:焊接震荡电路时候,忘记接地了,后来修改回来了。
编程时期:
一:思路卡住时候,多想想,慢慢就有思路了。
二:编程时候要注意逻辑思路和代码安放位置,我之前思路搞错了,导致遇到瓶颈,画了很多时间和请教别人,最终在仿真的时候才得到要的结果。
5心得体会
经过一段时间的努力,该项设计也快接近尾声了,但遗憾的是我的实物虽然做出来了,但是经过多次调试还是没有出现预期的结果。
在设计实物时,不但要你有紧密的逻辑思维能力,还要细心、有耐心。元件多,布线多,钻的孔自然也多。一不留神把焊盘打没了,就会给焊接带来很大的难度。而且孔很多,一定要慢慢焊接,
工程
路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理
量确实很大。在调试过程中,一定要细心、耐心,一点小小的断线都会导致整个电路无法工作。可以说,调试时本次设计的难点。但是遗憾的是,经过多次的调试,我的设计却不能出现预期的结果,让我有点头痛。于是,我开始从硬件焊接上找找自己的原因,向老师询问后,从输出到输入一级一级开始找自己的焊接错误,在比对仿真图的时候从中也发现了一些错误,但在焊接正确后还是不能出现结果。然后,我就开始在我的程序里面找一下可能的错误,最后由于能力有限和时间问题,还是没能找到错误,有点失败。
在次课程设计中,不仅培养了我们综合应用所学知识解决实际问题的能力,也提高了我的动手能力,让我学会了独立思考问题,并通过各种途径来解决问题。此次课程设计不单是一个实验设计,也是善于思考的最佳机会。在这个过程中,我懂得了很多专业知识,也学到了很多运用技巧。更大的一点是:激起了我对实验设计这方面的兴趣。
虽然在此过程中遇到很多挫折及困难,也很有多情绪问题。比如说,气馁,灰心等情绪。但是由于水平有限,我的课程设计还没有完善,存在一些错误,我还想在后期改进该设计功能,让其实现原有功能基础之上,还要实现动态显示数码管。但我却连基本的计时功能还没实现,有点遗憾。
6 参考文献
[1] 陈晰.数字电路试验技术基础.北京:电子工业出版社,1999
[2] 李元.数字电路与逻辑设计.南京:南京大学出版社,1997
[3] 郝波.数字电子技术,西安:西安电子科技大学出版社,2004
[4] 郭斌.数字逻辑电路.北京:电子科技大学出版社,1995
[5] 程震先.数字电路实验与应用.北京:北京理工大学出版社,1999
[6]曹琳琳.[C]单片机原理及接口技术.国防科技大学出版社,200
附录
三位数字显示计时定时器设计源程序:
#include
#define uchar unsigned char
#define uint unsigned int
sbit rs=P0^5;
sbit rw=P0^6;
sbit e=P0^7;
sbit led=P0^1;
sbit keyg=P2^0;
sbit key1=P2^7;
sbit key2=P2^6;
sbit key3=P2^5;
uint num,count,ge,shi,a,flag,flag1;
int fen,miao;
uchar code table[]="ding shi qi";
uchar code table1[]=" 00:00";
/***延时函数***/
void delay(uchar z)
{
uchar x,y;
for(x=110;x>0;x--)
for(y=z;y>0;y--);
}
/***写指令***/
void write_zl(uchar zl)
{
rw=0;
rs=0;
e=0;
P1=zl;
delay(5);
e=1;
delay(5);
e=0;
}
/***写数据***/
void write_sj(uchar sj)
{
rw=0;
rs=1;
e=0;
P1=sj;
delay(5);
e=1;
delay(5);
e=0;
}
/***分秒动态显示***/
void write_sm(uchar add,uchar date)
{
shi=date/10;
ge=date%10;
write_zl(0x80+0x40+add);
write_sj(0x30+shi);
write_sj(0x30+ge);
}
/***初始化***/
void init()
{
led=0;
write_zl(0x38);
write_zl(0x0c);
write_zl(0x06);
write_zl(0x01);
write_zl(0x80);
for(num=0;num<11;num++)
{
write_sj(table[num]);
delay(2);
}
write_zl(0x80+0x40);
for(num=0;num<9;num++)
{
write_sj(table1[num]);
delay(2);
}
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
/***键盘扫描***/
void keyscan()
{
keyg=0;
/****************第一按键**************************/
if(key1==0)
{
delay(5);
if(key1==0) /**消抖**/
{
a++; /**a表示按第一个键盘的次数**/
while(!key1);
delay(2);
while(!key1); /**判断是否松手**/
if(a==1) /**秒处暂停,光标在秒处闪烁**/
{
TR0=0; /**定时器关**/
write_zl(0x0f);
write_zl(0x80+0x40+8);
}
if(a==2) /**秒处暂停,光标在分处闪烁**/
{
write_zl(0x80+0x40+5);
}
if(a==3) /**秒处走动,光标隐藏**/
{
a=0;
TR0=1;
write_zl(0x0c);
}
}
}
/****************第二按键**************************/
if(a!=0)
{
if(key2==0)
{
delay(5);
if(key2==0)
{
while(!key2);
delay(2);
while(!key2);
if(a==1) /***按一下,秒处数字加1***/
{
miao++;
if(miao==60)
{
miao=0;
}
write_sm(7,miao);
write_zl(0x80+0x40+8);
}
if(a==2) /***按一下,分处数字加1***/
{
fen++;
if(fen==10)
{
fen=0;
}
write_sm(4,fen);
write_zl(0x80+0x40+5);
}
}
}
}
/****************第三按键**************************/
if(a!=0)
{
if(key3==0)
{
delay(5);
if(key3==0)
{
while(!key3);
delay(2);
while(!key3);
if(a==1) /***按一下,秒处数字减1***/
{
miao--;
if(miao==-1)
{
miao=59;
}
write_sm(7,miao);
write_zl(0x80+0x40+8);
}
if(a==2) /***按一下,分处数字减1***/
{
fen--;
if(fen==-1)
{
fen=9;
}
write_sm(4,fen);
write_zl(0x80+0x40+5);
}
}
}
}
}
/***主函数***/
void main()
{
init();
while(1)
{
if(count==20)
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==10)
{
fen=0;
}
write_sm(4,fen);
}
write_sm(7,miao);
}
if(fen==9&&miao==59)
{
TR0=0;
led=1;
}
keyscan();
}
}
/***定时器***/
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
}