当前位置:   article > 正文

【嵌入式开发-8051】详细:基于AT89C52单片机设计的温控风扇(Proteus仿真设计-含设计原理图、程序源码)_at98c52单片机引脚图

at98c52单片机引脚图

【嵌入式开发-8051】详细:基于AT89C52单片机设计的温控风扇(Proteus仿真设计-含设计原理图、程序源码)

1、本设计是基于AT89C51/52单片机为核心的温控风扇系统,使用Proteus进行仿真分析。

2、由于上传后图片压缩,可以私信联系获取清晰图片。

3、本次为本人结课设计,整体比较简单,如有疑问欢迎大家交流讨论!

 目录

【嵌入式开发-8051】详细:基于AT89C52单片机设计的温控风扇(Proteus仿真设计-含设计原理图、程序源码)

一、开发软件

二、硬件搭建

2.1、系统整体架构介绍

2.2、系统核心元件介绍(含原理简述)

2.3、Proteus原理图设计

三、编程设计

3.1、程序流程图

3.2、具体实现代码(含详细注释)

四、最终效果

4.1、调整设定温度

4.2、环境温度高于设定温度

4.3、环境温度低于设定温度


一、开发软件

软件编程环境:Keil uVision5

硬件仿真环境:Proteus 8 Professional(Proteus 8.12 SP0)

在这里我不介绍软件详细的下载流程(网上有比较详细的流程可以参考),只提供相应的百度网盘链接供大家自取。

Keil5(C51及MDK版本):百度网盘 请输入提取码

Proteus 8.12 SP0:百度网盘 请输入提取码

二、硬件搭建

2.1、系统整体架构介绍

整体系统框图如下图所示,系统的核心为AT89C51/52单片机,主要包括按键电路、数码管显示电路以及DS18B20温度传感器电路和LED报警和风扇电路四大模块。

系统整体架构
  • 系统的工作原理如下:

1、利用温度传感器DS18B20检测环境温度并输出数字温度信号给单片机AT89C51/52进行处理,随后在LED数码管上显示当前环境温度值;

2、通过Proteus中的直流电机模拟风扇的转动;

3、通过三个按键来实现选择调节预设温度、提高预设温度值和降低预设温度值。

  • 系统的工作流程如下:

如果环境温度高于预设温度将会自动报警,这时LED灯亮起,风扇启动;当环境温度低于预设温度后将自动取消报警,这时LED灯熄灭,风扇停转。

2.2、系统核心元件介绍(含原理简述)

2.2.1、AT89C51/52单片机

控制系统模块主要采用的是AT89C51/52作为微处理单元进行控制。AT89C51/52是一款低功耗、高性能、COMS八位微处理器,片内有4K字节在线可重复编程、快速擦除快速写入程序的存储器,能重复写入/擦除1000次,数据保存时间为10年。

AT89C51/52单片机引脚图如下图所示:

2.2.2、DS18B20数字温度传感器

  • DSB18B20的优势

DS18B20是常用的数字温度传感器,它具有微型化、低功耗、高性能、抗干扰能力强、易配微处理器等优点,可直接将温度转化成串行数字信号供处理器处理。

相比传统的热敏电阻以及其他温度测量元器件,DS18B20的数据可直接读出,能通过编程实现12位的数字值读数方式。当DS18B20模块接收到温度转换指令时,会立马启动转换。转换完成后,温度值会以二进制补码形式储存在高速暂存存储器的前两个字节。

  • DS18B20温度转换原理

AT89C51单片机可以通过单线接口按照由低位到高位的顺序读出该数据,由于寄存器中存储的是二进制环境温度值,因此还需要经过转换才能得到实际环境温度值。首先将二进制数值转换为十进制数值,随后根据该数据的正负对数据进行处理,如果是正数,直接乘以0.0625,如果是负数,则进行取反加1,即可得到实际的温度值。

2.2.3、LED数码管

  • LED数码管的结构

