单片机课程设计单片机多功能测量仪的设计_第1页
单片机课程设计单片机多功能测量仪的设计_第2页
单片机课程设计单片机多功能测量仪的设计_第3页
单片机课程设计单片机多功能测量仪的设计_第4页
单片机课程设计单片机多功能测量仪的设计_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

1、 单片机应用技术 课程设计学 生 姓 名: 左 鹏 学 号: 年级/专业/班: 2012级机电2班 学 院: 应用技术学院 指 导 教 师: 黄惟公 2014年1月目 录任务书1 单片机多功能测量仪的设计11.1 主要功能11.2 电路总体方案11.3 各个功能模块的说明11.3.1 STC89C52的主要特点11.3.2 LCM1602显示电路21.3.3 键盘电路31.3.4 光电计数电路31.3.5 直流电压测量电路31.3.6 温度测量电路41.4 电路原理图(SCH)42 应用程序设计52.1 程序的总体设计52.1.1 程序结构框图52.1.2 所需要的程序模块52.2 主程序的设

2、计63 仿真及实际效果图931 Protues仿真效果图94 总结与致谢11参考文献11附 程序清单1 单片机多功能测量仪的设计1.1 主要功能主要功能如下:(1) 测量05V的直流电压;用LCM1602液晶显示电压值(小数点后一位);(2) 测量-30100温度;用LCM1602液晶显示温度值(整数);(3) 对光电传感器的遮挡次数进行计数(000255)。 (4) 按下键key1、key2、key3分别显示电压、温度、计数值。1.2 电路总体方案根据以上功能,设计的电路总体方案框图如下: 采用增强型51系列单片机STC89c52为核心控制器;字符型LCM1602液晶显示模块;三个独立键盘;

3、光电计数单元;一线制的DS18B20集成测温芯片测量温度;TLC549为AD,采集直流的05v电压值。1.3 各个功能模块的说明以下分别描述各功能模块的电路设计。 STC89C52的主要特点STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 主要特性如下:1. 增强型8051单片机,6时

4、钟/机器周期和12时钟/机器周期可以任意选择,指令代码完全兼容传统8051;2. 工作电压:5.5V3.3V(5V单片机)/3.8V2.0V(3V单片机);3. 工作频率范围:040MHz,相当于普通8051的080MHz,实际工作频率可达48MHz;4. 用户应用程序空间为8K字节;5. 片上集成512字节RAM;6. 通用I/O口(32个),复位后为:P1/P2/P3/P4是准双向口/弱上拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。7. ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可通过串口(RxD/P3.

5、0,TxD/P3.1)直接下载用户程序,数秒即可完成一片;8. 具有EEPROM功能;9. 具有看门狗功能;10. 共3个16位定时器/计数器。即定时器T0、T1、T2;11. 外部中断2个,下降沿中断或低电平触发电路,Power Down模式可由外部中断低电平触发中断方式唤醒;12. 通用异步串行口(UART),还可用定时器软件实现多个UART;13. 工作温度范围:-40+85(工业级)/075(商业级)。 LCM1602显示电路显示电路如下;这是一种四线数据、2根控制线的接口方法,它与单片机需要六线连接。 键盘电路这是一种独立式键盘的电路。 光电计数电路电路原理如右;采用的是反射式光电开

6、关,如图OP。74LS14为施密特触发器,起整形作用。整形后的信号进入89c52的T1计数器进行计数。 直流电压测量电路电路原理图如下;采用TLC549作为AD转换器,TLC549是美国德州仪器公司生产的8位串行A/D转换器芯片,可与通用微处理器、控制器通过CLK、CS、DATA OUT三条口线进行串行接口。具有4MHz片内系统时钟和软、硬件控制电路,转换时间最长17s, TLC549为40 000次/s。总失调误差最大为±0.5LSB,典型功耗值为6mW。TLC549均有片内系统时钟,该时钟与I/O CLOCK是独立工作的,无须特殊的速度或相位匹配。仿真时,用一个10k的可调电阻获

