IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> imut 51单片机课设 模拟室内温度检测器 *秋昊 -> 正文阅读

[嵌入式]imut 51单片机课设 模拟室内温度检测器 *秋昊

写在前面的话:

本文主要讲述了一下IMUT的单片机课设报告。

下面的百度云链接中包括了:ICL7109手册,ICL7109自检_标度转换(excel),课设报告(word版),演示视频,程序源码。

链接:https://pan.baidu.com/s/11rYRBHVuxdQT_ll0R2NnZg?
提取码:1111

以下是课设报告的具体内容:

摘 ??要

? ? ? ?温度与现代人类的生产、生活有着密切的关系,同时也是各大产业最常见的基本工艺参数。随着我们的生活质量的提升,人们对于生存环境已经愈发关注,而空气中的温度变化,往往会影响到各大产业的生产情况,对人的情绪也会产生一定的影响。因此,对温度的检查就显得十分地有必要了。本设计中的温度检测器,输出温度采用数字显示器显示。温度测量范围为0-50℃,可以完成一般的需要。本实践设计了一种以STC89C51单片机为主控制单元,以ICL7109为模拟温度传感器的模拟室温监控系统。该系统可以实时测量相关的温度数据,通过对比温度测量值与温度上下限来做出下一步动作。实践设计了一系列相关程序完成硬件部分自检以及温度检测。其中硬件部分主要包括STC89C51单片机最小系统,ICL7109测温部分、按键部分、数码管显示部分以及报警部分等。系统程序主要包括主程序、按键处理函数、读出温度函数、标度转换函数、数码管显示函数以及对比报警函数等。

关键词:STC89C51单片机,ICL7109,模拟温度控制

目录

一、设计目的与意义

二、硬件实验板介绍及硬件自检

2.1硬件图及相关说明

2.1.1蜂鸣器

2.1.2按键部分

2.1.3 ICL7109

2.1.4 数码管

2.1.5 开关电源

2.2自检子程序流程框图??????

2.2.1蜂鸣器自检流程框图

2.2.2数码管自检框图

?2.2.3按键自检框图

2.2.4ICL7109自检图

2.3硬件自检总结

2.3.1蜂鸣器

2.3.2数码管显示模块

2.3.3键盘

2.4自检程序清单

2.4.1蜂鸣器自检程序

2.4.2按键自检程序

2.4.3 数码管自检程序

三、设计任务分析

3.1任务内容解析

3.2任务分工??

3.2.1自检阶段

3.2.1主程序阶段

3.3设计思路

3.3.1 温度采集模块

3.3.2按键处理模块

3.3.3数码管显示模块

3.3.4 对比报警模块

3.4程序流程框图(一级框图、二级框图)

3.4.1系统设计框图

3.4.2各模块框图

3.5程序清单可分两栏打印,要求有明确的程序注解(可放备注)

3.6实验结果分析(可拍照片)

3.6.1初始正常状态

3.6.2超出上限界面

3.6.3超出临界上限界面

3.6.4低于下限界面

3.6.5低于临界下限报警界面

四、设计体会

五、参考资料


一、设计目的与意义

? ? ? ?随着社会的发展,温度的测量及控制变得越来越重要。本文采用单片机STC89C51设计了温度实时测量及对比报警系统。单片机STC89C51能够根据温度传感器ICL7109所采集的温度在数码管上实时显示,通过对比报警使温度超出上下限时能够报警。所有温度数据均通过数码管显示出来。

? ? ? ?通过此实践课程的学习使我们熟悉开发板的内部电路和硬件,熟练掌握单片机的编程语言,我们通过分组的模式来对任务进行开发,根据老师下达要求,验收各阶段的任务来进行逐步的设计,培养学生的自我学习,自我动手实践能力。并了解工程项目设计实施的全过程,达到提高学生工程实践能力和素质的目标。

二、硬件实验板介绍及硬件自检

2.1硬件图及相关说明

2.1.1蜂鸣器

? ? ? ? 说明:蜂鸣器变量定义为P3^7,单片机执行指令P3.7为“1”,使得此时NPN三极管导通,促使蜂鸣器被供电,根据相应的延时函数发出两种频率的“滴滴”声音。由此可以判断单片机的蜂鸣器电路没有问题,功能可以正常实现。

图2.1.1.1 蜂鸣器原理图

