单片机课程设计报告-单片机课程设计报告心得体会.doc_第1页
单片机课程设计报告-单片机课程设计报告心得体会.doc_第2页
单片机课程设计报告-单片机课程设计报告心得体会.doc_第3页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

1、单片机课程设计报告|单片机课程设计报告心得体会单片机课程设计报告 题 目 数字电压表 班 级 姓 名 学 号 指导老师 设计时间 1 方案设计与论证 1.1 硬件总体设计 设计并制作一个基于单片机的数字电压表的电路其结构框图如图 1-1 所示: 单片机 STC 89C52 时钟电路 复位电路 按键 测量电压输入 PCF8591 A/D转换电路 电压数码管显示系统 图1-1 硬件结构框图 (1)单片机最小系统电路部分 (2)数码管显示部分 (3) PCF8591芯片 AD转换部分 (4)外部电压采集部分 1.2软件总体设计 良好的设计方案可以减少软件设计的工作量,提高软件的通用性,扩展性和可读性

2、。本系统的设计方案和步骤如下: (1)根据需求按照系统的功能要求,逐级划分模块。 (2)明确各模块之间的数据流传递关系,力求数据传递少,以增强各模块的独立性,便于软件编制和调试。 (3)确定软件开发环境,选择设计语言,完成模块功能设计,并分别调试通过。 (4)按照开发式软件设计结构,将各模块有机的结合起来,即成一个较完善的系统。采用 PCF8591芯片,其中A/D转换器用于实现模拟量向数字量的转换,单电源供电。单片机模块采用STC89C52单片机作为系统的控制单元。通过按键来选择相应的档位,主控控制相应继电器来选取不同的模拟量输入。通过A/D转换将被测值转换为数字量送入单片机中,再由单片机来送

3、显。 2 硬件设计 2.1 电源电路 本设计的电源部分采用的是外部直流直接供电方案。采用DC插座为连接器件。电压值为直流5V供电。当外部直流5V电输入时,首先进行滤波处理,减少直流电中的交流部分。为本系统提供稳定的5V电源,保证各个电路正常地稳定工作。 图2-1 电源电路图 2.2 显示电路 显示电路由一个4位的共阳数码管,4个PNP型的三极管S8550和4个限流电阻构成。S8550为数码管的段码驱动开关管,当它的B极为低电平时,三极管导通,当它的B极为高电平时,三极管截止,而这4个三极管的B极是受控于单片机的IO口的。三极管的E极接电源正,当三极管导通时,电源正极就到达了数码管的阳极。此时数

4、码管的8个段的点亮与熄灭完全受控于数码管的段码控制IO,只要它为低电平,就可以点亮数码管中相应的段。 图2-2-1 显示电路图 图2-2-2 显示电路图 2.3 单片机最小系统电路 单片机最小系统由复位电路与晶振电路组成电路图如下: 图2-3-1 单片机最小系统电路图 复位电路由按键复位和上电复位两部分组成。STC89C52系列单片及为高电平复位,通常在复位引脚RST上连接一个电容到VCC,再连接一个电阻到GND,由此形成一个RC充放电回路保证单片机在上电时RST脚上有足够时间的高电平进行复位,随后回归到低电平进入正常工作状态,这个电阻和电容的典型值为10K和10uF。 按键复位就是在复位电容

5、上并联一个开关,当开关按下时电容被放电、RST也被拉到高电平,而且由于电容的充电,会保持一段时间的高电平来使单片机复位。 晶振电路由晶振器件与2个助振电容组成,晶体振荡器作为振荡源,由于单片机内部带有振荡电路,所以外部只要连接一个晶振和两个电容即可,电容容量一般在15pF至50pF之间。 本系统采用内部方式的时钟电路和加电自复位的复位电路,如下图所示: 图2-3-2 时钟电路图 图2-3-3 复位电路图 2.4 PCF8591芯片 AD转换部分电路 PCF8591芯片将模拟电压信号转化为二进制数值,再用IC总线传送给单片机,经由单片机转换成十进制数值并通过数码管显示。PCF8591芯片AD转换