7、取05V的直流电压。如在实际应用中,这个电压来源于实际被测的直流电压。 温度测量电路DS18B20是DALLAS公司生产的单总线式数字温度传感器,它具有微型化、低功耗、高性能、抗干扰能力强、易配处理器等优点,特别适用于构成多点温度测控系统,可直接将温度转化成串行数字信号(提供9位二进制数字)给单片机处理,且在同一总线上可以挂接多个传感器芯片。它具有3引脚TO-92小体积封装形式,温度测量范围为-55+125,可编程为9位12位A/D转换精度,测温分辨率可达0.0625 ,被测温度用符号扩展的16位数字量方式串行输出,其工作电源既可在远端引人,也可采用寄生电源方式产生,多个DS18B20可以并联

8、到3根或2根线上,CPU只需一根端口线就能与多个DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。本仪器采用P3.4作为接口。如左图。14 电路原理图(SCH)2 应用程序设计2.1 程序的总体设计 程序结构框图 所需要的程序模块LCD1602-4.H3KEY.HTLC595.HDS18B20.H2.2 主程序的设计#include"key.h"#include<lcd1602.h>#include<tlc549.h>#include<ds18b20.h>sbit guangdian=P35;uchar i,num1

9、,nummm=2;void Guangdian(void) /光电计数子程序 uchar DispBuffer4;uchar num; num=TH1*256+TL1;DispBuffer0=TL1/100+0x30;DispBuffer1=TL1%100/10+0x30;DispBuffer2=TL1%10+0x30;DispBuffer3='0'LCD_Prints(6,1," ");LCD_Prints(8,1,DispBuffer);void DianYa(void) /测量电压和A/D转换子程序uchar bis6;uchar DA;DA= AD_

10、TLC549()*50.5/255;bis0=DA/10+0x30;bis1='.'bis2=DA%10+0x30;bis3=' 'bis4='V'bis5='0'LCD_Prints(6,1,bis);void wendu(void)/温度测量子程序 char DB6; uchar wd=0;Init_DS18B20();wd=ReadTemp();if(wd>128)wd=256-wd; DB0='-'else DB0=wd/100+0x30;DB1=wd%100/10+0x30;DB2=wd%10+0x