2.1.2按键部分

? ? ? ?说明:由原理图可知当按键按下,输入低电平。

? ? ? ?键盘是单片机应用系统中的主要输入设备,单片机使用的键盘分为编码键盘和非编码键盘。编码键盘采用硬件线路来实现键盘的编码,每按下一个键,键盘能够自动生成按键代码,并有去抖功能。非编码键盘中键的数量较少,硬件简单,在单片机中应用非常广泛。
? ? ? ?图为按键和AT89S52的接线图,检测仪共设有3个按键

.图2.1.2.1 按键原理图

2.1.3 ICL7109

图2.1.3.1 ?ICL7109原理图

? ? ? ?说明:?ICL7109的接口电路较强,输出为12位二进制数。其特点是:可与TTL电路兼容;具有三态控制输出;有通用信号控制端,可方便监视转换;有极性和溢出位;片内有振荡器,UART异步收发数据交换;可串行、并行接口;差分输入,差分基准电压使其具有较低噪声和较小误差;带有防静电保护功能;类似型号有TSCICL7109ADCICL7109。模拟部分接线图:

图2.1.3.2 ICL7109模拟室温传感器

2.1.4 数码管

一、简介

? ? ? ?数码管是一种半导体发光器件,其基本单元是发光二极管。能显示4位数字的叫四位数码管,当然也有多位和只有一位的数码管,他们的电气原理相同。数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。

图2.4.1.1 数码管显示器

二、电气特性

? ? ? ?单位数码管有十个管脚,其中有8根是用来点亮a,b,c,d,e,f,dp 8个发光二极管(原理中有介绍),38两个管脚为公共COM脚,它们相连通且作用相同,可接任意一根。为了更清楚介绍,贴图如下

?图2.4.1.2 共阳极数码管结构图

图2.4.1.3 共阳数码管脚位对应图

三、驱动方式

1、静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个呢:),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。

2、数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。

2.1.5 开关电源

1、基本电路

?图2.1.5.1 开关电源基本电路框图

? ? ? ?开关式稳压电源的基本电路框图如图二所示。

? ? ? ?交流电压经整流电路及滤波电路整流滤波后,变成含有一定脉动成份的直流电压,该电压进人高频变换器被转换成所需电压值的方波,最后再将这个方波电压经整流滤波变为所需要的直流电压。

? ? ? ?控制电路为一脉冲宽度调制器,它主要由取样器、比较器振荡器、脉宽调制及基准电压等电路构成。这部分电路目前已集成化,制成了各种开关电源用集成电路。控制电路用来调整高频开关元件的开关时间比例,以达到稳定输出电压的目的。

2.2自检子程序流程框图??????


2.2.1蜂鸣器自检流程框图

图2.2.1.1 蜂鸣器自检框图


2.2.2数码管自检框图

?图2.2.2.1 数码管自检框图

?2.2.3按键自检框图

?图2.2.3.1 ICL7109自检图

2.2.4ICL7109自检图

?图2.2.4.1 ?ICL7109自检图

?图2.2.4.2 ?ICL7109自检图

2.3硬件自检总结

2.3.1蜂鸣器

? ? ? ?单片机在执行自检程序时,我们小组根据课程要求使蜂鸣器可以发出两种间隔时间不同的声音,最终蜂鸣器可以发出相应的两种声音,证明蜂鸣器功能正常。

2.3.2数码管显示模块

? ? ? ?在验证数码管显示模块功能是否正常时,通过我们小组的程序检验,发现五个数码管(温度测量时只用四个)均可输出正确字符,由于中途出现诸多困难,也总结出一些需要注意的事项。

  1. 数码管需要逐个检查,只有这样才能保证动态显示时不会出错。
  2. 硬件有接触不良问题,需要多次烧入程序。

最后程序烧入成功,显示出程序设置的字符,证明此处的硬件并无异常。

2.3.3键盘

? ? ? ?在执行键盘自检程序时,我们小组将键盘与蜂鸣器和数码管相连接,使用键盘控制蜂鸣器和数码管,通过按下S1键,蜂鸣器响起一段时间,且数码管显示数字1;当按下S2键,蜂鸣器响起一段时间,且数码管显示数字2;按下S3键,蜂鸣器响起一段时间,且数码管显示数字3。通过对三个按键的测试,表明三个按键均正常。