6、部分电路如图2-4所示: 图2-4 PCF8591芯片 AD转换部分电路图 按照不同的量程,设置不同的衰减比例,即输入电阻的大小与总回路电阻的比值。外部采集到的电压进过电阻进行衰减,降到 PCF8591 芯片的基准采集电压范围之内, PCF8591是8位的 D/A采用的是串行数模转换器。有4路采样通道,因为本设计要采样温度和电压,需要用到2个采样通道.并且PCF8591与单片机通迅方便简单,PCF8591一共有4个采集通道,分别为AIN0,AIN1,AIN2,AIN3。AIN3为电压检测通道,它检测的是输入端的电压,单片机可以处理PCF8591发送来的数据计算出相应的电压值,并且经数码管显示出

7、来.TL431为可调的稳压芯片,此图上的接法是最典型的2.5V接法,它不需要可调电阻,方便简单。2.5V经R4电阻,C5组合成RC滤波,然后供给PCF8591做基准电压。我们知道,PCF8591是一个8位AD/DA芯片,8位共有256个量,如果用2.5V做基准的话,每个分辨量是:2.5V/(256-1) 约等于 9.8mV,就是PCF8591每检测到一个量就是9.8mV,由此来检测电压值。 RW为高精密可调电阻,称为电压校正电阻。它的作用是来调整输入电压分压.因为输入的电压一般都大于其准电压。所以要把输入的电压进行分压处理,然后在程序里进行还原处理。 3 软件设计 3.1 主程序 系统主程序包

8、括PCF8591AD转换模块,电压计算、数码管显示。主程序主要通过调用其他函数来实现系统的总体功能,其工作顺序如下: (1)系统启动后,进行系统的初始化。 (2)读取 PCF8591芯片的值,判断值得大小是否超过最大电压,再通过数码管显示。 (3)如果超过量大测量电压就显示OL,表示超量程,没有超过就显示相应电压值。 主程序的程序流程图如图 3-1所示。 程序开始 初始化 循环30次读取AD结果 AD结果/30=平均值 AD结果是最大值吗? 电压值计算 显示电压 显示超量程 N Y 图 3-1 主程序的程序流程图 3.2 PCF8591AD转换程序设计 电压表的测量是通过 PCF8591AD、

9、D/A转换芯片实现的,在硬件电路的设计中已经做了设计,现在设计 PCF8591AD、D/A转换芯片的软件部分。 AD转换流程如下图: 子程序初始化 I2C初始条件 写入器件地址(写) 发送控制字 检测应答信号 I2C初始条件 写入器件地址(读) 检测应答信号 接收数据存入指针地址 结束 图3-2 AD转换流程图 AD系统程序设计主要包括三部分:总线的初始化程序、启动信号程序、应答信号程序、停止信号程序、写字节程序、读字节程序。 4 安装与调试 4.1 电路安装 (1)检查元件的好坏 按电路图买好元件后首先检查买回元件的好坏,按各元件的检测方法分别进行检测,一定要仔细认真。而且要认真核对原理图是

10、否一致,在检查好后才可上件、焊件,防止出现错误焊件后不便改正。 (2)放置、焊接各元件 按原理图的位置放置各元件,在放置过程中要先放置、焊接较低的元件,后焊较高的和要求较高的元件。特别是容易损坏的元件要后焊,在焊集成芯片时连续焊接时间不要超过10s,注意芯片的安装方向。 4.2 系统调试 (1)在Keil软件中编写并调试程序,修改语法错误,最终生成.he_目标程序。 (2)利用Proteus软件绘制电路图,在确保电路连接正确无误的情况下,载入目标程序,仿真并查看结果,如图4-1所示。 图4-1仿真图 5 性能测试与结果分析 使用STC-ISP软件烧入目标程序,观察实物运行效果,将导线接在纽扣电

