Proteus仿真

#include <reg52.H>
#include <intrins.H>
sbit RS = P3^6;
sbit LCDEN = P3^7;
sbit ds = P1^7;
sbit IN1=P2^0;
sbit IN2=P2^1;
sbit ENA=P2^4;
sbit led=P1^6;
sbit P1_0=P1^0;
float T,TS=5;
typedef unsigned int uint;
typedef unsigned char uchar;
unsigned char sec,Min; //定义秒分
unsigned int T0Count,KeyNum;
unsigned char Counter,Compare,Line,Column;
char*String;
uint num,z;

//延时函数
void delayMs(uint a)
{
uint i, j;
for(i = a; i > 0; i–)
for(j = 110; j > 0; j–);
}

//LCD1602写指令函数
void writeComm(uchar comm)
{
RS = 0;
P0 = comm;
delayMs(5);
LCDEN = 1;
delayMs(5);
LCDEN = 0;
delayMs(5);

}

//LCD1602写数据函数
void writeData(uchar dat)
{
RS = 1;
P0 = dat;
delayMs(5);
LCDEN = 1;
delayMs(5);
LCDEN = 0;
delayMs(5);

}

//LCD1602行列位置函数
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{
if(Line1)
{
writeComm(0x80|(Column-1));
}
else if(Line2)
{
writeComm(0x80|(Column-1+0x40));
}
}

//LCD1602显示字符函数
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char)
{
LCD_SetCursor(Line,Column);
writeData(Char);
}

//LCD1602显示函数
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String)
{
unsigned char i;
LCD_SetCursor(Line,Column);
for(i=0;String[i]!=’\0’;i++)
{
writeData(String[i]);
}
}

int LCD_Pow(int X,int Y)
{
unsigned char i;
int Result=1;
for(i=0;i<Y;i++)
{
Result*=X;
}
return Result;
}

//LCD1602显示表达式数字函数
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
unsigned char i;
LCD_SetCursor(Line,Column);
for(i=Length;i>0;i–)
{
writeData(Number/LCD_Pow(10,i-1)%10+‘0’);
}
}

//LCD1602初始化
void init()
{
writeComm(0x38);
writeComm(0x0c);
writeComm(0x06);
writeComm(0x01);
}

//DS18B20初始化函数
void dsInit()
{

uint i;
ds = 0;
i = 103;  while(i>0) i--;
ds = 1;
i = 4;while(i>0) i--;

}

//读一位数据函数
bit tempreadBit()
{
uint i;
bit dat;
ds = 0;
i++;
ds = 1;
i++;
i++;
dat = ds;
i = 8;
while(i>0) i–;
return dat;
}

//读1字节
unsigned char tempreadByte()
{
unsigned int i;
unsigned char j, dat;
dat = 0;
for(i=0; i<8; i++)
{
j = tempreadBit();

    dat = (j << 7) | (dat >> 1);
}
return dat;

}

//写1字节
void tempwriteByte(uchar dat)
{
unsigned int i;
unsigned char j;
bit b;
for(j = 0; j < 8; j++)
{
b = dat & 0x01;
dat >>= 1;

    if(b)   {ds = 0;i++; i++;  ds = 1;    i = 8; while(i>0) i--;  }else  {ds = 0;i = 8; while(i>0) i--;  ds = 1;i++; i++;}

}
}

//获取温度并转换
void tempchange()
{
dsInit();

delayMs(1);
tempwriteByte(0xcc);
tempwriteByte(0x44);

}

//读取寄存器中存储的温度数据
int getTemp()
{
unsigned int temp;

int t;
unsigned char a ,b;dsInit();
delayMs(1);
tempwriteByte(0xcc);
tempwriteByte(0xbe);
a = tempreadByte();
b = tempreadByte();
t=(b<<8)+a;
if((t&0xf800)==0xf800)
{t=(~t)+1;
}
else
{ temp=t*0.0625;
}
return temp ;

}

//计时器T0中断初始化
void Timer0Init()
{
TMOD|=0X01;

TH0=0XFC;
TL0=0X18;
ET0=1;
EA=1;
TR0=1;

}

