找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机温控直流电机源程序

[复制链接]
跳转到指定楼层
楼主
ID:715107 发表于 2020-3-24 22:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机源程序如下:
  1. /*
  2. 实验说明:
  3.         根据自己使用的LCD1602是否带有转接板,如果带有转接板的即为4位,需在LCD.H头文件中
  4.         将宏#define LCD1602_4PINS打开,我们这里使用的LCD1602是8位,所以默认将该宏注释。
  5. 实验接线:
  6.         1,LCD1602液晶模块-->单片机管脚
  7.         参考LCD1602液晶显示实验接线(开发攻略内在对应的实验章节内实验现象有接线说明)
  8.         2,DS18B20温度传感器模块-->单片机管脚
  9.         参考DS18B20温度传感器实验接线(开发攻略内在对应的实验章节内实验现象有接线说明)
  10.         3,直流电机模块-->单片机管脚
  11.         IN1-->P10(参考直流电机实验接线)
  12.        
  13. 实验现象:
  14.         LCD1602显示温度值,温度变化改变直流电机旋转速度,这里仅仅是通过修改电机开关速度实现调速,
  15.         温度调速范围在main函数内设置
  16. */

  17. #include<reg51.h>
  18. #include<intrins.h>
  19. #include"lcd.h"
  20. typedef unsigned char uint8;
  21. typedef unsigned int uint16;
  22. typedef unsigned long uint32;

  23. sbit dq=P3^7;
  24. sbit moto=P1^0;        //直流电机
  25. uint8 d[16]="   tempertury   ";
  26. uint8 num[10]="0123456789";
  27. uint8 a,c,temp;
  28. void delay(uint16 i)
  29. {
  30.         while(i--);
  31. }
  32. void wrc(uint8 c)
  33. {
  34.         LcdWriteCom(c);
  35. }
  36. void wrd(uint8 dat)
  37. {
  38.         LcdWriteData(dat);
  39. }
  40. void lcd_init()
  41. {
  42.         LcdInit();
  43. }
  44. void ds18b20init()                //18b20的初始化
  45. {
  46.         dq=1;
  47.         delay(1);
  48.         dq=0;
  49.         delay(80);
  50.         dq=1;
  51.         delay(5);
  52.         dq=0;
  53.         delay(20);
  54.         dq=1;
  55.         delay(35);
  56. }
  57. void ds18b20wr(uint8 dat)          //18b20写数据
  58. {
  59.         uint8 i;
  60.         for(i=0;i<8;i++)
  61.         {
  62.                 dq=0;
  63.                 dq=dat&0x01;
  64.                 dat>>=1;
  65.                 delay(8);//在时序上只有这一块对时序要求最准确,他的时间必须大于15us
  66.                 dq=1;
  67.                 delay(1);
  68.         }       
  69. }
  70. uint8 ds18b20rd()                  //18b20读数据
  71. {
  72.         uint8 value,i;
  73.         for(i=0;i<8;i++)       
  74.         {
  75.                 dq=0;
  76.                 value>>=1;
  77.                 dq=1;
  78.                 if(dq==1)value|=0x80;
  79.                 delay(8);//在这一块也对时间要求特别准确,整段程序必须大于60us               
  80.         }
  81.         return value;
  82. }
  83. uint8 readtemp()                          //读取温度内需要复位的
  84. {
  85.         uint8 b;
  86.         ds18b20init();                //初始化
  87.         ds18b20wr(0xcc);   //发送忽略ROM指令
  88.         ds18b20wr(0x44);   //发送温度转换指令
  89.         delay(100);
  90.         ds18b20init();           //初始化
  91.         ds18b20wr(0xcc);   //发送忽略ROM指令
  92.         ds18b20wr(0xbe);   //发读暂存器指令
  93.         a=ds18b20rd();         //温度的低八位
  94.         b=ds18b20rd();         //温度的高八位
  95.         b<<=4;                         //ssss s***;s为标志位s=0表示温度值为正数,s=1温度值为负数
  96.         c=b&0x80;                //温度正负标志位确认
  97.         b+=(a&0xf0)>>4;
  98.         a=a&0x0f;          //温度的小数部分
  99.         return b;
  100. }
  101. void display()
  102. {
  103.         uint16 i,k;
  104.         float dio;
  105.         dio=a*0.0625;
  106.         k=dio*10000;//取小数点后两位有效数字
  107.         wrc(0x80+0x00);
  108.         for(i=0;i<16;i++)
  109.         {
  110.                 wrd(d[i]);
  111.         }
  112.         wrc(0x80+0x43);
  113.         if(c==0x80)        //读取到负温度即为补码,要将其转换成源码
  114.         {
  115.                 wrd('-');
  116.                 temp=temp-1;
  117.                 temp=(~temp)|0x80;//负数的补码即为反码+1;而负数的反码为其源码取反,除了符号位;正数的补码等于正数的反码等于正数的源码
  118.         }       
  119.         else
  120.         {
  121.                 wrd('+');
  122.                 temp=(temp);
  123.         }                       
  124.         wrd(num[temp/100]);
  125.         wrd(num[temp%100/10]);
  126.         wrd(num[temp%100%10]);
  127.         wrd('.');
  128.         wrd(num[k/1000]);
  129.         wrd(num[k%1000/100]);
  130.         wrd(0xdf);
  131.         wrd('C');
  132. }
  133. void motospeed(uint16 i)
  134. {
  135.         while(i--)
  136.         {
  137.                 moto=~moto;
  138.         }               
  139. }
  140. void main()
  141. {
  142.         moto=0;
  143.         lcd_init();
  144.         while(1)
  145.         {
  146.                 temp=readtemp();
  147.                 display();
  148.                 //具体的温度和速度范围自己可以设置
  149.                 if(temp>27&&temp<29) //速度1
  150.                         motospeed(1);
  151.                 if(temp>23&&temp<24) //速度2
  152.                         motospeed(10);
  153.                 if(temp>29&&temp<35) //速度3
  154.                         motospeed(100);                       
  155.         }               
  156. }
复制代码

所有资料51hei提供下载: 电机温控--温度调节速度.zip (22.93 KB, 下载次数: 18)

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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