电子设计实践报告.docx

上传人:b****8 文档编号:27612236 上传时间:2023-07-03 格式:DOCX 页数:25 大小:58.23KB
下载 相关 举报
电子设计实践报告.docx_第1页
第1页 / 共25页
电子设计实践报告.docx_第2页
第2页 / 共25页
电子设计实践报告.docx_第3页
第3页 / 共25页
电子设计实践报告.docx_第4页
第4页 / 共25页
电子设计实践报告.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

电子设计实践报告.docx

《电子设计实践报告.docx》由会员分享,可在线阅读,更多相关《电子设计实践报告.docx(25页珍藏版)》请在冰豆网上搜索。

电子设计实践报告.docx

电子设计实践报告

 

信息科学与工程学院

《电子设计实践》

课程设计报告

学院名称:

信息科学与工程

专业:

电子信息工程

班级:

13级1班

设计题目:

单片机系统

学生姓名:

杨云森

指导教师:

李星星

 

完成日期:

2016年06月21日

一、设计任务和性能指标

1.1设计任务

(1)单片机最小系统(液晶显示1602和键盘)

(2)电子时钟

(3)电机驱动,直流电机或步进电机(需有调速)

(4)波形发生器(D/A转换)或数字电压表(A/D转换)

(5)串口通信(可通过键盘动态设置波特率和通信格式)

1.2性能指标

1.日历:

年(2位)、月(2位)、日(2位)

2.时钟:

时(2位)、分(2位)、秒(2位)

3.能够驱动电机转动,速度可调

4.能将电阻阻值通过数字的方式显示出来

5.能够实现单片机与PC机的通信

二、.设计方案

按照系统设计的功能的要求,初步确定设计系统由主控模块、时钟模块、显示模块、键扫描接口电路共四个模块组成,电路系统构成框图如图1.1所示。

主控芯片使用51系列AT89C52单片机,采用高性能的静态80C51设计,由先进工艺制造,并带有非易失性Flash程序存储器。

它是一种高性能、低功耗的8位COMS微处理芯片,市场应用最多。

时钟芯片使用美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片DS1302。

采用DS1302作为主要计时芯片、可以做到计时准确。

更重要的是,DS1302可以在很小的电流的后备电源(2.5~5.5V电源,在2.5V时耗电小于300nA)下继续计时,并可编程选择多种充电电流对后备电源进行慢速充电,可以保证后备电源基本不耗电。

采用串行数据传输,与单片机硬件连接简单,如果使用时钟芯片DS12887,将采用并行数据传输,占用更多的硬件资源。

因此为节省单片机端口,时钟芯片采用DS1302。

图2.1日历时钟显示系统构成框图

显示模块采用普通的共阴LED数码管,也可采用LCD显示,但考虑其造价较高浪费资源,故使用LED显示。

键盘采用线性连接,连接方式相对简单,使用查询法实现调整功能。

三、系统硬件设计

3.1单片机的最小系统

ATMEL公司生产的AT89C52单片机它是硬件电路的核心部分,时钟电路晶振使用11.0592MHz,复位电路采取按键复位方式。

3.2时钟电路DS1302

1.DS1302的性能

●实时时钟,可对秒、分、时、日、周、月以及带闰年补偿的年进行计数;

●用于高速数据暂存的31*8位的RAM;

●最少引脚的串行I/O;

●2.5-5.5V的电压工作范围;

●2.5V时耗电小于300nA;

●用于时钟或RAM数据读/写的单字节或多字节(脉冲方式)数据传送方式;

●简单的3线接口;

●可选的慢速充电(至Vcc1)的能力。

DS1302时钟芯片包括实时时钟/日历和31字节的静态RAM。

它经过一个简单的串行接口与微处理器通信。

实时时钟/日历提供秒、分、时、日、周、月和年等信息。

对于小于31天的月和月末的日期自动进行调整,还包括闰年校正的功能。