11、池正负端,电压测量效果如图5-1所示。经实验测试,该数字电压表设计方案正确、可行,各项指标稳定、可靠。 图5-1实物运行效果 6 心得体会 通过本次的设计,使我们不仅对单片机这门课程有了更深刻的认识,懂得了如何运用课本知识结合实际来完成定时器的显示和编程方法以及数码显示电路的驱动方法,使我们能够很快的适应现代控制技术发展的需求,同时也提高了我们的思维能力和实际操作能力,为以后更好的走上工作岗位奠定了坚实的基础。另外,这次的设计还让我更进一步的认识了关于 STC89C52等芯片的引脚功能以及使用方法,使我学会了应用不同的芯片来配合完成整个设计的操作。在做硬件电路的这段时间里,从思考设计到对电路的

12、调试经过了许多困难。同样在对软件进行设计时,也可为一路坎坷。但是通过对软硬件不断撞墙,不断思考解决问题的过程中,我学会了很多东西,同时对单片机也有了更深的认识。 参考文献: 1 王福瑞单片机测控系统设计大全M 北京:北京航空航天大学出版社,20_0 2 谭浩强C程序设计M北京:清华大学出版社,20_7 3 丁元杰单片机原理及应用M 北京: 机械工业出版社,20_3 附录: 1 电路图 2 实物图(正反面) 3 源程序 #include /包含头文件 #define setPcf8591Add 0_90 /定义PCF859的器件地址 sbit SCL = P26; /定义PCF859的时钟IO口

13、 sbit SDA = P27; /定义PCF859的数据IO口 /_-这样做的好处就是可以随意改IO与段码的对应关系(方便洞洞板接线)-_/ sbit LED1 = P37; /定义第1个数码管的位选 sbit LED2 = P36; /定义第2个数码管的位选 sbit LED3 = P12; /定义第3个数码管的位选 sbit LED4 = P11; /定义第4个数码管的位选 sbit LED_a = P35; /定义数码管的段选a段 sbit LED_b = P13; /定义数码管的段选b段 sbit LED_c = P30; /定义数码管的段选c段 sbit LED_d = P32;

14、/定义数码管的段选d段 sbit LED_e = P33; /定义数码管的段选e段 sbit LED_f = P34; /定义数码管的段选f段 sbit LED_g = P17; /定义数码管的段选g段 sbit LED_dp = P31; /定义数码管的段选dp段 /_=把数显段码存放在数组里,并且与数组下标对应=_/ unsigned char dig10 = 0_03,0_9f,0_25,0_0d,0_99,0_49,0_41,0_1f,0_01,0_09; /0 1 2 3 4 5 6 7 8 9段码 /_=数码管显示暂存数组=_/ unsigned char ledData = 0_

15、ff,0_ff,0_ff,0_03; /第3位,第2位,第1位,第0位 /_=数码管显示函数=_/ void led_out(void) unsigned char i,j; for(i = 0;i 4;i+) /for循环4次,i从0到3循环4次,依次扫描4个数码管. /_-关全部位选-_/ LED1 = 1; /数码管位选1位关 LED2 = 1; /数码管位选2位关 LED3 = 1; /数码管位选3位关 LED4 = 1; /数码管位选4位关 /_-输入要显示数组里的段码-_/ LED_a = ledDatai &; 0_80; /数码管的段选a段输出暂存数组里的相对应数据.LED_b

16、 = ledDatai &; 0_40; /数码管的段选b段输出暂存数组里的相对应数据.LED_c = ledDatai &; 0_20; /数码管的段选c段输出暂存数组里的相对应数据.LED_d = ledDatai &; 0_10; /数码管的段选d段输出暂存数组里的相对应数据.LED_e = ledDatai &; 0_08; /数码管的段选e段输出暂存数组里的相对应数据.LED_f = ledDatai &; 0_04; /数码管的段选f段输出暂存数组里的相对应数据.LED_g = ledDatai &; 0_02; /数码管的段选g段输出暂存数组里的相对应数据.LED_dp = le

