找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2075|回复: 1
收起左侧

如何用AT89S52芯片,用LCD1602、DS18B20、ADC0804、和普通的直流电机写一套温控风...

[复制链接]
ID:400716 发表于 2018-11-21 16:19 | 显示全部楼层 |阅读模式
200黑币
本人初学五一板子,最近正在学习如何用开发板中的stc芯片,用LCD1602、DS18B20、ADC0804、和普通的直流电机写一套温控风扇的程序,可以不用按键进行加减温度,但是电机的转速随着温度的变化线性变化,求有哪位大神能够写一段程序,下面是原理图附件

开发板原理图V3.pdf

161.66 KB, 下载次数: 26

回复

使用道具 举报

ID:155507 发表于 2018-11-22 23:16 | 显示全部楼层
我给你来个DS18B20程序试试

  1. #include <reg52.H>
  2. #include <intrins.H>
  3. #include <math.H>

  4. #define uchar unsigned char
  5.   #define uint unsigned int
  6. sbit dula = P2^6;
  7. sbit wela = P2^7;
  8. sbit rw = P3^6;
  9. sbit RS = P3^5;  
  10.   
  11. sbit LCDEN = P3^4;

  12. void delayUs()
  13. {
  14.     _nop_();
  15. }

  16. void delayMs(uint a)
  17. {
  18.     uint i, j;
  19.     for(i = a; i > 0; i--)
  20.         for(j = 100; j > 0; j--);
  21. }


  22. void writeComm(uchar comm)
  23. {
  24.      RS = 0;   
  25.     P0 = comm;
  26.     LCDEN = 1;
  27.      delayUs();
  28.     LCDEN = 0;
  29.     delayMs(1);
  30. }

  31. //写数据:RS=1, RW=0;
  32. void writeData(uchar dat)
  33. {
  34.      RS = 1;
  35.      P0 = dat;
  36.      LCDEN = 1;
  37.     delayUs();
  38.     LCDEN = 0;
  39.     delayMs(1);
  40. }


  41. void init()
  42. {
  43.      rw = 0;
  44.      dula = wela = 0;
  45.     writeComm(0x38);
  46.    writeComm(0x0c);
  47.     writeComm(0x06);
  48.     writeComm(0x01);
  49. }

  50. void writeString(uchar * str, uchar length)
  51. {
  52.      uchar i;
  53.     for(i = 0; i < length; i++)
  54.     {
  55.          writeData(str[i]);
  56.      }
  57. }

  58. /**//*****************************DS18B20*******************************/
  59. sbit ds = P2^2;
  60. void dsInit()
  61. {
  62.    
  63.     unsigned int i;  
  64.     ds = 0;
  65.     i = 100;  
  66.      while(i>0) i--;
  67.     ds = 1;   
  68.     i = 4;
  69.      while(i>0) i--;
  70. }

  71. void dsWait()
  72. {
  73.       unsigned int i;
  74.       while(ds);  
  75.       while(~ds);
  76.       i = 4;
  77.       while(i > 0) i--;
  78. }


  79. bit readBit()
  80. {
  81.     unsigned int i;
  82.     bit b;
  83.     ds = 0;
  84.     i++;   
  85.     ds = 1;
  86.    i++; i++;  
  87.     b = ds;
  88.     i = 8;
  89.     while(i>0) i--;
  90.     return b;
  91. }

  92. unsigned char readByte()
  93. {
  94.     unsigned int i;
  95.     unsigned char j, dat;
  96.    dat = 0;
  97.     for(i=0; i<8; i++)
  98.     {
  99.         j = readBit();
  100.       
  101.         dat = (j << 7) | (dat >> 1);
  102.     }
  103.     return dat;
  104. }


  105. void writeByte(unsigned char dat)
  106. {
  107.     unsigned int i;
  108.     unsigned char j;
  109.     bit b;
  110.     for(j = 0; j < 8; j++)
  111.     {
  112.         b = dat & 0x01;
  113.         dat >>= 1;
  114.    
  115.         if(b)   
  116.         {
  117.            ds = 0;          i++; i++;  
  118.             ds = 1;   
  119.             i = 8; while(i>0) i--;  
  120.         }
  121.         else  
  122.         {
  123.             ds = 0;
  124.           i = 8; while(i>0) i--;  
  125.             ds = 1;
  126.            i++; i++;
  127.         }
  128.    }
  129. }


  130. void sendChangeCmd()
  131. {
  132.     dsInit();   
  133.     dsWait();   
  134.     delayMs(1);   
  135.     writeByte(0xcc);
  136.     writeByte(0x44);
  137. }

  138. void sendReadCmd()
  139. {
  140.     dsInit();
  141.     dsWait();
  142.     delayMs(1);
  143.     writeByte(0xcc);
  144.     writeByte(0xbe);
  145. }


  146. int getTmpValue()
  147. {
  148.     unsigned int tmpvalue;
  149.     int value;
  150.     float t;
  151.     unsigned char low, high;
  152.     sendReadCmd();
  153.    
  154.     low = readByte();
  155.     high = readByte();
  156.    
  157.     tmpvalue = high;
  158.     tmpvalue <<= 8;
  159.     tmpvalue |= low;
  160.     value = tmpvalue;
  161.    
  162.   \
  163.     t = value * 0.0625;
  164.     \
  165.     value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0减0.5
  166.     return value;
  167. }

  168. void display(int v)
  169. {
  170.     unsigned char count;
  171.     unsigned char datas[] = {0, 0, 0, 0, 0};
  172.     unsigned int tmp = abs(v);
  173.     datas[0] = tmp / 10000;
  174.     datas[1] = tmp % 10000 / 1000;
  175.     datas[2] = tmp % 1000 / 100;
  176.     datas[3] = tmp % 100 / 10;
  177.     datas[4] = tmp % 10;
  178.     writeComm(0xc0+3);
  179.     if(v < 0)
  180.     {
  181.         writeString("- ", 2);
  182.    }
  183.     else
  184.     {
  185.        writeString("+ ", 2);
  186.     }
  187.     if(datas[0] != 0)
  188.     {
  189.         writeData('0'+datas[0]);
  190.     }
  191.     for(count = 1; count != 5; count++)
  192.     {
  193.         writeData('0'+datas[count]);
  194.         if(count == 2)
  195.         {
  196.             writeData('.');
  197.         }
  198.     }
  199. }
  200. /**//*****************************DS18B20*******************************/

  201. void main()
  202. {
  203.     uchar table[] = "  xianzaiwendu: ";
  204.     sendChangeCmd();
  205.     init();
  206.     writeComm(0x80);
  207.     writeString(table, 16);
  208.     while(1)
  209.     {
  210.         delayMs(1000); //温度转换时间需要750ms以上
  211.         writeComm(0xc0);
  212.         display(getTmpValue());
  213.         sendChangeCmd();
  214.     }
  215. }
复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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