时钟的运行可以采用24h或带AM(上午)/PM(下午)的12h格式。

采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多字节的时钟信号或RAM数据。

DS1302有主电源和后备电源双电源引脚:

Vcc1在单电源与电池供电的系统中提供低电源,并提供低功率的电池备份;Vcc2在双电源系统中提供主电源,在这种运用方式中,Vcc1连接到备份电源,以便在没有主电源的情况下能保存时间信息以及数据。

DS1302由较大者供电。

当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电;当Vcc2小于Vcc1时,DS1302由Vcc1供电。

2.DS1302数据操作原理

DS1302在任何数据传送时必须先初始化,把RST脚置为高电平,然后把8位地址和命令字装入移位寄存器,数据在SCLK的上升沿被输入。

无论是读周期还是写周期,开始8位指定40个寄存器中哪个被访问到。

在开始8个时钟周期,把命令装入移位寄存器之后,另外的时钟周期在读操作时输出数据,在写操作时写入数据。

时钟脉冲在单字节方式下为8加8,在多字节方式下为8加字节数,最大可达248个字节数。

如果在传送过程中置RST脚为低电平,则会中止本次数据传送,并且I/O引脚变为高阻态。

上电运行时,在Vcc≥2.5V之前,RST脚必须保持低电平.只有在SCLK为低电平时,才能将RST置为高电平。

DS1302的引脚及内部结构图如图3.1所示,表3.1为各引脚功能。

 

 

图3.1DS1302引脚及内部结构

表3.1DS1302引脚功能

引脚号

引脚名称

功能

1

Vcc2

主电源

2,3

X1,X2

振荡源,外接32.768KHZ晶振

4

GND

地线

5

RST

复位/片选线

6

I/O

串行数据输入/输出端(双向)

7

SCLK

串行数据输入端

8

Vcc1

后备电源

DS1302与单片机的具体连接见附录1,它的控制字如图3.2所示。

控制字的最高有效位(位7)必须是逻辑1;如果为0,则不能把数据写到DS1302中。

位6如果为0,则表示存取日历时钟数据;为1表示存取RAM数据。

位5-1(A4-A0)指示操作单元的地址。

最低有效位(位0)如果为0,表示要进行写操作;为1表示要进行读操作。

控制字节总是从最低位开始输入/输出。

7

6

5

4

3

2

1

0

1

RAM

CK

A4

A3

A2

A1

A0

RAM

K

图3.2DS1302的控制字

DS1302共有12个寄存器,其中有7个寄存器与日历、时钟有关,存放的数据为BCD码形式。

其日历、时间寄存器及其控制字见表2.2,其中奇数为读操作,偶数为写操作。

DS1302的晶振选用32.768KHz。

3.3电机调速的设计

利用ULN2003A驱动直流电机实现转动,再结合51单片机最小系统进行PWM调速。

3.4数字电压表的设计

数字电压表由单片机系统、AD转换模块、lcd显示模块构成,电位器作为输入,转动电位器生成不同的模拟信号经过AD转换再液晶上就能显示不同的电压值。

四、系统软件设计

4.1电子时钟设计

因为使用了时钟芯片DS1302,阳历只需从DS1302各寄存器中读出年、周、月、日、时、分、秒等数据,再经处理即可。

在首次对DS1302进行操作之前,必须对它进行初始化,然后从DS1302中读出数据,再经过处理后,送给显示缓冲单元

 

4.2数字电压表设计

由5个主要部分组成:

A/D转换电路、单片机控制部分、LED显示部分。

系统的工作原理是:

控制系统采用AT89S52单片机,A/D转换采用AD0809,利用AD0809进行电压测量和将模拟信号转为数字信号,单片机将接受的信号进行处理后,将被测的电压值用四位的LED显示

4.3电机调速设计

通过控制总中断使能EA控制电机的开关,同时使能对霍尔传感器输出的方波在单位时间内脉冲个数的计数。

