标题:
自己看书写的一个DS18B20温度传感器温度报警器单片机程序
[打印本页]
作者:
a358828564
时间:
2019-9-9 11:44
标题:
自己看书写的一个DS18B20温度传感器温度报警器单片机程序
这个是我的课件做的,所以电路图不知道怎么画 就用画图程序画了一个,将就看吧,功能很简单就是检测温度的高低,高于某个值就报警,蜂鸣器响,同理低于某个值也响,最高值和最低值可以通过修改源码初始化值重新编译下载到单片机里,当然,我也设置了功能按键,可以通过diy板上的键设置这两个值,区别在于每次断电后这两个值会恢复到源码里面设置那个值,好了上图上源码
图片2.png
(472.79 KB, 下载次数: 45)
下载附件
diy成品演示
2019-9-9 11:41 上传
图片1.png
(29.67 KB, 下载次数: 57)
下载附件
diy板接线电路图
2019-9-9 11:41 上传
单片机源程序如下:
//采用共阴极数码管
//P0接数码管段选 可加一个排阻
//P2接数码管位选
//P1^1接温度传感器
//P1^0接蜂鸣器(需要一个三极管放大来驱动蜂鸣器,通常是8550)
//仅供参考(八哥)
/*****************************************************************************/
//程序部分开始//
/****************************************************************************/
//头文件
#include <reg51.h>
/*****************************************************************************/
//数码管的段码编码
unsigned char code table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//下一行的数组可以显示数值外,还可以显示数码管的点
unsigned char code table_d[16] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};
unsigned char code LED_W[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned int sec = 0,item_h=300,item_l=100;
bit w = 0;
bit v = 1;
/*****************************************************************************/
sbit KEY_1 = P1^4;
sbit KEY_2 = P1^5;
sbit KEY_3 = P1^6;
sbit KEY_4 = P1^7;
sbit led_r = P1^3;
sbit led_g = P1^2;
sbit DQ = P1^1;//ds18B20
sbit beep = P1^0;//蜂鸣器
/******************************************************************************/
//DS18B20温度传感器驱动(显示0至60度)
/******************************************************************************/
void Delay(int num){//延时函数
while(num--) ;
}
/****************************************************************************/
void Delay_1ms(unsigned int a){//延时函数 1MS/次
unsigned char i;
while( --a != 0){
for(i = 0; i < 125; i++); //一个 ; 表示空语句,CPU空转。
} //i 从0加到125,CPU大概就耗时1毫秒
}
/****************************************************************************/
/******************************************************************************/
void Init_DS18B20(void){//初始化ds1820
unsigned char x=0;
DQ = 1; //DQ复位
Delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
Delay(80); //精确延时 大于 480us
DQ = 1; //拉高总线
Delay(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
Delay(20);
}
/******************************************************************************/
unsigned char ReadOneChar(void){//读一个字节
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--){
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
Delay(4);
}
return(dat);
}
/******************************************************************************/
void WriteOneChar(unsigned char dat){//写一个字节
unsigned char i=0;
for (i=8; i>0; i--){
DQ = 0;
DQ = dat&0x01;
Delay(5);
DQ = 1;
dat>>=1;
}
}
/******************************************************************************/
unsigned int ReadTemperature(void){//读取温度
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器
a=ReadOneChar(); //读低8位
b=ReadOneChar(); //读高8位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t= tt*10+0.5; //放大10倍输出并四舍五入
return(t);
}
/*****************************************************************************/
void Display(unsigned int i)
{
unsigned char a=0,b=0,c=0;
a=i/100;
b=(i/10)%10;
c=i%10;
P0 = 0;
P2 = LED_W[3];
P0 = table[12]; //显示C
Delay_1ms(7.5);
P0 = 0;
P2 = LED_W[2];
P0 = table[c]; //显示小数位温度
Delay_1ms(7.5);
P0 = 0;
P2 = LED_W[1];
P0 = table_d[b]; //显示个位温度,带点显示
Delay_1ms(7.5);
P0 = 0;
P2 = LED_W[0];
P0 = table[a]; //显示十位温度
Delay_1ms(7.5);
}
/*****************************************************************************/
void Beep_key(void){//-扬声器--按键音
if (v == 1)
{
unsigned char a;//定义变量用于发声的长度设置
for(a=100;a>0;a--){//声音的长度
beep = ~beep;
Delay(50);//音调设置延时
}
beep = 1;//音乐结束后扬声器拉高关闭
}
}
/*****************************************************************************/
void set_t(unsigned char sel)
{
if (sel==0)
{
Display(item_h);
led_r = 1;
led_g = 0;
}
if (sel==1)
{
Display(item_l);
led_r = 0;
led_g = 1;
}
if (KEY_1 == 0)
{
if (KEY_1 == 0 && sel == 0) item_h--;
if (KEY_1 == 0 && sel == 1) item_l--;
//if (KEY_1 == 0 && sel == 2) v = 1;
}
if (KEY_2 == 0)
{
if (KEY_2 == 0 && sel == 0) item_h++;
if (KEY_2 == 0 && sel == 1) item_l++;
//if (KEY_1 == 0 && sel == 2) v = 0;
}
}
/*****************************************************************************/
void main(void)
{
unsigned char e=0;
beep = 1;
while(1)
{
if(w == 0)
{
sec=ReadTemperature();//读温度并送显
Display(sec);
if (sec > item_h || sec < item_l)beep = 0; //蜂鸣器响
else beep = 1;
}
else
{
if(e==0)Display(item_h);
if(e==1)Display(item_l);
}
/*******************************************************/
if (KEY_1 == 0) //减调整
{
Delay_1ms(15);
if (KEY_1 == 0 && w == 1)//调温状态减调整
{
Beep_key();
set_t(e);
}
}
/*******************************************************/
if (KEY_2 == 0) //加调整
{
Delay_1ms(15);
if (KEY_2 == 0 && w == 1)//调温状态加调整
{
Beep_key();//按键音
set_t(e);
}
}
/*******************************************************/
if (KEY_3 == 0) //模式调节
{
Delay_1ms(15);
if (KEY_3 == 0 && w == 0) //正常显示状态进入调温状态
{
Beep_key();
w = 1;
}
if (KEY_3 == 0 && w == 1) //调温状态选择上下限调节
{
e++;
if (e>1) e = 0;
set_t(e);
}
}
/*******************************************************/
if (KEY_4 == 0) //调温状时退出调温
{
Delay_1ms(15);
if (KEY_4 == 0 && w == 1)
{
Beep_key();
w = 0;
}
}
}
}
复制代码
作者:
bhjyqjs
时间:
2019-9-10 09:06
佩服这位仁兄,用画图软件画出这么漂亮的图
作者:
Toxic_pill
时间:
2019-9-10 10:51
兄嘚 有PCB吗
作者:
ping264888
时间:
2019-9-10 11:26
不過晶振那裡要修改一下, 是通過電容接地, 不是直接接地.
作者:
skyline@
时间:
2021-4-20 20:53
请问一下v和w是什么,是LED灯吗?一开始v=1,w=0,然而我的灯一开始仿真两个LED灯都是亮的而且蜂鸣器一直响,这是为什么,大佬们帮帮忙
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1