//PWM调节转速函数
void PWM_Ctrl(void)
{
if(T<TS)
{Compare=0;}
if((T-TS)>=0)
{Compare=30;}
if((T-TS)<=1&&(T-TS)>0)
{Compare=40;}
if((T-TS)<=2&&(T-TS)>1)
{Compare=50;}
if((T-TS)<=3&&(T-TS)>2)
{Compare=60;}
if((T-TS)<=4&&(T-TS)>3)
{Compare=70;}
if((T-TS)<=5&&(T-TS)>4)
{Compare=80;}
if((T-TS)<=6&&(T-TS)>5)
{Compare=90;}
if((T-TS)>6)
{Compare=100;}

}

//分秒累加函数
void Ctrl(void)
{
if((T-TS)>0)
{
if (T0Count>=590)
{
T0Count=0;
sec++;

     if(sec>=60)             {Min++;                   sec=0;                 }if(Min>=3)             {

// ENA=0;
// a=0;
Compare=0;
EA=0;
if(Counter<Compare)
{
IN1=1;
IN2=0;
ENA=1;
}
else
{
IN1=0;
IN2=0;
ENA=0;
}
LCD_ShowString(2,9,“Too Hot:”);
}
}
}

}

//LCD1602显示函数
void LCD_Display()
{
LCD_ShowNum(1,8,(unsigned long)(T10)%10 ,1);
LCD_ShowNum(1,13,TS,2);
LCD_ShowNum(1,5,T,2);
LCD_ShowNum(1,16,(unsigned long)(TS
10)%10 ,1);
LCD_ShowNum(2,4,Min,2);
LCD_ShowNum(2,7,sec,2);
}

//显示温度正负函数
void Temp_Convert(void)
{
if(T<0)
{
LCD_ShowChar(1,4,’-’);

     T=-T;                              }else{LCD_ShowChar(1,4,'+');}if(TS<0)                        {LCD_ShowChar(1,12,'-');          TS=-TS;                            }else{LCD_ShowChar(1,12,'+');}

}

//独立按键重新启动电机函数
void Time_End(void)
{
if(P1_0==0)
{
IN1=1;
ENA=1;
IN2=0;
EA=1;
sec=0;
Min=0;
// a=1;
T0Count=0;
LCD_ShowString(2,9," ");
}
}

//主函数
void main()
{
init();
Timer0Init();
LCD_ShowString(1,1,“ET:”);
LCD_ShowString(1,9,“ST:”);
LCD_ShowString (2,1,“WT:”);
LCD_ShowString (2,6,":" );
LCD_ShowChar(1,7,’.’);
LCD_ShowChar(1,15,’.’);

 while(1){                   tempchange();    //获取温度并转换T=getTemp();    //读取温度Time_End();              //独立按键控制重新启动Temp_Convert();     //温度正负Ctrl();           //分秒LCD_Display();       //LCD显示PWM_Ctrl();       //PWM调节电机转速

}
}

//计时器T0中断函数
void Timer0_Routine() interrupt 1
{

TH0 = 0xFc;
TL0 = 0x18;        Counter++;
Counter%=100;
T0Count++;                if(Counter<Compare)
{
IN1=1;IN2=0;ENA=1;
}
else
{
IN1=0;IN2=0;ENA=0;
}

}

