#include <reg52.h> //52系列头文件
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define PWM_T 100
sbit ds=P3^4;
sbit dula=P2^6;
sbit beep=P1^4; //定义蜂鸣器
uint temp,t,w; //定义整型的温度数据
uchar flag;
float f_temp; //定义浮点型的温度数据
uint high,low,PWM_t,time_count;
sbit led1=P1^0; //控制发光二极管
sbit led2=P1^1; //控制发光二极管
sbit s1=P3^5;
sbit s2=P3^6;
sbit s3=P3^7;
sbit PWM=P3^0;
uchar flag1,flag2,flag3,flag4,s1num,qian,bai,shi,ge;
uchar code table[]=
{
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,0xc6
}; //共阳数码管段码表
uchar code table1[]=
{0x40,0x79,0x24,0x30,0x19,
0x12,0x02,0x78,0x00,0x10};//带小数点的编码
void delay(uchar z) //延时函数
{
uchar a,b;
for(a=z;a>0;a--)
for(b=100;b>0;b--);
}
void init()
{
EA=1;
ET1=1;
ET0=1;
TR1=1;
TR0=1;
TMOD=0x12;
TH1=(65536-4000)/256;
TL1=(65536-4000)%256;
TH0=0x216; //保证定时时长为0.1ms
TL0=0x216;
flag=0;
low=200;
high=300;
}
void hdidi()
{
beep=0;
led1=0;
delay(500);
beep=1;
led1=1;
delay(500);
}
void ldidi()
{
beep=0;
led2=0;
delay(50);
beep=1;
led2=1;
delay(50);
}
void dsreset(void) //DS18b20复位, 初始化函数
{
uint i;
ds=0;
i=103; //延时最短480us
while(i>0) i--;
ds=1; //等待16-60us,收到低电平一个约60-240us则复位成功
i=4;
while(i>0) i--;
}
bit tempreadbit(void) //读1位数据函数
{
uint i;
bit dat;
ds=0;i++;
ds=1;i++;i++; //i++起到延时作用
dat=ds;
i=8;
while(i>0)i--;
return(dat);
}
uchar tempread(void) //读1字节的数据函数
{
uint i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);
//读出的数据最低位在最前面,这样刚好一个字节在dat里
}
return(dat);
}
void tempwritebyte(uchar dat) //向DS18B20写一个字节的数据函数
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //写1
{
ds=0;
i++;i++;
ds=1;
i=8;
while(i>0)
i--;
}
else //写0
{
ds=0;
i=8;
while(i>0) i--;
ds=1;
i++;i++;
}
}
}
void tempchange(void) //DS18B20开始获取温度并转换
{
dsreset();
delay(1);
tempwritebyte(0xcc); //写跳过读ROM指令
tempwritebyte(0x44); //写温度转换指令
}
uint get_temp() //读取寄存器中存储的温度数据
{
uchar a,b;
dsreset();
delay(1);
tempwritebyte(0xcc); //写跳过读ROM指令
tempwritebyte(0xbe); //写温度转换指令
a=tempread(); //读低8位
b=tempread(); //读高8位
temp=256*b+a;
f_temp=temp*0.0625; //温度在寄存器中为12位,分辨率为0.0625
temp=f_temp*10+0.5; //乘以10表示小数点后面只取一位
return temp; //temp是整型
}
void keyscan()
{
if(s1==0)
{P2=0xff;
delay(5);
if(s1==0)
{
while(!s1);
s1num++;
if(s1num==1)
{
flag=1;
}
if(s1num==2)
{
flag=2;
}
if(s1num==3)
{
s1num=0;
flag=0;
}
}
}
if(s1num==1)
{
flag=1;
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!s2);
low+=10;
if(low==1000)
low=200;
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!s3);
low-=10;
if(low==0)
low=200;
}
}
}
if(s1num==2)
{
flag=2;
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!s2);
high+=10;
if(high==1000)
high=200;
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!s3);
high-=10;
if(high==0)
high=300;
}
}
}
}
void main() //主函数
{
init();
while(1)
{
tempchange(); //温度转换函数
//delay(5);
//temp=get_temp()/10;
if(temp>high)
{
hdidi();
PWM_t=100;
}
if(temp>=low&&temp<=high)
{
PWM_t=20;
}
if(temp<low)
{
ldidi();
PWM_t=0;
}
}
}
void t0(void) interrupt 1 using 0
{
time_count++;
if(time_count>=PWM_T)
{
time_count=0;
}
if(time_count<PWM_t)
PWM=0;
else
PWM=1;
}
void time1() interrupt 3
{
TH1=(65536-4000)/256;
TL1=(65536-4000)%256;
t++;
keyscan();
if(flag==0)
{
if(t==4) t=0;
switch(t)
{
case 1:P0=table[get_temp()/100]; P2=0xfd;break;
case 2:P0=table1[get_temp()%100/10];P2=0xfb;break;
case 3:P0=table[get_temp()%10]; P2=0xf7;break;
//case 3:delay(1);break;
}
}
if(flag==1)
{
if(t==4) t=0;
switch(t)
{
case 0:P0=0xc7; P2=0xfe;break;
case 1:P0=0xff; P2=0xfd;break;
case 2:P0=table[low/100]; P2=0xfb;break;
case 3:P0=table[low%100/10]; P2=0xf7;break;
}
}
if(flag==2)
{
if(t==4) t=0;
switch(t)
{
case 0:P0=0x89; P2=0xfe;break;
case 1:P0=0xff; P2=0xfd;break;
case 2:P0=table[high/100]; P2=0xfb;break;
case 3:P0=table[high%100/10]; P2=0xf7;break;
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
111、基于51单片机DS18B20温度采集控制风扇电路图及程序元件清单
共24个文件
schdoc:2个
pdf:2个
bak:2个
2 下载量 198 浏览量
2023-09-30
23:35:38
上传
评论 1
收藏 597KB RAR 举报
温馨提示
本资源内容概要: 这是基于51单片机的DS18B20温度采集控制风扇设计,包含了电路图源文件(Altiumdesigner软件打开)、C语言程序源代码(keil软件打开)、元件清单(excel表格打开)。 本资源适合人群: 单片机爱好者、电子类专业学生、电子diy爱好者。 本资源能学到什么: 可以通过查看电路学习电路设计原理,查看代码学习代码编写原理。 本资源使用建议: 建议使用者需要具备一定电子技术基础,掌握一些常用元器件原理,例如三极管、二极管、数码管、电容、稳压器等。了解C语言基础设计原理,能看懂基础的电路图,具备一定的电路图软件使用能力。
资源推荐
资源详情
资源评论
收起资源包目录
111、基于51单片机DS18B20温度采集控制风扇电路图及程序元件清单.rar (24个子文件)
111、基于51单片机DS18B20温度采集控制风扇电路图及程序元件清单
电路图
18B20.PrjPcbStructure 47B
__Previews
18B20.SchDocPreview 67KB
History
18B20.~(1).PRJPCB.Zip 5KB
18B20.SchDoc 203KB
18B20.PcbLib 0B
复件 18B20.SchDoc 198KB
18B20.pdf 525KB
复件 18B20.pdf 291KB
18B20.PRJPCB 49KB
18B20.PcbDoc 562KB
封装.lib 77KB
温控风扇程序
DS18B20 14KB
DS18B20.c 5KB
DS18B20.LST 13KB
DS18B20.OBJ 16KB
DS18B20.Uv2 2KB
DS18B20_Opt.Bak 973B
DS18B20.plg 198B
DS18B20.M51 20KB
DS18B20.Opt 976B
DS18B20.lnp 46B
DS18B20.hex 6KB
DS18B20_Uv2.Bak 2KB
温控风扇原件清单.xls 14KB
共 24 条
- 1
资源评论
>行者<
- 粉丝: 209
- 资源: 135
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 原生微信小程序源码 - -滴滴公交-查公交
- 人工智能实验四 感知器算法的设计实现
- java小项目多线程多线程 复制文件 冒泡排序 群聊
- 四数之和(java代码).docx
- 701837906919458TapScanner v3.0.10 (Pro).apk
- 青岛大学人工智能实验二 利用α-β搜索的博弈树算法编写一字棋游戏
- ### 1、项目介绍 本项目Scrapy进行数据爬取,并使用Django框架+PyEcharts实现可视化大屏 效果如下:
- # 微信小程序-健康菜谱 基于微信小程序的一个查找检索菜谱的应用 ### 效果 !动态图(./res/gif/demo
- zabbix-get命令包资源
- 289ssm-mysql-jsp 计算机课程实验管理系统.zip(可运行源码+数据库文件+文档)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功