找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7165|回复: 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 单片机教程网

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