找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2688|回复: 1
收起左侧

STC8G1K08单片机驱动的HM2503控制直流电机程序原理图PCB文件

[复制链接]
ID:816608 发表于 2021-9-9 11:26 | 显示全部楼层 |阅读模式
1.使用国产STC81K小芯片的工程,可供相关学习研究的人员学习交流;
2.使用国产直流电机正反转控制芯片,控制方案简单,体积小,电流在3A左右;
3.调速使用外接拨码开关设置速度;
4.本工程中有,原理图,PCB图,原代码,设置速度的表  HM2503的PDFU资料;
5.全部资料,在压缩包中;

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
51hei.png

单片机源程序如下:
  1. /*************  功能说明    *********************************************
  2. 1.检测拨码开关状态,以确定IO口输出方波的时间长短

  3. 程序工作流:
  4.     1.上电IO产生方波,
  5.     2.检测拨码开关状态,自动调节方波时间,最长1000MS为固定;调节范围:1ms--119ms
  6.                          
  7. 适用:用于ATQ229继电器老化
  8. *************************************************************************/
  9. //#include    "reg51.h"                  //包含此头文件后,里面声明的寄存器不需要再手动输入,避免重复定义
  10. #include "STC8GXX.h"
  11. #include "intrins.h"

  12. typedef     unsigned char   u8;
  13. typedef     unsigned int    u16;
  14. typedef     unsigned long   u32;

  15. #define Baudrate1           115200UL
  16. #define UART1_BUF_LENGTH    12


  17. unsigned char       TX1_Cnt;             //发送计数
  18. unsigned char       RX1_Cnt;             //接收计数
  19. unsigned long       MAIN_Fosc=11059200;  //22118400L   //定义主时钟(精确计算115200波特率)

  20. bit B_TX1_Busy; //发送忙标志
  21. bit sign_usart1_receive12char=0;         //串口1接收标志量

  22. sbit DIP1_port   =P1^7;                                     //拨码开关8个位
  23. sbit DIP2_port   =P5^5;                             
  24. sbit DIP3_port   =P3^7;                            
  25. sbit DIP4_port   =P3^6;

  26. sbit DIP5_port   =P3^5;                            
  27. sbit DIP6_port   =P3^4;                            
  28. sbit DIP7_port   =P3^3;                            
  29. sbit DIP8_port   =P3^2;       

  30. sbit C_BI_port   =P1^0;                                //方波B向口
  31. sbit C_FI_port   =P1^1;                                //方波F向口

  32. #define Timer0_Reload   (MAIN_Fosc / 1000)      //Timer 0 中断频率, 1000次/秒

  33. unsigned char ch=0;                             //1----16    CHANNEL1   2:CHANEL16
  34. unsigned char RX1_Buffer[UART1_BUF_LENGTH],r=0; //接收缓冲

  35. unsigned char DIP_8SW_H=0,DIP_8SW_L=0,TH_MS_VAL=0;
  36. unsigned char Xms_cnt=100;
  37. unsigned char DELAY_CNT=5,delay_cnt=0; //B向 F向关闭后延时MS数 固定



  38. //函数说明
  39. void Timer0_init(void);
  40. void delay_X100MS(unsigned char ts);                  //@11.0592MHz
  41.   
  42. void UART1_config(u8 brt);                      //选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.

  43. void PrintString1(u8 *puts);
  44. void sendData(unsigned char dat);

  45. void do_task(unsigned char x);
  46. void execute_cmd(void);
  47. void scan_dip_8SW();

  48. //=================================================================================================================
  49. //--------------------------------------------------------------------------------------------------
  50. // 函数名称: g_delay(unsigned int times)
  51. // 入口参数:
  52. // 函数功能: 几个100MS时
  53. //--------------------------------------------------------------------------------------------------
  54. void delay_X100MS(unsigned char ts)          //@11.0592MHz       
  55. {
  56.         unsigned char i, j, k;

  57.         for(;ts>0;ts--)
  58.                 {
  59.                         _nop_();
  60.                         _nop_();
  61.                         i = 5;
  62.                         j = 52;
  63.                         k = 195;
  64.                         do
  65.                         {
  66.                                 do
  67.                                 {
  68.                                         while (--k);
  69.                                 } while (--j);
  70.                         } while (--i);
  71.                 }
  72. }


  73. //--------------------------------------------------------------------------------------------------
  74. // 函数名称:void Delay10ms()                //@11.0592MHz
  75. // 入口参数:
  76. // 函数功能: 几个100MS时
  77. //--------------------------------------------------------------------------------------------------
  78. void Delay10ms()                //@11.0592MHz
  79. {
  80.         unsigned char i, j;

  81.         i = 108;
  82.         j = 145;
  83.         do
  84.         {
  85.                 while (--j);
  86.         } while (--i);
  87. }


  88. //--------------------------------------------------------------------------------------------------
  89. // 函数名称:void Delay1ms()                //@11.0592MHz
  90. // 入口参数:
  91. // 函数功能: 几个100MS时
  92. //--------------------------------------------------------------------------------------------------

  93. void Delay1ms()                //@11.0592MHz
  94. {
  95.         unsigned char i, j;

  96.         i = 15;
  97.         j = 90;
  98.         do
  99.         {
  100.                 while (--j);
  101.         } while (--i);
  102. }


  103. //========================================================================
  104. // 函数: void scan_dip_8SW()
  105. // 描述: 串口1发送字节函数。
  106. // 参数: dat:  字节
  107. // 返回: none.
  108. // 版本:
  109. // 日期:
  110. // 备注:
  111. //========================================================================
  112. void scan_dip_8SW()  //检测拨码开关的值       
  113. {
  114. unsigned char w_h, w_l;       
  115.        
  116. DIP_8SW_H=0,DIP_8SW_L=0;       
  117.        
  118.        
  119. if(DIP1_port==0) w_l|=0x01;
  120. else             w_l&=0x0E;
  121.        
  122. if(DIP2_port==0) w_l|=0x02;
  123. else             w_l&=0x0D;
  124.        
  125. if(DIP3_port==0) w_l|=0x04;
  126. else             w_l&=0x0B;
  127.        
  128. if(DIP4_port==0) w_l|=0x08;
  129. else             w_l&=0x07;
  130.        
  131.        
  132. if(DIP5_port==0) w_h|=0x01;
  133. else             w_h&=0x0E;
  134.        
  135. if(DIP6_port==0) w_h|=0x02;
  136. else             w_h&=0x0D;

  137. if(DIP7_port==0) w_h|=0x04;
  138. else             w_h&=0x0B;

  139. if(DIP8_port==0) w_h|=0x08;       
  140. else             w_h&=0x07;

  141. if(DIP_8SW_H==0xff &&DIP_8SW_L==0xff)          //1秒钟方波
  142.         {
  143.                 TH_MS_VAL=1000;//1000MS
  144.         }
  145. else                                    //1MS到119MS方波
  146.          {
  147.                         DIP_8SW_H=w_h&0x0F;               //ms数的十位:0--11
  148.                         if(DIP_8SW_H>11) DIP_8SW_H=11;

  149.                         DIP_8SW_L=w_l&0x0f;                       //ms数的个位:0--9
  150.                         if(DIP_8SW_L>9) DIP_8SW_L=9;
  151.                  
  152.                  TH_MS_VAL=DIP_8SW_H*10+DIP_8SW_L;   //1--119MS
  153.          }
  154.        
  155. //sendData(10*DIP_8SW_H);                 //通过串口检测设置值
  156. //sendData(DIP_8SW_L);       
  157. }
  158. //========================================================================
  159. // 函数: void sendData(unsigned char dat)
  160. // 描述: 串口1发送字节函数。
  161. // 参数: dat:  字节
  162. // 返回: none.
  163. // 版本:
  164. // 日期:
  165. // 备注:
  166. //========================================================================
  167. void sendData(unsigned char dat)
  168. {
  169.     while (B_TX1_Busy);          //等待前面的数据发送完成
  170.     B_TX1_Busy= 1;
  171.     SBUF = dat;//ACC;            //写数据到UART数据寄存器
  172. }


  173. //========================================================================
  174. // 函数: void execute_cmd(void)
  175. // 描述: 执行通道切换  返回OK字符
  176. // 参数: none.
  177. // 返回: none.
  178. // 版本:
  179. // 日期:
  180. // 备注:
  181. //========================================================================
  182. void execute_cmd(void)
  183. {       
  184.         if(sign_usart1_receive12char==1)            //
  185.                 {
  186.                         //do_task(ch);ch=0XFF;   //切到通道x          //通道x的LED亮  //应答OK字符  //清除标志       
  187.                 }               

  188.    scan_dip_8SW();   //检测拨码开关的状态               
  189. }


  190. //========================================================================
  191. // 函数: void PrintString1(u8 *puts)
  192. // 描述: 串口1发送字符串函数。
  193. // 参数: puts:  字符串指针.
  194. // 返回: none.
  195. // 版本:
  196. // 日期:
  197. // 备注:
  198. //========================================================================
  199. void PrintString1(u8 *puts)
  200. {
  201.     for (; *puts != 0;  puts++)     //遇到停止符0结束
  202.                         {
  203.                                         SBUF = *puts;
  204.                                         B_TX1_Busy = 1;
  205.                                         while(B_TX1_Busy);
  206.                         }
  207. }

  208. //========================================================================
  209. // 函数: void   UART1_config(u8 brt)
  210. // 描述: UART1初始化函数。
  211. // 参数: brt: 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
  212. // 返回: none.
  213. // 版本:
  214. // 日期:
  215. // 备注:
  216. //========================================================================
  217. void    UART1_config(u8 brt)
  218. {
  219.     /*********** 波特率使用定时器1 *****************/
  220.                 TR1 = 0;
  221.                 AUXR &= ~0x01;      //S1 BRT Use Timer1;
  222.                 AUXR |=  (1<<6);    //Timer1 set as 1T mode
  223.                 TMOD &= ~(1<<6);    //Timer1 set As Timer
  224.                 TMOD &= ~0x30;      //Timer1_16bitAutoReload;
  225.                 //TH1 = (u8)((65536UL - (MAIN_Fosc / 4) / Baudrate1) / 256);
  226.                 //TL1 = (u8)((65536UL - (MAIN_Fosc / 4) / Baudrate1) % 256);
  227.                 TL1 = 0xE8;                //
  228.                 TH1 = 0xFF;                //
  229.                 ET1 = 0;    //禁止中断
  230.                 //INT_CLKO &= ~0x02;  //不输出时钟
  231.                 INTCLKO&= ~0x02;  //不输出时钟
  232.                 TR1  = 1;
  233.    
  234.     /*************************************************/
  235.     SCON = (SCON & 0x3f) | 0x40;    //UART1模式, 0x00: 同步移位输出, 0x40: 8位数据,可变波特率, 0x80: 9位数据,固定波特率, 0xc0: 9位数据,可变波特率
  236.     //  PS  = 1;    //高优先级中断
  237.     ES  = 1;    //允许中断
  238.     REN = 1;    //允许接收
  239.     P_SW1 &= 0x3f; //串口1使用P3.0  P3.1
  240.                 //  P_SW1 |= 0x00;      //UART1 switch to, 0x00: P3.0 P3.1, 0x40: P3.6 P3.7, 0x80: P1.6 P1.7, 0xC0: P4.3 P4.4
  241.                 //  PCON2 |=  (1<<4);   //内部短路RXD与TXD, 做中继, ENABLE,DISABLE

  242.                 //                IPH|=0X10;            //0X11  串口1中断级为最高第3级
  243.                 //          PS=1;       
  244.                
  245.                 IPH|=0X10;            //0X11  串口1中断级为最高第2级
  246.           PS=0;                       
  247.                
  248.     B_TX1_Busy = 0;
  249.     TX1_Cnt = 0;
  250.     RX1_Cnt = 0;
  251. }





  252. //========================================================================
  253. // 函数: void UART1_int (void) interrupt UART1_VECTOR
  254. // 描述: UART1中断函数。
  255. // 参数: nine.
  256. // 返回: none.
  257. // 版本:
  258. // 日期:
  259. // 备注:
  260. //========================================================================
  261. void UART1_int (void) interrupt 4
  262. {
  263. //    if(RI)
  264. //    {
  265. //        RI = 0;
  266. //        RX1_Buffer[RX1_Cnt] = SBUF;
  267. //        if(++RX1_Cnt >= UART1_BUF_LENGTH)   RX1_Cnt = 0;
  268. //    }

  269. //    if(TI)
  270. //    {
  271. //        TI = 0;
  272. //        B_TX1_Busy = 0;
  273. //    }
  274.        
  275.     if(RI)
  276.             {
  277.                 RI = 0;

  278.                                         r= SBUF;
  279.                                         if(r==0xaa)  RX1_Cnt=0;
  280.                                         RX1_Buffer[RX1_Cnt] = r;
  281.                                
  282.                                         //------
  283.                                         sign_usart1_receive12char=1;               //收到了字节 标志位置1                                                               
  284.                                         //------
  285.                                                
  286.                                         if(++RX1_Cnt >= UART1_BUF_LENGTH)   RX1_Cnt = 0;    //防溢出
  287.             }

  288.     if(TI)
  289.             {
  290.                 TI = 0;
  291.                 B_TX1_Busy = 0;
  292.             }       
  293.        
  294. }





  295. //========================================================================
  296. // 函数: void   Timer0_init(void)
  297. // 描述: timer0初始化函数.
  298. // 参数: none.
  299. // 返回: none.
  300. // 版本: V1.0, 2015-1-12
  301. //========================================================================
  302. void    Timer0_init(void)
  303. {
  304.         TR0 = 0;           //停止计数
  305.         ET0 = 1;           //允许中断

  306.         INTCLKO &= ~0x01;  //不输出时钟

  307.         AUXR |= 0x80;                   //1T
  308.         TMOD &= 0xF0;                   //定时器模式
  309.        
  310.         TL0 = 0xCD;                     //初值    1ms
  311.         TH0 = 0xD4;                     //
  312.        
  313.         TF0 = 0;                       //清除TF0
  314.         TR0 = 1;                       //开起 T0                               
  315. }

  316. //========================================================================
  317. // 函数: void timer0_int (void) interrupt TIMER0_VECTOR
  318. // 描述:  timer0中断函数.
  319. // 参数: none.
  320. // 返回: none.
  321. // 版本: V1.0, 2015-1-12
  322. //========================================================================
  323. void timer0_int (void) interrupt 1
  324. {
  325.    
  326.          if(Xms_cnt)    Xms_cnt--;       
  327.          if(Xms_cnt==0)
  328.                  {
  329.                          Xms_cnt=TH_MS_VAL;       
  330.                           
  331.                           if(C_FI_port==1)    //F向口切换,产生方波  //B向口切换,产生方波
  332.                                         {                                        
  333.                                                 C_BI_port=1;
  334.                                                 //最好加1MS到几MS延时
  335.                                                 C_FI_port=0;
  336.                                         }
  337.                          else
  338.                                         {
  339.                                                 C_FI_port=1;
  340.                                                 //最好加1MS到几MS延时
  341.                                                 C_BI_port=0;                                                 
  342.                                         }
  343.                  }       
  344. }

  345. //========================================================================
  346. // 函数: void main(void)
  347. // 描述: 主函数。
  348. // 参数: none.
  349. // 返回: none.
  350. // 版本:
  351. // 日期:
  352. // 备注:
  353. //========================================================================
  354. void main(void)
  355. {
  356.           //IO初始说明
  357.                 //sfr PXM1 = 0xYY;    //PxM1.n,PxM0.n     =00--->Standard,    01--->push-pull
  358.                 //sfr PXM0 = 0xYY;    //                  =10--->pure input,  11--->open drain               
  359.           start:
  360.                 P1M1 = 0x00;       
  361.                 P1M0 = 0x03;     //P1.1  1.0强输出   其它口双向口                

  362.                 //                P3M1 = 0x00;       
  363.                 //                P3M0 = 0xFC;     //3.1 3.0 双向口         其它口强输出               
  364.                 P3M1 = 0x00;       
  365.                 P3M0 = 0x00;     //3.1 3.0 双向口         其它口双向口       
  366.        
  367.                 //                P5M1 = 0x00;       
  368.                 //                P5M0 = 0x30;     //P5.5  5.4强输出   其它口双向口                
  369.                 P5M1 = 0x00;       
  370.                 P5M0 = 0x00;     //P5.5  5.4双向口                   其它口双向口       

  371.                 DIP1_port=1;             //开关口置高
  372.                 DIP2_port=1;
  373.                 DIP3_port=1;
  374.                 DIP4_port=1;
  375.                 DIP5_port=1;
  376.                 DIP6_port=1;
  377.                 DIP7_port=1;
  378.                 DIP8_port=1;
  379.                
  380.                 C_BI_port=0; //初始B向口一直为低,控制继电器的通断由F向口控制接通或 断开

  381.     EA = 0;             //关全局中断       
  382.                 delay_X100MS(5);    //delay_X100MS(5);

  383.     Timer0_init();
  384.     UART1_config(1);      // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
  385.     //UART2_config(2);    // 选择波特率, 2: 使用Timer2做波特率, 其它值: 无效.
  386.                 delay_X100MS(1);   
  387.                
  388.                 RX1_Cnt=0; RX1_Buffer[0]=0; RX1_Buffer[1]=0;RX1_Buffer[2]=0;RX1_Buffer[3]=0;
  389.     EA = 1;             //允许全局中断         

  390.     while (1)
  391.                         {
  392.                                 execute_cmd();                               
  393.                         }
  394. }
复制代码

所有资料51hei附件下载:
STC8G1K08 HM2503_2.7z (2.89 MB, 下载次数: 52)

评分

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

查看全部评分

回复

使用道具 举报

ID:898433 发表于 2024-1-11 23:05 | 显示全部楼层
感谢感谢。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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