单片机自动调光C语言,基于51单片机的DS18B20水温PID控制调节系统设计C语言程序...
#include ‘reg52.h’
#include ‘stdio.h’
#define uchar unsigned char
#define uint unsigned int
sbit s1=P2^0;
sbit s2=P2^1;
sbit s3=P2^2;
sbit s4=P2^3;
sbit s5=P2^4;
sbit ds=P2^5;
sbit beep=P2^6;
sbit rd=P1^0;
sbit rs=P1^1;
sbit wr=P1^2;
sbit lcden=P1^3;
sbit PWM=P1^6;
sbit led1=P1^4;
sbit led2=P1^5;
uchar set_temp,keytemp;
uint temp;
uchar c;
bit flag,flag1,flag2;
float f_temp,t;
int timecount,z;
float KP,KI,KD;
float e1,e2,e3;
float uk,duk;
uchar HighL,HighH,PWMH;
float k;
uchar code table[]={"设定温度:"};
uchar code table1[]={"实测温度:"};
uchar code table2[]={"加热"};
uchar code table3[]={"保温"};
uchar code table4[]={"作者:0903锋仔@"};
uchar code table5[]={"系统初始化"};
uchar code table6[]={"measured Temperature"};
uchar code table7[]={"水温控制系统设计"};
uchar code table8[]={" "};
void delay(uint z)//延时函数,延时5ms
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void keyscan()
{
if(set_temp>=100)//将设定温度限定在0-100度之间
set_temp=100;
if(set_temp<=0)
set_temp=0;
if(s5==0)//此键按下设定温度加5
{
delay(10);
if(s5==0)
{
flag1=0;
set_temp+=5;
if(set_temp>=100)
{
set_temp=100;
beep=0;
delay(1000);
beep=1;
}
}while(s5==0);
}
if(s4==0)//此键按下设定温度减5
{
delay(10);
if(s4==0)
{
flag1=0;
set_temp-=5;
if(set_temp<=0)
{
set_temp=0;
beep=0;
delay(1000);
beep=1;
}
}while(s4==0);
}
if(s3==0)//此键按下设定温度加1
{
delay(10);
if(s3==0)
{
flag1=0;
set_temp++;
if(set_temp==100)
{
set_temp=100;
beep=0;
delay(1000);
beep=1;
}
}while(s3==0);
}
if(s2==0)//此键按下设定温度减1
{
delay(10);
if(s2==0)
{
flag1=0;
set_temp--;
if(set_temp==0)
{
set_temp=0;
beep=0;
delay(1000);
beep=1;
}
}while(s2==0);
}
if(s1==0)//确定加热状态(加热与不加热)
{
delay(10);
if(s1==0)
{
flag1=1;
}
while(s1==0);
}
}
void dsreset()//DS18B20复位函数
{
uint i;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}
bit tempreadbit()//从DS18B20 RAM读一位数据
{
uint i;
bit dat;
ds=0;i++;
ds=1;i++;i++;
dat=ds;
i=8;while(i>0)i--;
return(dat);
}
uchar tempread()//从DS18B20 RAM读一字节数据
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
void tempwritebyte(uchar dat)//向DS18B20写以字节的数据
{
uint i,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()//启动温度转换
{
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0x44);
}
float get_temp()//温度值读取与处理函数
{
uchar a,b;
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread();
b=tempread();
temp=b;
temp<<=8;
temp=temp|a;
f_temp=(float)(temp*0.0625);
f_temp=f_temp*10;
return(f_temp);
}
void write_com(uchar com)//向12864写指令
{
rs=0;
wr=0;
delay(1);
P0=com;
lcden=1;
delay(1);
lcden=0;
delay(1);
}
void write_date(uchar date)//向12864写数据
{
rs=1;
wr=0;
delay(1);
P0=date;
lcden=1;
delay(1);
lcden=0;
delay(1);
}
void display(float m,uchar n)//显示设定温度、实测温度、加热状态
{
uint i,j;
float b;
float p;
uchar a1,a2,a3;
uchar b1,b2,b3,b4;
if(n<100)
{
a1=0;
a2=n/10;
a3=n;
}
else
{
a1=1;
a2=0;
a3=0;
}
p=m;
j=(uint)(p*10);
b1=(uchar)(j/1000);
b2=(uchar)(j00/100);
b3=(uchar)(j0/10);
b4=(uchar)(j);
write_com(0x90+5);//显示设定温度
write_date(0x30+a1);
write_date(0x30+a2);
write_date(0x30+a3);
write_com(0x88+5);//显示实测温度
write_date(0x30+b1);
write_date(0x30+b2);
write_date(0x2e);
write_date(0x30+b3);
write_date(0x30+b4);
b=((float)(b1*100+b2*10+b3))/10.0;
i=0;
if((b+0.2)
{
led1=0;
write_com(0x98+1);
while(table2[i]!='\0')
{
write_date(table2[i]);
i++;
}
flag2=1;
}
else
{
led1=1;
i=0;
write_com(0x98+1);
while(table8[i]!='\0')
{
write_date(table8[i]);
i++;
}
i=0;
if((b=n)||((b>n)&&((b-0.2)<=n))||((b=n)))
{
led2=0;
write_com(0x98+4);
while(table3[i]!='\0')
{
write_date(table3[i]);
i++;
}
}
}
if(flag2==1)
{
flag2=0;
led2=1;
i=0;
write_com(0x98+4);
while(table8[i]!='\0')
{
write_date(table8[i]);
i++;
}
}
}
void conversion()//定时器2初值处理函数
{
uint temp2;
temp2=65536-PWMH*10;
HighH=temp2/256;
HighL=temp2%6;
}
void senddate(float y)
{
// uint i;
if(flag==1)
{
ES=0;
flag=0;
c=0;
TI=1;
printf("The measured temp:%f",y);
// SBUF=1;
while(!TI);
TI=0;
ES=1;
}
}
void init()//初始化函数
{
uint i,j;
TMOD=0x21;
TH1=0xfd;
TL1=0xfd;
TH0=(65536-50000)/256;
TL0=(65536-50000)%6;
PWMH=0;
conversion();
TH2=(65536-50000)/256;
TL2=(65536-50000)%6;
rd=1;
lcden=0;
write_com(0x30);
write_com(0x0c);
write_com(0x01);
write_com(0x90);
while(table5[i]!='\0')//系统初始化
{
write_date(table5[i]);
i++;
delay(20);
}
for(j=0;j<=1;j++)//6个点的三次循环
{
write_com(0x88+4);
for(i=0;i<=5;i++)
{
write_date(0x2e);
delay(200);
}
delay(100);
write_com(0x88+4);
for(i=0;i<=5;i++)
{
write_date(0x20);
}
delay(100);
}
i=0;
write_com(0x80);//显示 水温控制系统设计标题
while(table7[i]!='\0')
{
write_date(table7[i]);
i++;
}
i=0;
write_com(0x90);//显示 设定温度
while(table[i]!='\0')
{
write_date(table[i]);
i++;
}
i=0;
write_com(0x88);//显示 实测温度
while(table1[i]!='\0')
{
write_date(table1[i]);
i++;
}
// tempwritebyte(0x4e);//设定DS18B20的分辨率为11位
// tempwritebyte(0x5f);
PWM=0;
e1=0;
e2=0;
e3=0;
duk=0;
uk=0;
KP=20;//PID控制算法参数
KI=0.061;
KD=30;
REN=1;//串口通信设置
SM0=0;
SM1=1;
ET0=1;
ET2=1;
TR0=1;
TR1=1;
TR2=1;//启动定时器2
EA=1;
ES=1;
}
void main()
{
init();
while(1)
{
keyscan();//调用键盘扫描函数
tempchange();//启动温度转换
t=get_temp();//提取实测温度
display(t,set_temp);//显示设定温度和实测温度
senddate(t);//向上位机发送数据函数
if((flag1==1))
{
if(timecount>=375)
{
timecount=0;
e1=set_temp-t;
duk=(KP*(e1-e2)+KI*e1+KD*(e1-2*e2+e3));//PID控制算法式
uk=uk+duk;
if(e1>=75)
{
z=4;
}
else if(e1>=50)
{
z=3;
}
else if(e1>=10)
{
z=2;
}
else
z=1;
}
if(uk>=2500)uk=2500;
if(uk<=0)uk=0;
if(uk<=0)
{
ET0=0;
ET2=0;
PWM=0;
}
else
{
ET0=1;
ET2=1;
PWMH=(uchar)uk;
k=(float)uk;
}
e3=e2;
e2=e1;
conversion();//调用定时器2初值处理函数
}
else
{
ET0=0;
ET2=0;
PWM=0;
}
}
}
void timer0() interrupt 1//定时器1中断
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%6;
timecount++;
TH2=HighH;
TL2=HighL;
PWM=1;
}
void ser() interrupt 4//串口中断
{
RI=0;
c=SBUF;
flag=1;
}
void Timer2() interrupt 5//用定时器2控制PWM占空比
{
TF2=0;
PWM=0;
}
单片机自动调光C语言,基于51单片机的DS18B20水温PID控制调节系统设计C语言程序...相关推荐
- 单片机检测电机频率c语言,基于51单片机的电动机测速表的设计.doc
基于51单片机的电动机测速表的设计 基于51单片机的电动机测速表设计 摘 要 本文介绍了采用光电传感器实施电机转速测量的方法.基本原理,完成了一种基于AT89C51单片机平台的电动机测速表的软硬件设计 ...
- 温控仪C语言程序,模糊PID控制温控系统设计C语言程序代码
<模糊PID控制温控系统设计C语言程序代码>由会员分享,可在线阅读,更多相关<模糊PID控制温控系统设计C语言程序代码(17页珍藏版)>请在人人文库网上搜索. 1.*模糊PID ...
- 温控系统c语言源代码,模糊PID控制温控系统设计C语言程序代码
<模糊PID控制温控系统设计C语言程序代码>由会员分享,可在线阅读,更多相关<模糊PID控制温控系统设计C语言程序代码(17页珍藏版)>请在人人文库网上搜索. 1.模糊PID控 ...
- 自动计数报警器c语言,基于51单片机的光电式计数报警器
详细的基于51单片机的光电式计数报警器的技术方案,有图,详尽,从原理到设计思路,到设计过程,关键代码,到测评都很详尽. 基于51单片机的光电式计数报警器 概述与应用背景 光电式传感器是将光信号转化为电 ...
- 基于51单片机的自动浇花系统设计/基于51单片机的智能抽奖系统控制设计/基于51单片机的数字时钟与日历显示控制设计 毕业设计
1147基于51单片机的自动浇花系统设计 设计思路:通湿度传感器实时监测湿度,通过LCD显示出实时的湿度采集值,可以通过按键设定目标界限,当达到这个界限值时,浇花系统的电机装置运行. 电路包含:LCD ...
- 用单片机c51电子秤的c语言,基于51单片机的电子秤系统设计
微机原理论文第八篇:基于51单片机的电子秤系统设计 摘要:本文主要分析51单片机下的数字电子秤.在设计过程中,这种电子秤具体包括电源.传感器.蓝牙.转换器.单片机.键盘.开关.显示器等组成部分,在实践 ...
- 声控灯程序C语言,基于51单片机的声控灯的设计.doc
PAGE 3 基于51单片机的声控小灯 电子信息工程技术信息工程系 电子信息工程技术 信息工程系 年 10 月 20 日 诚 信 声 明 本人郑重声明:所呈交的毕业设计文本和成果,是本人在指导老师的指 ...
- 51单片机电机测速程序c语言,基于51单片机光电编码器测速.doc
基于51单片机光电编码器测速 PAGE PAGE 2 课程设计报告 课程名称: 微机原理课程设计 题 目: 基于51单片机的光电编码器测速 摘要 光电编码器是高精度位置控制系统常用的一种位移检测传感器 ...
- 万年历设计单片机c语言,基于51单片机的电子万年历的设计
基于51单片机的电子万年历的设计(论文9400字) 功能要求 1. 万年历能用数码管显示阳历年.月.日.星期.[小]时.分.秒并设置指定时间的闹铃. 2. 数字式温度计要求测温范围-50~100°C, ...
最新文章
- 《小美斗地主》:棋牌手游新商业模式启示录
- android 高斯模糊 c,c-如何在不使用任何内置高斯函数的情况下对图像进行高斯模糊处理?...
- go编译so win10_windows搭建Go语言交叉编译环境
- 基于JAVA+Servlet+JSP+MYSQL的学生选课系统
- Policy-Based Reinforcement Learning
- Android:eclipse新建android工程style文件里的Theme老是报错
- 11.微服务设计 --- 规模化微服务
- maven仓库--私服(Nexus的配置使用)
- 解决MobaXterm左侧没有文件列表,没有SCP,不显示文件夹
- 通过 Nginx 来实现禁止国外IP访问网站
- java 读写乱码_java读写文件出现乱码的解决方法
- java 发 腾讯企业邮_JAVA使用腾讯企业邮箱发送邮件时报错Could not connect to SMTP host...
- 软件工程--总体设计过程包括那些步骤---软件设计过程中应该遵循那些基本原理--模块独立性
- 安装quartusⅡ简明教程
- 让明日科技今日成真,Mali-G72有何妙招?
- web程序发布后发送传真失败记要
- 量化选股——基于动量因子的行业风格轮动策略(第2部分—策略回测)
- 圆形体癣是什么样子的图片_【 身上起圈圈型的癣图片】_如何治疗_怎么治疗-大众养生网...
- Nginx做缓存服务器
- 查看tmp目录下的文件