找回密码
 立即注册

QQ登录

只需一步,快速开始

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

智能小风扇的单片机源码

[复制链接]
跳转到指定楼层
楼主
ID:356190 发表于 2018-6-21 16:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <reg52.H>
  2. #include <intrins.H>   //含有 _nop_
  3. #define uchar unsigned char
  4. #define uint unsigned int


  5. sbit rw = P2^5;
  6. sbit RS = P2^6;  
  7. sbit LCDEN = P2^7;
  8. sbit ds = P3^7;          //18b20

  9. sbit beep = P2^1;        //蜂鸣器
  10. sbit led_red = P2^2;
  11. sbit led_green = P2^0;
  12. sbit jian_key = P1^4;   //减速
  13. sbit jia_key = P1^6;   //加速
  14. sbit key_mo = P1^5;    //模式选择

  15. sbit IN1=P3^2;  //L298N--IN1           //电机驱动模块输入引脚1          //这里只需要一个驱动接口
  16. //sbit IN2=P3^3;
  17. //L298N--IN2           //电机驱动模块输入引脚2

  18. //sbit key_c = P1^5;//模式选择

  19. uint temp1=1;//温度初始值=1;储存温度整数部分
  20. bit flag=0;         //模式标志位
  21. uchar a=0;   //用于记录速度----按键
  22. uchar b=0;        //用于记录速度----温度
  23. void delayUs()
  24. {
  25.     _nop_();
  26. }

  27. void delayMs(uint a)
  28. {
  29.     uint i, j;
  30.     for(i = a; i > 0; i--)
  31.         for(j = 100; j > 0; j--);
  32. }
  33. /************************电机驱动***********************/
  34. void temperature()
  35. {
  36.         if(temp1<16)
  37.         {        b = 0; }
  38.         else if(temp1<21)
  39.         {        b = 3; }
  40.         else if(temp1<=28)
  41.         {        b = 5; }
  42.         else
  43.         {        b = 8; }
  44. }
  45. void key_scan()                            //按键进行加减速
  46. {
  47.         uchar i;
  48.         if(jia_key==0)                //加速
  49.         {
  50.                  for(i=0;i<=10;i++);        //小延时
  51.                 if(!jia_key)
  52.                 {
  53.                         a++;
  54.                         while(!jia_key);//等待松手
  55.                         if(a>=8)
  56.                         {        a=8;        }
  57.                 }
  58.         }
  59.         if(jian_key==0)                                                                        //减速
  60.         {
  61.                  for(i=0;i<=10;i++);        //小延时
  62.                 if(!jian_key)
  63.                 {
  64.                         if(a==0)
  65.                         {        a=1;        }
  66.                          a--;
  67.                         while(!jian_key);
  68.                 }
  69.         }
  70.         if(key_mo==0)
  71.         {
  72.                 for(i=0;i<=10;i++);        //小延时
  73.                 while(!key_mo);
  74.                 flag = ~flag;
  75.         }
  76. }
  77. void speed(uchar x)
  78. {        
  79.            IN1=1;//转动
  80.         delayMs(x*10);
  81.         IN1=0;//不转动
  82.         delayMs(80-x*10);
  83. }
  84. /*******************电机驱动*************************/


  85. /******************lcd1602************************/
  86. void writeComm(uchar comm)
  87. {
  88.         RS = 0;   
  89.         P0 = comm;
  90.         LCDEN = 1;
  91.         delayUs();
  92.         LCDEN = 0;
  93.         delayMs(1);
  94. }

  95. //写数据:RS=1, RW=0;
  96. void writeData(uchar dat)
  97. {
  98.         RS = 1;
  99.         P0 = dat;
  100.         LCDEN = 1;
  101.         delayUs();
  102.         LCDEN = 0;
  103.         delayMs(1);
  104. }

  105. void init()
  106. {
  107.         rw = 0;
  108.         writeComm(0x38);
  109.         writeComm(0x0c);
  110.         writeComm(0x06);
  111.         writeComm(0x01);
  112. }

  113. void writeString(uchar * str, uchar length)
  114. {
  115.         uchar i;
  116.         for(i = 0; i < length; i++)
  117.         {
  118.                 writeData(str[i]);
  119.         }
  120. }
  121. /**********************lcd1602************************/


  122. /**//*****************************DS18B20*******************************/
  123. void dsInit()
  124. {
  125.            uint i;  
  126.         ds = 0;
  127.         i = 100;  
  128.         while(i>0) i--;
  129.         ds = 1;   
  130.         i = 4;
  131.         while(i>0) i--;
  132. }

  133. void dsWait()
  134. {
  135.         uint i;
  136.         while(ds);  
  137.         while(~ds);
  138.         i = 4;
  139.         while(i > 0) i--;
  140. }

  141. bit readBit()
  142. {
  143.     uint i;
  144.     bit b;
  145.     ds = 0;
  146.     i++;   
  147.     ds = 1;
  148.     i++; i++;  
  149.     b = ds;
  150.     i = 8;
  151.     while(i>0) i--;
  152.     return b;
  153. }

  154. unsigned char readByte()
  155. {
  156.     uint i;
  157.     uchar j, dat;
  158.     dat = 0;
  159.     for(i=0; i<8; i++)
  160.     {
  161.         j = readBit();

  162.         dat = (j << 7) | (dat >> 1);
  163.     }
  164.     return dat;
  165. }


  166. void writeByte(unsigned char dat)
  167. {
  168.     uint i;
  169.     uchar j;
  170.     bit b;
  171.     for(j = 0; j < 8; j++)
  172.     {
  173.         b = dat & 0x01;
  174.         dat >>= 1;

  175.         if(b)   
  176.         {
  177.            ds = 0;          i++; i++;  
  178.             ds = 1;   
  179.             i = 8; while(i>0) i--;  
  180.         }
  181.         else  
  182.         {
  183.             ds = 0;
  184.           i = 8; while(i>0) i--;  
  185.             ds = 1;
  186.            i++; i++;
  187.         }
  188.    }
  189. }
  190. void sendChangeCmd()
  191. {
  192.     dsInit();   
  193.     dsWait();   
  194.     delayMs(1);   
  195.     writeByte(0xcc);        //只有一个18B20,不进行选择,直接读取数据
  196.     writeByte(0x44);        //启动温度转换
  197. }

  198. void sendReadCmd()
  199. {
  200.     dsInit();
  201.     dsWait();
  202.     delayMs(1);
  203.     writeByte(0xcc); //只有一个18B20,不进行选择,直接读取数据
  204.     writeByte(0xbe); //度取数据的命令
  205. }
  206. int getTmpValue()
  207. {
  208.     uint tmpvalue;
  209.     int value;
  210.     float t;
  211.     unsigned char low, high;
  212.     sendReadCmd();

  213.     low = readByte();
  214.     high = readByte();

  215.     tmpvalue = high;
  216.     tmpvalue <<= 8;
  217.     tmpvalue |= low;
  218.     value = tmpvalue;


  219.     t = value * 0.0625;        //每增加1,表示0.0625度

  220.     value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0减0.5
  221.     return value;
  222. }

  223. void display(int v)
  224. {
  225.     uchar count;
  226.     uchar datas[] = {0, 0, 0, 0, 0};
  227.     unsigned int tmp = v;
  228.     datas[0] = tmp / 10000;
  229.     datas[1] = tmp % 10000 / 1000;
  230.     datas[2] = tmp % 1000 / 100;
  231.     datas[3] = tmp % 100 / 10;
  232.     datas[4] = tmp % 10;
  233.     writeComm(0xc0+3);
  234.     writeString("+ ", 2);

  235.         temp1 = datas[1]*10 + datas[2];         //temp1用于对温度值大小进行判断

  236.         if(datas[0] != 0)
  237.     {
  238.         writeData('0'+datas[0]);
  239.     }
  240.     for(count = 1; count != 5; count++)
  241.     {
  242.         writeData('0'+datas[count]);
  243.         if(count == 2)
  244.         {
  245.             writeData('.');
  246.         }
  247.     }
  248. }
  249. /*****************************DS18B20*******************************/

  250. void main()
  251. {
  252.     uchar table[] = " temperature is ";
  253.         uchar table1[]= "   warning ! ! !";
  254.         beep = 1;
  255.     sendChangeCmd();
  256.     init();
  257.         led_red = 0;
  258.         led_green = 1;
  259.     while(1)
  260.     {
  261.                 int  temp = getTmpValue();
  262.                 writeComm(0xc0);
  263.         display( temp );
  264.         sendChangeCmd();
  265.                 if(temp1 <= 28)//29度报警!!!
  266.                 {
  267.                         led_red = 0;
  268.                         led_green = 1;
  269.                         beep = 1;//关
  270.                            writeComm(0x80);
  271.                     writeString(table, 16);
  272.                 }
  273.                 else{
  274.                         beep = 0; //开
  275.                         led_red = 1;
  276.                         led_green = 0;
  277.                         writeComm(0x80);
  278.                     writeString(table1, 16);
  279.                 }

  280.                 key_scan();
  281.                 temperature();
  282.                 if(flag==0)
  283.                 {        speed(a);   }
  284.                 else
  285.                 {        speed(b);        }
  286.     }
  287. }
复制代码

评分

参与人数 1黑币 +5 收起 理由
892313600 + 5 很给力!

查看全部评分

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

使用道具 举报

沙发
ID:349556 发表于 2018-6-22 10:43 | 只看该作者
楼主 有电路图吗?
回复

使用道具 举报

板凳
ID:229768 发表于 2020-5-19 15:04 | 只看该作者
有原理图吗
回复

使用道具 举报

地板
ID:755988 发表于 2020-5-19 19:54 | 只看该作者

好东西,收下先
回复

使用道具 举报

5#
ID:751649 发表于 2021-4-15 21:08 | 只看该作者
为什么只需要一个驱动接口
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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