课程设计完美打印.docx

上传人:b****1 文档编号:11166510 上传时间:2023-05-29 格式:DOCX 页数:21 大小:285.93KB
下载 相关 举报
课程设计完美打印.docx_第1页
第1页 / 共21页
课程设计完美打印.docx_第2页
第2页 / 共21页
课程设计完美打印.docx_第3页
第3页 / 共21页
课程设计完美打印.docx_第4页
第4页 / 共21页
课程设计完美打印.docx_第5页
第5页 / 共21页
课程设计完美打印.docx_第6页
第6页 / 共21页
课程设计完美打印.docx_第7页
第7页 / 共21页
课程设计完美打印.docx_第8页
第8页 / 共21页
课程设计完美打印.docx_第9页
第9页 / 共21页
课程设计完美打印.docx_第10页
第10页 / 共21页
课程设计完美打印.docx_第11页
第11页 / 共21页
课程设计完美打印.docx_第12页
第12页 / 共21页
课程设计完美打印.docx_第13页
第13页 / 共21页
课程设计完美打印.docx_第14页
第14页 / 共21页
课程设计完美打印.docx_第15页
第15页 / 共21页
课程设计完美打印.docx_第16页
第16页 / 共21页
课程设计完美打印.docx_第17页
第17页 / 共21页
课程设计完美打印.docx_第18页
第18页 / 共21页
课程设计完美打印.docx_第19页
第19页 / 共21页
课程设计完美打印.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

课程设计完美打印.docx

《课程设计完美打印.docx》由会员分享,可在线阅读,更多相关《课程设计完美打印.docx(21页珍藏版)》请在冰点文库上搜索。

课程设计完美打印.docx

课程设计完美打印

课程设计任务书

学生姓名:

专业班级:

指导教师:

工作单位:

信息工程学院

题目:

基于定时器计数器的秒表仿真和C语言开发

初始条件:

本课程设计,要求用使用Proteus仿真软件进行系统设计与仿真。

要求完成的主要任务:

(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)

1、课程设计工作量:

1周内完成对系统的设计、仿真。

2、技术要求:

1)试用定时器/计数器设计一个简单的秒表,能显示计时状态和结果。

要求进行电路仿真实验,并使用C语言进行程序的开发。

2)要求学生主动思考,自主发挥,实现系统的特色功能。

3、查阅至少5篇参考文献。

按《武汉理工大学课程设计工作规范》要求撰写设计报告书。

全文用A4纸打印,图纸应符合绘图规范。

提交报告的主要内容:

(使用Proteus7.5sp3)

1)题目

2)仿真所完成的主要功能和特色简介——摘要(特别是自己扩展的功能,根据特色功能评优)

3)Proteus仿真的基本流程

4)所使用芯片以及引脚功能简介(需要提供对应芯片DataSheet的下载链接)

5)设计方案与工作原理,给出仿真电路图

6)实验记录与结果分析

时间安排:

1)第1天,查阅相关资料,学习设计原理。

2)第2~3天,方案选择和电路设计仿真。

3)第4天,设计说明书撰写。

4)第5天,上交报告,同时进行答辩。

指导教师签名:

年月日

系主任(或责任教师)签名:

年月日

目录

摘要1

1、硬件设计2

1.1元件介绍2

1.1.1AT89C51芯片2

1.1.2AT89C51各引脚功能2

1.1.31602LCD引脚接口说明4

1.1.4引脚说明5

1.1.5DDRAM地址与显示位置的对应关系5

1.2电路设计6

1.2.1晶振电路6

1.2.2复位电路6

2、软件设计7

2.1流程图7

2.2程序源文件7

3、仿真与测试13

4、心得体会14

5、参考文献15

本科生能力拓展训练成绩评定表16

摘要

本系统采用AT89C51单片机为中心器件,利用定时器计数器定时和记数的原理,结合单片机最小系统及lcd1602显示等来设计计数器,将软、硬件有机地结合起来。

其中硬件系统采用PROTEUS仿真功能来实现,简单且易于观察,在仿真中就可以观察到实际的工作状态。

关键词:

秒表单片机PROTEUS仿真

 

1、硬件设计

1.1元件介绍

1.1.1AT89C51芯片

AT89C51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含有4KB的可反复擦写的只读程序存储器和128字节的随机存储器。

该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容,由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,它为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

AT89C51功能性能:

与MCS-51成品指令系统完全兼容;4KB可编程闪速存储器;寿命:

1000次写/擦循环;数据保留时间:

10年;全静态工作:

0-24MHz;三级程序存储器锁定;128*8B内部RAM;32个可编程I/O口线;2个16位定时/计数器;5个中断源;可编程串行UART通道;片内震荡器和掉电模式。

