找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2354|回复: 1
打印 上一主题 下一主题
收起左侧

51温控风扇代码

[复制链接]
跳转到指定楼层
楼主
ID:311195 发表于 2018-4-18 20:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
////////////////////
sbit dj=P1^0;//电机控制端接口
sbit DQ=P1^6;//温度传感器接口
//////////按键接口 /////////////////////////////////
sbit key1=P3^5;//设置温度
sbit key2=P3^6;//温度加
sbit key3=P3^7;//温度减
//////////////////////////////////////////////////////
sbit w1=P2^4;
sbit w2=P2^5;
sbit w3=P2^6;
sbit w4=P2^7;
/////共阴数码管段选 ////////////////////////////////////////////// uchar table[22]=
{0x3F,0x06,0x5B,0x4F,0x66,
0x6D,0x7D,0x07,0x7F,0x6F,
0x77,0x7C,0x39,0x5E,0x79,0x71,
0x40,0x38,0x76,0x00,0xff,0x37};//'-',L,H,灭 , 全亮, n 16-21
uint wen_du;
uchar gao,di;//pwm
uint shang,xia; //对比温度暂存变量
uchar dang;//档位显示
uchar flag;
uchar zz;//计算温度差
uchar d1,d2,d3;//显示数据暂存变量
void delay(uint ms)
{
uchar x;
for(ms;ms>0;ms--)
for(x=10;x>0;x--);
}
void display()//显示温度
{
w1=0;P0=table[d1];delay(10); //第 1位
P0=0x00;w1=1;delay(1);
w2=0;P0=table[16];delay(10);//第 2位
P0=0x00;w2=1;delay(1);
w3=0;P0=table[d2]; delay(10);//第 3位
P0=0x00;w3=1;delay(1);
w4=0;P0=table[d3];delay(10);//第 4位
P0=0x00;w4=1;delay(1);
}
/***********ds18b20延迟子函数(晶振 12MHz ) *******/
void delay_18B20(uint i)
{
while(i--);
}
/**********ds18b20初始化函数 **********************/
void Init_DS18B20()
{
uchar x=0;
DQ=1; //DQ复位
delay_18B20(1); //稍做延时
DQ=0; //单片机将 DQ 拉低
delay_18B20(35); //精确延时 大于 480us
DQ=1; //拉高总线
delay_18B20(14);
x=DQ; //稍做延时后 如果 x=0则初始化成功 x=1则初始化失败 delay_18B20(20);
}
/***********ds18b20读一个字节 **************/
uchar ReadOneChar()
{
uchar i=0;
uchar dat=0;
for (i=8;i>0;i--)
{
DQ=0; // 给脉冲信号
dat>>=1;
DQ=1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(4);
}
return(dat);
}
/*************ds18b20写一个字节 ****************/
void WriteOneChar(uchar dat)
{
uchar i=0;
for (i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay_18B20(5);
DQ=1;
dat>>=1;
}
}
/**************读取 ds18b20当前温度 ************/
void ReadTemperature()
{
uchar a=0;
uchar b=0;
uchar t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
display();//显示温度 // this message is very important
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读 9个寄存器) 前两个就是温度 display();//显示温度
a=ReadOneChar(); //读取温度值低位
b=ReadOneChar(); //读取温度值高位
wen_du=((b*256+a)>>4); //当前采集温度 (得出实际的温度值 )
}
void zi_keyscan()//自动模式按键扫描函数
{
if(key1==0)
{
delay(10);
if(key1==0)flag=1;
while(key1==0);//松手检测
}
while(flag==1)
{
d1=18;d2=shang/10;d3=shang%10;
display();
if(key1==0)
{
delay(10);
if(key1==0)flag=0;
while(key1==0);//松手检测
}
if(key2==0)
{
delay(10);
if(key2==0)
{
shang++;
if(shang>=40)shang=40;
xia=shang-10;
}while(key2==0);//松手检测
}
if(key3==0)
{
delay(10);
if(key3==0)
{
shang--;
if(shang<=30)shang=30;
xia=shang-10;
}while(key3==0);//松手检测
}
}
}
void zi_dong()//自动温控模式
{
uchar i;
d1=dang;d2=wen_du/10;d3=wen_du%10;
zi_keyscan();//自动模式按键扫描函数
if(wen_du<=xia){dj=0;dang=0;display();}//低于下限 停止
if((wen_du>xia)&&(wen_du<shang))//1挡
{
zz=wen_du-xia;
switch(zz)
{
case 1:dang=1;gao=5;di=5;break;//PWM高低电平比例 1:1 case 2:dang=2;gao=10;di=5;break;//PWM高低电平比例 2:1 case 3:dang=3;gao=15;di=5;break;//PWM高低电平比例 3:1 case 4:dang=4;gao=20;di=5;break;//PWM高低电平比例 4:1 case 5:dang=5;gao=25;di=5;break;//PWM高低电平比例 5:1 case 6:dang=6;gao=30;di=5;break;//PWM高低电平比例 6:1 case 7:dang=7;gao=35;di=5;break;//PWM高低电平比例 7:1 case 8:dang=8;gao=40;di=5;break;//PWM高低电平比例 8:1 case 9:dang=9;gao=45;di=5;break;//PWM高低电平比例 9:1 }
for(i=0;i<di;i++){dj=0;display();}
for(i=0;i<gao;i++){dj=1;display();}
}
if(wen_du>=shang){dj=1;dang=10;display();}//高温全速
}
void main()
{
uchar j;
dj=0;
shang=30;
xia=20;
for(j=0;j<80;j++)
ReadTemperature();
while(1)
{
ReadTemperature();
zi_keyscan();//自动模式按键扫描函数
for(j=0;j<100;j++)zi_dong();//自动温控模式
}
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:99612 发表于 2019-10-16 18:38 | 只看该作者
xia=20;这个去掉
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表