其中定时器T0,T1分别对脉冲的宽度、霍尔元件输出的脉冲数对应的1秒时间定时。

对脉冲宽度的调整是通过改变高电平的定时长度,由变量high控制。

变量change、 sub_speed 、add_speed分别实现电机的转向、加速、减速。

4.4串口通信设计

在串行通信中,用“波特率”来描述数据的传输速率。

所谓波特率,即每秒传送的二进制位数,其单位为bit/s(bits per second),它是衡量传输串行数据速度快慢的重要指标。

有时候也用“位周期”来表示传输速率,位周期是波特率的倒数。

国际上规定了一个标准波特率系列:

110bit/s、300bit/s、600 bit/s、1200 bit/s、1800 bit/s、2400 bit/s、2400 bit/s、9600 bit/s、14.4k bit/s、19.2 kbit/s、28.8k bit/s等,如9600 bit/s,其意义是每秒传送9600位数据,包含字符位和其他必须的位。

  大多数串行接口电路的接收波特率和发送波特率都可以设置,但是接收方的波特率必须与发送方的发送波特率形同

五、调试及性能分析

5.1调试步骤

调试分为硬件调试和软件调试。

硬件调试主要是检测硬件电路是否有短路、断路、虚焊等。

具体步骤及测试结果如下:

(1)检查电源与地线是否全部连接上,用万用表对照电路原理图测试各导线是否完全连接,测试结果所有连接线都已连接好;

(2)检验DS1302和单片机的晶振是否起振,用示波器观察波形;测试结果波形都很好;

(3)检查各芯片的功能是否正常,检测按键的导通情况。

测试结果正常。

软件调试主要是程序调试,将整个日历时钟显示程序按照实现功能分为各子模块进行调试,首先都要在实验台上进行调试。

具体步骤如下:

(1)显示程序调试。

在单片机实验课中我们已经做过LED显示实验,所以这部分相对简单,很快便调试无误了。

我们设计的硬件显示部分与实验台虽然并不相同,但相差并不多,经改动后在单路板上也调试通过了;

(2)时间调整程序的调试。

这部分也先在实验台上调试过,此时显示程序已经无误,我们直接观察数码管的显示情况,首先在单片机的内存单元中置成了当时的时间,然后看时间调整键是否好用,这部分在实验台上调试无误后可直接在电路板上使用;

(3)阴历子程序的调试。

由于阴历程序非常长,我们在敲完程序后就检查了几便。

其调试方法是在存放阳历的内存单元中置成当天的日期,在程序执行后看转换的是否正确。

阴历子程序主要是根据参考书编写的,在调试过程中发现在阳历为一月份时转换的不对,经我们在实验台上单步调试找到了错误的原因,阴历子程序调试成功,在电路板上直接使用即可

(4)阳历日期和时间的读取。

实验台中并没有时钟芯片,这部分只能在电路板焊接完成后才能进行调试,经我们查阅资料后,这部分在电路板上一次性通过。

5.2性能分析

单片机上电复位后,七个数码管显示为全零状态,这是因为还没有给DS1302初值,它此时并没有开始振荡,所以从DS1302读取的值都是0;按下控制键进入时间调整状态,此时在我们调整哪一位时哪一位就会处于闪烁状态,按下加1键被调整的那一位就会加1,而且没有按键抖动现象;在给DS1302写入初值后,它开始振荡,通过移位控制键、翻屏键的作用可以查看显示的年、月、日、周、时、分、秒是否正确,在调试时我们写入的初值是当时的时间:

06年12月21日14点55分,通过翻屏,可以看到数码管显示的很稳定,时间的显示也很准确;在翻到显示阴历那一屏是可以看到当时的阴历日期是十一月二日,阴历转换没有错误;当我们将日期置为2006年9月1日时,因为当天是阴历闰七月的初九,用于指示阴历闰月的发光二极管正常发光。

