找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机温度控制风扇转速程序,且温度在LCD1602上显示

[复制链接]
跳转到指定楼层
楼主
ID:721091 发表于 2020-4-26 16:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
原理图如下所示:


源程序如下所示:
  1. #ifndef _DS18B20_H_
  2. #define _DS18B20_H_

  3. /*****************************************************/
  4. /************???????????************************/
  5. uchar DS_init()
  6. {
  7.         uchar state;
  8.         DQ=1;
  9.         delay_1us(8);
  10.         DQ=0;
  11.         delay_1us(80); //??????????4800US
  12.         DQ=1;
  13.         delay_1us(8);
  14.         state=DQ;
  15.         delay(100);        //???
  16.         return state;        //??????1???????????
  17. }
  18. void DS_write_byte(uchar dat)
  19. {
  20.         uchar i;
  21.         for(i=0;i<8;i++)
  22.         {
  23.                 if((dat&0x01)==0)  //д?
  24.                 {
  25.                         DQ=0;
  26.                         delay_1us(5);
  27.                           DQ=1;          //?????????γ?????
  28.                 }
  29.                 else           //д0
  30.                 {
  31.                         DQ=0;
  32.                         delay_1us(1);
  33.                         DQ=1;
  34.                         delay_1us(4);
  35.                 }
  36.                 dat>>=1;
  37.         }
  38. }
  39. uchar DS_read_byte()
  40. {
  41.         uchar i,dat=0;
  42.         for(i=0;i<8;i++)
  43.         {
  44.                 DQ=0;
  45.                 dat>>=1;
  46.                 DQ=1;
  47.                 if(DQ==1)
  48.                         dat|=0x80;
  49.                 else
  50.                         dat|=0x00;
  51.                 delay_1us(30);
  52.                 DQ=1;
  53.         }
  54.         return dat;
  55. }

  56. void DS_read_temperature()
  57. {
  58.         if(DS_init()==1)           //??????1?
  59.                 DS_OK=0;                   //DS_ok=0???????
  60.         else
  61.         {
  62.                 DS_init();
  63.                 DS_write_byte(0xcc);//???????к?
  64.                  DS_write_byte(0x44);  //?????????
  65.                 DS_init();
  66.                 DS_write_byte(0xcc);
  67.                 DS_write_byte(0xbe);//?????????
  68.                 temp_value[1]=DS_read_byte(); //??д??λ??д??λ
  69.                 temp_value[0]=DS_read_byte();
  70.                 alarm_HL[0]=DS_read_byte();        //??????д??λ??д??λ
  71.                 alarm_HL[1]=DS_read_byte();
  72.                 DS_OK=1;
  73.         }
  74. }
  75. void set_alarm_HL()
  76. {
  77.         DS_init();
  78.         DS_write_byte(0xcc);
  79.          DS_write_byte(0x4e);//д??RAM
  80.         DS_write_byte(alarm_HL[0]);         //??д??λ
  81.         DS_write_byte(alarm_HL[1]);
  82.         DS_write_byte(0x7f);
  83.         DS_init();
  84.         DS_write_byte(0xcc);
  85.         DS_write_byte(0x48);//????????ROM
  86. }

  87. void display_temperature()
  88. {
  89.         uchar flag=0;
  90.         if((temp_value[0]&0xf8)==0xf8)
  91.         {
  92.                 flag=1;
  93.                 temp_value[0]=~temp_value[0];
  94.                 temp_value[1]=~temp_value[1]+1;
  95.                 if(temp_value[1]==0x00)
  96.                         temp_value[0]++;
  97.         }
  98.         display_digit[3]=df_tab[temp_value[1]&0x0f];//?С??
  99.         //?????
  100.         current=((temp_value[0]&0x07)<<4)|((temp_value[1]&0xf0)>>4);
  101.         //?ж?????
  102.         sign_temp=flag?-current:current;
  103.         
  104.         LO_alarm=sign_temp<=alarm_HL[1]?1:0;        
  105.         HI_alarm=sign_temp>=alarm_HL[0]?1:0;

  106. /*********???????*************************************/
  107.         display_digit[0]=current/100;
  108.         display_digit[1]=current%100/10;
  109.         display_digit[2]=current%10;
  110. /****?????*********************************************/
  111.         buffer_line2[8]=display_digit[0]+'0';
  112.         buffer_line2[9]=display_digit[1]+'0';
  113.         buffer_line2[10]=display_digit[2]+'0';
  114.         buffer_line2[11]='.';
  115.         buffer_line2[12]=display_digit[3]+'0';
  116. /*********???θ?λ?????*******************************/
  117.         if(display_digit[0]==0)
  118.                 buffer_line2[8]=' ';
  119.         if(display_digit[0]==0&&display_digit[1]==0)
  120.                 buffer_line2[9]=' ';
  121.         if(flag==1)
  122.         {
  123.                 if(buffer_line2[9]==' ')
  124.                         buffer_line2[9]='-';
  125.                 else
  126.                 {
  127.                         if(buffer_line2[8]==' ')
  128.                                 buffer_line2[8]='-';
  129.                          else
  130.                                 buffer_line2[7]='-';
  131.                 }
  132.         }        
  133.         LCD_display(0x00,buffer_line1);
  134.         LCD_display(0x40,buffer_line2);
  135.         LCD_write_cmd(0x80+0x4d);
  136.         LCD_write_data(0x00);
  137.         LCD_write_cmd(0x80+0x4e);
  138.         LCD_write_data('C');         
  139. }


  140. #endif
复制代码
具体见压缩包,欢迎交流与批评指正
温控风扇改进PWM Proteus仿真程序.7z (65.02 KB, 下载次数: 129)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:583422 发表于 2020-6-7 21:37 | 只看该作者
不错哦不错,效果ok
回复

使用道具 举报

板凳
ID:1053638 发表于 2022-11-24 16:07 | 只看该作者
有人能讲解一下程序吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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