#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语言程序...相关推荐

  1. 单片机检测电机频率c语言,基于51单片机的电动机测速表的设计.doc

    基于51单片机的电动机测速表的设计 基于51单片机的电动机测速表设计 摘 要 本文介绍了采用光电传感器实施电机转速测量的方法.基本原理,完成了一种基于AT89C51单片机平台的电动机测速表的软硬件设计 ...

  2. 温控仪C语言程序,模糊PID控制温控系统设计C语言程序代码

    <模糊PID控制温控系统设计C语言程序代码>由会员分享,可在线阅读,更多相关<模糊PID控制温控系统设计C语言程序代码(17页珍藏版)>请在人人文库网上搜索. 1.*模糊PID ...

  3. 温控系统c语言源代码,模糊PID控制温控系统设计C语言程序代码

    <模糊PID控制温控系统设计C语言程序代码>由会员分享,可在线阅读,更多相关<模糊PID控制温控系统设计C语言程序代码(17页珍藏版)>请在人人文库网上搜索. 1.模糊PID控 ...

  4. 自动计数报警器c语言,基于51单片机的光电式计数报警器

    详细的基于51单片机的光电式计数报警器的技术方案,有图,详尽,从原理到设计思路,到设计过程,关键代码,到测评都很详尽. 基于51单片机的光电式计数报警器 概述与应用背景 光电式传感器是将光信号转化为电 ...

  5. 基于51单片机的自动浇花系统设计/基于51单片机的智能抽奖系统控制设计/基于51单片机的数字时钟与日历显示控制设计 毕业设计

    1147基于51单片机的自动浇花系统设计 设计思路:通湿度传感器实时监测湿度,通过LCD显示出实时的湿度采集值,可以通过按键设定目标界限,当达到这个界限值时,浇花系统的电机装置运行. 电路包含:LCD ...

  6. 用单片机c51电子秤的c语言,基于51单片机的电子秤系统设计

    微机原理论文第八篇:基于51单片机的电子秤系统设计 摘要:本文主要分析51单片机下的数字电子秤.在设计过程中,这种电子秤具体包括电源.传感器.蓝牙.转换器.单片机.键盘.开关.显示器等组成部分,在实践 ...

  7. 声控灯程序C语言,基于51单片机的声控灯的设计.doc

    PAGE 3 基于51单片机的声控小灯 电子信息工程技术信息工程系 电子信息工程技术 信息工程系 年 10 月 20 日 诚 信 声 明 本人郑重声明:所呈交的毕业设计文本和成果,是本人在指导老师的指 ...

  8. 51单片机电机测速程序c语言,基于51单片机光电编码器测速.doc

    基于51单片机光电编码器测速 PAGE PAGE 2 课程设计报告 课程名称: 微机原理课程设计 题 目: 基于51单片机的光电编码器测速 摘要 光电编码器是高精度位置控制系统常用的一种位移检测传感器 ...

  9. 万年历设计单片机c语言,基于51单片机的电子万年历的设计

    基于51单片机的电子万年历的设计(论文9400字) 功能要求 1. 万年历能用数码管显示阳历年.月.日.星期.[小]时.分.秒并设置指定时间的闹铃. 2. 数字式温度计要求测温范围-50~100°C, ...

最新文章

  1. 《小美斗地主》:棋牌手游新商业模式启示录
  2. android 高斯模糊 c,c-如何在不使用任何内置高斯函数的情况下对图像进行高斯模糊处理?...
  3. go编译so win10_windows搭建Go语言交叉编译环境
  4. 基于JAVA+Servlet+JSP+MYSQL的学生选课系统
  5. Policy-Based Reinforcement Learning
  6. Android:eclipse新建android工程style文件里的Theme老是报错
  7. 11.微服务设计 --- 规模化微服务
  8. maven仓库--私服(Nexus的配置使用)
  9. 解决MobaXterm左侧没有文件列表,没有SCP,不显示文件夹
  10. 通过 Nginx 来实现禁止国外IP访问网站
  11. java 读写乱码_java读写文件出现乱码的解决方法
  12. java 发 腾讯企业邮_JAVA使用腾讯企业邮箱发送邮件时报错Could not connect to SMTP host...
  13. 软件工程--总体设计过程包括那些步骤---软件设计过程中应该遵循那些基本原理--模块独立性
  14. 安装quartusⅡ简明教程
  15. 让明日科技今日成真,Mali-G72有何妙招?
  16. web程序发布后发送传真失败记要
  17. 量化选股——基于动量因子的行业风格轮动策略(第2部分—策略回测)
  18. 圆形体癣是什么样子的图片_【 身上起圈圈型的癣图片】_如何治疗_怎么治疗-大众养生网...
  19. Nginx做缓存服务器
  20. 查看tmp目录下的文件

热门文章

  1. 京东开普勒iOS端对接遇到的奇葩问题
  2. 在字符串中找出连续最长的数字串
  3. coreldraw橙子怎么画_智慧职教云课堂APPcoreldraw服装款式图绘画(安徽职业技术学院)章节测验答案...
  4. Android组件系列——Content Provider
  5. 字节、比特、位的单位换算
  6. OpenGL全屏显示背景贴图
  7. UE4 后期处理体积 (角色受到伤害场景颜色变淡案例)
  8. 如何将XPS批量转换成PDF
  9. Nachos5.0 java版本前三个proj设计报告
  10. 连续三次世界500强面试经历