1.1.2AT89C51各引脚功能

AT89C51提供以下标准功能:

4KB的Flash闪速存储器,128B内部RAM,32个I/O口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内震荡器及时钟电路,同时,AT89C51可降至0Hz静态逻辑操作,并支持两种软件可选的节电工作模式。

空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作,掉电方式保存RAM中的内容,但震荡器停止工作并禁止其他所有工作直到下一个硬件复位。

AT89C51采用PDIP封装形式,引脚配置如图3所示。

图1AT89C51的引脚图

AT89C51芯片的各引脚功能为:

P0口:

这组引脚共有8条,P0.0为最低位。

这8个引脚有两种不同的功能,分别适用于不同的情况,第一种情况是89C51不带外存储器,P0口可以为通用I/O口使用,P0.0-P0.7用于传送CPU的输入/输出数据,这时输出数据可以得到锁存,不需要外接专用锁存器,输入数据可以得到缓冲,增加了数据输入的可靠性;第二种情况是89C51带片外存储器,P0.0-P0.7在CPU访问片外存储器时先传送片外存储器的低8位地址,然后传送CPU对片外存储器的读/写数据。

P0口为开漏输出,在作为通用I/O使用时,需要在外部用电阻上拉。

P1口:

这8个引脚和P0口的8个引脚类似,P1.7为最高位,P1.0为最低位,当P1口作为通用I/O口使用时,P1.0-P1.7的功能和P0口的第一功能相同,也用于传送用户的输入和输出数据。

P2口:

这组引脚的第一功能与上述两组引脚的第一功能相同即它可以作为通用I/O口使用,它的第一功能和P0口引脚的第二功能相配合,用于输出片外存储器的高8位地址,共同选中片外存储器单元,但并不是像P0口那样传送存储器的读/写数据。

P3口:

这组引脚的第一功能和其余三个端口的第一功能相同,第二功能为控制功能,每个引脚并不完全相同,如下表1所示:

P3口各位

第二功能

P3.0

RXT(串行口输入)

P3.1

TXD(串行口输出)

P3.2

/INT0(外部中断0输入)

P3.3

/INT1(外部中断1输入)

P3.4

T0(定时器/计数器0的外部输入)

P3.5

T1(定时器/计数器1的外部输入)

P3.6

/WR(片外数据存储器写允许)

P3.7

/RD(片外数据存储器读允许)

表1P3口各位的第二功能

Vcc为+5V电源线,Vss接地。

ALE:

地址锁存允许线,配合P0口的第二功能使用,在访问外部存储器时,89C51的CPU在P0.0-P0.7引脚线去传送随后而来的片外存储器读/写数据。

在不访问片外存储器时,89C51自动在ALE线上输出频率为1/6震荡器频率的脉冲序列。

该脉冲序列可以作为外部时钟源或定时脉冲使用。

:

片外存储器访问选择线,可以控制89C51使用片内ROM或使用片外ROM,

=1,则允许使用片内ROM,若

=0,则只使用片外ROM。

片外ROM的选通线,在访问片外ROM时,89C51自动在

线上产生一个负脉冲,作为片外ROM芯片的读选通信号。

RST:

复位线,可以使89C51处于复位(即初始化)工作状态。

通常89C51复位有自动上电复位和人工按键复位两种。

XTAL1和XTAL2:

片内震荡电路输入线,这两个端子用来外接石英晶体和微调电容,即用来连接89C51片内OSC(震荡器)的定时反馈回路。

1.1.31602LCD引脚接口说明

编号

符号

引脚说明

编号

符号

引脚说明

1

VSS

电源地

9

D2

DataI/O

2

VDD

电源正极

10

D3

DataI/O

3

VL

液晶显示偏压信号

11

D4

DataI/O

4

RS

数据命令选择端口(H/L)

12

D5

DataI/O

5

R/W

读/写选择端(H/L)

13

D6

DataI/O

6

E

使能信号

14

D7

DataI/O

7

D1

DataI/O

15

BLA

背光源正极

8

D1

DataI/O

16

BLK

背光源负极

1.1.4引脚说明

3脚:

VL,液晶显示偏压信号,用于调整LCD1602的显示对比度,一般会外接电位器用以调整偏压信号,此脚电压为0时可以得到最强的对比度。

4脚:

RS,数据/命令选择端,当此脚为高电平时,可以对1602进行数据字节的传输操作,而为低电平时,则是进行命令字节的传输操作。

命令字节,即是用来对LCD1602的一些工作方式作设置的字节;数据字节,即使用以在1602上显示字节。

5脚:

R/W,读写选择端。

当此脚为高电平可对LCD1602进行读数据操作,反之进行写数据操作。

