《基于DS18b20的温度测量和秒表设计单片机最小系统实验报告.doc》由会员分享,可在线阅读,更多相关《基于DS18b20的温度测量和秒表设计单片机最小系统实验报告.doc(29页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、单片机最小系统实验报告基于DS18b20的温度测量和秒表设计目录单片机最小系统实验报告1一、单片机31.单片机简介32.最小系统33. AT89C51单片机引脚说明4二、18B20介绍5三、最小系统硬件设计81、设计结构框图82、系统时钟电路83、复位电路8四、实验具体容91、实现LED显示器的选通并显示字符92、基于DS18b20的温度测量和秒表设计16五、总结29一、单片机1.单片机简介单片微型计算机简称单片机,是典型的嵌入式微控制器(Microcontroller Unit),常用英文字母的缩写MCU表示单片机,单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统
2、集成到一个芯片上。单片机由运算器,控制器,存储器,输入输出设备构成,相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。它最早是被用在工业控制领域AT89C51提供以下标准功能:8K字节Falsh闪速存储器,256字节部RAM,32个I/O口线,3个16位定时/计数器,一个6向量两级中断结构,一个全双工串行通信口,片震荡器与时钟电路,同时AT89C51可降至0HZ的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU
3、的工作,但允许RAM,时/计数器,串行通信口与中断系统持续工作。掉电方式保存RAM中的容,但震荡器停止工作并禁止其他所有部件工作直到下一个硬件复位。AT89C51单片机主要功能特性:兼容MCS51指令系统4k可反复擦写(1000次)FlashROM32个双向I/O口8个中断源三个16位可编程定时/计数器2.7-6.V的宽工作电压围时钟频率0-24MHz128x8bit部RAM五个外部中断源两个串行中断可直接驱动LED两级加密位低功耗睡眠功能置一个模拟比较放大器可编程UARL通道软件设置睡眠和唤醒功能2.最小系统单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统.
4、对51系列单片机来说,单片机+晶振电路+复位电路,便组成了一个最小系统.但是一般我们在设计中总是喜欢把按键输入、显示输出等加到上述电路中,成为小系统。3. AT89C51单片机引脚说明VCC:供电电压。GND:接地。P0口:P0口为一个8位漏级开路双向I/O口,部无上拉电阻每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。P1口:P1口是一个部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于部
5、上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。P2口:P2口为一个部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。P3口:P3口管脚是8个带部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流,这是由于上拉的缘故。P3口也可作为AT89C51的一些特殊功能口,如下表所示:P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2
6、 /INT0(外部中断0)P3.3 /INT1(外部中断1)P3.4 T0(记时器0外部输入)P3.5 T1(记时器1外部输入)P3.6 /WR(外部数据存储器写选通)P3.7 /RD(外部数据存储器读选通)P3口同时为闪烁编程和编程校验接收一些控制信号。RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:
7、每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有部程序存储器。注意加密方式1时,/EA将部锁定为RESET;当/EA端保持高电平时,此间部程序存储器。在FL
8、ASH编程期间,此引脚也用于施加12V编程电源(VPP)。XTAL1:反向振荡放大器的输入与部时钟工作电路的输入。XTAL2:来自反向振荡器的输出。二、18B20介绍DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样,有LTM8877,LTM8874等等。主要根据应用场合的不同而改变其外观。封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。(1)DS18B20
9、(a)通过单线总线端口访问 DS1820 的协议如下:初始化void Init_DS18B20() uchar x=0; DQ = 1; /DQ复位 delay_18B20(8); /稍做延时 DQ = 0; /单片机将DQ拉低 delay_18B20(80); /精确延时 大于 480us DQ = 1; /拉高总线 delay_18B20(14); x=DQ; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18B20(20); ROM 操作命令int ReadOneChar(void)uchar i=0;uchar dat = 0;for (i=8;i0;i-) D
10、Q = 0; / 给脉冲信号 dat=1; DQ = 1; / 给脉冲信号 if(DQ) dat|=0x80; delay_18B20(4); return(dat);存储器操作命令WriteOneChar(uchar dat) uchar i=0; for (i=8; i0; i-) DQ = 0; DQ = dat&0x01; delay_18B20(5); DQ = 1; dat=1; 执行/数据ReadTemperature(void)uchar a=0;uchar b=0;uint t=0;Init_DS18B20();WriteOneChar(0xCC); / 跳过读序号列号的操作
11、WriteOneChar(0x44); / 启动温度转换delay_18B20(100);Init_DS18B20();WriteOneChar(0xCC); /跳过读序号列号的操作WriteOneChar(0xBE); /读取温度寄存器等(共可读9个寄存器) 前两个就是温度a=ReadOneChar();b=ReadOneChar();/传感器返回值除16得实际温度值/为了得到2位小数位,先乘100,再除16,考虑整型数据长度,/技巧处理后先乘25,再除4,除4用右移实现b=8;t=a+b;return(t);DS1820 需要严格的协议以确保数据的完整性。协议包括几种单线信号类型:复位脉冲
12、、存在脉冲、写0、写1、读0 和读1。所有这些信号,除存在脉冲外,都是由总线控制器发出的。和 DS1820 间的任何通讯都需要以初始化序列开始,初始化序列见下图。一个复位脉冲跟着一个存在脉冲表明DS1820 已经准备好发送和接收数据(适当的ROM 命令和存储器操作命令)(b)当总线上只有一个器件时,DS18B20读温度的流程为:复位发0CCH SKIP ROM命令发44H开始转换命令延时复位发0CCHSKIP ROM命令发0BEH读存储器命令连续读出两个字节数据(即温度)结束。 Convert T 44h这条命令启动一次温度转换而无需其他数据。温度转换命令被执行,而后DS1820 保持等待状态
13、。如果总线控制器在这条命令之后跟着发出读时间隙,而DS1820 又忙于做时间转换的话,DS1820 将在总线上输出“0”,若温度转换完成,则输出“1”。如果使用寄生电源,总线控制器必须在发出这条命令后立即起动强上拉,并保持500ms。 Read Scratchpad BEh这个命令读取暂存器的容。读取将从字节0 开始,一直进行下去,直到第9(字节8,CRC)字节读完。如果不想读完所有字节,控制器可以在任何时间发出复位命令来中止读取。(c)DS18b20 用12 位存贮温值度最高位为符号位,下图为18b20 的温度存储方式,负温度S=1 正温度S=0LSB:D7 D6 D5 D4 D3 D2 D
14、1 D0232221202-12-22-32-4MSB:D7 D6 D5 D4 D3 D2 D1 D0SSSSS272625三、最小系统硬件设计1、设计结构框图2、系统时钟电路单片机部具有一个高增益反相放大器,用于构成振荡器。通常在引脚XTALl和XTAL2跨接石英晶体和两个补偿电容构成自激振荡器,系统时钟电路结构如图:3、复位电路单片机小系统采用上电自动复位和手动按键复位两种方式实现系统的复位操作。上电复位要求接通电源后,自动实现复位操作。手动复位要求在电源接通的条件下,在单片机运行期间,用按钮开关操作使单片机复位。显示电路、键盘以与外部RAM的扩展根据具体电路的不同而不同四、实验具体容1、
15、实现LED显示器的选通并显示字符电路图的绘制(1)打开PROTEUS将所需元器件加入到对象选择器窗口。Picking Components into the Schematic单击对象选择器按钮,如图所示弹出“Pick Devices”页面,在“Keywords”输入AT89C51,系统在对象库中进行搜索查找,并将搜索结果显示在“Results”中,如图所示。在“Results”栏中的列表项中,双击“AT89C51”,则可将“AT89C51”添加至对象选择器窗口。 (2)接着在“Keywords”栏中重新输入7SEG,如图所示。双击“7SEG-MPX6-CA-BLUE”,则可将“7SEG-MP
16、X6-CA-BLUE”(6位共阳7段LED显示器)添加至对象选择器窗口。(3)最后,在“Keywords”栏中重新输入RES,选中“Match Whole Words”,如图所示。在“Results”栏中获得与RES完全匹配的搜索结果。双击“RES”,则可将“RES”(电阻)添加至对象选择器窗口。单击“OK”按钮,结束对象选择。经过以上操作,在对象选择器窗口中,已有了7SEG-MPX6-CA-BLUE、AT89C51、RES三个元器件对象,若单击AT89C51,在预览窗口中,见到AT89C51的实物图,如图所示;若单击RES或7SEG-MPX6-CA-BLUE,在预览窗口中,见到RES和7SE
17、G-MPX6-CA-BLUE的实物图,如图所示。此时,我们已注意到在绘图工具栏中的元器件按钮处于选中状态。(4)放置元器件至图形编辑窗口Placing Components onto the Schematic在对象选择器窗口中,选中7SEG-MPX6-CA-BLUE,将鼠标置于图形编辑窗口该对象的欲放位置、单击鼠标左键,该对象被完成放置。同理,将AT89C51和RES放置到图形编辑窗口中。如图所示。(5)放置总线至图形编辑窗口单击绘图工具栏中的总线按钮,使之处于选中状态。将鼠标置于图形编辑窗口,单击鼠标左键,确定总线的起始位置;移动鼠标,屏幕出现粉红色细直线,找到总线的终了位置,单击鼠标左键
18、,再单击鼠标右键,以表示确认并结束画总线操作。此后,粉红色细直线被蓝色的粗直线所替代,如图所示。(6)元器件之间的连线Proteus的智能化可以在你想要画线的时候进行自动检测。下面,我们来操作将电阻R1的右端连接到LED显示器的A端。当鼠标的指针靠近R1右端的连接点时,跟着鼠标的指针就会出现一个“”号,表明找到了R1的连接点,单击鼠标左键,移动鼠标(不用拖动鼠标),将鼠标的指针靠近LED显示器的A端的连接点时,跟着鼠标的指针就会出现一个“”号,表明找到了LED显示器的连接点,同时屏幕上出现了粉红色的连接,单击鼠标左键,粉红色的连接线变成了深绿色,同时,线形由直线自动变成了90的折线,这是因为我
19、们选中了线路自动路径功能。Proteus具有线路自动路径功能(简称WAR),当选中两个连接点后,WAR将选择一个合适的路径连线。WAR可通过使用标准工具栏里的“WAR”命令按钮来关闭或打开,也可以在菜单栏的“Tools”下找到这个图标。同理,我们可以完成其它连线。在此过程的任何时刻,都可以按ESC键或者单击鼠标的右键来放弃画线。(7)元器件与总线的连线画总线的时候为了和一般的导线区分,我们一般喜欢画斜线来表示分支线。此时我们需要自己决定走线路径,只需在想要拐点处单击鼠标左键即可,如图所示。(8)给与总线连接的导线贴标签PART LABELS单击绘图工具栏中的导线标签按钮,使之处于选中状态。将鼠
20、标置于图形编辑窗口的欲标标签的导线上,跟着鼠标的指针就会出现一个“”号,如图所示。表明找到了可以标注的导线,单击鼠标左键,弹出编辑导线标签窗口,如图所示。 在“string”栏中,输入标签名称(如a),单击“OK”按钮,结束对该导线的标签标定。同理,可以标注其它导线的标签,如图所示。注意,在标定导线标签的过程中,相互接通的导线必须标注一样的标签名。至此,我们便完成了整个电路图的绘制。KeilC与Proteus连接调试进入KeilC Vision2开发集成环境,创建一个新项目(Project),并为该项目选定合适的单片机CPU器件(如:Atmel公司的AT89C51)。并为该项目加入KeilC源
21、程序。实验仿真图:源程序如下:#include #define LEDS 6 /led灯选通信号unsigned char code Select=0x01,0x02,0x04,0x08,0x10,0x20;unsigned char code LED_CODES= 0xc0,0xF9,0xA4,0xB0,0x99,/0-4 0x92,0x82,0xF8,0x80,0x90,/5-9 0x88,0x83,0xC6,0xA1,0x86;void main() char i=0,j=0; long int k; while(1) P2=0; P1=LED_CODESi; P2=Selectj; f
22、or(k=3000;k0;k-); /该LED模型靠脉冲点亮,第i位靠脉冲点亮后,会自动熄来头。/修改循环次数,改变点亮下一位之前的延时,可得到不同的显示效果。 i+; j+; if(j5) j=0; if(i14)i=0; 2、基于DS18b20的温度测量和秒表设计设计方案:通过功能键(外部中断)选择进入不同的模式工作。当K=0时,工作在时间显示模式,当k=1时,工作在秒表模式,其中开关1、2、3时调节自己需要倒计时的时间,没按下时,对应的数值加一。开关4为开始/暂停按键。当k=4时,显示采集回来的温度。LED1、LED 2、LED3灯是用来更直观的看本设计工作在什么下的,LED4为是闪烁,
23、闪烁频率为1s.(1)、硬件部分(2)软件部分源程序:#include#define DataPort P0 /定义数据端口 程序中遇到DataPort 则用P0 替换#define uchar unsigned char#define uint unsigned int/*位定义*/sbit menu = P32; /位声明,外部中断口,功能键sbit LED1 = P15; /LED灯sbit LED2 = P16;sbit LED3 = P17;sbit LED4 = P14;sbit add_m= P10; /按键,调分sbit add_s= P11; /按键,调秒sbit add_u
24、s=P12; /按键,调微秒sbit reset =P13; /清零,秒表状态下也是清零sbit LATCH1=P20; /定义锁存使能端口 段锁存sbit LATCH2=P21;/ 位锁存sbit DQ = P22; /定义18b20的通信端口 /*参数定义*/uint a,b,j;uchar TempData8;uint m,s,w, /时钟 m0,s0,w0,/秒表 k;/状态转换标志uchar code weima=0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe;/位码uchar code duanma=0x3f,0x06,0x5b,0x4f,0x66,
25、0x6d,0x7d,0x07,0x7f,0x6f;/段码/*函数声明*/void delay_18B20(uint i);void Init_DS18B20();int ReadOneChar();WriteOneChar(uchar dat);ReadTemperature(void);void Display1();void init();void keyscan();void display(uchar a,uchar b,uchar c);void delay(uchar z);void wendu();/*主函数*/ void main()init(); /初始化while(1)if
26、(k=0)/时间 LED1=1; /点亮第一个灯,辨别是工作在时间模式下的 LED2=0; LED3=0; keyscan(); display(m0,s0,w0); /显示时间 if(k=1)/倒计时 LED1=0; LED2=1; /点亮第二个灯,辨别是工作在秒表模式下的 LED3=0; keyscan();display(m,s,w); if(k=2)/温度 LED1=0; LED2=0; LED3=1; /点亮第三个灯,辨别是工作在温度模式下的 wendu(); void delay_18B20(uint i)/延时函数while(i-);/*18b20初始化*/void Init_D
27、S18B20() uchar x=0; DQ = 1; /DQ复位 delay_18B20(8); /稍做延时 DQ = 0; /单片机将DQ拉低 delay_18B20(80); /精确延时 大于 480us DQ = 1; /拉高总线 delay_18B20(14); x=DQ; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18B20(20);/*读一个字节*/ int ReadOneChar(void)uchar i=0;uchar dat = 0;for (i=8;i0;i-) DQ = 0; / 给脉冲信号 dat=1; DQ = 1; / 给脉冲信号 if
28、(DQ) dat|=0x80; delay_18B20(4); return(dat);/*写一个字节*/ WriteOneChar(uchar dat) uchar i=0; for (i=8; i0; i-) DQ = 0; DQ = dat&0x01; delay_18B20(5); DQ = 1; dat=1; /*读取温度*/ReadTemperature(void)uchar a=0;uchar b=0;uint t=0;Init_DS18B20();WriteOneChar(0xCC); / 跳过读序号列号的操作WriteOneChar(0x44); / 启动温度转换delay_
29、18B20(100);Init_DS18B20();WriteOneChar(0xCC); /跳过读序号列号的操作WriteOneChar(0xBE); /读取温度寄存器等(共可读9个寄存器) 前两个就是温度a=ReadOneChar();b=ReadOneChar();/传感器返回值除16得实际温度值/为了得到2位小数位,先乘100,再除16,考虑整型数据长度,/技巧处理后先乘25,再除4,除4用右移实现b4; TempL=temp&0x0F; TempL=TempL*6/10;/小数近似处理 if(TempH/100=0) TempData6=0;else TempData6=duanma
30、TempH/100; /十位温度 if(TempH/100=0)&(TempH%100)/10=0)/消隐 TempData2=0;else TempData5=duanma(TempH%100)/10; /十位温度 TempData4=duanma(TempH%100)%10|0x80; /个位温度,带小数点 TempData3=duanmaTempL; TempData1=0x39; /显示C符号 TempData0=0x00; Display1();/*初始化函数*/void init()a=0;b=0;k=0;LED1=0;/关闭所有灯LED2=0;LED3=0;LED4=0;m0=1
31、2;/时间初始化s0=0;w0=0;m=0; /秒表初始化s=0;w=0;TMOD=0x11; /定时器0,1工作于方式1;赋初值TH0=(65536-5000)/256; /晶振12M,秒表定时器给初值 TL0=(65536-5000)%256;TH1=(65536-50000)/256; /时间定时器给初值TL1=(65536-50000)%256;EA=1; /开总中断,中断允许EX0=1; /秒表中断ET0=1;ET1=1;IT0=1; /边沿触发方式IT1=1;PX0=1;PX1=1;TR0=0; /初始,秒表不工作TR1=1; /时钟一开始工作/*定时器0中断*/void time
32、r0_int() interrupt 1/秒表TH0=(65536-5000)/256;TL0=(65536-5000)%256;a+;if(a=2)/5000*2msa=0;if(w!=0)|(s!=0)|m)/判断倒计时时间到没。 w-; if(w=0)w=99;if(s!=0)|m) s-;if(s=0) s=59; if(m0)m-;/*外部中断0中断函数*/void ex0_int() interrupt 0 k+;/按下一次功能键,使得K值加一,进入不同的工作模式if(k=3)k=0;/*定时器1中断*/void timer1_int() interrupt 3/控制时钟工作TH1
33、=(65536-50000)/256;TL1=(65536-50000)%256;b+;if(b=20)/50000*20=1s,说明1秒的时间到了b=0;w0+;LED4=LED4;/让第四个灯,随时间闪烁 if(w0=60) /秒 w0=0; s0+; if(s0=60)/分 s0=0; s0+; if(m0=12)/时 m0=0; /*按键扫描1*/void keyscan()/调节秒表的初始时间 if(reset=0)/秒表开始暂停按键delay(10);/时间延迟if(reset=0)TR0=TR0;/定时器启动停止 if(add_us=0)/调usdelay(10);if(add_
34、us=0) w+; if(w=100)w=0;while(!add_us)/按键释放 display(m,s,w);/显示 if(add_s=0)/每按下一次秒加一 delay(10); if(add_s=0) s+; if(s=60) s=0; while(!add_s) display(m,s,w); if(add_m=0)/每按下一次粉加一 delay(10); if(add_m=0) m+; if(m=60) m=0; while(!add_m) display(m,s,w); /*时间显示*/ void display(uchar a,uchar b,uchar c) unsigne
35、d char i; TempData0=duanmaa/10; TempData1=duanmaa%10; TempData2=0x40; TempData3=duanmab/10;/用于显示分 TempData4=duanmab%10; TempData5=0x40; TempData6=duanmac/10; /用于显示秒 TempData7=duanmac%10; for(i=0;i0;x-)for(y=100;y0;y-);(3)调试结果1 时间2.秒表倒计时通过调节按键可以设置时间的具体的分、秒、微秒。当按下开始键时,开始倒计时。倒计时中:时间到:3.温度正温度显示:负温度显示:复位开关