11、30;DB3=0xdf;DB4='C'DB5='0'LCD_Prints(6,1,DB); void caidan (uchar num1)switch(num1)case 0:Guangdian();break;case 1:DianYa();break;case 2:wendu();break; void KeyProc(void) /按键处理程序uchar key;key=KeyScanNUM();if(key=UP|key=DOWN|key=ENTER)switch(key)case UP:nummm=0;LCD_Prints(1,0,"Pho

12、toelectric ");break;case DOWN:nummm=1;LCD_Prints(1,0,"Voltage ");break;case ENTER:nummm=2;LCD_Prints(1,0,"Temperature ");break;caidan(nummm);void main(void)TMOD=0x50;TL1=0;TH1=0;TR1=1;LCD_Init();LCD_Prints(1,0,"Temperature ");while(1) KeyProc(); 3 仿真及实际效果图31 Protue

13、s仿真效果图课程设计总结这个学期的单片机课已经早早的上完了,但是理论纯属理论,没有与实践的结合总让我们学的不踏实,感觉没有达到学以致用的效果。所庆幸的是在课程介绍考试完之后,老师给我们安排了这次单片机课程设计,给了我们学以致用的做好的实践。 关于这次课程设计,我们花费了比较多的心思,既是对课程理论内容的一次复习和巩固,还让我们丰富了更多与该专业相关的其他知识,比如软件应用等,在摸索中学习,在摸索中成长,在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的又一收获,在真正设计之前我们做了相当丰富的准备,首先巩固一下课程理论,再一遍熟悉课程知识的构架,然后结合加以理论分析、总结,有了一

14、个清晰的思路和一个完整的的软件流程图之后才着手设计。在设计程序时,我们不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;养成注释程序的好习惯是非常必要的,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也能为资料的保存和交流提供了方便;我觉得在设计课程过程中遇到问题是很正常,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题的课程设计又出错了。 除了对此次设计的准备工作之外,我们还学到了很多平时难得的东西,首先是团队协作,在这次设计当中,难免和同学产生观点和意见的分歧,以及分工明细、时间安排等不合理,通过这次设计,我们体会到了

15、团结合作的重要性及力量之强大,还有让我们处理事情更加有条理,思路更加清晰明了了,发现、提出、分析、解决问题和实践能力的提高都将受益于我在以后的学习、工作和生活中。 此次的设计,其实也是我们所学知识的一次综合运用,让我深深的认识到了学习单片机要有一定的基础,要有电子技术方面的数字电路和模拟电路等方面的理论基础,特别是数字电路;也要有编程语言的汇编语言或C语言。要想成为单片机高手,我们首先要学好汇编语言,然后转入C语言学习,所以我们不能学到后面就忘了前面的知识,更应该将所学的知识紧紧的结合在一起,综合运用,所谓设计,就是要求创新,只有将知识综合运用起来才能真正的设计好。参考文献黄惟公等单片机原理及

16、接口技术 西安电子科大出版社 2007周景润等 基于PROTEUS的电路及单片机系统设计与仿真 北航出版社 2006.5韩晓东等Pretel电路设计入门与应用 中国铁道出版社 附程序清单 综合测量仪程序主程序#include"key.h"#include<lcd1602.h>#include<tlc549.h>#include<ds18b20.h>sbit LED1=P14;sbit LED2=P15;sbit LED3=P16;sbit guangdian=P35;sbit E1 = P24;sbit E2 = P25;uchar i;

17、void KeyProc(void) /红黄灯亮子程序uchar key;key=KeyScanNUM();switch(key)case UP:LED1=1;LED2=1;LED3=0;break;case DOWN:LED1=1;LED2=0;LED3=1;break;case ENTER:LED1=0;LED2=1;LED3=1;break;key=0;void Guangdian(void) /光电计数子程序 uchar code dis=0xc0,0xf3,0x98,0x92,0xa3,0x86,0x84,0xd3,0x80,0x82,0xff;uchar num; num=TH1*

18、256+TL1;switch(i) case 0:P0=disnum/10;E1=1;E2=0;i=1;break; case 1:P0=disnum%10;E1=0;E2=1;i=0;break;void DianYa(void) /测量电压和A/D转换子程序uchar bis6;uchar DA;DA= AD_TLC549()*50.5/255;bis0=DA/10+0x30;bis1='.'bis2=DA%10+0x30;bis3=' 'bis4='V'bis5='0'LCD_Prints(0,1,bis);void wen

19、du(void)/温度测量子程序 char DB6; uchar wd=0;Init_DS18B20();wd=ReadTemp();if(wd>127)i=256-wd; DB0='-'else DB0=i/100+0x30;DB1=wd%100/10+0x30;DB2=wd%10+0x30;DB3=0xdf;DB4='C'DB5='0'LCD_Prints(10,1,DB);void main(void)TMOD=0x50;TL1=0;TH1=0;TR1=1;LCD_Init(); LCD_Prints(0,0,"DianYa

20、");LCD_Prints(10,0,"WenDu");while(1)KeyProc();Guangdian();DianYa();wendu(); LCM1602驱动函数:LCD1602.h#ifndef _LCD1602_H_#define _LCD1602_H_#include<reg52.h>#define uint unsigned int#define uchar unsigned charsfr LCD_DATA=0x90;sbit LCD_RS=P26;sbit LCD_EN=P27;void LCD_Init(void);void

21、LCD_Prints(uchar x,uchar y,uchar *str);#endifLCM1602驱动程序:LCD1602.c#include"lcd1602.h"void LCD_Delay(uchar x)while(-x);void LCD_En(void)LCD_EN=1;LCD_Delay(4);LCD_EN=0;void LCD_cmd(uchar cmd)uchar cmd1;cmd1=cmd;cmd1>>=4;LCD_Delay(18);LCD_RS=0;LCD_DATA &=0xf0;LCD_DATA |=cmd1&0x0

22、f;LCD_En();LCD_DATA &=0xf0;LCD_DATA |=cmd&0x0f;LCD_En();void LCD_Clr(void)LCD_cmd(0x01);LCD_Delay(255);LCD_Delay(255);LCD_Delay(255);LCD_Delay(200);void LCD_Init(void)LCD_cmd(0x28);LCD_En();LCD_cmd(0x28);LCD_cmd(0x0c);LCD_Clr();void LCD_Dat(uchar dat)uchar dat1;dat1=dat;dat1>>=4;LCD_De

23、lay(18);LCD_RS=1;LCD_DATA &=0xf0;LCD_DATA |=dat1&0x0f;LCD_En();LCD_DATA &=0xf0;LCD_DATA |=dat&0x0f;LCD_En();void LCD_Pos(uchar x,uchar y)if(y)LCD_cmd(x|0xc0);else LCD_cmd(x|0x80);void LCD_Prints(uchar x,uchar y,uchar *str)LCD_Pos(x,y);while(*str)LCD_Dat(*str);str+;按键驱动函数及程序KEY.h#ifnd

24、ef _KEY_H_#define _KEY_H_#include<reg52.h>#define uchar unsigned char#define UP 0x01#define DOWN 0x02#define ENTER 0x03sbit UP_key=P22;sbit DOWN_key=P21;sbit ENTER_key=P20;void ys (unsigned int x) unsigned char j; while (x-) for (j=0;j<123;j+); uchar KeyScanNUM(void) uchar key=0; UP_key=1;D

25、OWN_key=1;ENTER_key=1; if(UP_key=0)ys(10);if(UP_key=0)key=UP;else key=0; if(DOWN_key=0)ys(10);if(DOWN_key=0)key=DOWN;else key=0; if(ENTER_key=0)ys(10);if(ENTER_key=0)key=ENTER;else key=0; return key;TCL549驱动函数及程序TCL549.h /*-功能:TCL549的头文件-*/#ifndef _TCL549_H_#define _TCL549_H_#include<reg52.h>#

26、define uint unsigned int#define uchar unsigned char/ADC0832引脚与51单片机的连接sbit AD_CS =P33; sbit AD_DAT =P37; sbit AD_CLK =P36; void delay(uint x) while(x-);uchar AD_TLC549()uchar value=0,i=0;AD_CS=0;AD_DAT=1;for (i=0;i<8;i+)if(AD_DAT)value|=(0x80)>>i;AD_CLK=1;AD_CLK=0;delay(10);AD_CS=1;delay(50

27、);return value;#endif智能温度传感器DS18B20驱动函数DS18B20.h#ifndef _DS18B20_#define _DS18B20_#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit DQ = P34; /温度传送数据接口,根据实际电路修改/unsigned char temp_value; /存放温度数据/unsigned char TempBuffer6; /存放转换成液晶字符的数组 ××注意此数组的定义void Init_DS18

28、B20(void); /初始化DS18B20,uchar ReadTemp(void); /读DS18B20温度,存入temp_valu /转换结果正温度为3位整数,负温度为两位整数;都无小数部分/void temp_to_str(void); /温度数据转换成液晶显示字符(ASIC码)#endif智能温度传感器DS18B20驱动程序DS18B20.c#include <REG52.H>#include "ds18b20.h"/sbit DQ = P10; /温度传送数据IO口unsigned char temp_value; /存放温度数据unsigned char TempBuffer3; /volatile存放转换成液晶字符的数组 ××注意此数组的定义void delay_18B20(unsigned int i)while(i-);void Init_DS18B20(void) unsigned char x=0; DQ = 1; /DQ复位 delay_18B20(8); /稍做延时 DQ = 0; /单片机将DQ拉低 delay_18B20(80); /精确延时 大于 480us DQ = 1; /拉高总线 delay_18B20(14); x=DQ; /稍做延时后 如果x=0则初始化

温馨提示

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

评论

0/150

提交评论