6脚:

E,使能信号,其实是LCD1602的数据控制时钟信号,利用该信号的上升沿实现对LCD1602的数据传输。

7~14脚:

8位并行数据口,使得对LCD1602的数据读写大为方便。

基本操作时序:

(1)读状态:

输入:

RS=L,RW=H,E=H;输出:

D0~D7=状态字

(2)写指令:

输入:

RS=L,RW=L,D0~D7=指令码,E=高脉冲;输出:

(3)读数据:

输入:

RS=H,RW=H,E=H;输出:

D0~D7=数据

(4)写数据:

输入:

RS=H,RW=L,D0~D7=数据,E=高脉冲;输出:

需要两个写时序:

①当我们要写指令字,设置LCD1602的工作方式时:

需要把RS置为低电平,RW置为低电平,然后将数据送到数据口D0~D7,最后E引脚一个高脉冲将数据写入。

②当我们要写入数据字,在1602上实现显示时:

需要把RS置为高电平,RW置为低电平,然后将数据送到数据口D0~D7,最后E引脚一个高脉冲将数据写入。

1.1.5DDRAM地址与显示位置的对应关系

1602中我们就用前16个就行了。

第二行也一样用前16个地址。

对应如下:

 

1.2电路设计

1.2.1晶振电路

如图2-3所示,这里选用12MHE的内部振荡方式,电路如下:

电容器C1,C2起稳定振荡频率,快速起振的作用,C1,C2可在20~100PF之间取,这里取20PF,接线时要使晶振振荡器尽可能接近单片机。

1.2.2复位电路

采用上电+按键复位电路,上电后,由于电容充电,使RST持续一段时间高电平时间。

当单片机已在运行之中时,按下复位按键也能使RST持续一段时间的高电平,从而实现上电加开关复位的操作。

这不仅能时单片机复位,而且还能使单片机的外围芯片也同时复位,当程序出现错误时,可以随时使电路复位。

复位是单片机的初始化操作。

其主要功能是把PC初始化为0000H,使单片机从0000H单元开始执行程序。

除了进入系统的正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需按复位键重新启动

整体电路图:

图2总体电路图

2、软件设计

2.1流程图

 

图3流程图

2.2程序源文件:

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

#defineDelayNOP(){_nop_();_nop_();_nop_();_nop_();}

sbitK1=P1^0;

sbitK2=P1^1;

sbitK3=P1^2;

sbitK4=P1^3;

sbitLCD_RS=P2^0;

sbitLCD_RW=P2^1;

sbitLCD_EN=P2^2;

ucharkeycount1=-1;

ucharkeycount2=-1;

ucharcodestr1[]="secondcount";

uchars1_string[]="N100:

00:

00:

00";

uchars2_string[]="N200:

00:

00:

00";

ucharmillisecond1,second1,minute1,hour1;

ucharmillisecond2,second2,minute2,hour2;

bitLCD_Busy_Check();

voidLCD_Initialize();

voidLCD_Set_POS(uchar);

voidLCD_Write_Command(uchar);

voidLCD_Write_Data(uchar);

//延时

voidDelayMS(uintms)

{uchart;

while(ms--)

for(t=0;t<120;t++);

}

//LCD忙检查

bitLCD_Busy_Check()

{

bitResult;

LCD_RS=0;LCD_RW=1;LCD_EN=1;DelayNOP();

Result=(bit)(P0&0x80);

LCD_EN=0;

returnResult;

}

//向LCD写指令

voidLCD_Write_Command(ucharcmd)

{

while(LCD_Busy_Check());

LCD_RS=0;LCD_RW=0;LCD_EN=0;

_nop_();_nop_();

P0=cmd;DelayNOP();

LCD_EN=1;DelayNOP();

LCD_EN=0;

}

//向LCD写数据

voidLCD_Write_Data(ucharstr)

{

while(LCD_Busy_Check());

LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=str;DelayNOP();

LCD_EN=1;DelayNOP();LCD_EN=0;

}

//初始化LCD

voidLCD_Initialize()

{

DelayMS(5);LCD_Write_Command(0x38);

DelayMS(5);LCD_Write_Command(0x0c);

DelayMS(5);LCD_Write_Command(0x06);

DelayMS(5);LCD_Write_Command(0x01);

DelayMS(5);

}

//设置显示位置

voidLCD_Set_POS(ucharPosition)

{

LCD_Write_Command(Position|0x80);

}

//显示函数,在LCD指令行上显示字符串

voidDisplay_String(uchar*str,ucharLineNo)

{uchark;

LCD_Set_POS(LineNo);

for(k=0;k<16;k++)

LCD_Write_Data(str[k]);

}

