收藏 分销(赏)

太原理工大学单片机原理及应用课程设计报告.doc

上传人:仙人****88 文档编号:8992411 上传时间:2025-03-10 格式:DOC 页数:44 大小:298KB
下载 相关 举报
太原理工大学单片机原理及应用课程设计报告.doc_第1页
第1页 / 共44页
太原理工大学单片机原理及应用课程设计报告.doc_第2页
第2页 / 共44页
点击查看更多>>
资源描述
单片机原理及应用课程设计 有害气体温度监控仪 学 院: 理学院 班 级: 应物 学 号: 姓 名: 指导老师: 太 原 理 工 大 学 单 片 机 原 理 课 程 设 计 任 务 书 课程设计题目: 有害气体温度监控仪 设计要求与原始资料 : 1 独立按时完成设计任务。 2 综合应用所学基础理论知识,培养独立思考问题和解决问题的能力。 3 锻炼学生搜集资料和整理资料的能力。 4在熟悉掌握89S52芯片参数指标和相关知识的前提下,研发一台可以监控有害气体(二氧化硫,二氧化氮,一氧化碳)浓度和环境温度的仪器,把测量结果显示在八位数码管上,并画出相应原理图,PCB图。 5 论文要求语言简练,文字通畅,思路清晰。 设计的主要内容: 1画出有害气体温度监控仪控制电路的原理图并生成相应PCB图。 2编译程序实现其功能。 3在电路板上焊接各元件。 4调试运行并对不合理之处加以改正。 学生应交出的设计文件: 1 严格按照学校课程设计要求与格式编排。 2 课程设计正文不少于20页。 3 查阅相关资料尽可能的全面。 主要参考文献(资料): 1《单片机中级教程---原理及应用》北京航空航天大学出版社 张俊谟 2 学林网 3《单片机程序设计基础》 北京航空航天大学出版社 周航慈 饶运涛 4《AVR单片机嵌入式系统原理与应用实践》 北京航空航天大学出版社 马潮 专业班级 应用物理学0601班 学生 仝步升 要求设计工作的起止日期2008年12月29日—2009年1月10日 指导老师签字 日期 教研室主任审查签字: 日期 系主任批准签字: 日期 单片机原理及应用课程设计说明书 有害气体温度监控仪 目 录 第一章 选题背景与总体思路 6 1.1、选题背景 6 1.2、总体思路 6 第二章 设计原理 7 2.1、方案和选材 7 2.1.1、气体传感器 7 2.1.2、AT 89C52单片机 7 2.1.3、模数转换芯片TLC2543 8 2.1.4、数字温度传感器DS18B20 8 2.1.5、数码管驱动芯片CH451 8 2.2、原理图 9 第三章 电路的功能实现 10 3.1、控制电路——89C52芯片 10 3.1.1、电源电路 10 3.1.2、复位电路 10 3.1.3、晶振电路 10 3.2、气体浓度的采集及处理 10 3.2.1、气体浓度的采集 10 3.2.2、模拟信号的处理 11 3.3、温度的采集及处理 15 3.4、显示电路的原理及应用 20 第四章 程序设计及说明 24 第五章 结果分析 43 5.1、实验结果分析 43 5.2、设计心得 43 参 考 文 献 44 第一章 选题背景与总体思路 1.1 选题背景 空气中的二氧化硫,二氧化氮,一氧化碳含量超过一定范围会对人的身体造成伤害,甚至会发生其它严重的安全事故。某些生产场所需要配备监控这些气体浓度和环境温度的仪器。 单片机本身是一个微控制器,内部无任何程序,当它和其他器件设备有机地组合在一起,并配置适当的工作程序,就构成一个单片机应用系统。在应用系统中以它为核心, 控制其它外围电路协调工作,有很强的控制功能。随着时代的进步和发展,单片机作为一种比较成熟的技术,在我们生活,工作,科研等各个领域有着及其广泛的应用。 我们计划研发一台可以监控有害气体(二氧化硫,二氧化氮,一氧化碳)浓度和环境温度的仪器,并把测量结果显示在八位数码管上。本试验的指导思想是运用单片机的控制功能对气体传感器,放大电路,数模转换电路,LED数码管驱动电路等进行控制。 1.2 总体思路 对于有害气体的检测,通过气体传感器将气体的浓度采集回来,将气体信号的变化转化成电信号,再由放大电路将电信号放大,经过A/D转换芯片,将模拟量转换成数字量,最后经过CPU的处理,通过显示电路将气体浓度值显示在数码管上。 对于温度的检测,通过数字式温度传感器直接将温度信号转化为数字信号,再通过CPU的分析处理,将正确的温度显示在数码管上。 本设计的由六个部分组成:气体传感器、数字温度传感器、A/D转换电路、LED显示电路、89C52控制电路。 第二章 设计原理 2.1 方案和选材 关键词:气体传感器、AT89C52、模数转换芯片TLC2543、数字温度传感器DS18B20、数码管驱动芯片CH451。 2.1.1 气体传感器 二氧化硫传感器 二氧化氮传感器 一氧化碳传感器 2.1.2 AT 89C52单片机 其主要包含下列硬件资源: a)面向控制的8位CPU; b)片内振荡器及时钟电路; c)8K字节程序存储器ROM; d)256字节数据存储器RAM; e)三个16位定时器/计数器; f)可寻址64K外部数据存储器和64K外部程序器空间的控制电路; g)32条可编程的I/O线; h)一个可编程全双工串行口; i)具有5个中断源,两级中断优先级; j)有位寻址功能,适于布尔处理的位处理机。 其优点: a)小巧灵活、成本低、易于产品化 ; b)可靠性高、适用的温度范围宽 ; c)易扩展、控制功能强 ; d)指令系统相对简单,较易掌握 。 2.1.3 模数转换芯片TLC2543 TLC2543由美国德州仪器公司于近几年推出,是有11个输入端的12位模数转换芯片,具有转换快、稳定性好、与微处理器接口简捷、价格低等优点。 2.1.4 数字温度传感器DS18B20 DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。 其性能优点如下: a)独特的单线接口仅需要一个端口引脚进行通信; b)多个DS18B20可以并联在惟一的三线上,实现多点组网功能; c)无须外部器件; d)可通过数据线供电,电压范围为3.0~5.5V; e)零待机功耗; f)温度以9或12位数字; g)用户可定义报警设置; h)报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件; i)负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作; 2.1.5 数码管驱动芯片CH451 CH451是一个整合了数码管显示驱动和键盘扫描控制以及监控的多功能外围芯片,CH451内置RC振荡电路,支持多片级联,时钟速度从 0到 10MHz。可以动态驱动8位数码管或者64位LED,具有BCD译码、闪烁、移位等功能;同时还可以进行64键的键盘扫描。其工作原理如下图所示。 | 2.2 原理图 图2-1原理图 第三章 电路的功能实现 3.1 控制电路——89C52芯片 3.1.1 电源电路 89C52芯片采用5V的直流稳压电源。 3.1.2 复位电路 复位是单片机回到初始状态的一种操作,是处理单片机“死锁”的主要方法,复位电路即实现此功能。单片机上电后,从何处开始执行第一条指令,由系统复位后的状态决定。我们使用的复位器中的电容为极性电容,最大工作电压为16V,电容为10uV,最高工作温度105°。 3.1.3 晶振电路 由晶振和电容组成,与89C52的XTAL1及XTAL2两引脚相连,即可构成一个稳定的自激振荡器,为CPU提供稳定的震荡频率,保证89C52工作。 3.2 气体浓度的采集及处理 3.2.1 气体浓度的采集 10 二氧化硫,二氧化氮,一氧化碳气体传感器能感知环境中气体的存在及其浓度,根据气体传感器转换成的电信号的强弱就可以获得待测气体在环境中存在情况的信息,从而可以进行检测监控。 放大电路放大由于气体含量变化引起的传感器的电压的变化,然后送入A/D转换器的输入端。对其基本要求是:①输入阻抗应与传感器输出阻抗相匹配;②一定的放大倍数和稳定的增益;③低噪声;④低的输入失调电压和输入失调电流以及低的漂移;⑤足够的带宽和转换速率(无畸变的放大瞬态信号);⑥高输入共模范围和高共模抑制比;⑦可调的闭环增益;⑧线性好、精度高;⑨成本低。 单管或双管构成的单级放大电路的增益有限,不能满足实际的需要,而需要由若干单级放大电路级联成多级放大电路来运用。 多级放大电路通常可分为输入级(其输入端与信号源相连接)、中间级、末前级和末级(其输出端与负载相连接)四部分。其中,输入级和中间级属于小信号放大电路,而末前级和末级属于大信号功率放大电路。多级放大电路级间耦合方式的基本要求是:既要不失真地、有效地传送信号,又要保证各级都有合适的静态工作点,常用的耦合方式有:电容(又称阻容)耦合、变压器耦合、直接耦合、光电耦合。 3.2.2 模拟信号的处理 模拟信号的处理通过模数转换芯片TLC2543来完成。 (1)TLC2543引脚及功能 TLC2543是12位的开关电容逐次逼近模数转换器,有多封装种形式,其中DB、DW或N封装的管脚图见图。TLC2543有20根引脚,其它封装形式引脚数及引脚功能相同。 引脚的功能简要分类说明如下: ①电源引脚 Vcc,20脚:正电源端,一般接+5V。 GND,10脚:地。 REF+,14脚:正基准电压端,一般接+5V。 REF-,13脚:负基准电压端,一般接地。 ②控制引脚 CS,15脚:片选端,由高到低有效,由外部输入。 EOC,19脚:转换结束端,向外部输出。 I/O CLOCK,18脚:控制输入输出的时钟,由外部输入。 ③模拟输入引脚 AIN0~AIN10,1~9脚、11~12脚:11路模拟输入端,输入电压范围:0.3V~Vcc+0.3V。 ④控制字输入引脚 DATA INPUT,17脚:控制字输入端,选择通道及输出数据格式的控制字由此输入。 ⑤转换数据输出引脚 DATA OUT,16脚:A/D转换结果输出的3态串行输出端。 (2)控制字的格式 控制字为从DATA INPUT端串行输入TLC2543芯片内部的8位数据,它告诉TLC2543要转换的模拟量通道、转换后的输出数据长度、输出数据的格式。其中高4位(D7~D4)决定通道号,对于0通道至10通道,该4位分别为0000、0001、…、1010,该4位为其它数字时的功能,用于检测校正。低4位决定输出数据长度及格式,其中D3、D2决定输出数据长度,TLC2543的输出数据长度有8位、12位、16位,但由于TLC2543为12位A/D转换芯片,经过分析可以看出,8位、16位输出对TLC2543的应用意义不大,宜定在12位输出,D3、D2两位为00即可。D1决定输出数据是高位先送出,还是低位先送出,若为高位先送出,该位为0,反之为1。D0决定输出数据是单极性(二进制)还是双极性(2的补码),若为单极性,该位为0,反之为1。 (3)TLC2543接口   TLC2543只用4根线,即片选线CS,数据输入线DATA INPUT,数据输出线DATA OUT, 时钟线 I/O CLK与单片机相接。EOF未接入单片机,这是基于二个工作周期之间的单片机指令一般大于10μs,转换已经完成,不必判断EOF,也可以通过试验或计算指令执行时间确定转换是否结束,这样可以省去一根接线。 三路模拟信号(二氧化硫,二氧化氮,一氧化碳)即电压信号从通道1(AIN0),通道2(AIN1),通道3(AIN2)输入,其控制字分别为00000000,00010000,00020000,输出的数字信号为12位,高位先送出,二进制。 (4)内部寄存器   TLC2543内部寄存器有输入数据寄存器与输出数据寄存器。输入数据寄存器存放从DATA INPUT端移入的控制字。输出数据寄存器存放转换好的数据,以供从DATA OUT端移出。 开始时,片选为高,I/O CLOCK、DATA INPUT被禁止,DATA OUT呈高阻状态,此时EOC为高,输入数据寄存器被置为0,输出数据寄存器的内容是随机的。上电后,片选必须从高到低,才能开始一次工作周期。12个时钟信号从I/O CLOCK端依次加入,随着时钟信号的加入,控制字从DATA INPUT一位一位地在时钟信号的上升沿时被送入TLC2543(高位先送入),同时上一周期转换的A/D数据,即输出数据寄存器中的数据从DATA OUT一位一位地移出。TLC2543收到第4个时钟信号后,通道号也已收到,因此,此时TLC2543开始对选定通道的模拟量进行采样,并保持到第12个时钟的下降沿。在第12个时钟下降沿,EOC变低,开始对本次采样的模拟量进行A/D转换,转换时间约需10μs,转转完成EOC变高,转转的数据在输出数据寄存器中,待下一个工作周期输出。此后,可以进行新的工作周期。 TLC2543在每次I/O周期读取的数据都是上次转换的结果,当前的转换结果在下一个I/O周期中被串行移出。第一次读数由于内部读取的转换结果可能不准确,应丢弃。 (5)程序及文字说明 *************************************/ TLC2543驱动程序 #include <reg51.h> #include <intrins.h> /**************************************         2543控制引脚宏定义 *************************************/ #define CLOCK p17 /*2543时钟*/ #define D_IN p16 /*2543输入*/ #define D_OUT p14 /*2543输出*/ #define _CS p15 /*2543片选*/ #define uint unsigned int #define uchar unsigned char /**************************************   名称:delay   功能:延时模块   输入参数:n要延时的周期数   输出参数:无 *************************************/ void delay(uchar n) { uchar i; for(i=0;i<n;i++) {    _nop_(); } } /**************************************   名称:read2543   功能:TLC2543驱动模块   输入参数:port通道号   输出参数:ad转换值 *************************************/ uint read2543(uchar port) { uint ad=0,i; CLOCK=0; //时钟通道打开禁止 _CS=0; //片选为低,开始工作, port<<=4; for(i=0;i<12;i++) // 12个时钟上升沿 {   if(D_OUT) ad|=0x01; //上个周期输出数据寄存器中的数据赋值给变量ad   D_IN=(bit)(port&0x80); 控制字从高位逐位输入到输入数据寄存器   CLOCK=1; // 时钟信号   delay(3); //延时半个周期   CLOCK=0;   delay(3);   port<<=1;   ad<<=1; } _CS=1; // 采样结束,片选变低,开始转换 ad>>=1; return(ad); // 数字信号输出 } /**************************************   名称:main   功能:主函数   输入参数:无   输出参数:无 *************************************/ void main() {uint ad; while(1) {   ad=read2543(0); } } 3.3、温度的采集及处理 DS18B20可完成温度的采集和处理。 (1)DS18B20内部结构 温度LSB 温度MSB 用户字节1 用户字节2 配置寄存器 保留 保留 保留 DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。高速暂存RAM的结构为8字节的存储器,结构如图所示。头2个字节包含测得的温度信息,第3和第4字节TH和TL的拷贝,是易失的,每次上电复位时被刷新。第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。DS18B20工作时根据寄存器中的分辨率转换为相应精度的温度数值。该字节各位的定义如图所示。低5位一直为1,TM是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,用户要去改动,R1和R0决定温度转换的精度位数,来设置分辨率。高速暂存RAM的第6、7、8字节保留未用,表现为全逻辑1。第9字节读出前面所有8字节的CRC码,可用来检验数据,从而保证通信数据的正确性。 (2)读数过程 带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625℃/LSB形式表示。 当符号位S=0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位S=1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。表2是一部分温度值对应的二进制温度数据。 (3)接口电路 采用电源供电方式, DS18B20的1脚接地,2脚作为信号线,3脚接电源。 (4)程序 //------------------------- // 程序名称:DS1820驱动程序 //------------------------- //函数声明,变量定义 #include <reg51.h> #define jump_ROM 0xCC //跳过ROM命令 #define start 0x44 //启动转换命令 #define read_EEROM 0xBE //读存储器命令 #define uchar unsigned char #define uint unsigned int sbit DQ=P1^0; //信号端定义 unsigned char TMPH,TMPL; //---------------------------------------------------------- // 函数名称: delay10ms // 系统采用11.0592MHz的时钟时,延时满足要求,其它情况需要改动 //---------------------------------------------------------- void delay10ms(uchar time) 每个周期10ms { uchar a,b,c; for(a=0;a<time;a++) for(b=0;b<10;b++) for(c=0;c<120;c++) ; } //---------------------------------------------------------- // 函数名称: delay //---------------------------------------------------------- void delay(unsigned int N) { int i; for(i=0;i<N;i++); } //-------------------- // 函数名称: Reset //-------------------- unsigned char Reset(void) { unsigned char deceive_ready; delay(10); DQ=0; //拉低DQ线 delay(29); //延时至少480us~960us DQ=1; //将DQ线设置位逻辑高 delay(3); //延时等待deceive_ready响应 deceive_ready=DQ; //采样deceive_ready信号 delay(25); //等待时序结束 return(deceive_ready); //有deceive_ready信号时返回0,否则返回1 } //--------------------------- // 函数名称:read_bit // 入口参数: 无 // 返回接收的数据 // 函数功能:读一个bit子程序 //--------------------------- unsigned char read_bit(void) { unsigned char i; DQ=0; //拉低DQ线开始时序 DQ=1; //升高DQ线 for(i=0;i<3;i++); //延时至时序开始15us return(DQ); //返回DQ值 } //--------------------------- // 函数名称: write_bit // 入口参数: bitval // 函数功能:写一个bit子程序 //--------------------------- void write_bit(unsigned char bitval) { DQ=0; //拉低DQ线开始时序 if(bitval==1) DQ=1; //如果写逻辑为高 delay(5); //延时 DQ=1; //升高DQ线 } //---------------------------- // 函数名称: write_byte // 入口参数: val // 函数功能:写一个byte子程序 //---------------------------- void write_byte(unsigned char val) { unsigned char i,temp; for(i=0;i<8;i++) { temp=val>>i; //将val位右移i位赋值给比temp temp=temp&0x01; //取temp最低位 write_bit(temp); delay(5); //延时至时序结束 } } //---------------------------- // 函数名称: read_byte // 返回接收的数据 value // 函数功能:读一个byte子程序 //---------------------------- unsigned char read_byte(void) { unsigned char i,m,receive_data; m=1;receive_data=0; //初始化 for(i=0;i<8;i++) { if(read_bit()) { receive_data=receive_data+(m<<i); } //每读一位数据据,左移一位 delay(6); //延时至时序结束 } return(receive_data); //返回value } //--------------------------- // 函数名称: Get_temp // 返回接收的数据 TMPL, TMPH // 函数功能:取出温度值 //--------------------------- void Get_temp(void) { Reset(); write_byte(jump_ROM); //发跳过ROM命令 write_byte(start); //发启动转换命令 Reset(); write_byte(jump_ROM); //发跳过ROM命令 write_byte(read_EEROM); //读存储器命令 TMPL=read_byte(); //读低8位温度值 TMPH=read_byte(); //读高8位温度值 } //------------- //------------------- // 函数名称: main // 函数功能: 主函数 //------------------- void main() { for(;;) { Get_temp(); } 3.4、显示电路的原理及应用 本过程由CH451芯片驱动八位数码管来实现。 (1)CH451概述 CH451是一个整合了数码管显示驱动和键盘扫描控制以及监控的多功能外围芯片CH451内置RC振荡电路,支持多片级联,时钟速度从 0到 10MHz。可以动态驱动8位数码管或者64位LED,具有BCD译码、闪烁、移位等功能;同时还可以进行64键的键盘扫描。 (2)外部接口 CH451具有硬件实现的高速 4线串行接口,即4个信号线:串行数据输入线 DIN、串行数据时钟线 DCLK、串行数据加载线 LOAD、串行数据输出线 DOUT。其中DIN、DCLK、LOAD接单片机的三个I/O口。 字驱动引脚DIG4、DIG5、DIG6、DIG7接四个LED.段驱动引脚SEG0到7脚接LED的a、b、c、d、e、f、g、pd段,采用共阴极数码管,所以三脚接地。 (3)输出过程 ①单片机向 CH451输出串行数据的过程是(低位在前): 输出一位数据,即向 DIN输出最低位数据 B0,并向 DCLK输出低电平脉冲(从高电平变为低电平再恢复为高电平),其中包括一个上升沿使 CH451输入位数据; ②以同样的方式,输出位数据 B0~B11; ③向 LOAD输出低电平脉冲,其中包括一个上升沿使 CH451加载串行数据。 (4)程序及文字说明 #include<reg51.h> #define uchar unsigned char #define uint unsigned int #define ch451_dsp 0x0500 //设置默认显示方式 #define ch451_BCD 0x0580 //设置BCD译码方式 #define ch451_twinkle 0x0600 设置闪烁方式 #define ch451_reset 0x0201 //复位 #define ch451_syson1 0x0401 开显示 #define ch451_dig4 0x0c00 dig4,dig5,dig6,dig7接四个八位LED #define ch451_dig5 0x0d00 #define ch451_dig6 0x0e00 #define ch451_dig7 0x0f00 sbit ch451_dclk=P1^7; //串行数据时钟上升延激活 sbit ch451_din=P1^6; // 串行数据输出,接CH451的数据输入 sbit ch451_load=P1^5; 串行数据加载 void delay10ms(uchar time) 延时 time 个周期,每个10ms { uchar a,b,c; for(a=0;a<time;a++) for(b=0;b<10;b++) for(c=0;c<120;c++); } void ch451_init() 初始化函数 { ch451_din=0; ch451_dclk=1; ch451_din=1; } void ch451_write(int command) 将12位数据输入CH451 { int i,temp; temp=command; 12位数据赋值给变量temp ch451_load=0; LOAD变低,开始输入 for(i=0;i<12;i++) 12位数据 { ch451_dclk=0; 时钟信号 ch451_din=temp&1; 从低位输入 ch451_dclk=1; 时钟信号上升沿 temp=temp>>1; 逐位输入 } ch451_load=1; 输入结束 } void display (int num) CH451根据操作命令显示 { int a,b,c,d; a=num/1000; b=num%1000/100; c=num%100/10; d=num%10; ch451_write(ch451_dig7|a); ch451_write(ch451_dig6|b); ch451_write(ch451_dig5|c); ch451_write(ch451_dig4|d); } void main() { ch451_init(); 初始化 ch451_write(ch451_syson1); 开显示 ch451_write(ch451_twinkle); 开闪烁 display_1(255,255,255,255); 8位LED都亮 delay10ms(300); 延时300周期 while(1) { ch451_write(ch451_reset); 复位 ch451_write(ch451_syson1); 开显示 ch451_write(ch451_BCD); 开BCD译码 void display (8888); } } 第四章 程序设计及说明 //----------------------------------------------------// //-----------------气体监测系统程序-------------------// //--------author:wxh time:2009-01-06-----------------// #include<reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int #define ch451_syson 0x0400 //关显示、键盘、看门狗 #define ch451_syson1 0x0401 //开显示 #define ch451_syson2 0x0403 //开显示、键盘 #define ch451_syson3 0x0407 //开显示、键盘、看门狗功能 #define ch451_dsp 0x0500 //设置默认显示方式 #define ch451_BCD 0x0580 //设置BCD译码方式 #define ch451_twinkle 0x0600
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服