单片机课程设计报告

  • 格式:doc
  • 大小:281.00 KB
  • 文档页数:9

扬州大学单片机课程设计报告姓名:徐旸学号:090801121班级:电科0901完成日期:2013年1月16日一.系统结构:设计任务:(1)基于DS18B20的温度测量DS18B20是一个数字式的温度传感器,单片机可以直接读取其转换之后的温度,并在数码管上显示。

设计要求:(1)基于DS18B20的温度测量要求能够在4个数码管上显示实时测量温度。

比如12.34。

实现温度报警功能,假设温度超过20度就报警,并点亮一个LED灯,以此提醒用户。

设计流程:(1)首先理解原理图,分析清楚各个电路部分的功能作用。

(2)认识熟悉各个元器件。

(3)事先在万能板上布好局,放置各个元器件,其中芯片用插座代替放置。

布局要做到美观整齐。

(4)布局完成之后,进行电路焊接。

(5)通电测试,调试程序。

二.硬件原理:1.元器件介绍:(1)发光二级管:长脚为正,短脚为负。

肖特基二极管5819:灰色圈一极为负。

电解电容:白色区域对应的管脚为负。

(2)J1:电源输入的接口。

(3)J2:和计算机的RS232串口连接。

(4)S1:电源开关,请用万用表来确认常闭和常开管脚。

(5)RJ1:排阻,一共有9个引脚,其中一个引脚与所有电阻的一端相连接,其余8个引脚分别对应8个电阻。

他们的大小分别为470欧。

(6)S2,S3,S4轻触按键:4各管脚有常开和常闭。

一般都是使用对角线的两个引脚。

(7)Q1-Q4:PNP三极管,将三极管有字面正对自己,管脚朝下,从左到右依次为E、B、C(8)S5:四连体的共阳极数码管。

(9)电阻:包括4.7k和470欧两种。

(10)RS232串口,采用DB-9型号的串口。

串口只需用到DB9.2、DB9.3和DB9.5三个信号脚。

2.电路原理图:本次课程设计的电路图包括4个模块:电源电路模块,单片机LED数码管显示电路模块,串口下载电路模块,DS18B20电路和DS1320电路模块。

以下为各个模块的电路原理图:(1)电源电路模块:电源下载电路是用来给整个电路板供电,从J1接入9-15v的电压,从U1的Vout 输出5V电压。

(2)单片机LED数码管显示电路模块:该电路模块通过P0.1接入DS18DATA,接受DS18B20的温度数据,通过P0.3、P0.4、P0.5连接DS1302的SCLK、IO、RST,接受DS1302的时间数据,在经过单片机程序的处理后在共阳极的数码管上显示。

(3)串口下载电路模块:串口下载电路主要由MAX232芯片构成。

串行数据信号线RXD和TXD分别连接单片机的P3.0和P3.1口。

R1IN和T1OUT将连接RS232接口,分别对应2号脚和3号脚。

(4)DS18B20电路和DS1320电路模块:DS18B20是用来产生温度数据,传入单片机中。

电路的连接很简单。

三.软件设计:1.设计思路:温度显示的程序里,把采集进来的数据分解成单个的为保存在数组中,然后再根据值找到对应的数码管显示值。

2.程序流程图:3.软件C51程序:#include <at89x52.h>#include "intrins.h"#define uchar unsigned char#define uint unsigned int#define TEMPSHIW 2 //监控温度#define TEMPGEWI 6#define TEMPXSHU 8uchar codedispcode[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xff, 0xff,0xfe};uchar flag = 0;sbit DQ=P0^1; //温度输入口sbit DIN=P2^0; //LED小数点控制sbit LED1=P1^0; //闹铃指示灯sbit LED2=P1^1; //温度报警指示灯//**************温度小数部分用查表法***********//uchar codeditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0 x07,0x08,0x08,0x09,0x09};uchar code scan_con[4]={0x7f,0xbf,0xdf,0xef}; //列扫描控制字uchar data temp_data[2]={0x00,0x00}; //读出温度暂放uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4个数据和一个运算暂用/***********显示扫描函数**********/void delay2(uint t){for(;t>0;t--);}///***********显示扫描函数**********/scan(){char k;for(k=0;k<4;k++) //四位LED扫描控制{P2=0xff;P2=dispcode[display[k]];if(k==1){DIN=0;}P3=scan_con[k];delay2(90);P3=0xff;}}/////***********18B20复位函数**********/ow_reset(void){char presence=1;while(presence){while(presence){DQ=1;_nop_();_nop_();DQ=0; //delay2(50); // 550usDQ=1; //delay2(6); // 66uspresence=DQ; // presence=0继续下一步}delay2(45); //延时500uspresence = ~DQ;}DQ=1;}/////**********18B20写命令函数*********///向 1-WIRE 总线上写一个字节void write_byte(uchar val){uchar i;for (i=8; i>0; i--){DQ=1;_nop_();_nop_();DQ = 0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us DQ = val&0x01; //最低位移出delay2(6); //66usval=val/2; //右移一位}DQ = 1;delay2(1);}///*********18B20读1个字节函数********///从总线上读取一个字节uchar read_byte(void){uchar i;uchar value = 0;for (i=8;i>0;i--){DQ=1;_nop_();_nop_();value>>=1;DQ = 0;_nop_();_nop_();_nop_();_nop_(); //4usDQ = 1;_nop_();_nop_();_nop_();_nop_(); //4us if(DQ)value|=0x80;delay2(6); //66us}DQ=1;return(value);}///***********读出温度函数**********///read_temp(){ow_reset(); //总线复位write_byte(0xCC); // 发Skip ROM命令write_byte(0xBE); // 发读命令temp_data[0]=read_byte(); //温度低8位temp_data[1]=read_byte(); //温度高8位ow_reset();write_byte(0xCC); // Skip ROMwrite_byte(0x44); // 发转换命令}///***********温度数据处理函数**********/void work_temp(){uchar n=0;uchar doth,dotl;uchar flag3=1,flag2=1; //数字显示修正标记if((temp_data[1]&0xf8)!=0x00){temp_data[1]=~(temp_data[1]);temp_data[0]=~(temp_data[0])+1;n=1;flag=1;}//负温度求补码if(temp_data[0]>255){temp_data[1]++;}display[4]=temp_data[0]&0x0f;display[0]=ditab[display[4]];doth=display[0]/10;dotl=display[0]%10;display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x07)<<4); display[3]=display[4]/100;display[2]=display[4]/10%10;display[1]=display[4]%10;if(!display[3]){display[3]=0x0a;flag3=0;if(!display[2]){display[2]=0x0a;flag2=0;}}//最高位为0时都不显示if(display[2] == 0x0a) //超温报警判断{LED2=1;}else{if((display[2] > TEMPSHIW)){LED2=0;}else if((display[2] == TEMPSHIW) && (display[1] > TEMPGEWI)){LED2=0;}else if((display[2] == TEMPSHIW) && (display[1] == TEMPGEWI) && (display[0] > TEMPXSHU)){LED2=0;}else{LED2=1;}}if(n){display[3]=0x0b;//负温度时最高位显示"-"flag3=0;}}/**************主函数****************/void DS18B20_START(){P3=0xff; //初始化端口P2=0xff;write_byte(0xCC); // Skip ROMwrite_byte(0x44); // 发转换命令while(1){read_temp(); //读出18B20温度数据work_temp(); //处理温度数据scan(); //显示温度值2秒}}void main(){while(1){DS18B20_START();}}四.总结:通过本次课程设计,我更加熟悉了单片机的c51编程,对DS18B20芯片的功能有了比较深入的了解。