要求
(一)基本功能
1. 测温范围-50℃—110℃
2. 精度误差不大于0.1℃
3. LED数码直读显示
(二)扩展功能
1.实现语音报数(不开发)
2.可以任意设定温度的上下限报警功能
二.计划完成时间 三周
1.第一周完成软件和硬件的整体设计,同时按要求上交设计报告一份。
2.第二周完成软件的具体设计和硬件的制作。
3.第三周完成软件和硬件的联合调试。
准备工作
确定模块
1.温度传感器模块 2.数码管模块 3.转换模块
元件清单
1.STC89C52单片机 2.DS18B20温度传感器
开发工具
1.proteus(开发仿真图)
2.dxp(开发原理图,设计电路板)
安装教程
1.http://www.3d66.com/softhtml/softsetup_114.html
破解教程
破解文件在上文链接中
破解方法:AD10KeyGen 运行AD10KeyGen,点击“打开模板”,加载license.ini,如想修改注册名,只需修改:TransactorName=Your Name其中Your Name用你自己的名字替换,其它参数在单机版的情况下无需修改; 点击“生成协议”,保存生成的alf文件(文件名任意,如“jack”),并将其放到你的安装目录下; 将patch.exe放到你的安装目录下,运行patch,对安装目录下的dxp.exe文件补丁,注意运行破解时软件没有运行; 启动DXP,运行菜单DXP->My Account,点击Add Standalone License file,加载前面生成的license(.alf)文件后即能正常使用了。
3.keil(开发程序)
1.点击"keil3.exe"直接安装直到结束. 不过这样只可以生产2k以下的代码,如果要生成2k以上的代码需要注册, 请按第2部操作.
2.第一次运行请先进入"文件"->“授权管理”弹出窗口下输入注册码, 注册码由"Keil注册.exe"生成,选择V2选项,生成后复制LIC内容到keil 弹出窗口的“新授权ID码(LIC)”中然后点击“添加授权”, 注意看看注册后的使用期限,如果太短可以用注册机重新生成, 一般都可以找到30年左右:-)
3.keil3注册失败(出现错误: ERROR R208: RENEW LICENSE ID CODE (LIC)):[解决方案]
keil3下载地址:http://www.xdowns.com/soft/38/39/2013/Soft_104885.html 注册机下载地址: http://www.51hei.com/f/Keil_lic_v2.exe
设计方案
数字温度计设计方案
电路结构
电路主要有控制模块,报警模块,显示模块,温度传感器模块以及核心模块单片机处理模块, 其系统原理框图如下图所示!
设计思路
DSl8B20作为单片机AT89C52的外部信号源,把所采集到的温度转换为数字信号,通过I/O接口传给AT89C52,AT89C52启动ROM内的控制程序驱动LED数码管,通过I/O接口和数据线(单片机和数码管的接口)把数据传送给数码管,将采集到的温度显示出来,通过控制模块控制测温的上下限,当达到限制时,则AT89C52通知报警模块,实现报警功能!
![结构](https://img-blog.csdnimg.cn/img_convert/f2bbe094154eec16d7b2cf26dd1bbe8c.png)
开发仿真图
开发程序
十六进制数值翻转代码
int isTurn=0;
int turnAll(int a) {//切换全部
if(isTurn)return a^0xff;
return a;
}
int turnAfter(int a){//仅切换低位
if(isTurn)return a^0x0f;
return a;
全部代码
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit DATA = P1^1; //DS18B20接入口
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳极字型码
//uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴极字型码
int temp; //温度值
int ss; //中间的一个变量
int dd;
int j;
int isTurn=0; //切换共阴极-共阳极
uchar data b;//定时器中断次数
uchar data buf[4];//字型显示中间变量
int alarmH=320; //默认报警值
int alarmL=100;
//定义开关的接入口
sbit k1=P2^5;//+
sbit k2=P2^6;//-
sbit k3=P2^7;//确认
sbit k4=P2^4; //切换
sbit bell=P1^0; //蜂鸣器
sbit HLight=P1^2; //正温指示灯
sbit LLight=P1^3; //负温度指示灯
sbit warn=P1^4; //报警指示灯
sbit Red=P1^6; //温度上限设置指示灯
sbit Green=P1^7; //温度下限设置指示灯
bit set=0; //初始化
bit Flag=0; //设置标志
int n,a;
//函数的声明区
void key_to1();
void key_to2();
void delay(uint);
void key();
void Show();
int turnAll(int a) ;
int turnAfter(int a);
//函数的定义区
int turnAll(int a) {
if(isTurn)return a^0xff;
return a;
}
int turnAfter(int a){
if(isTurn)return a^0x0f;
return a;
}
/*延时子函数*/
void delay(uint num)
{
while(num--) ;
}
void delay2(void) //延时函数,延时约0.6毫秒
{
unsigned char i;
for(i=0;i0;i--)
{
DATA = 0; // 给脉冲信号
dat>>=1;
DATA = 1; // 给脉冲信号
if(DATA)
dat|=0x80;
delay(8);
}
return(dat);
}
WriteOneChar(unsigned char dat) //写一个字节
{
uchar i=0;
for (i=8; i>0; i--)
{
DATA = 0;
DATA = dat&0x01;
delay(10);
DATA = 1;
dat>>=1;
}
delay(8);
}
int ReadTemperature(void) //读取温度
{
uchar a=0;
uchar b=0;
int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();//低位
b=ReadOneChar();//高位
t=b;
t |