电子设计实践报告.doc_第1页
电子设计实践报告.doc_第2页
电子设计实践报告.doc_第3页
电子设计实践报告.doc_第4页
电子设计实践报告.doc_第5页
免费预览已结束,剩余13页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

信息科学与工程学院电子设计实践课程设计报告学院名称:信息科学与工程专 业:电子信息工程班 级:13级1班设计题目:单片机系统学生姓名:杨云森指导教师:李星星 完成日期:2016年06月21日目 录一、设计任务和性能指标21.1设计任务21.2性能指标2二、.设计方案2三、系统硬件设计43.1单片机的最小系统43.2时钟电路DS130253.3电机驱动,直流电机或步进电机(需有调速)43.4数字电压表(A/D转换)43.5串口通信4四、系统软件设计44.1时钟电路DS1302设计44.2电机调速设计44.3数字电压表(A/D转换)设计54.4串口通信设计5五、调试及性能分析55.1调试步骤55.2性能分析5六、心得体会6参考文献7附录 程序清单7一、设计任务和性能指标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.55.5V电源,在2.5V时耗电小于300nA)下继续计时,并可编程选择多种充电电流对后备电源进行慢速充电,可以保证后备电源基本不耗电。采用串行数据传输,与单片机硬件连接简单,如果使用时钟芯片DS12887,将采用并行数据传输,占用更多的硬件资源。因此为节省单片机端口,时钟芯片采用DS1302。(89C52)主控模块键扫描电路显示电路时钟芯片 图 2.1 日历时钟显示系统构成框图显示模块采用普通的共阴LED数码管,也可采用LCD显示,但考虑其造价较高浪费资源,故使用LED显示。键盘采用线性连接,连接方式相对简单,使用查询法实现调整功能。三、系统硬件设计3.1单片机的最小系统ATMEL公司生产的AT89C52单片机它是硬件电路的核心部分,时钟电路晶振使用11.0592MHz,复位电路采取按键复位方式。3.2时钟电路DS13021.DS1302的性能l 实时时钟,可对秒、分、时、日、周、月以及带闰年补偿的年进行计数;l 用于高速数据暂存的31*8位的RAM;l 最少引脚的串行I/O;l 2.5-5.5V的电压工作范围;l 2.5V时耗电小于300nA;l 用于时钟或RAM数据读/写的单字节或多字节(脉冲方式)数据传送方式;l 简单的3线接口;l 可选的慢速充电(至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引脚变为高阻态。上电运行时,在Vcc2.5V之前,RST脚必须保持低电平.只有在SCLK为低电平时,才能将RST置为高电平。DS1302的引脚及内部结构图如图3.1所示,表3.1为各引脚功能。 输入移位寄存器实时时钟命令与控制逻辑震荡器与分频器31 8RAM电源控制RSTSCLKVcc1Vcc2GNDI/O 图3.1 DS1302引脚及内部结构表3.1 DS1302引脚功能引脚号引脚名称功 能1Vcc2主电源2,3X1,X2振荡源,外接32.768KHZ晶振4GND地线5RST复位/片选线6I/O串行数据输入/输出端(双向)7SCLK串行数据输入端8Vcc1后备电源DS1302与单片机的具体连接见附录1,它的控制字如图3.2所示。控制字的最高有效位(位7)必须是逻辑1;如果为0,则不能把数据写到DS1302中。位6如果为0,则表示存取日历时钟数据;为1表示存取RAM数据。位5-1(A4-A0)指示操作单元的地址。最低有效位(位0)如果为0,表示要进行写操作;为1表示要进行读操作。控制字节总是从最低位开始输入/输出。765432101RAMCKA4A3A2A1A0RAM K图3.2 DS1302的控制字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(bitspersecond),它是衡量传输串行数据速度快慢的重要指标。有时候也用“位周期”来表示传输速率,位周期是波特率的倒数。国际上规定了一个标准波特率系列:110bit/s、300bit/s、600bit/s、1200bit/s、1800bit/s、2400bit/s、2400bit/s、9600bit/s、14.4kbit/s、19.2kbit/s、28.8kbit/s等,如9600bit/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授时校正,提高时间的精度。我们的日历可以把阳历任意置成某一天然后查看当时的阴历是几月初几,实现了阴历的自动转换,星期的自动转换也可以编写程序实现,这样既可以跳到指定日期查看阴历,也可以查看当天是星期几了,所以我们的日历在性能上还有不完善的地方,在以后的学习当中,我们将尽力把这些功能也完善好。六、心得体会l 学习单片机没有捷径,别指望两三天就学会,要坚持不懈,重在积累。l 别崇拜高手,别相信天才,大部分人都不是天才(相信你也不是)!l 单片机是一门应用性和实践性很强的学科,要多动手,多做实验。l 要学会参考别人的程序,减少自己琢磨的时间,迅速提高自己的编程能力。l 碰到问题可以借助网络来搜寻答案和对自己有帮助的问题,可以大大减少你的开发时间。l 要多交一些朋友,多交流。技术是靠不断的积累和交流才会进步的,封闭自守只会更加落后。希望大家多上网看看前辈的经验,可以少走很多弯路。最后,祝愿大家早日成为单片机高手。本次课程设计虽然时间很短,但收获却很大。首先我们对单片机最小系统的设计有了整体的把握,对程序编写的合理与规范性有了深刻的理解,建立起程序设计的一般思路,其强大的功能给我们提供了很大的帮助,通过原理图的设计过程,使我们认识到了这个软件的重要性,我们会以此为契机,在日后的学习中会继续使用它,使其发挥更大的功能。经过一个学期的课程设计,我们得到了充分的锻炼,不仅对单片机的学习有了深刻的理解,同时也增强了我们的毅力和处理突发问题的能力。学习是要付出一定的艰辛与努力的,做事情一定要有不怕困难的吃苦精神,唯有坚持不懈,发扬团队协作才能够克服困难,取得最后的胜利。参考文献1 徐维祥、刘旭敏. 单片微型机原理及应用. 大连:大连理工大学出版社,19962 李光飞、楼然苗、胡佳文、谢象佐. 单片机课程设计与实例指导. 北京: 北京航空航天大学出版社,2004 3 余永权. 89系列FLASH单片机原理及应用. 北京:电子工业出版社,20024 李群芳,黄建. 单片机微型计算机与接口技术. 北京:电子工业出版社,20015 楼然苗、李光飞. 51系列单片机设计实例. 北京:北京航空航天大学出版社,2003附录 程序清单4.1电子时钟设计 #includeds1302.h/-DS1302写入和读取时分秒的地址命令-/-秒分时日月周年 最低位读写位;-/uchar code READ_RTC_ADDR7 = 0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d; uchar code WRITE_RTC_ADDR7 = 0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c;/-DS1302时钟初始化2013年1月1日星期二12点00分00秒。-/-存储顺序是秒分时日月周年,存储格式是用BCD码-/uchar TIME7 = 0, 0, 0x12, 0x04, 0x01, 0x02, 0x16;/* 函 数 名 : Ds1302Write* 函数功能 : 向DS1302命令(地址+数据)* 输 入 : addr,dat* 输 出 : 无*/void Ds1302Write(uchar addr, uchar dat)uchar n;RST = 0;_nop_();SCLK = 0;/先将SCLK置低电平。_nop_();RST = 1; /然后将RST(CE)置高电平。_nop_();for (n=0; n= 1;SCLK = 1;/数据在上升沿时,DS1302读取数据_nop_();SCLK = 0;_nop_();for (n=0; n= 1;SCLK = 1;/数据在上升沿时,DS1302读取数据_nop_();SCLK = 0;_nop_(); RST = 0;/传送数据结束_nop_();/* 函 数 名 : Ds1302Read* 函数功能 : 读取一个地址的数据* 输 入 : addr* 输 出 : dat*/uchar Ds1302Read(uchar addr)uchar n,dat,dat1;RST = 0;_nop_();SCLK = 0;/先将SCLK置低电平。_nop_();RST = 1;/然后将RST(CE)置高电平。_nop_();for(n=0; n= 1;SCLK = 1;/数据在上升沿时,DS1302读取数据_nop_();SCLK = 0;/DS1302下降沿时,放置数据_nop_();_nop_();for(n=0; n1) | (dat17);SCLK = 1;_nop_();SCLK = 0;/DS1302下降沿时,放置数据_nop_();RST = 0;_nop_();/以下为DS1302复位的稳定时间,必须的。SCLK = 1;_nop_();DSIO = 0;_nop_();DSIO = 1;_nop_();return dat;/* 函 数 名 : Ds1302Init* 函数功能 : 初始化DS1302.* 输 入 : 无* 输 出 : 无*/void Ds1302Init()uchar n;Ds1302Write(0x8E,0X00); /禁止写保护,就是关闭写保护功能for (n=0; n7; n+)/写入7个字节的时钟信号:分秒时日月周年Ds1302Write(WRITE_RTC_ADDRn,TIMEn);Ds1302Write(0x8E,0x80); /打开写保护功能/* 函 数 名 : Ds1302ReadTime* 函数功能 : 读取时钟信息* 输 入 : 无* 输 出 : 无*/void Ds1302ReadTime()uchar n;for (n=0; n7; n+)/读取7个字节的时钟信号:分秒时日月周年TIMEn = Ds1302Read(READ_RTC_ADDRn);4.4串口通信设计/* 实验名 : 串口实验* 使用的IO : P2* 实验效果 : 将接收到发送回电脑上面。*注意 :*/#includevoid UsartConfiguration();/* 函数名 : main* 函数功能 : 主函数* 输入 : 无* 输出 : 无*/void main()UsartConfiguration();while(1)/* 函数名 :UsartConfiguration()* 函数功能 :设置串口* 输入 : 无* 输出 : 无*/void UsartConfiguration()SCON=0X50;/设置为工作方式1TMOD=0X20;/设置计数器工作方式2PCON=0X80;/波特率加倍TH1=0XF3;/计数器初始值设置,注意波特率是4800的TL1=0XF3;ES=1;/打开接收中断EA=1;/打开总中断TR1=1;/打开计数器/* 函数名 :Delay(unsigned int i)* 函数功能 : 延时函数* 输入 : 无* 输出 : 无*/void Usart() interrupt 4unsigned char receiveData;receiveData=SBUF;/出去接收到的数据RI = 0;/清除接收中断标志位SBUF=receiveData;/将接收到的数据放入到发送寄存器while(!TI); /等待发送数据完成TI=0; /清除发送完成标志位 4.2数字电压表设计#includereg51.h#includeXPT2046.h/-定义使用的IO-/#define GPIO_DIG P0sbit LSA=P22;sbit LSB=P23;sbit LSC=P24;/-定义全局变量-/unsigned char code DIG_CODE17=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;/0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码uchar DisplayData8;/用来存放要显示的8位数的值void DigDisplay(void);void main(void)uint temp,count;while(1) if(count=50) count=0; temp = Read_AD_Data(0x94);/ AIN0 电位器/temp = Read_AD_Data(0xD4);/ AIN1 热敏电阻/temp = Read_AD_Data(0xA4);/ AIN2 光敏电阻/temp = Read_AD_Data(0xE4);/ AIN3 外部输入 count+; DisplayData7=DIG_CODE0; DisplayData6=DIG_CODE0; DisplayData5=DIG_CODE0; DisplayData4=DIG_CODE0; DisplayData3=DIG_CODEtemp%10000/1000; DisplayData2=DIG_CODEtemp%1000/100; DisplayData1=DIG_CODEtemp%100/10; DisplayData0=DIG_CODEtemp%10/1; DigDisplay();void DigDisplay(void)unsigned char i;unsigned int j;for(i=0;i8;i+)switch(i) /位选,选择点亮的数码管,case(0):LSA=0;LSB=0;LSC=0; break;/显示第0位case(1):LSA=1;LSB=0;LSC=0; break;/显示第1位case(2):LSA=0;LSB=1;LSC=0; break;/显示第2位case(3):LSA=1;LSB=1;LSC=0; break;/显示第3位case(4):LSA=0;LSB=0;LSC=1; break;/显示第4位case(5):LSA=1;LSB=0;LSC=1; break;/显示第5位case(6):LSA=0;LSB=1;LSC=1; break;/显示第6位case(7):LSA=1;LSB=1;LSC=1; break;/显示第7位GPIO_DIG=DisplayDatai;/发送段码j=50; /扫描间隔时间设定while(j-);GPIO_DIG=0x00;/消隐4.3电机调速设计#include /-定义使用的IO口-/ sbit PWM=P10;/-定义一个全局变量-/unsigned char timer1; void Time1Config();/* 函 数 名 : main* 函数功能 : 主函数* 输 入 : 无* 输 出 : 无*/void main(void)Time1Config();while(1) if(timer1100) /PWM周期为100*0.5ms

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论