17、dDatai &; 0_01; /数码管的段选dp段输出暂存数组里的相对应数据./_-判断要开哪个位选-_/ if(i = 0) /判断显示的位置.LED1 = 0; /如果当前扫描的是第1个数码管.位选打开,显示数据 else if(i = 1) /如果当前扫描的是第2个数码管.位选打开,显示数据 LED2 = 0; else if(i = 2) /如果当前扫描的是第3个数码管.位选打开,显示数据 LED3 = 0; else if(i = 3) /如果当前扫描的是第4个数码管.位选打开,显示数据 LED4 = 0; for(j = 0;j 0;time-); /_= 函数名 : I2C起始

18、条件.调 用 : 无调用函数.参 数 : 无参数.返回值 : 无返回值.备 注 : 当SCL为高,SDA的下降沿叫做起始条件.(5V时:高大于0.6us,低大于0.6us) =_/ void i2c_start(void) /I2C起始条件 SDA = 1; /SDA输出高电平(注意的是:SCL需在SDA后面拉高,如果外部已拉低SCL,SDA的拉高将被看着是停止条件) delay(5); /延时 SCL = 1; /SCL输出高电平 delay(5); /延时 SDA = 0; /SDA下降沿.delay(5); /延时 SCL = 0; /SCL输出高电平 delay(5); /延时 /_=

19、 函数名 : I2C停止条件.调 用 : 无调用函数.参 数 : 无参数.返回值 : 无返回值.备 注 : 当SCL为高,SDA的上升沿叫做停止条件.写此函数思想:1.要产生停止条件,必须要让SDA产生1个上升沿.在产生上升沿之前,SDA须为低.2.正常停止信号在ACK应答后产生,考虑到应答和非应答,所以要先拉低SCL,允许 SDA确保为低,再拉高SCL来满足这1条件 =_/ void i2c_stop(void) /I2C停止条件 SCL = 0; /允许SDA为低.delay(5); /延时 SDA = 0; /SDA输出低电平.delay(5); /延时 SCL = 1; /SCL输出高

20、电平 delay(5); /延时 SDA = 1; /SDA上升沿.delay(5); /延时 /_= 函数名 : 回复应答或者非应答信号.调 用 : 无调用函数.参 数 : ACKsw为:应答开关,为0时表示应答,1表示非应答.返回值 : 无返回值.备 注 : =_/ void i2c_ACK(bit ACKsw) /回复应答或者非应答信号.为0时表示应答,1表示非应答. SCL = 0; /拉抵SCL,允许SDA变化.delay(5); /延时 SDA = ACKsw; /把应答信号传输SDA.delay(5); /延时 SCL = 1; /拉高SCL,让I2C来读取.delay(5);

21、/延时 SCL = 0; /拉低SCL,允许外部改变SDA.delay(5); /延时 /_= 函数名 : 检测应答信号.调 用 : 无调用函数.参 数 : 无参数.返回值 : 返回值应答,0表示应答,1表示非应答.备 注 : 当发送完8个数据位后,再发送1个SCL用来检测I2C是否应答.=_/ bit i2c_waitACK(void) /检测应答信号 SCL = 0; /拉低SCL,允许SDA改变.delay(5); /延时 SDA = 1; /因为是要接收低电平,所以要先拉高SDA的电平.delay(5); /延时 SCL = 1; /发送1个SCL高.准备检测SDA数据.delay(3

22、0); /延时 if(SDA = 1) /检测SDA数据. SCL = 0; /拉低SCL,准备退出,允许外部改变SDA.delay(5); /延时 return 1; /如果读到应答对应位为1说明I2C没有应答. else SCL = 0; /拉低SCL,准备退出,允许外部改变SDA.delay(5); /延时 return 0; /如果读到应答对应位为0说明I2C回复了应答. /_= 函数名 : I2C位发送.调 用 : 无调用函数.参 数 : dat为:要发送的8位数据.返回值 : 无返回值.备 注 : 传输1个字节数据的8个位.=_/ void i2c_sendbyte(unsigne

23、d char dat)/I2C位发送 unsigned char i; /定义1个变量用来循环发送数据位用.SCL = 0; /SCL输出低电平,允许数据改变 delay(5); /延时 for(i = 0;i 8;i+) /循环8次,发送1个数据的8个位 if(dat &; 0_80) /如果要发送的数据最高位为1 SDA = 1; /传输位1.else SDA = 0; /否则传输0.dat = 1; /把要传输的数据移到高位,方便下次发送.delay(5); /延时 SCL = 1; /SCL输出高电平I2C来读数 delay(5); /延时 SCL = 0; /SCL输出低电平允许改变

