找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机温控步进电机程序

[复制链接]
跳转到指定楼层
楼主
ID:498672 发表于 2019-3-26 20:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. //DS18B20温度传感器函数
  2. #include<reg52.h>
  3. #include<math.h>
  4. #include<intrins.h>
  5. #include<string.h>
  6. #defineuchar unsigned char
  7. unsignedchar high_time,low_time,count=0;
  8. sbitoutput=P3^4;
  9. sbitSPEAKER=P3^0;
  10. sbitDATA= P3^7;
  11. voiddelay(unsigned int i)
  12. {
  13. while(i--);
  14. }
  15. Init_DS18B20(void)   //传感器初始化
  16. {
  17. ucharx=0;         
  18. DATA=1;           //DQ复位
  19. delay(10);          //稍作延时
  20. DATA=0;           //单片机将DQ拉低
  21. delay(80);         //延时80s
  22. DATA=1;          //拉高总线
  23. delay(20);
  24. x=DATA;          //稍作延时后,如果x=0则初始化成功,x=1则失败
  25. delay(30);
  26. return0;
  27. }
  28. //读1字节
  29. ReadOneChar(void)
  30. {
  31. uchari=0;
  32. uchardat=0;
  33. for(i=8;i>0;i--)
  34. {
  35. DATA=0;        //给脉冲信号
  36. dat>>=1;
  37. DATA=1;        //给脉冲信号
  38. if(DATA)
  39. dat|=0x80;
  40. delay(8);
  41. }
  42. return(dat);
  43. }
  44. //写1字节
  45. WriteOneChar(uchardat)
  46. {
  47. uchari=0;
  48. for(i=8;i>0;i--)
  49. {
  50. DATA=0;
  51. DATA=dat&0x01;                                                                                 
  52. delay(10);                        
  53. DATA=1;                                
  54. dat>>=1;
  55. }
  56. delay(8);
  57. return 0;
  58. }
  59. //读取温度
  60. intReadTemperature(void)
  61. {
  62. uchara=0;
  63. ucharb=0;
  64. int t=0;
  65. floattt=0;
  66. ucharflag_Negative_number;
  67. Init_DS18B20();
  68. WriteOneChar(0xCC);      //跳过读序号列号的操作
  69. WriteOneChar(0x44);      //启动温度转换
  70. Init_DS18B20();
  71. WriteOneChar(0xCC);      //跳过读序号列号的操作
  72. WriteOneChar(0xBE);      //读取温度寄存器等(供可读9个寄存器),前两个就是温度
  73. a=ReadOneChar();         //低位
  74. b=ReadOneChar();         //高位
  75. t=b;
  76. t<<=8;
  77. t=t|a;
  78. if(b&0x80)
  79. {
  80. t=~t+1;
  81. flag_Negative_number=1;
  82. }
  83. else
  84. {
  85. flag_Negative_number=0;
  86. }
  87. tt=t*0.0625;           //DS18B20温度传感器的分辨率
  88. t=tt*10+0.5;
  89. tt=t+0.05;
  90. return(tt);
  91. }
  92. //LCD1602液晶显示函数
  93. #include<reg52.h>
  94. #defineuchar unsigned char
  95. sbitEN=P2^2;
  96. sbitRS=P2^0;
  97. sbitRW=P2^1;
  98. voidDelayms_1602(unsigned int x)       //延时函数
  99. {unsignedint i;
  100. while(x--)
  101. for(i=0;i<200;i++);
  102. }
  103. ucharBusy_Check_1602()               //忙检测
  104. {
  105. ucharLCD_Status;
  106. RS=0;
  107. RW=1;
  108. EN=1;
  109. Delayms_1602(1);
  110. LCD_Status=P0;
  111. EN=0;
  112. returnLCD_Status;
  113. }
  114. voidWrite_LCD_Command_1602(uchar cmd)         //LCD1602写命令
  115. {
  116. while((Busy_Check_1602()&0x80)==0x80);
  117. RS=0;
  118. RW=0;
  119. EN=0;
  120. P0=cmd;
  121. EN=1;
  122. Delayms_1602(1);
  123. EN=0;
  124. }
  125. voidWrite_LCD_Data_1602(uchar dat)             //LCD1602写数据
  126. {
  127. while((Busy_Check_1602()&0x80)==0x80);
  128. RS=1;
  129. RW=0;
  130. EN=0;
  131. P0=dat;
  132. EN=1;
  133. Delayms_1602(1);
  134. EN=0;
  135. }
  136. voidInitialize_LCD_1602()                  //初始化LCD1602
  137. {
  138. Write_LCD_Command_1602(0x38);           //显示模式设置
  139. Delayms_1602(1);
  140. Write_LCD_Command_1602(0x01);            //显示清屏
  141. Delayms_1602(1);
  142. Write_LCD_Command_1602(0x06);            //显示光标移动设置
  143. Delayms_1602(1);
  144. Write_LCD_Command_1602(0x0c);             //显示开/关及光标设置
  145. Delayms_1602(1);
  146. }
  147. voidShowString_1602(uchar x,uchar y,uchar * str)
  148. {
  149. uchari=0;
  150. if(y==0)
  151. Write_LCD_Command_1602(0x80|x);
  152. if(y==1)
  153. Write_LCD_Command_1602(0xc0|x);
  154. for(i=0;i<16;i++)
  155. {
  156. Write_LCD_Data_1602(str[i]);
  157. }
  158. }

  159. //温控系统主函数
  160. sbitK1=P1^7;
  161. sbitK2=P1^6;
  162. sbitK3=P1^5;
  163. #defineuchar unsigned char
  164. #defineuint unsigned int
  165. #defineTime_5ms     (0x10000-100)
  166. uchartable [] ="temp=  .  C" ;
  167. uchartable1 [] ="set temp=  .  C" ;
  168. uchar  qian, bai, shi, ge;                 //定义变量
  169. uchar  qian1, bai1, shi1, ge1;           //定义变量
  170. uchar  qian2, bai2, shi2, ge2;           //定义变量
  171. ucharh1, h2, h3, h4;
  172. int  temp;
  173. ucharm=0;
  174. ucharset_temper=50;
  175. voidkeyscan()                        //按键处理函数
  176. {
  177. if(K1==0)
  178. m++;
  179. if(m==1)
  180. {if(K2==0)
  181. set_temper++;
  182. elseif(K3==0)
  183. set_temper--;
  184. }
  185. if(m==2)
  186. m=0;
  187. }

  188. voiddisplay()
  189. {  int h;
  190. if(m==1)
  191. {
  192. qian1=set_temper%10000/1000;         
  193. bai1=set_temper%1000/100;            //显示百位
  194. shi1=set_temper%100/10;              //显示十位
  195. ge1=set_temper%10;                  //显示个位
  196. table1[9]=qian1+'0';
  197. table1[10]=bai1+'0';
  198. table1[11]=shi1+'0';
  199. table1[12]=ge1+'0';
  200. }
  201. //if(m==0)
  202. //{
  203. //}
  204. h=high_time;
  205. h1=h/1000;
  206. temp=ReadTemperature();           //读温度
  207. qian=temp%10000/1000;           
  208. bai=temp%1000/100;              //显示百位
  209. shi=temp%100/10;                //显示十位
  210. ge=temp%10;                    //显示个位
  211. table[5]=qian+'0';
  212. table[6]=bai+'0';
  213. table[7]=shi+'0';
  214. table[9]=ge+'0';
  215. }

  216. //intredtemper(void)
  217. //{ inth=0;
  218. //intw=0;
  219. //h=ReadTemperature();
  220. //qian2=h%10000/1000;               
  221. //bai2=h%1000/100;                     //显示百位
  222. //shi2=h%100/10;                       //显示十位
  223. //ge2=h%10;                           //显示个位
  224. //w=qian2*1000+bai2*100+shi2*10+ge2;
  225. //return(w);
  226. //}

  227. voidwarm()
  228. {
  229. uintt,a;

  230. t=set_temper;
  231. t=t*10;
  232. a=bai*100+shi*10+ge;
  233. SPEAKER=1;
  234. if(a>750)
  235. {   SPEAKER=0;
  236. }
  237. else
  238. {SPEAKER=1;
  239. }
  240. }
  241. voidmain()
  242. {
  243. TMOD=TMOD|0x01;
  244. TMOD=TMOD&0xF1;
  245. ET0=1;                   //定时器0的中断控制位
  246. EX0=1;                   //外部的中断0控制位
  247. IT0=1;                    //外部中断0为下降沿触发方式
  248. EA=1;
  249. high_time=50;
  250. low_time=50;
  251. Init_DS18B20();             //温度传感器初始化
  252. Initialize_LCD_1602();           //LCD1602初始化
  253. while(1)
  254. {
  255. keyscan();
  256. display();
  257. warm();
  258. ShowString_1602(0,0,table);
  259. ShowString_1602(0,1,table1);
  260. }
  261. }
  262. #include<reg52.h>       //52芯片管脚定义头文件
  263. #include<intrins.h>           //内部包含延时函数 _nop_();
  264. #defineuchar unsigned char
  265. #defineuint  unsigned int
  266. ucharcode FFW[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};  //四相八拍正转编码
  267. ucharcode REV[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};  ////四相八拍反转编码
  268. sbit  Y1   =P1^0;       //正转
  269. sbit  Y2   =P1^1;       //反转
  270. sbit  Y3   =P1^2;       //停止
  271. sbit  BEEP = P1^4;     
  272. /********************************************************/
  273. /*                                                  
  274. /* 延时t毫秒  
  275. /*11.0592MHz时钟,延时约1ms                                      
  276. /*                                                      
  277. /********************************************************/
  278. voiddeloy(uint t)
  279. {                           
  280.    uint y;
  281.    while(t--)
  282.    {
  283.      for(y=0; y<125; y++)
  284.      { }
  285.    }
  286. }

  287. /**********************************************************/
  288. voiddeloyB(uchar x)    //x*0.14MS
  289. {
  290.    uchar i;
  291.    while(x--)
  292.    {
  293.      for (i=0; i<13; i++)
  294.      { }
  295.    }
  296. }
  297. /**********************************************************/
  298. voidbeep()
  299. {
  300.    uchar i;
  301.    for (i=0;i<100;i++)
  302.     {  
  303.      deloyB(4);
  304.      BEEP=!BEEP;                 //BEEP取反
  305.     }  
  306.      BEEP=1;                     
  307. }
  308. /********************************************************/
  309. /*
  310. /*步进电机正转
  311. /*
  312. /********************************************************/
  313. void  motor_ffw()
  314. {  
  315.    uchar i;
  316.    uint j;
  317.    for (j=0; j<8; j++)         //转1*n圈  
  318.     {  
  319.             if(K3==0)
  320.         {break;}                //退出此循环程序
  321.       for (i=0; i<8; i++)       //一个周期转45度
  322.         {
  323.           P1 = FFW;          //取数据
  324.           deloy(2);            //调节转速
  325.         }
  326.     }
  327. }

  328. /********************************************************/
  329. /*
  330. /*步进电机反转
  331. /*
  332. /********************************************************/
  333. void  motor_rev()
  334. {
  335.      uchar i;
  336.           uint  j;
  337.           for (j=0; j<8; j++)       //转1×n圈
  338.       {
  339.             if(K3==0)
  340.          {break;}               //退出此循环程序
  341.         for (i=0; i<8; i++)     //一个周期转45度
  342.         {
  343.           P1 = REV;          //取数据
  344.           deloy(2);            //调节转速
  345.         }
  346.       }
  347. }
  348. /********************************************************
  349. *                                                      
  350. *  主程序                                                                                                     
  351. *********************************************************/
  352. void zhengzhuang()
  353. {  
  354.       uchar r,N=64;             //N 步进电机运转圈数
  355.    while(1)
  356.     {   
  357.       if(K1==0)
  358.           {
  359.         beep();
  360.                    for(r=0;r<N;r++)
  361.          {
  362.                       motor_ffw();       //电机正转
  363.                     if(K3==0)
  364.             {beep();break;}    //退出此循环程序
  365.              }
  366.       }
  367.           else if(K2==0)
  368.        {
  369.             beep();
  370.                    for(r=0;r<N;r++)
  371.          {
  372.                motor_rev();       //电机反转
  373.                       if(K3==0)
  374.             {beep();break;}    //退出此循环程序
  375.                     }
  376.        }
  377.           else   
  378.                  P1 = 0xf0;
  379.     }
  380. }

复制代码


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

使用道具 举报

沙发
ID:1 发表于 2019-3-29 04:12 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

板凳
ID:96131 发表于 2019-3-29 08:38 | 只看该作者
有原理图才能很快看明白
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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