2.4自检程序清单

2.4.1蜂鸣器自检程序

/******蜂鸣器自检******/
void beeptest(){
	for(i = 0;i < 3;i++){
		beep = 0;
		delay(50);
		beep = 1;
		delay(50);
		beep = 0;
		delay(20);
		beep = 1;
		delay(20);
		beep = 0;
		delay(30);
		beep = 1;
		delay(30);	
	}
	beep=1;

2.4.2按键自检程序

void keytest(){
	p25 = 0; p26 = 0; p27 = 0;//DT1选通
	P0=0x00;//起初没有灯亮 
	for(i=0;i<4;){
		p25 = 1; p26 = 1; p27 = 1;//SEL8选通
		//判断按键1
		if(key1 == 0){
			delay(20);	//按键消抖 
			if(key1 == 0){
				p25 = 1; p26 = 0; p27 = 0;	//启动数码管5
				P0 = smgdata[1];   	//显示数字1
			beep = 0;   //蜂鸣器打开
				delay(150);
		P0 = 0X00;	  //熄灭数码管
		beep = 1;   //蜂鸣器关闭
				i++;
			}
		
	}
		//判断按键2
		p25 = 1; p26 = 1; p27 = 1;//SEL8选通
		if(key2 == 0){
			delay(20);	//按键消抖 
			if(key2 == 0){
	                              p25 = 0; p26 = 1; p27 = 1;	//启动数码管4
P0 = smgdata[2];   	//显示数字2
beep = 0;   //蜂鸣器打开
				delay(150);
P0 = 0X00;	  //熄灭数码管
beep = 1;   //蜂鸣器关闭
				i++;
			}
		}//判断按键3
if(key3 == 0){
	delay(20);	//按键消抖 
	if(key3 == 0){
p25 = 0; p26 = 1; p27 = 0;	//启动数码管3
P0 = smgdata[3];   	//显示数字3
beep = 0;   //蜂鸣器打开
delay(150);
P0 = 0X00;	  //熄灭数码管
beep = 1;   //蜂鸣器关闭
				i++;
			}
		}
		if(key4 == 0){
			delay(20);	//按键消抖 
			if(key4 == 0){
p25 = 0; p26 = 0; p27 = 1;	//启动数码管2
				P0 = smgdata[4];   	//显示数字4
		beep = 0;   //蜂鸣器打开
				delay(150);
		P0 = 0X00;	  //熄灭数码管
		beep = 1;   //蜂鸣器关闭
				i++;
			}
		
		}
	}
	delay(200);
}

2.4.3 数码管自检程序

void fun1(){
	P0 = 0x7e;	//显示数字0 
	delay(30);
	P0 = 0x0c;	//显示数字1 
	delay(30); 
	P0 = 0xb6;	//显示数字2 
	delay(30);
	P0 = 0x9e;	//显示数字3 
	delay(30);
	P0 = 0xcc;	//显示数字4 
	delay(30);
	P0 = 0xda;	//显示数字5 
	delay(30);
	P0 = 0xfa;	//显示数字6 
	delay(30);
	P0 = 0x0e;	//显示数字7 
	delay(30);
	P0 = 0xfe;	//显示数字8 
	delay(30);
	P0 = 0xde;	//显示数字9 
	delay(30);	
	P0 = 0x01;	//显示小数点 
	delay(30);
}




 void tubetest(){
	p25 = 1; p26 = 0; p27 = 0;	//启动数码管5
	fun1();
	p25 = 0; p26 = 1; p27 = 1;	//启动数码管4 
	fun1();
	p25 = 0; p26 = 1; p27 = 0;	//启动数码管3
	fun1();
	p25 = 0; p26 = 0; p27 = 1;	//启动数码管2
	fun1();									  
	p25 = 0; p26 = 0; p27 = 0;	//启动数码管1
	led1=0;	  //小灯泡熄灭
	led2=0;	  //小灯泡熄灭
	led3=0;   //小灯泡熄灭 
	P0 = 0x8d;	//数码管熄灭

三、设计任务分析

3.1任务内容解析

要求:

(1)测量温度,显示在数码管上

(2)利用按键设定温度上下限

本课题设计的是一种以STC89C51单片机为主控制单元,以ICL7109为温度传感器来进行温度测量,以数码管进行显示的控制系统。该控制系统可以用按键设定温度上下限,实时显示相关的温度数据,并将测出的温度值与设定的温度上下限进行比较,比较过后如果超出上下限,则点亮相应的LED灯,如果超出极限值后,则亮相应的LED灯的同时发出警报。其主要包括:温度采集模块、按键处理模块、数码管显示模块、对比报警模块以及单片机最小系统。

3.2任务分工??

3.2.1自检阶段

李**

负责数码管部分

刘**

负责按键部分

王**

负责蜂鸣器部分

3.2.1主程序阶段

李**

编写程序,硬件测试,任务书撰写

刘**

查找资料,协助修改程序,写实践报告

王**

绘制程序框图

3.3设计思路

将程序模块化,分为三个部分:温度采集模块、数码管显示模块、对比报警模块

3.3.1 温度采集模块

(1)目标:使之采集温度,通过P0输入十六位二进制温度值数据(高三位和高四位是符号,后十二位是温度值),通过算法转化为十进制数,然后将其再对应为0-50℃,最后显示在数码管上。

(2)大致过程:初始化ICL7109→发ROM功能命令→发外部中断0使能命令→单片机依次采集数据→单片机处理数据→数码管显示温度

(3)设计思路:将以上过程分为几个函数,分别实现各功能。分别写出:初始化函数、读一位函数、写一位函数、读取温度函数、温度显示与数据转换函数。

3.3.2按键处理模块

(1)目标:用三个按键实现温度上下限设置加减。

  1. 各键功能:

① S1:加法按键(当前位加)

②S2:功能选择键(不按表示修改上限,按一下表示修改下限,再按一下回到修改上限)

③ S3:减法按键(设置当前位减)

(3)设计思路:使用三个函数,分别为模式设置函数,上限设置函数和下限设置函数。模式设置函数用if语句,如果S2按下,则使S2计数加一,当计数大于1时则使其回到0,这样就能一直在上限设置和下限设置中。上限设置函数中包括S1和S3的加减功能,最后数据都存入变量hnum和lnum里面。将这两个变量赋给数组,传送到数码管上显示出来。

3.3.3数码管显示模块

(1)目标:如果ICL7109初始化成功,则不断更新并显示当前温度。最开始显示初始化的上下限温度值,后期设置上下限温度后更新显示温度值。

(2)设计思路:通过功能选择,选择修改上下限功能或温度检测功能。若选择修改上下限功能,则进入按键处理模块;若选择温度检测功能。则进入温度采集模块。

3.3.4 对比报警模块

(1)目标:将测出的温度值与设定的温度上下限进行比较,比较过后如果超出上下限,则点亮相应的LED灯,如果超出极限值后,则点亮相应的LED灯的同时发出警报。

(2)设计思路:用if条件语句对比温度是否过高或过低→过高则点亮相应的LED灯,过低则不点亮,并等待下一次对比→用if条件语句对比温度是否高与极限温度→过高则点亮相应的LED灯的同时发出警报,不过高,则依旧点亮相应的LED灯。

3.4程序流程框图(一级框图、二级框图)

3.4.1系统设计框图

?图3.4.1.1 总程序框图

3.4.2各模块框图


(1)按键处理模块

?图3.4.2.1 按键处理模块框图


(2) 对比报警模块

图3.4.2.2 对比报警模块框图

3.5程序清单可分两栏打印,要求有明确的程序注解(可放备注)

#include<reg51.h>
#include<stdio.h>
typedef long u32; 
typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;
/*********************变量声明*******************/
sbit beep = P2^3;
sbit led1 = P0^4;
sbit led2 = P0^5;
sbit led3 = P0^6;
sbit key1 = P1^0;
sbit key2 = P1^1;
sbit key3 = P1^2;
sbit key4 = P1^3;
sbit p27 = P2^7; 
sbit p26 = P2^6; 
sbit p25 = P2^5;
sbit lben = P2^2; 
sbit hben = P2^1; 
sbit load = P2^0;   
u8 smgdata[]={0x7e,0x0c,0xb6,0x9e,0xcc,0xda,0xfa,0x0e,0xfe,0xde};		//数码管码字 
u8 disp[4];
u8 i=0;
u8 ans=0;
u32 ans1 = 0; 
u32 ans2 = 0;
u32 ans3 = 0;
u16 temphigh = 0;
u16 templow = 0;
u32 temp=0;
u32 sum=0;
/*********************基础函数*******************/ 
/******延时******/
u8 delay(u8 num)
{
	u8 a,b,c;
	for(a=num;a>0;a--)
	for(b=200;b>0;b--)
	for(c=20;c>0;c--);
	return 0;
}
/******延时******/
void delay2(u16 a)
	//int i = 0;
   {
    while(a--);
   }
/******数码管数字循环******/
void fun1(){
	P0 = 0x7e;	//显示数字0 
	delay(30);
	P0 = 0x0c;	//显示数字1 
	delay(30); 
	P0 = 0xb6;	//显示数字2 
	delay(30);
	P0 = 0x9e;	//显示数字3 
	delay(30);
	P0 = 0xcc;	//显示数字4 
	delay(30);
	P0 = 0xda;	//显示数字5 
	delay(30);
	P0 = 0xfa;	//显示数字6 
	delay(30);
	P0 = 0x0e;	//显示数字7 
	delay(30);
	P0 = 0xfe;	//显示数字8 
	delay(30);
	P0 = 0xde;	//显示数字9 
	delay(30);	
	P0 = 0x01;	//显示小数点 
	delay(30);
}
u16 hextochar0(){
	u8 a;
	a = ans1 & 0x000f;
switch(a)
	{
	case 0x0000:
		a = 0;break; 
	case 0x0001:
		a = 1;break; 
	case 0x0002:
		a = 2;break; 
	case 0x0003:
	case 0x0004:	  
		a = 3;break; 
		a = 4;break;
	case 0x0005:
		a = 5;break;
	case 0x0006:
		a = 6;break;
	case 0x0007:
		a = 7;break;
	case 0x0008:
		a = 8;break;
	case 0x0009:
		a = 9;break;
	case 0x000a : 

		a = 10;break;
	case 0x000b :

		a = 11;break;
	case 0x000c :

		a = 12;break;
	case 0x000d :

		a = 13;break;
	case 0x000e :
		a = 14;break;
	case 0x000f :
		a = 15;break; 
	}
	return a;
	}
u16 hextochar1(){
	u8 a; 
	a = (ans2 >> 4) & 0x000f;
switch(a)
	{
	case 0x0000:
		a = 0;break; 
	case 0x0001:
		a = 1;break; 
	case 0x0002:
		a = 2;break; 
	case 0x0003:
		a = 3;break; 
	case 0x0004:
		a = 4;break;
	case 0x0005:
		a = 5;break;
	case 0x0006:
		a = 6;break;
	case 0x0007:
		a = 7;break;
	case 0x0008:
		a = 8;break;
	case 0x0009:
		a = 9;break;
	case 0x000a : 
		a = 10;break;
	case 0x000b :
		a = 11;break;
	case 0x000c :
		a = 12;break;
	case 0x000d :
		a = 13;break;
	case 0x000e :
		a = 14;break;
	case 0x000f :
		a = 15;break; 
	}
	return a;
	}
u16 hextochar2(){
	u8 a;
	a = (ans3 >> 8) & 0x000f;
switch(a)
	{
	case 0x0000:
		a = 0;break; 
	case 0x0001:
		a = 1;break; 
	case 0x0002:
		a = 2;break; 
	case 0x0003:
		a = 3;break; 
	case 0x0004:
		a = 4;break;
	case 0x0005:
		a = 5;break;
	case 0x0006:
		a = 6;break;
	case 0x0007:
		a = 7;break;
	case 0x0008:
		a = 8;break;
	case 0x0009:
		a = 9;break;
	case 0x000a : 
		a = 10;break;
	case 0x000b :
		a = 11;break;
	case 0x000c :
		a = 12;break;
	case 0x000d :
		a = 13;break;
	case 0x000e :
		a = 14;break;
	case 0x000f :
		a = 15;break; 
	}
	return a;
	}
/******十六进制转十进制******/
u32 fun2(){
	u16 sum2=0;
	u8 a,b,c;
	a = hextochar0();
	b = hextochar1();
	c = hextochar2();
	sum2 = c*256+b*16+a;
return sum2;
}
/**********************自检**********************/ 
/******蜂鸣器自检******/
void beeptest(){
	for(i = 0;i < 3;i++){
		beep = 0;
		delay(50);
		beep = 1;
		delay(50);
		beep = 0;
		delay(20);
		beep = 1;
		delay(20);
		beep = 0;
		delay(30);
		beep = 1;
		delay(30);	
	}
	beep=1;
}
/******按键自检******/

void keytest(){
	p25 = 0; p26 = 0; p27 = 0;//DT1选通
	P0=0x00;//起初没有灯亮 
	for(i=0;i<4;){
		p25 = 1; p26 = 1; p27 = 1;//SEL8选通
		//判断按键1
		if(key1 == 0){
			delay(20);	//按键消抖 
			if(key1 == 0){
		p25 = 1; p26 = 0; p27 = 0;	//启动数码管5
		P0 = smgdata[1];   	//显示数字1
		beep = 0;   //蜂鸣器打开
				delay(150);
		P0 = 0X00;	  //熄灭数码管
		beep = 1;   //蜂鸣器关闭
				i++;
			}
	}
		//判断按键2
		p25 = 1; p26 = 1; p27 = 1;//SEL8选通
		if(key2 == 0){
			delay(20);	//按键消抖 
			if(key2 == 0){
		p25 = 0; p26 = 1; p27 = 1;	//启动数码管4
				P0 = smgdata[2];   	//显示数字2
			beep = 0;   //蜂鸣器打开
				delay(150);
		P0 = 0X00;	  //熄灭数码管
			beep = 1;   //蜂鸣器关闭
				i++;
			}
		}
		//判断按键3
		if(key3 == 0){
		delay(20);	//按键消抖 
			if(key3 == 0){
			p25 = 0; p26 = 1; p27 = 0;	//启动数码管3
				P0 = smgdata[3];   	//显示数字3
			beep = 0;   //蜂鸣器打开
				delay(150);
		P0 = 0X00;	  //熄灭数码管
			beep = 1;   //蜂鸣器关闭
				i++;
			}
		}
		if(key4 == 0){
			delay(20);	//按键消抖 
			if(key4 == 0){
				p25 = 0; p26 = 0; p27 = 1;	//启动数码管2
				P0 = smgdata[4];   	//显示数字4
			beep = 0;   //蜂鸣器打开
				delay(150);
		P0 = 0X00;	  //熄灭数码管
		beep = 1;   //蜂鸣器关闭
				i++;
			}
		}
	}
	delay(200);
}

/******数码管自检******/

void tubetest(){
 
	p25 = 1; p26 = 0; p27 = 0;	//启动数码管5
	fun1();
	p25 = 0; p26 = 1; p27 = 1;	//启动数码管4 
	fun1();
	p25 = 0; p26 = 1; p27 = 0;	//启动数码管3
	fun1();
	p25 = 0; p26 = 0; p27 = 1;	//启动数码管2
	fun1();						  
	p25 = 0; p26 = 0; p27 = 0;	//启动数码管1
	led1=0;	  //小灯泡熄灭
	led2=0;	  //小灯泡熄灭
	led3=0;   //小灯泡熄灭 
	P0 = 0x8d;	//数码管熄灭
	delay(20);
}
/******设置外部中断0******/
void Int0Init()
{
	//设置INT0
	IT0=1;//跳变沿出发方式(下降沿)
	EX0=1;//打开INT0的中断允许。	
	EA=1;//打开总中断	
}

/******外部中断0的中断函数******/

void Int0()	interrupt 0		//外部中断0的中断函数
{
	load = 0;		//输出引脚打开

	lben = 1;		//关闭低8位输出
	hben = 0;		//打开高8位输出 
	temphigh = P1;		//获取高8位数据 

	lben = 0;		//打开低8位输出
	hben = 1;		//关闭高8位输出 
	templow = P1;		//获取低8位数据	
	load = 1;	
	ans++;
}
/********************数据处理********************/ 
u32 datapros(){
	u32 x=0;
	u32 y=0;
//	temphigh=0x08;
//	templow=0x88;
	temphigh = temphigh & 0x0f;		//清除高2位数据,因为这两位数据没有意义 
	temp = (temphigh << 8) + templow;		//合并数据
	ans1 = temp;
	ans2 = temp;
	ans3 = temp;

	x = fun2();	//十六进制转十进制	
	y = 0.012*x;	  
	ans++;
	return y;	
}	
/******报警函数******/	
void baojing(){
	p25 = 0; p26 = 0; p27 = 0;//DT1选通
	P0=0x00;//起初没有灯亮
	//beep = 1;
	if(sum <= 16 && sum >= 5){			//过冷
		led1 = 1;	//红灯亮,加热
		beep = 1;
		delay2(10);
	}
	else if(sum < 5){
			led3 = 1;
			led1 = 1;	//报警灯亮+红灯亮,加热
			beep = 0;
			delay2(30);
		}
	else if(sum >= 26 && sum <= 36){  	//过热	
		led2 = 1;//绿灯亮,降温	
		beep = 1;
		delay2(10);		
	}

	else if(sum > 36 ){
			led3 = 1;
			led2 = 1;	//报警灯亮+绿灯亮,降温
			beep = 0;
			delay2(30);
		}
	else if(sum >= 16 && sum <= 26)	//正常
		{
		P0=0x00;	//没有灯亮
		beep = 1;
		}
	p25 = 1; p26 = 1; p27 = 0;
	beep = 1;

}	
/******数码管动态显示******/
void DigDisplay(u16 sum)

	{
	disp[0]=smgdata[sum/1000];// 千位
	disp[1]=smgdata[sum%1000/100];//百位
	disp[2]=smgdata[sum%100/10];//十位 
	disp[3]=smgdata[sum%10]; //个位
	for(ans = 0;ans<250;ans++){
	for(i=0;i<4;i++)
	{ 
	  switch(i)
	  {
		case 0:
	  		p25 = 0; p26 = 0; p27 = 1;break; //显示第1个数码管
		case 1:
	  		p25 = 0; p26 = 1; p27 = 0;break; //显示第2个数码管
		case 2:
	 		p25 = 0; p26 = 1; p27 = 1;break; //显示第3个数码管 
		case 3:
			p25 = 1; p26 = 0; p27 = 0;break; //显示第4个数码管 
	  }
	  P0 = disp[i];//显示数值
	  delay2(100); 	//延时,造成视觉暂留现象
	  P0 = 0x00; 	//数码管消隐
	  baojing();	//报警
	}
	}	
	}

/*----------------------------------------------*/
/*********************主函数*********************/
/*----------------------------------------------*/
void main(){
	//tubetest();		//数码管自检函数	 
	//beeptest();		//蜂鸣器自检函数
	//keytest();		//按键自检函数	
	while(1){	//循环 模拟室温检测程序段
		Int0Init();  //	打开外部中断0
		for(ans=0;ans<10;){		//求均值滤波
				
			sum += datapros();		//数据处理函数 	
			
		}
	  	ans = 0;
		sum /= 10;
    DigDisplay(sum);		//数码管显示函数	
	}
}

3.6实验结果分析(可拍照片)

? ? ? ?有以下四个状态可知:可以手动调试上下限温度值,并根据当前的温度值与设置的上下限温度值对比来判断是否报警。

3.6.1初始正常状态

图3.6.1.1 初始正常状态

3.6.2超出上限界面

?

?图3.6.2.1 超出上限26度,降温灯工作

3.6.3出临界上限界面

图3.6.3.1 超出临界上限36度,降温灯工作,报警灯工作,蜂鸣器工作

3.6.4低于下限界面

图3.6.4.1 低于下限16度,升温灯工作

3.6.5低于临界下限报警界面

图3.6.5.1 低于临界下限5度,升温灯工作,报警灯工作,蜂鸣器工作

四、设计体会

李**:

? ? ? ?两个星期的单片机课设即将进入尾声,在这十多天里我体会到了硬件调试与软件调试的区别,很多次我们把同样的程序写入到实验板里,但是得到的结果不尽相同:屏幕只是亮,但是不显示写入的数据;新的程序下进去屏幕上的数据并没有刷新,这时候我们对错误进行分析,有时是因为调试环境没有设置正确的参数,大多数因为硬件接触不实,真的很令人头疼,时而感到沮丧,但是想到自己的能力需要靠一次次的失败来提升,若只是每次随随便便放过自己,不过只是原地踏步,想要学到东西还是需要继续努力啊。

? ? ? ?一开始接触课题时,发现很多地方没有头绪,不知道应该怎么开始后面在老师的讲解以及同学之间相互讨论,将一个又一个的问题都给解决了。后来发现,同时解决问题也是十分重要的,调试程序和硬件的过程中总是会遇到很多问题,在看参考资料和同学们的共同努力下,问题被一个个攻克,也能逐渐编写出能够正常运行并符合要求的程序,能够实现相应的功能,而且程序结构在不断的修改中变得简洁明了,让我在学习中积累,不断丰富自己的知识。

? ? ? ?在这段时间的实习中,我很好的学习了C语言的相关知识,以及对电路图原理以及对程序调试有了新的认识,通过和小组人的配合,让我了解到很多事情不是一个人能够完成的,只有通过团结合作,才能使好多事情变得轻松完成。在这里我不仅仅要感谢我的组友,还要谢谢指导老师的耐心指导,以及给我们传授了一些课本上面所没有的东西。

刘**:

? ? ? ?经过本次实践,我对单片机这门课程了解更深了。单片机的知识点涉及的内容是很多的,因此学习所需要花的时间也是十分多的。在此次的单片机课设的过程中,我发现我有许多的知识并没有掌握到,因此在做课设的时间里,我需要查很多的资料,在查的过程中让我温习了许多的知识点,也让我学习到了很多的新知识,让我收获颇深。

? ? ? ?我们选择的课题是模拟室内温度检测器,在最开始准备的阶段,我们发现有一些模块是我们不曾接触的:ICL7109,开关电源。我们几个虽然平时水平都不是很好,但是大家都很努力的查资料,上b站上看相关视频给自己进行补课,研究时序图,研究引脚功能,研究各种指令的意义,了解数据传输有多少位,每一位是什么意思,在将时序图与程序对应的过程中,我意识到软件的底层是硬件,只有了解硬件的每个状态才能通过软件进行硬件进行控制。89c51的cpu运行速率是很快的,而我们扩展的外设(ICL7109)他们的速率远远不及51,所以需要加大量延时,而延时也要区分,数码管和ICL7109的初始化中延时要使用us级的延时,但在将数据写入数码管时使用ms级的延时。使用key对温度的上下限进行设置,我们只有三个键,来调整两个数,并对他们进行加减,这就意味着我们要用一个键实现对功能的切换,我们采用对按键的次数进行统计来实现功能切换,这就成为了老大难的问题,但是我们仍然在努力实现!这一段时间,我学会将任务分成很多小模块,并用基础的知识实现每一块小模块来最终实现最后的整体功能,不积跬步无以至千里,是不可能一步跨越到成功的,我意识到了理论和实践的区别,学会了和会用之间是有距离的,调程序是需要耐心的,世上不确定的东西有很多,不是程序对了,下载到硬件里就可以确定成功,但是世上确定的东西也很多,付出时间去学去了解之后的我也不一样了。

王**:

? ? ? ?一周的单片机课程设计实训,真是让我们受益匪浅,学到了很多东西。起初,对单片机的设计毫无头绪,但是通过查阅资料和老师任务安排,我慢慢有了思路。一开始查看了几段代码,感觉我只是部分了解,后在视频的指导之下,不明白的知识点得以补充。但是,当在软件环境下运行时,代码显示出很多错误。不过,在组员以及其他成员的帮助下,我们组解决了这些问题。在课设过程中,相对比较重要的部分就是设计思路了,也就是画流程框图。其画法简单,结构清晰,逻辑性强,便于描述,容易理解。最后一部分便是写实验报告了,这需要对一周的工作进行回顾和详细总结,为其画上一个圆满的句号。
? ? ? ?踉踉跄跄地忙碌了一周,我的单片机课程设计也终将告一段落。设计实物也基本达到预期的效果,但由于能力和时间的关系,仍有很多需要完善的地方。通过单片机课设,我从中收获颇多,认识到完成一项任务需要一个认真且负责的态度。

五、参考资料

[1] 裴岩 刘利民.《单片机系统综合设计与实践》[M].内蒙古:内蒙古大学出版社,2003.

[2] 张海龙.基于ICL7109的单片机测温系统[J].电子制作,2016(11):25-25.

[3] 侯佳亮,张涛,卢涵宇.基于单片机的室内测温控制系统设计[J].电脑知识与技术,2020(13):242-244.

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-19 12:12:44  更:2021-08-19 12:14:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 17:06:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计