找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3592|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

STC8G1K08單片機(jī)驅(qū)動(dòng)的HM2503控制直流電機(jī)程序原理圖PCB文件

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
1.使用國(guó)產(chǎn)STC81K小芯片的工程,可供相關(guān)學(xué)習(xí)研究的人員學(xué)習(xí)交流;
2.使用國(guó)產(chǎn)直流電機(jī)正反轉(zhuǎn)控制芯片,控制方案簡(jiǎn)單,體積小,電流在3A左右;
3.調(diào)速使用外接撥碼開關(guān)設(shè)置速度;
4.本工程中有,原理圖,PCB圖,原代碼,設(shè)置速度的表  HM2503的PDFU資料;
5.全部資料,在壓縮包中;

Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)


單片機(jī)源程序如下:
  1. /*************  功能說(shuō)明    *********************************************
  2. 1.檢測(cè)撥碼開關(guān)狀態(tài),以確定IO口輸出方波的時(shí)間長(zhǎng)短

  3. 程序工作流:
  4.     1.上電IO產(chǎn)生方波,
  5.     2.檢測(cè)撥碼開關(guān)狀態(tài),自動(dòng)調(diào)節(jié)方波時(shí)間,最長(zhǎng)1000MS為固定;調(diào)節(jié)范圍:1ms--119ms
  6.                          
  7. 適用:用于ATQ229繼電器老化
  8. *************************************************************************/
  9. //#include    "reg51.h"                  //包含此頭文件后,里面聲明的寄存器不需要再手動(dòng)輸入,避免重復(fù)定義
  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;             //發(fā)送計(jì)數(shù)
  18. unsigned char       RX1_Cnt;             //接收計(jì)數(shù)
  19. unsigned long       MAIN_Fosc=11059200;  //22118400L   //定義主時(shí)鐘(精確計(jì)算115200波特率)

  20. bit B_TX1_Busy; //發(fā)送忙標(biāo)志
  21. bit sign_usart1_receive12char=0;         //串口1接收標(biāo)志量

  22. sbit DIP1_port   =P1^7;                                     //撥碼開關(guān)8個(gè)位
  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向關(guān)閉后延時(shí)MS數(shù) 固定



  38. //函數(shù)說(shuō)明
  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. // 函數(shù)名稱: g_delay(unsigned int times)
  51. // 入口參數(shù):
  52. // 函數(shù)功能: 幾個(gè)100MS時(shí)
  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. // 函數(shù)名稱:void Delay10ms()                //@11.0592MHz
  75. // 入口參數(shù):
  76. // 函數(shù)功能: 幾個(gè)100MS時(shí)
  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. // 函數(shù)名稱:void Delay1ms()                //@11.0592MHz
  90. // 入口參數(shù):
  91. // 函數(shù)功能: 幾個(gè)100MS時(shí)
  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. // 函數(shù): void scan_dip_8SW()
  105. // 描述: 串口1發(fā)送字節(jié)函數(shù)。
  106. // 參數(shù): dat:  字節(jié)
  107. // 返回: none.
  108. // 版本:
  109. // 日期:
  110. // 備注:
  111. //========================================================================
  112. void scan_dip_8SW()  //檢測(cè)撥碼開關(guān)的值       
  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數(shù)的十位:0--11
  148.                         if(DIP_8SW_H>11) DIP_8SW_H=11;

  149.                         DIP_8SW_L=w_l&0x0f;                       //ms數(shù)的個(gè)位: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);                 //通過串口檢測(cè)設(shè)置值
  156. //sendData(DIP_8SW_L);       
  157. }
  158. //========================================================================
  159. // 函數(shù): void sendData(unsigned char dat)
  160. // 描述: 串口1發(fā)送字節(jié)函數(shù)。
  161. // 參數(shù): dat:  字節(jié)
  162. // 返回: none.
  163. // 版本:
  164. // 日期:
  165. // 備注:
  166. //========================================================================
  167. void sendData(unsigned char dat)
  168. {
  169.     while (B_TX1_Busy);          //等待前面的數(shù)據(jù)發(fā)送完成
  170.     B_TX1_Busy= 1;
  171.     SBUF = dat;//ACC;            //寫數(shù)據(jù)到UART數(shù)據(jù)寄存器
  172. }


  173. //========================================================================
  174. // 函數(shù): void execute_cmd(void)
  175. // 描述: 執(zhí)行通道切換  返回OK字符
  176. // 參數(shù): 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亮  //應(yīng)答OK字符  //清除標(biāo)志       
  187.                 }               

  188.    scan_dip_8SW();   //檢測(cè)撥碼開關(guān)的狀態(tài)               
  189. }


  190. //========================================================================
  191. // 函數(shù): void PrintString1(u8 *puts)
  192. // 描述: 串口1發(fā)送字符串函數(shù)。
  193. // 參數(shù): puts:  字符串指針.
  194. // 返回: none.
  195. // 版本:
  196. // 日期:
  197. // 備注:
  198. //========================================================================
  199. void PrintString1(u8 *puts)
  200. {
  201.     for (; *puts != 0;  puts++)     //遇到停止符0結(jié)束
  202.                         {
  203.                                         SBUF = *puts;
  204.                                         B_TX1_Busy = 1;
  205.                                         while(B_TX1_Busy);
  206.                         }
  207. }

  208. //========================================================================
  209. // 函數(shù): void   UART1_config(u8 brt)
  210. // 描述: UART1初始化函數(shù)。
  211. // 參數(shù): brt: 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
  212. // 返回: none.
  213. // 版本:
  214. // 日期:
  215. // 備注:
  216. //========================================================================
  217. void    UART1_config(u8 brt)
  218. {
  219.     /*********** 波特率使用定時(shí)器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;  //不輸出時(shí)鐘
  231.                 INTCLKO&= ~0x02;  //不輸出時(shí)鐘
  232.                 TR1  = 1;
  233.    
  234.     /*************************************************/
  235.     SCON = (SCON & 0x3f) | 0x40;    //UART1模式, 0x00: 同步移位輸出, 0x40: 8位數(shù)據(jù),可變波特率, 0x80: 9位數(shù)據(jù),固定波特率, 0xc0: 9位數(shù)據(jù),可變波特率
  236.     //  PS  = 1;    //高優(yōu)先級(jí)中斷
  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);   //內(nèi)部短路RXD與TXD, 做中繼, ENABLE,DISABLE

  242.                 //                IPH|=0X10;            //0X11  串口1中斷級(jí)為最高第3級(jí)
  243.                 //          PS=1;       
  244.                
  245.                 IPH|=0X10;            //0X11  串口1中斷級(jí)為最高第2級(jí)
  246.           PS=0;                       
  247.                
  248.     B_TX1_Busy = 0;
  249.     TX1_Cnt = 0;
  250.     RX1_Cnt = 0;
  251. }





  252. //========================================================================
  253. // 函數(shù): void UART1_int (void) interrupt UART1_VECTOR
  254. // 描述: UART1中斷函數(shù)。
  255. // 參數(shù): 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;               //收到了字節(jié) 標(biāo)志位置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. // 函數(shù): void   Timer0_init(void)
  297. // 描述: timer0初始化函數(shù).
  298. // 參數(shù): none.
  299. // 返回: none.
  300. // 版本: V1.0, 2015-1-12
  301. //========================================================================
  302. void    Timer0_init(void)
  303. {
  304.         TR0 = 0;           //停止計(jì)數(shù)
  305.         ET0 = 1;           //允許中斷

  306.         INTCLKO &= ~0x01;  //不輸出時(shí)鐘

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

  316. //========================================================================
  317. // 函數(shù): void timer0_int (void) interrupt TIMER0_VECTOR
  318. // 描述:  timer0中斷函數(shù).
  319. // 參數(shù): 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向口切換,產(chǎn)生方波  //B向口切換,產(chǎn)生方波
  332.                                         {                                        
  333.                                                 C_BI_port=1;
  334.                                                 //最好加1MS到幾MS延時(shí)
  335.                                                 C_FI_port=0;
  336.                                         }
  337.                          else
  338.                                         {
  339.                                                 C_FI_port=1;
  340.                                                 //最好加1MS到幾MS延時(shí)
  341.                                                 C_BI_port=0;                                                 
  342.                                         }
  343.                  }       
  344. }

  345. //========================================================================
  346. // 函數(shù): void main(void)
  347. // 描述: 主函數(shù)。
  348. // 參數(shù): none.
  349. // 返回: none.
  350. // 版本:
  351. // 日期:
  352. // 備注:
  353. //========================================================================
  354. void main(void)
  355. {
  356.           //IO初始說(shuō)明
  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強(qiáng)輸出   其它口雙向口                

  362.                 //                P3M1 = 0x00;       
  363.                 //                P3M0 = 0xFC;     //3.1 3.0 雙向口         其它口強(qiáng)輸出               
  364.                 P3M1 = 0x00;       
  365.                 P3M0 = 0x00;     //3.1 3.0 雙向口         其它口雙向口       
  366.        
  367.                 //                P5M1 = 0x00;       
  368.                 //                P5M0 = 0x30;     //P5.5  5.4強(qiáng)輸出   其它口雙向口                
  369.                 P5M1 = 0x00;       
  370.                 P5M0 = 0x00;     //P5.5  5.4雙向口                   其它口雙向口       

  371.                 DIP1_port=1;             //開關(guān)口置高
  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;             //關(guān)全局中斷       
  382.                 delay_X100MS(5);    //delay_X100MS(5);

  383.     Timer0_init();
  384.     UART1_config(1);      // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
  385.     //UART2_config(2);    // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 無(wú)效.
  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. }
復(fù)制代碼

所有資料51hei附件下載:
STC8G1K08 HM2503_2.7z (2.89 MB, 下載次數(shù): 61)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:898433 發(fā)表于 2024-1-11 23:05 | 只看該作者
感謝感謝。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表