基于AT89C52实现智能温控器相关推荐

  1. 基于单片机步进电机ppt答辩_基于单片机的智能晾衣架系统设计答辩.pptx

    目录 01 02 03 04 05 选题目的及要求 总体方案设计 测试结果分析 实验心得 06 成员分工 过程中的问题及解决 选 题 目 的 及 要 求 基于单片机的智能晾衣系统 环境光强及温湿度的采 ...

  2. c语言数字植物管理系统,基于AT89C52单片机的智能浇花系统(包含程序代码)

    内容简介: 基于AT89C52单片机的智能浇花系统,毕业论文,共50页,18022字,附程序代码.实物图等. 摘要 伴随着经济的快速发展,人们的物质生活水平得到了极大的提高,生活质量越来越为人们关注. ...

  3. 基于低功耗32位MCU CW32系列的智能温控器的应用

    随着社会的发展,温度的测量及控制变得越来越重要.及时准确的获取温度信息并对其进行适当的控制,这在许多场合中都是很重要的环节.对于不同场景要求下的温度控制,所采用的控制方式也不同.目前,学习与应用单片机 ...

  4. 单片机蜂鸣器编程音乐_基于单片机的智能鱼缸温控系统设计

    曹益豪 聊城大学东昌学院机电工程系 山东 聊城 252000 摘  要:为满足热带鱼的饲养要求,设计了一种基于AT89C52单片机的小型智能温控鱼缸系统.该系统利用DS18B20传感器检测水温,并通过 ...

  5. 基于单片机的智能教室控制系统的设计

     word完整版可点击如下下载>>>>>>>> 基于单片机的智能教室控制系统的设计_c++课程设计题目汇总-硬件开发文档类资源-CSDN下载内容包括详细 ...

  6. 智能窗帘研究制作_基于单片机的智能窗帘设计

    基于单片机的智能窗帘设计 摘 要 本设计通过分析电动窗帘的现状和人们对自动窗帘控制系统的功能的需求,从而对自动窗帘控制器进行总体的设计.系统的总体设计采用以步进电机作为单片机控制元件,执行窗帘开闭的主 ...

  7. 基于AT89C52单片机的温湿度检测设计

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87704704 源码获取 主要内容: ...

  8. 基于单片机的智能储存柜的设计

    1绪论 1.1课题研究背景及意义 存储柜是在公共场合十分常见的设备,一般分为机械式和电子式两种.机械式存储柜采用的是传统的机械锁构架,使用者凭借提供的钥匙开关储存柜.这一系统的缺点非常明显,如果钥匙丢 ...

  9. 如何撬动温控器市场?免开发打造智能温控器

    近年来,传统温控器由于受限于硬件及软件的交互方式,在实现一些复杂的功能,例如:编程.自定义模式,让用户很难在实际使用中得到很好的操作体验,于是纷纷选择了转向发展智能温控器,通过手机作为更加友好和易用的 ...

最新文章

  1. 2020年AI如何走?Jeff Dean和其他四位“大神”已做预测!
  2. Arch Linux PDF格式文件无法显示中文
  3. Android View 测量流程(Measure)完全解析
  4. python十:字典(dict)
  5. 迷你HTM在线L编辑器—xhEditor
  6. 关于在for循环中绑定事件打印变量i是最后一次。
  7. 用友nc6.5详细安装过程
  8. 五个最佳媒体格式转换器
  9. openstack云计算平台 1(认证服务、镜像服务)
  10. 如何确立人生目标?100个人生目标清单总汇
  11. “姓氏文化展”在国图开展 免费对读者开放
  12. 游戏建模都要用到哪些软件?3d游戏建模用什么软件容易
  13. 高性能服务器架构(High-Performance Server Architecture) .
  14. C++不知算法系列之解析回溯算法中的人文哲学
  15. 初级——如何进行Android单元测试
  16. Python编程入门之Arcade游戏编程(一)
  17. EXCEL骨灰级玩家必备技能,学会后年薪翻倍!年轻人耗子尾汁
  18. 没学历的IT人生没那么悲催,献给程序员们
  19. 切换NPM源(淘宝源)
  20. 【web安全】SQL注入漏洞1--寻找SQL注入

热门文章

  1. 远程桌面装服务器程序,Windows 2008 R2 远程桌面服务打印 RemoteApp程序的打印
  2. SLAM--PL-SLAM中基于线特征的初始化方法(LSD算法,LBD描述子,计算R和t)
  3. node 如何搭建服务器
  4. mysql子查询 分组,Mysql子查询实现分组取最指定数据的版本差异
  5. Java之坦克大战(四)---如何移动坦克
  6. pythongps距离_在Python中求两个gps点之间的距离
  7. 心理学史上的第一个流派是构造主义,还是机能主义?|小白心理-312/347考研答疑
  8. 地狱模式年度中期体验报告
  9. 一些人程序员伤心和开心的话
  10. 开都河畔白色蔷薇花之恋