由于课程设计时间比较短,我们没有大量的时间去观察时钟走的是否精确,在走过一段时间后时间显示上可能会有一定的误差,我们可以再外接GPS,采用GPS授时校正,提高时间的精度。

我们的日历可以把阳历任意置成某一天然后查看当时的阴历是几月初几,实现了阴历的自动转换,星期的自动转换也可以编写程序实现,这样既可以跳到指定日期查看阴历,也可以查看当天是星期几了,所以我们的日历在性能上还有不完善的地方,在以后的学习当中,我们将尽力把这些功能也完善好。

六、心得体会

●学习单片机没有捷径,别指望两三天就学会,要坚持不懈,重在积累。

●别崇拜高手,别相信天才,大部分人都不是天才(相信你也不是)!

●单片机是一门应用性和实践性很强的学科,要多动手,多做实验。

●要学会参考别人的程序,减少自己琢磨的时间,迅速提高自己的编程能力。

●碰到问题可以借助网络来搜寻答案和对自己有帮助的问题,可以大大减少你的开发时间。

●要多交一些朋友,多交流。

技术是靠不断的积累和交流才会进步的,封闭自守只会更加落后。

希望大家多上网看看前辈的经验,可以少走很多弯路。

最后,祝愿大家早日成为单片机高手。

本次课程设计虽然时间很短,但收获却很大。

首先我们对单片机最小系统的设计有了整体的把握,对程序编写的合理与规范性有了深刻的理解,建立起程序设计的一般思路,其强大的功能给我们提供了很大的帮助,通过原理图的设计过程,使我们认识到了这个软件的重要性,我们会以此为契机,在日后的学习中会继续使用它,使其发挥更大的功能。

经过一个学期的课程设计,我们得到了充分的锻炼,不仅对单片机的学习有了深刻的理解,同时也增强了我们的毅力和处理突发问题的能力。

学习是要付出一定的艰辛与努力的,做事情一定要有不怕困难的吃苦精神,唯有坚持不懈,发扬团队协作才能够克服困难,取得最后的胜利。

参考文献

[1]徐维祥、刘旭敏.单片微型机原理及应用.大连:

大连理工大学出版社,1996

[2]李光飞、楼然苗、胡佳文、谢象佐.单片机课程设计与实例指导.北京:

北京航空航天大学出版社,2004

[3]余永权.89系列FLASH单片机原理及应用.北京:

电子工业出版社,2002

[4]李群芳,黄建.单片机微型计算机与接口技术.北京:

电子工业出版社,2001

[5]楼然苗、李光飞.51系列单片机设计实例.北京:

北京航空航天大学出版社,2003

附录程序清单

4.1电子时钟设计

#include"ds1302.h"

//---DS1302写入和读取时分秒的地址命令---//

//---秒分时日月周年最低位读写位;-------//

ucharcodeREAD_RTC_ADDR[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};

ucharcodeWRITE_RTC_ADDR[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};

//---DS1302时钟初始化2013年1月1日星期二12点00分00秒。

---//

//---存储顺序是秒分时日月周年,存储格式是用BCD码---//

ucharTIME[7]={0,0,0x12,0x04,0x01,0x02,0x16};

/*******************************************************************************

*函数名:

Ds1302Write

*函数功能:

向DS1302命令(地址+数据)

*输入:

addr,dat

*输出:

*******************************************************************************/

voidDs1302Write(ucharaddr,uchardat)

{

ucharn;

RST=0;

_nop_();

SCLK=0;//先将SCLK置低电平。

_nop_();

RST=1;//然后将RST(CE)置高电平。

_nop_();

for(n=0;n<8;n++)//开始传送八位地址命令

{

DSIO=addr&0x01;//数据从低位开始传送

addr>>=1;

SCLK=1;//数据在上升沿时,DS1302读取数据

_nop_();

SCLK=0;

_nop_();

}

for(n=0;n<8;n++)//写入8位数据

{

DSIO=dat&0x01;

dat>>=1;

SCLK=1;//数据在上升沿时,DS1302读取数据

_nop_();

SCLK=0;

_nop_();

}

RST=0;//传送数据结束

_nop_();

}

