单片机数字温度计的课程设计程序

503 Service Temporarily Unavailable
503 Service Temporarily Unavailable
openresty/1.9.7.4君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
单片机课程设计 数字温度计
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口查看: 9756|回复: 74
51单片机电子温度计源程序+仿真+照片
在51hei论坛逛了几个月了今天我也发一个小制作,基于STC89C52、DS18B20的电子温度计源程序+仿真+照片,直接下载可用。
温度值用LED数码管显示;测温范围-30°C ~125°C,测温误差大于0.1°C;u 开机启动,检测各元件是否正常工作 u 温度的实时测量与显示 u 支持正负温度的显示(精度为0.1 °C ) u 正负温度辨别(正温度红灯亮,负温度绿灯亮) u 软件预设上限温度32°C,下限温度10°C u 支持手动按键配置温度上下限 K1 K2 K3 K4u 超过温度上下限即实现报警功能,报警灯闪烁,蜂鸣器震动并发声警示 u 一键复位
QQ截图30.jpg (75.86 KB, 下载次数: 70)
02:30 上传
#include&reg52.h&
#include &intrins.h&
#define&&uchar&&unsigned&&char
#define&&uint& &unsigned&&int
sbit&&DATA = P1^1; //DS18B20接入口
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴极字型码
&&//温度值
& & & & & & & & //中间的一个变量
//定时器中断次数
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;& & & & //设置标志
//函数的声明区
void key_to1();
void key_to2();
void delay(uint);
void key();
void Show();
//函数的定义区
/*延时子函数*/
void delay(uint num)
{
& & & & while(num--) ;
}
//DS18b20温度传感器所需函数,分为初始化,读写字节,读取温度4个函数
Init_DS18B20(void)& & & & & & & && & //传感器初始化
{
& & & & uchar x=0;
& & & & DATA = 1;& & //DQ复位
& & & & delay(10);&&//稍做延时
& & & & DATA = 0;& & //单片机将DQ拉低
& & & & delay(80); //精确延时 大于 480us& & //450
& & & & DATA = 1;& & //拉高总线
& & & & delay(20);
& & & & x=DATA;& && &//稍做延时后 如果x=0则初始化成功 x=1则初始化失败
& & & & delay(30);
}
ReadOneChar(void)&&//读一个字节
{
& & & & uchar i=0;
& & & & uchar dat = 0;
& & & & for (i=8;i&0;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&&=8;
& & & & t=t|a;
& & & & tt=t*0.0625;
& & & & t= tt*10+0.5;
& & & & return(t);
}
void&&display00()& &&&//*********显示负值子函数
{& & & &
& & dd=-(temp-1);
& & buf[1]=dd/100;
& & & & buf[2]=dd/100;
& & & & buf[3]=dd%100/10;
& & & & buf[0]=dd%10;
& & & & //动态显示
& & & & for(j=0;j&5;j++)
& & {
& & & & P2=0& && && & & & & & & & & & & & & && &// 初始灯为灭的
& & P0=0x00;
& & & & P2=0 //显示小数点
& & & & P0=0x80; //显示小数点
& & & & delay(100);& & & & & & & &
& & P2=0&&// 初始灯为灭的
& & P0=0x00;
& & P2=0xf7; //片选LCD1
& & P0=0x40;
& & & & delay(100);
& & & & P2=0
& & P0=0x00;
& & P2=0&&//片选LCD2
& & P0=table[buf[2]];
& & & & delay(100);
& & & & P2=0
& & P0=0x00;
& & & & P2=0X//片选LCD3
& & & & P0=table[buf[3]];
& & & & delay(100);
& & & & P2=0
& & P0=0x00;
& & & & P2=0X
& & & & P0=table[buf[0]];& & & & & & & && &//片选LCD4& & & &
& & & & delay(100);
& & & & P2=0& &
& & }
}
//显示正值子函数
void&&display()
{& & & & & & & &
& & & & buf[1]=temp/1000;//显示百位
& & & & buf[2]=temp/100%10;//显示十位
& & & & buf[3]=temp%100/10;//显示个位
& & & & buf[0]=temp%10; //小数位
& & & & for(j=0;j&3;j++)
& & & & {
& & & & P2=0& && && & & & & & & & & & & & & && &// 初始灯为灭的
& & P0=0x00;
& & & & P2=0 //显示小数点
& & & & P0=0x80; //显示小数点
& & & & delay(300);& & & & & & & &
& & P2=0& && && & & & & & & & & & & & & && &// 初始灯为灭的
& & P0=0x00;
& & P2=0xf7;& && && &&&& & & & & & & & & & & && &//片选LCD1
& & P0=table[buf[1]];
& & & & delay(300);
& & & & P2=0
& & P0=0x00;
& & P2=0& && && && & & & & & & & & &&&//片选LCD2
& & P0=table[buf[2]];
& & & & delay(300);
& & & & P2=0
& & P0=0x00;
& & & & P2=0X& & & & & & & && &//片选LCD3
& & & & P0=table[buf[3]];
& & & & delay(300);
& & & & P2=0
& & P0=0x00;
& & & & P2=0X
& & & & P0=table[buf[0]];& & & & & & & && &//片选LCD4& & & &
& & & & delay(300);
& & & & P2=0
& & & & }
}
void key()& & & & //按键扫描子程序
{& &if(k1!=1)
& & & & {
& & & && & delay(20);
& & & && & if(k1!=1)
& & & && & {
& & & & & & & & while(k1!=1)
& & & & & & & && &{ key_to1();
& & & & & & & && &&&for(n=0;n&8;n++)
& & & & & & & && &&&Show();
& & & && && &&&}
& & & && & }
& & & & }
& & & & if(k2!=1)
& & & & {
& & & & & & & & delay(20);
& & & & & & & & if(k2!=1)
& & & & & & & & {
& & & & & & & && &while(k2!=1)
& & & & & & & & & & & & { key_to2();
& & & & & & & & & & & && &for(n=0;n&8;n++)
& & & & & & & && && & Show();
& & & & & & & & & & & & }
& & & & & & & & & & & &
& & & & & & & & }
& & & & }& & & &&&
& & & & if(k3!=1)
& & & & {& & & & TR0=1; //复位,开定时
& && &&&temp=ReadTemperature();
& & & & }
& & & & if(k4!=1)
& & & & {&&delay(20);
& & & && & if(k4!=1)
& & & && & {&&while(k4!=1);
& & & && && & set=!
& & & & & & & && & if(set==0)
& & & & & & & && & { Red=0;Green=1;}
& & & & & & & && & else { Green=0;Red=1;}
& & & & & & & & }
& & & &&&}
}
void key_to1()
{
& & & && &&&TR0=0;& & & && && &&&//关定时器
& && &&&temp+=10;
& & & & & & & & if(temp&=1100)
& & & & & & & && & {temp=-550;}
& && &&&if(set==0)
& & & & & & & & {alarmH=}
& & & & & & & & else {alarmL=}& & & &
}
void key_to2()
{
& & & && &&&TR0=0;
& && & //关定时器
& && &&&temp-=10;
& & & & & & & & if(temp&=-550)
& & & & & & & && &&&{temp=1100;}
& && &&&if(set==0)
& & & & & & & & { alarmH=}
& & & & & & & & else { alarmL=}
}
void alarm(void)
{
& & if(temp&alarmH||temp&alarmL)
& & & & {& &//bell=1;
& & & && &&&//delay(50);
& & & & & & & & //bell=0;
& & & & & & & & Flag=1;
& &&&}else {Flag=0;}
}
logo()//开机的Logo&&
{& &P0=0x40;
& & P2=0xf7;
& & & & delay(50);
& & P2=0
& & & & delay(50);
& & & & P2=0X
& & & & delay(50);
& & & & P2=0X
& & & & delay(50);
& & P1 = 0& && && &//关闭显示
}
void Show()&&//显示函数,分别表示温度正负值
{& & & && &&&if(temp&=0)
& & & & & & & & {HLight=1;LLight=0;display();}
& & & & & & & & if(temp&0)
& & & & & & & & {HLight=0;LLight=1;display00();}
}
void&&main()
{& & & &
& & TCON=0x01; //定时器T0工作在01模式下
& & TMOD=0X01;& & & &
& & & & TH0=0XD8;//装入初值
& & & & TL0=0XF0;
& & & & EA=1;&&//开总中断
& & & & ET0=1; //开T0中断
& & & & TR0=1; //T0开始运行计数
& & & & EX0=1; //开外部中断0
& & & &
& & & & for(n=0;n&500;n++)//显示启动LOGo&- - - -&
& & & & {bell=1;warn=1;logo();}
& & & &&&Red=0;
& & & & while(1)
& & & & {
& & & && &&&key();
& & & & & & & & ss=ReadTemperature();
& && &&&Show();
& & & & & & & & alarm();& &//报警函数
& & & & & & & & if(Flag==1)
& & & & & & & & {bell=!
& & & & & & & &&&warn=!}&&//蜂鸣器滴滴响
& & & & & & & & else {bell=1;
& & & & & & & && && & warn=1;}& & & &
& & & & }& & & &&&
}
void time0(void) interrupt 1 using 1&&//每隔10ms执行一次此子程序
{& & & & TH0=0X56;
& & & & TL0=0XDC;& & & &
& & & & temp=
}复制代码仿真文件和源代码下载:
(155.85 KB, 下载次数: 966)
02:31 上传
点击文件名下载附件
下载积分: 黑币 -5
绝世好帖!
 谢谢楼主!!!此贴必火!!!!
 好东东,牛人,51Hei(51黑)论坛有你更精彩.
很好 学习 谢谢
c语言编的啊& &新手&&现在学汇编&&还是多谢楼主提供
楼主有没有无线多路温度采集系统的设计资料啊?nRF905,DS18B20,LCD1602
有的话传个资料,万分感谢!
正是我初学能用上的好 资料,谢谢!
他奶奶的,无法编译,仿真通不过。
楼主,能多带几个18b20吗,4个可以吗.谢谢!!
新手支持个……
楼主挺厉害啊,正在做这个呢,hhh
很好的资料,仿真正常运行
最近在做相关方面的毕业设计,借鉴一下
谢谢分享!!!
好东西,谢谢
详细,能够下载吗
我已经下载了,不怎么样
好东东,牛人,51Hei(51黑)论坛有你更精彩.
好东东,牛人,51Hei(51黑)论坛有你更精彩.
感谢楼主-- 下载试试
楼主好人 资料不错
谢谢楼主!!!此贴必火!!!!
楼主你也是自动化的呀。我也是自动化的,目前正在自学单片机
这个有电路图么
我已经下载了,不怎么样
谢谢LZ,最近刚好要要用到,下来借鉴下
给楼主点个赞!!!
谢谢楼主啦,楼主是好人
看不见温度显示乱七八糟
感谢楼主分享
这么晚才看到楼主的帖子,自己的毕设也是单片机仿真电路。
真心不错,好东西,一次成功,希望大家都可以借鉴学习
 谢谢楼主真的是帮大忙了
Powered by基于单片机AT89C2051的数字温度计设计
> 基于单片机AT89C2051的数字温度计设计
基于单片机AT89C2051的数字温度计设计
控制已成为今天电子设计追-求的目标之一,本文将这种控制技术应用于温度测量中。是美国Atmel公司生产的低电压、高性能CMOS8位,片内含有2 KB的反复擦写的只读程序存储器和128 B的随机存取数据存储器(RAM)。美国DALLAS半导体公司生产的DSl-8B20型单线智能温度传感器,属于新一代适配微处理器的智能传感器。是以DS18B20为检测元件,由作为主控制器的温度计,具有功耗低、结构简单、读数方便、测温范围广、测温准确的特点。  1 电路构成及工作原理  1.1 硬件设计  由构成的温度计主要由三部分组成:DSl8B20温度传感器、AT89C2051、由LED数码管构成的显示模块。其系统原理框图如图1所示。DSl8B20作为单片机AT89C2051的外部信号源,把所采集到的温度转换为数字信号,通过I/O接口传给启动ROM内的控制程序驱动LED数码管,通过I/O接口和数据线(单片机和数码管的接口)把数据传送给数码管,将采集到的温度显示出来。  1.2 总电路图  基于AT89C2051的温度测量系统电路图把温度转化成带符号的数字信号(以十六位补码形式,占两个字节),若采用带屏蔽的双绞电缆线,连线的长度可以达到150 m,输出脚I/0直接与单片机的P3.4相连,R1为上拉电阻,传感器采用外部电源供电。AT89C2051是整个系统的核心部分,内含2 KB的FLASH ROM,用户程序存放在这里。显示器模块由四位一体的共阳数码管和四个9012组成。系统程序分传感器控制程序和显示器程序两部分,传感器控制程序是按照DSl8B20的通信协议编制。系统的工作是在程序控制下,完成对传感器的读写和对温度的显示。  产品的主要技术指标:测量范围:-55~+125℃,测量精度:0.5℃;反应时间小于等于500 ms。  2 软件设计  2.1 采集模块  该模块选用单线温度传感器DSl8B20完成温度采集。单片机AT89C51对DSl8B20访问流程如下:先对DSl8B20初始化,再进行ROM操作命令,最后才能对存储器操作。DSl8B20每一步操作都要遵循严格的工作时序和通信协议。根据DSl8B20的通讯协议,需经三个步骤:每一次读写之前都要对DSl8B20进行复位,复位成功后发送一条ROM指令(指令代码CCH)并置标志位,根据标志位来判断是否初始化成功,最后发送RAM指令(指令代码44H)DSl8B20开始转换,再读出温度转换值(指令代码BEH),读取的温度值高位字节送27H单元,低位字节送26H单元,再按照温度值字节的表示格式及其符号位,经过简单的变换即可得到实际温度值。
分享给小伙伴们:
我来说两句……
最新技术贴
微信公众号二
微信公众号一单片机温度计实验报告-学网-提供健康,养生,留学,移民,创业,汽车等信息
单片机温度计实验报告
这样的最小系统好象还不是最小的,可以做的更小。T_UP,#60H ;初始化温度上限 MOV T_DOWN,#30H ;初始化温度下限 MOV MARK,#00H ;当前显示数值的标志。0显示当前温度,1显示并调节最高温度,2显示并调节最低温度。...单片机8位完整对应,硬件不缩水,使用显示更方便更完整。可做实验:比如计 数器、秒... 温度显示器:可做温度传感显示实验,可以做成温度检测控制器。(初步掌握单片机操作后... { unsigned char x=0; DQ = 1; //DQ复位 delay(8); //稍做延时 DQ = 0; //单片机将DQ... WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 a=Read... 好繁琐的显示电路啊,那么多IO口闲着,还要用芯片 收到没有?没有我再发给你一份。 该数字温度计利用AD590集成温度传感器及其接口电路完成温度的测量并转换成模拟电压信号,经由模数转换器ADC0804转换成单片机能够处理的数字信号,然后送到单片机A...单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器...只是LCD1602的代码 ;多功能51单片机开发板 ;LCD1602测试程序 RS EQU P2.0 RW EQU P2.1 E EQU P2.2 网上找,多的是
您可能还关注:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
大类导航: |

我要回帖

更多关于 单片机温度计原理图 的文章

 

随机推荐