24、数据 delay(5); /延时 /_= 函数名 : I2C读取8位.调 用 : 无调用函数.参 数 : 无参数.返回值 : 返回读取到的8位数据.备 注 : 读取1个字节数据的8个位.=_/ unsigned char i2c_recbyte(void) /I2C读取8位 unsigned char i; /定义1个变量用来循环接收数据位用.unsigned char readDat; /定义1个变量用来暂存接收到的数据 readDat = 0; /暂存初值为0.SCL = 0; /SCL输出低电平,允许数据改变(任何时序函数结束时都应保持SCL低电平) SDA = 1; /如果要接收数据,

25、必须释放数据总线SDA.delay(5); /延时 for(i = 0;i 8;i+) /循环8次,接收1个数据的8个位 SCL = 1; /SCL拉高电平,24C输出数据位.delay(30); /延时 readDat = 1; /因为24C传输数据是高位在前,所以必须左移1位才有空位接收新的数据位.if(SDA = 1) /如果读到的数据为1.readDat+; /暂存最低位置1.SCL = 0; /SCL输出低电平允许改变数据 delay(5); /延时 return readDat; /返回读取到的字节 /_= 函数名 : 读AD转换后的值.参 数 : 的值为AD转换控制字,具体可以查

26、PCF8591手册,控制字寄存器功能说明.dat为转换后的值指针变量.只要把一个变量的地址传给这个函数.那么经过此函数转换后,就可以 改变传过来地址变量的值,假如传A变量的地址给这个函数,转换成功后,AD转换结果就存入了A变量的地址 判断这个函数转换成功后,可以直接使用A的值.返回值 : 返回1说明转换失败.备 注 : 读取AD转换的一次结果.=_/ bit i2c_readbyte(unsigned char , unsigned char _dat) i2c_start; /I2C起始条件 i2c_sendbyte(setPcf8591Add); /向I2C写入器件地址,(写) if (i

27、2c_waitACK) /检测应答信号,如果非应答,就返回1,结束函数.return 1; i2c_sendbyte(); /如果器件地址通过,就发送控制字节 if (i2c_waitACK) /检测应答信号,如果非应答,就返回1,结束函数 return 1; i2c_start; /I2C起始条件 i2c_sendbyte(setPcf8591Add+1); /向I2C写入器件地址(读) if (i2c_waitACK) /检测应答信号,如果非应答,就返回1,结束函数.return 1; _dat = i2c_recbyte; /读取数据 i2c_ACK(0); /因为只读一字节数据,不发送

28、ACK信号 i2c_stop; /发送停止信号.return 0; /返回0说明转换成功. /_=定时器0初始化=_/ void Init_Timer0(void) TMOD |= 0_01; /使用模式1,16位定时器,使用“|“符号可以在使用多个定时器时不受影响 TMOD &;= 0_F0; /设置定时器模式 TL0 = 0_00; /设置定时初值 TH0 = 0_00; /设置定时初值 EA = 1; /总中断打开 ET0 = 1; /定时器中断打开 TR0 = 1; /定时器开关打开 /_=定时器中断子程序=_/ void Timer0_isr(void) interrupt 1 TMOD &;= 0_F0; /设置定时器模式 TL0 = 0_00; /设置定时初值 TH0 = 0_00; /设置定时初

温馨提示

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

评论

0/150

提交评论