/*******************************************************************************

*函数名:

Ds1302Read

*函数功能:

读取一个地址的数据

*输入:

addr

*输出:

dat

*******************************************************************************/

ucharDs1302Read(ucharaddr)

{

ucharn,dat,dat1;

RST=0;

_nop_();

SCLK=0;//先将SCLK置低电平。

_nop_();

RST=1;//然后将RST(CE)置高电平。

_nop_();

for(n=0;n<8;n++)//开始传送八位地址命令

{

DSIO=addr&0x01;//数据从低位开始传送

addr>>=1;

SCLK=1;//数据在上升沿时,DS1302读取数据

_nop_();

SCLK=0;//DS1302下降沿时,放置数据

_nop_();

}

_nop_();

for(n=0;n<8;n++)//读取8位数据

{

dat1=DSIO;//从最低位开始接收

dat=(dat>>1)|(dat1<<7);

SCLK=1;

_nop_();

SCLK=0;//DS1302下降沿时,放置数据

_nop_();

}

RST=0;

_nop_();//以下为DS1302复位的稳定时间,必须的。

SCLK=1;

_nop_();

DSIO=0;

_nop_();

DSIO=1;

_nop_();

returndat;

}

/*******************************************************************************

*函数名:

Ds1302Init

*函数功能:

初始化DS1302.

*输入:

*输出:

*******************************************************************************/

voidDs1302Init()

{

ucharn;

Ds1302Write(0x8E,0X00);//禁止写保护,就是关闭写保护功能

for(n=0;n<7;n++)//写入7个字节的时钟信号:

分秒时日月周年

{

Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);

}

Ds1302Write(0x8E,0x80);//打开写保护功能

}

/*******************************************************************************

*函数名:

Ds1302ReadTime

*函数功能:

读取时钟信息

*输入:

*输出:

*******************************************************************************/

voidDs1302ReadTime()

{

ucharn;

for(n=0;n<7;n++)//读取7个字节的时钟信号:

分秒时日月周年

{

TIME[n]=Ds1302Read(READ_RTC_ADDR[n]);

}

}

4.4串口通信设计

/*******************************************************************************

*实验名:

串口实验

*使用的IO:

P2

*实验效果:

将接收到发送回电脑上面。

*注意:

*******************************************************************************/

#include

voidUsartConfiguration();

/*******************************************************************************

*函数名:

main

*函数功能:

主函数

*输入:

*输出:

*******************************************************************************/

voidmain()

{

UsartConfiguration();

while

(1)

{

}

}

/*******************************************************************************

*函数名:

UsartConfiguration()

*函数功能:

设置串口

*输入:

*输出:

*******************************************************************************/

voidUsartConfiguration()

{

SCON=0X50;//设置为工作方式1

TMOD=0X20;//设置计数器工作方式2

PCON=0X80;//波特率加倍

TH1=0XF3;//计数器初始值设置,注意波特率是4800的

TL1=0XF3;

ES=1;//打开接收中断

EA=1;//打开总中断

TR1=1;//打开计数器

}

/*******************************************************************************

*函数名:

Delay(unsignedinti)

*函数功能:

延时函数

*输入:

*输出:

*******************************************************************************/

voidUsart()interrupt4

{

unsignedcharreceiveData;

receiveData=SBUF;//出去接收到的数据

RI=0;//清除接收中断标志位

SBUF=receiveData;//将接收到的数据放入到发送寄存器

while(!

TI);//等待发送数据完成

TI=0;//清除发送完成标志位

4.2数字电压表设计

#include"reg51.h"

#include"XPT2046.h"

//--定义使用的IO--//

#defineGPIO_DIGP0

sbitLSA=P2^2;

s

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

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1