LED数码管主要是由8段发光二极管组成,其中a~g为数字和字符显示段,dp为小数点的显示,通过a~g共7段发光二极管,可以显示0~9和A~F共16个数字和字母。

LED数码管可以分为共阴极和共阳极两种结构。共阴极结构将8个发光二极管阴极连在一起,共阳极结构把8个发光二极管阳极连在一起。

  • LED数码管的原理

通过单片机引脚输出高低电平,可使数码管显示相应的数字或字母,这种使数码管显示字形的数据称为段选码,如下表所示。

显示字符共阴极段码共阳极段码显示字符共阴极段码共阳极段码
00x3f0xbf80x7f0xff
10x060x8690x6f0xef
20x5b0xdbA0x770xf7
30x4f0xcfB0x7c0xfc
40x660xe6C0x390xb9
50x6d0xedD0x5e0xde
60x7d0xfdE0x790xf9
70x070x87F0x710xf1

2.3、Proteus原理图设计

三、编程设计

3.1、程序流程图

3.2、具体实现代码(含详细注释)

  • main.c

  1. #include<reg51.h>
  2. #include"ds18b20.h"
  3. #define uchar unsigned char
  4. #define uint unsigned int        
  5. ​uint wendu;            //温度变量
  6. ​uint sheding=20;        //默认设定温度值
  7. ​uchar shi,ge;            //数码管显示数值
  8. ​uint flag;              //标记
  9. ​sbit motor=P3^7;        //直流电机接口
  10. ​sbit key1=P1^0;        //调整设定温度
  11. ​sbit key2=P1^3;        //温度+
  12. ​sbit key3=P1^6;        //温度-
  13. ​sbit w1=P2^0;
  14. ​sbit w2=P2^1;          //数码管接口
  15. ​sbit led=P3^4;          //LED接口
  16. //共阴数码管段选
  17. ​uchar table[16]={
  18. ​    0x3f,0x06,0x5b,0x4f,        //0,1,2,3
  19. ​    0x66,0x6d,0x7d,0x07,       //4,5,6,7
  20.    0x7f,0x6f,0x77,0x7c,        //8,9,A,b
  21. ​    0x39,0x5e,0x79,0x71,       //C,d,E,F
  22. ​};
  23. //显示与报警函数
  24. void display(){
  25. ​    w1=0;
  26. ​    P0=table[shi];
  27. ​    delay(10);             //第1位数码管显示数据
  28. ​    P0=0x00;
  29. ​    w1=1;                //关闭显示消除动态扫描阴影
  30. ​​    w2=0;
  31. ​    P0=table[ge];
  32. ​    delay(10);             //第2位数码管显示数据
  33. ​    P0=0x00;
  34. ​    w2=1;                //关闭显示消除动态扫描阴影
  35. ​    //当温度高于设定值,LED灯亮起
  36. ​    if(wendu>sheding){
  37. ​       led=0;
  38. ​       motor=0;
  39. ​   }
  40. ​    else{
  41. ​       led=1;
  42. ​       motor=1;
  43. ​   }
  44. ​}
  45. //按键事件
  46. void prebutton(){
  47. ​    if(key1==0){                 //按下key1,调整设定温度
  48. ​       delay(30);
  49. ​       if(key1==0)
  50. ​           flag=1;
  51. ​       while(key1==0);           //松手检测
  52. ​   }
  53. ​    while(flag==1){
  54. ​       shi=sheding/10;
  55. ​       ge=sheding%10;
  56. ​       display();                 //显示设定温度值
  57. ​       //再次按下key1时跳出循环
  58. ​       if(key1==0){
  59. ​           delay(30);
  60. ​           if(key1==0)
  61.              flag=0;
  62. ​           while(key1==0);
  63. ​       }
  64. ​       //温度+
  65. ​       if(key2==0){
  66. ​           delay(30);                    
  67. ​           if(key2==0)
  68. ​              sheding+=1;
  69. ​           while(key2==0);
  70. ​       }
  71. ​       //温度-
  72. ​       if(key3==0){
  73. ​           delay(30);
  74. ​           if(key3==0)
  75. ​              sheding-=1;
  76.           while(key3==0);
  77. ​       }        
  78. ​   }
  79. ​}
  80. //主函数
  81. void main(){
  82. ​    uchar j;
  83. ​    while(1){
  84. ​       wendu=ReadTemperature();
  85. ​       shi=wendu/10;
  86. ​       ge=wendu%10;
  87. ​       for(j=0;j<80;j++){
  88. ​           prebutton();
  89. ​           display();          
  90. ​       }
  91. ​   }
  92. ​}
  • ds18b20.c

  1. #include "ds18b20.h"
  2. ​​
  3. sbit DQ=P3^1;         //数据传输线接单片机的相应的引脚
  4. //延时函数
  5. void delay(uint k){
  6.    while(k--);
  7. }
  8. //DS18B20初始化函数
  9. void ds18b20_init(){
  10.    uchar x=0;
  11.    DQ=1;       //DQ先置高
  12.    delay(8);          //稍做延时
  13.    DQ=0;       //发送复位脉冲
  14.    delay(80);          //延时大于480us
  15.    DQ=1;       //拉高总线
  16.    delay(14);
  17.    x=DQ;      //稍做延时后,若x=0则初始化成功,x=1则初始化失败
  18.    delay(20);
  19. }
  20. //字节读取函数
  21. uchar Read(){
  22.    uchar i=0;
  23.    uchar dat=0;
  24.    for (i=8;i>0;i--){
  25.       DQ=0;            //给脉冲信号
  26.       dat>>=1;          //数据右移位
  27.       DQ=1;            //给脉冲信号
  28.       if(DQ)
  29.           dat|=0x80;      //读取数据线得到对应状态
  30.       delay(4);
  31.   }
  32.    return(dat);
  33. }
  34. //字节写入函数
  35. void Write(uchar dat){
  36.    uchar i=0;
  37.    for(i=8;i>0;i--){
  38.       DQ=0;
  39.       DQ=dat&0x01;     //从低位开始发送数据
  40.       delay(5);
  41.       DQ=1;
  42.       dat>>=1;
  43.   }
  44. }
  45. //温度读取函数
  46. uint ReadTemperature(){
  47.    uint temp;                 //温度变量
  48.    uchar a=0;                //寄存器温度低位
  49.    uchar b=0;                //寄存器温度高位
  50.    ds18b20_init();            //DS18B20初始化
  51.    Write(0xcc);          //跳过读序列号的操作
  52.    Write(0x44);       //启动温度转换
  53.    delay(100);            //转换有一定的延时
  54.    ds18b20_init();         //DS18B20初始化
  55.    Write(0xCC);      //跳过读序列号的操作
  56.    Write(0xBE);      //读取温度寄存器,前两位值分别为温度的低位和高位
  57.    delay(100);        
  58.    a=Read();       //读取温度值低位
  59.    b=Read();       //读取温度值高位
  60. //温度转换:实际上温度有正负之分,但是负温度的处理比较复杂,只完成了正温度的转换
  61.    temp=((b*256+a)*0.0625);
  62.    return temp;
  63. }

四、最终效果

4.1、调整设定温度

按下调整设定温度按钮,将设定温度调整为30℃后,再次按下调整设定温度按钮,完成设定温度的设置。

4.2、环境温度高于设定温度

人为调整DS18B20测得的环境温度为35℃,此时环境温度高于设定温度30℃,系统会自动开启报警电路,此时LED灯亮起,直流电机开始转动。

4.3、环境温度低于设定温度

随后人为调整DS18B20测得的环境温度为20℃,此时环境温度低于设定温度30℃,系统会自动关闭报警电路,此时LED灯熄灭,直流电机停止转动。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/752170
推荐阅读
相关标签
  

闽ICP备14008679号