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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7269|回復: 2
收起左側

單片機溫控步進電機電路及程序設計

[復制鏈接]
ID:439423 發表于 2018-12-4 17:35 | 顯示全部樓層 |閱讀模式
一.課設目的:

1.通過本設計,使學生綜合運用《單片機原理及應用》及電子技術等課程的內容,為以后從事基于單片機的檢測與控制工作奠定一定的基礎。

2.主要掌握芯片DS18B20、ULN2803等器件的使用,掌握步進電機的使用。

3.學會用Keil C51語言編寫一個完整的程序。

4.掌握單片機應用開發的全過程:分析需求、設計原理圖、選用元器件、布線、編程、調試、撰寫報告等步驟。

5.掌握Proteus軟件的應用。

二.課設內容:

采用單片機內部定時器,設計1s定時,每秒檢查一次由溫度傳感器輸入的當前溫度。設置溫度的上限(t2)和下限(t1),假定當前溫度為t。由此可知:

若t≥t2,則控制步進電機順時針旋轉;

若t≤t1,則控制步進電機逆時針旋轉;

若t1<t<t2,步進電機停止轉動。

.問題分析及設計思路:

由設計要求可知,需要通過由溫度傳感器采集的溫度來控制步進電機的轉動,因此可以在源程序中加入相應的語句加以實現。電路原理圖的設計思路如下:

1.單片機P1.0接溫度傳感器DS18B20,采集外界的當前溫度。DS18B20的電源和地線分別接VCC和GND。

2.單片機P2.0~P2.3接74LS04,74LS04的輸出接ULN2803,ULN2803的輸出通過電阻接步進電機。

3.設計程序每秒檢查一次由溫度傳感器輸入的當前溫度,根據設置的溫度控制步進電機轉動的方向或停止步進電機。

四.電路原理圖:

  • 程序流程圖:
    0.png
六.實驗源程序:

  • 遇到的問題及解決方法:

1.在使用Proteus軟件繪制電路圖時,遇到的器件名稱不唯一的問題。

解決方法:在繪制電路圖時,必須保證器件名稱唯一,否則就會仿真時就會提示出錯。需進行修改使其唯一。

2.繪制電路圖時,器件的安放及線路連接問題。

解決方法:由于該電路涉及的功能模塊比較多,故器件排布及線路連接有些復雜。在進行了多次修改之后,確定了比較合理的布局方式,使電路圖看起來較為整潔有條理。

     3.在編寫源程序時,出現的某些函數無法進行調用的問題。

解決方法:在對老師所給的代碼進行分析之后,發現若需要在主程序中對函數進行調用,則應該在代碼前面對其進行聲明,否則編譯時會出現錯誤。

  • 仿真結果:

1.若讀取的溫度大于20度且小于25度,則電機停止轉動:

2.若讀取的溫度大于等于25度,則電機反轉:

3.若讀取的溫度小于等于20度,則電機正轉:

  • 課設小結:

   通過本次課設,熟悉了proteus軟件的使用方法,了解了Keil C51語言編寫程序的相關知識。在老師的指導下,解決了課設過程中出現的一些問題,加深了自己對有關知識的理解。特別是使用proteus軟件繪制電路圖時的一些收獲,讓我覺得受益匪淺,也對該軟件的使用變得更加熟練。在使用Keil C51語言編寫程序時,也學習了對單片機源程序編寫的一些技巧。在編寫單片機源程序時,要設計好各個功能模塊,以及延時子程序、相關芯片的復位、顯示等。在對各個功能函數進行調用之前,需對其進行初始化。通過本次課設,也對之前學習的知識有了一個回顧和總結,收獲很多。



  1. #include <reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar code fortab[9]={0x0e,0x0c,0x0d,0x09,0x0b,0x03,0x07,0x06,0x00};
  5. uchar code revtab[9]={0x0e,0x06,0x07,0x03,0x0b,0x09,0x0d,0x0c,0x00};
  6. int time=500;

  7. void disp(uchar cc);
  8. void dsend(uchar bb);
  9. void dmsec (unsigned int count);
  10. void tmreset (void);
  11. void tmpre (void);
  12. bit tmrbit (void);
  13. unsigned char tmrbyte (void);
  14. void tmwbyte (unsigned char dat);
  15. void tmstart (void);
  16. uchar tmrtemp (void);
  17. void dfor(void);
  18. void drev(void);
  19. rom();

  20. //對調用的函數進行初始化定義

  21. uchar code temper_tab[100]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
  22. 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0x21,0x22,0x23,
  23. 0x24,0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
  24. 0x38,0x39,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x50,0x51,
  25. 0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x60,0x61,0x62,0x63,0x64,0x65,
  26. 0x66,0x67,0x68,0x69,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,
  27. 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x90,0x91,0x92,0x93,
  28. 0x94,0x95,0x96,0x97,0x98,0x99
  29. };       //定義溫度范圍,0到100度

  30. uchar code dis_code[10]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09};
  31.                   //0        1    2    3    4    5    6    7    8    9
  32. sbit TMDAT = P1^0;        //根據實實際情況設定
  33. uchar TMP;                //讀取后溫度值存于TMP中,將其除以2即可得出實際溫度;
  34. uchar f;                //結果是否為負溫,“0”為正溫,“1”為負溫。



  35. //正轉子程序
  36. void dfor(void)
  37. {
  38. uchar i;
  39. uint j;
  40.     for(i=0;i<=8;i++)
  41.     {
  42.      P2=fortab[i];
  43.      for(j=0;j<time;j++);
  44.     }
  45. }

  46. //中斷服務子程序(反轉)
  47. void drev(void) //interrupt 1 using 0               
  48. {
  49. uchar i;
  50. uint j;
  51.     for(i=0;i<=8;i++)
  52.     {
  53.      P2=revtab[i];   
  54.      for(j=0;j<time;j++);
  55.     }
  56. }

  57.                
  58. void disp(uchar cc)
  59. {
  60. uchar temp1,bb;
  61. temp1=cc;
  62. bb=temp1&0x0F;
  63. dsend(bb);
  64. bb=temp1>>4;
  65. dsend(bb);
  66. }

  67. void dsend(uchar bb)
  68. {
  69. uchar i=bb;
  70. SBUF=dis_code[i];
  71. while(TI==0);TI=0;
  72. }
  73. ////////////////////////////////////////延時部分//////////////////////////
  74. void dmsec (unsigned int count)                                                                     //
  75. {                                                                                                            //
  76.         unsigned int i;                                                                                   //        
  77.         while (count)                                                                                //
  78.         {                                                                                                //
  79.                 i = 115;                                                                                //
  80.                 while (i>0) i--;                                                                    //
  81.                 count--;                                                                                //
  82.     }                                                                                                            //
  83. }                                                                                                            //
  84. //////////////////////////////////////////////////////////////////////////

  85. /////////////////////////////////////// 發送復位//////////////////////////
  86. void tmreset (void)                                                                                    //
  87. {                                                                                                       //
  88.         unsigned int i;                                                                                //
  89.         TMDAT = 0;                                                                                    //
  90.         i = 103;                                                                                        //
  91.         while (i>0) i--;                 // 延時 900 uS(11.0592Mhz時)            //
  92.         TMDAT = 1;                                                                                    //
  93.         i = 4;                                                                                            //
  94.         while (i>0) i--;                                                                            //
  95. }                                                                                                            //
  96. //////////////////////////////////////////////////////////////////////////
  97. //判斷DS1820是否存在的子程序。最好不要用,因為當器件不存在時將會進入死循環
  98. ////////////////////////////////////// 等待存在脈沖///////////////////////
  99. //void tmpre (void)                        //判斷器件是否存在                                    //
  100. //{                                                                                                 //
  101. //        unsigned int i;                                                                                //
  102. //        while (TMDAT);                                                                                //
  103. //        while (~TMDAT);                                                                                //
  104. //        i = 4; while (i>0) i--;                                                                    //
  105. // }                                                                                                            //
  106. //////////////////////////////////////////////////////////////////////////
  107. ///////////////////////////////////// 讀一位//////////////////////////////
  108. bit tmrbit (void)                                                                                    //
  109. {                                                                                                   //  
  110.         unsigned int i;                                                                                //
  111.         bit dat;                                                                                        //
  112.         TMDAT = 0; i++;                                                                                //
  113.         TMDAT = 1; i++; i++;                //微量延時                                            //
  114.         dat = TMDAT;                                                                                    //
  115.         i = 8; while (i>0) i--;                // 延時                                                //
  116.         return (dat);                                                                                //
  117. }                                                                                                            //
  118. //////////////////////////////////////////////////////////////////////////
  119. //////////////////////////////////////// 讀一個字節///////////////////////
  120. unsigned char tmrbyte (void)                                                                      //
  121. {                                                                                                         //
  122.         unsigned char i,j,dat;                                                                    //
  123.         dat = 0;                                                                                        //
  124.         for (i=1;i<=8;i++)                                                                        //
  125.         {                                                                                                //
  126.                 j = tmrbit ();                                                                            //
  127.                 dat = (j << 7) | (dat >> 1);                                                    //
  128.         }                                                                                                //
  129.         return (dat);                                                                                //
  130. }                                                                                                            //
  131. //////////////////////////////////////////////////////////////////////////
  132. /////////////////////////////////////// 寫一個字節////////////////////////
  133. void tmwbyte (unsigned char dat)                                                            //
  134. {                                                                                                    //
  135.         unsigned int i;                                                                                //
  136.         unsigned char j;                                                                            //
  137.         bit testb;                                                                                    //
  138.         for (j=1;j<=8;j++)                                                                        //
  139.         {                                                                                                //
  140.                 testb = dat & 0x01;                                                                    //
  141.                 dat = dat >> 1;                                                                            //
  142.                 if (testb)                                                                                //
  143.                 {                                                                                            //
  144.                         TMDAT = 0;                                       // 寫0         //
  145.                         i++; i++;                                                            //
  146.                         TMDAT = 1;                                                                        //
  147.                         i = 8; while (i>0) i--;                                              //
  148.                 }                                                                                             //
  149.                 else                                                                                         //
  150.                 {                                                                                             //  
  151.                         TMDAT = 0;                                       // 寫0     //
  152.                         i = 8; while (i>0) i--;                                              //
  153.                         TMDAT = 1;                                                                        //
  154.                         i++; i++;                                                            //
  155.                 }                                                                                            //
  156.         }                                                                                                //
  157. }                                                                                                            //
  158. //////////////////////////////////////////////////////////////////////////
  159. /////////////////////////////////發送ds1820 開始轉換//////////////////////
  160. void tmstart (void)                                                                                    //
  161. {                                                                                                   //
  162.         tmreset ();                //復位                                                                //
  163.         //tmpre ();                //等待存在脈沖                                                    //
  164.         dmsec (1);                //延時                                                                //
  165.         tmwbyte (0xcc);                //跳過序列號命令                                        //
  166.         tmwbyte (0x44);         //發轉換命令 44H,                                            //
  167. }                                                                                                            //
  168. //////////////////////////////////////////////////////////////////////////
  169. /////////////////////////////////// 讀取溫度//////////////////////////////
  170. uchar tmrtemp (void)                                                                                //
  171. {                                                                                                   //
  172.         unsigned char l,h,i;                                                                        //
  173.         tmreset ();                //復位                                                                //
  174.         //tmpre ();                //等待存在脈沖                                                    //
  175.         dmsec (1);                //延時                                                                //
  176.         tmwbyte (0xcc);         //跳過序列號命令                                            //
  177.         tmwbyte (0xbe);         //發送讀取命令                                                     //
  178.         l = tmrbyte ();                //讀取低位溫度                                                //
  179.         h = tmrbyte ();          //讀取高位溫度                              //
  180.         TMP=l>>4;                                                       //
  181.         if((l>>3)&0x01==0x01)                                           //
  182.         TMP=TMP+1;                                                      //
  183.         TMP=((h&0x07)<<4)|TMP;                                          //
  184.         i=TMP;                                                          //
  185.         TMP=temper_tab[i];                                              //
  186.                                                                                                             //        
  187.         return(TMP)                ;                                                                    //
  188. }                                                                                                            //
  189. //////////////////////////////////////////////////////////////////////////        
  190. //////////////////////////////////////////////////////////////////////////
  191. void main(void)                                                                                            //
  192. {        uchar aa,i;                                                                                    //
  193.         do{                                                                                                //
  194.                 tmstart();                                                                                //
  195.                 dmsec(100);        //如果是不斷地讀取的話可以不延時                        //
  196.          aa=tmrtemp();               //讀取溫度,執行完畢溫度將存于TMP中            //
  197.                 disp(aa);                                                       //
  198.          if(aa<=0x20)                                                   //
  199.                 dfor();    //對讀取溫度進行判斷,若小于等于20度則電機正轉      //
  200.          else if(aa>=0x25)                                              //
  201.                 drev();    //若讀取溫度大于等于25度則電機反轉                  //
  202.                 else;           //若讀取溫度在20度與25度之間,則電機停止轉動            //
  203.          …………
  204. …………
  205. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼


完整的Word格式文檔51黑下載地址:

溫控步進電機的實現.doc (619.62 KB, 下載次數: 59)



回復

使用道具 舉報

ID:697653 發表于 2020-2-26 17:50 | 顯示全部樓層
怎么獲取呀
回復

使用道具 舉報

ID:695233 發表于 2020-3-11 23:45 | 顯示全部樓層
能分享一下proteus的仿真嗎
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 超碰日本 | 中文字幕亚洲欧美日韩在线不卡 | 欧美视频成人 | 精品国产欧美 | 日韩在线一区二区三区 | 欧美自拍视频 | 国产精品亚洲成在人线 | 免费在线观看一区二区三区 | 真人毛片 | 欧美日韩国产三级 | 精品国产精品一区二区夜夜嗨 | 欧美无乱码久久久免费午夜一区 | 色爱综合网| 欧美成人高清视频 | 国产一区二区在线视频 | 国产成人精品免费视频 | 国产小网站 | 日韩一区二区三区在线 | 天天射美女 | 成人区精品一区二区婷婷 | 97色在线观看免费视频 | 久精品久久 | 免费色网址 | 欧美一级特黄aaa大片在线观看 | 中文字幕一级毛片视频 | 黄色一级网 | 欧美国产精品 | 欧美1级 | 国产欧美一区二区三区在线看 | 伊人久久精品 | 久久久久久中文字幕 | 国产精品欧美一区二区三区 | 99精品欧美一区二区三区综合在线 | 欧美性一区二区三区 | 国产福利在线视频 | 国产精品色婷婷久久58 | 午夜av电影 | 婷婷综合在线 | 午夜天堂精品久久久久 | 久久精品二区 | 99re在线视频 |