voidTime0()interrupt1using0

{

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

if(++millisecond1==100)

{

millisecond1=0;

if(++second1==60)

{

second1=0;

if(++minute1==60)

{

minute1=0;

if(++hour1==24)

{

hour1=0;minute1=0;second1=0;

}

}

}

}

}

voidTime1()interrupt3using1

{

TH1=(65536-10000)/256;

TL1=(65536-10000)%256;

if(++millisecond2==100)

{

millisecond2=0;

if(++second2==60)

{

second2=0;

if(++minute2==60)

{

minute2=0;

if(++hour2==24)

{

hour2=0;minute2=0;second2=0;

}

}

}

}

}

voiddisplay_s1(ucharmis,s,m,h)

{

s1_string[3]=h/10+'0';

s1_string[4]=h%10+'0';

s1_string[6]=m/10+'0';

s1_string[7]=m%10+'0';

s1_string[9]=s/10+'0';

s1_string[10]=s%10+'0';

s1_string[12]=mis/10+'0';

s1_string[13]=mis%10+'0';

Display_String(s1_string,0x00);

}

voiddisplay_s2(ucharmis,s,m,h)

{

s2_string[3]=h/10+'0';

s2_string[4]=h%10+'0';

s2_string[6]=m/10+'0';

s2_string[7]=m%10+'0';

s2_string[9]=s/10+'0';

s2_string[10]=s%10+'0';

s2_string[12]=mis/10+'0';

s1_string[13]=mis%10+'0';

Display_String(s2_string,0x40);

}

voidmain()

{

uinttmp=0;

uinttmp1=0;

IE=0x8A;

TMOD=0x11;

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

TH1=(65536-10000)/256;

TL1=(65536-10000)%256;

LCD_Initialize();

Display_String(str1,0x00);

P1=0xff;

while

(1)

{

if(K1==0)

{

while(K1==0);

tmp=tmp+1;

keycount1=tmp%2;

}

if(K2==0)

{

while(K2==0);

tmp1=tmp1+1;

keycount2=tmp1%2;

}

if(K3==0)

{

while(K3==0);

millisecond1=0;

second1=0;

minute1=0;

hour1=0;

TR0=0;

keycount1=-1;

tmp=0;

display_s1(millisecond1,second1,minute1,hour1);

}

if(K4==0)

{

while(K4==0);

millisecond2=0;

second2=0;

minute2=0;

hour2=0;

TR1=0;

keycount2=-1;

tmp1=0;

display_s2(millisecond2,second2,minute2,hour2);

}

switch(keycount1)

{

case1:

TR0=1;display_s1(millisecond1,second1,minute1,hour1);break;

case0:

TR0=0;display_s1(millisecond1,second1,minute1,hour1);break;

}

switch(keycount2)

{

case1:

TR1=1;display_s2(millisecond2,second2,minute2,hour2);break;

case0:

TR1=0;display_s2(millisecond2,second2,minute2,hour2);break;

}

}

}

 

3、仿真与测试

第一步:

按下K1键

图4秒表1仿真

第二步:

按下K2键

图5秒表2仿真

第三步:

按下K3键

图6秒表1清零

第四步:

按下K4键

图7秒表2清零

4、心得体会

本次课程设计运用单片机实现一个简单的秒表,运用了51单片机搭配相应的外围电路,如按键输入、lcd1602显示输出等模块,基本实现了题目要求,能够通过按键控制秒表的启、停等计时功能。

通过单片机课程设计,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。

创新,是要我们学会将理论很好地联系实际,并不断地去开动自己的大脑,做自己力所能及的,别人却没想到的事。

同时,更重要的是,我在这一设计过程中,学会了坚持不懈,不轻易言弃。

设计过程,也好比是我们人类成长的历程,常有一些不如意,也许这就是在对我们提出了挑战,勇敢过,也战胜了,胜利的钟声也就一定会为我们而敲响。

 

5、参考文献

[1]郭天祥.新概念51单片机C语言教程--入门、提高、开发、拓展全攻略[M].电子工业出版社.2009.11

[2]郭天翔.新概念51单片机C语言教程.北京:

电子工业出版社,2008.10

[3]陈益飞.单片机原理及应用技术.北京[M]:

国防工业出版社,2011

[4]张伟.张杰编著.单片机原理及应用.北京[M]:

机械工业出版社,2007

[5]丁元杰单片机原理及应用[M].北京:

机械工业出版社.2005

 

本科生能力拓展训练成绩评定表

姓名

性别

专业、班级

题目:

答辩或质疑记录:

成绩评定依据:

最终评定成绩(以优、良、中、及格、不及格评定)

 

指导教师签字:

年月日

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2