久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2306|回復: 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. }

復制代碼


回復

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 高清欧美性猛交 | 国产日韩精品在线 | 天天射天天干 | 色综合国产 | 久久网亚洲 | 亚洲一区二区三区四区视频 | 欧美精品免费观看二区 | 99精品欧美一区二区蜜桃免费 | 成人蜜桃av | 日韩一级电影免费观看 | 亚洲国产一区二区三区 | 日韩高清在线 | 狠狠干影院 | 在线日韩 | 亚洲精品乱码久久久久久按摩观 | 国内精品久久久久久 | 精品国产欧美一区二区三区成人 | 亚洲欧美bt | 欧美精品久久久久 | 91看片视频| 亚洲视频二区 | 免费不卡视频 | 国产成人精品久久二区二区91 | wwww.8888久久爱站网 | av手机在线播放 | 国内自拍偷拍视频 | 久久久av| 国产精品久久久久久52avav | 精品一区二区av | 日本天堂一区 | 中文字幕不卡一区 | 日韩国产中文字幕 | 亚洲区中文字幕 | 亚洲综合资源 | 国产精品亚洲成在人线 | 久久久久国产精品 | 国产三级精品三级在线观看四季网 | 久久久久久久久国产成人免费 | 亚洲国产一区二区视频 | 91成人在线视频 | 欧美黄色大片在线观看 |