標題:
STC8G1K08單片機驅動的HM2503控制直流電機程序原理圖PCB文件
[打印本頁]
作者:
libinstm32
時間:
2021-9-9 11:26
標題:
STC8G1K08單片機驅動的HM2503控制直流電機程序原理圖PCB文件
1.使用國產STC81K小芯片的工程,可供相關學習研究的人員學習交流;
2.使用國產直流電機正反轉控制芯片,控制方案簡單,體積小,電流在3A左右;
3.調速使用外接撥碼開關設置速度;
4.本工程中有,原理圖,PCB圖,原代碼,設置速度的表 HM2503的PDFU資料;
5.全部資料,在壓縮包中;
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
51hei.png
(58.5 KB, 下載次數: 55)
下載附件
2021-9-9 16:12 上傳
單片機源程序如下:
/************* 功能說明 *********************************************
1.檢測撥碼開關狀態(tài),以確定IO口輸出方波的時間長短
程序工作流:
1.上電IO產生方波,
2.檢測撥碼開關狀態(tài),自動調節(jié)方波時間,最長1000MS為固定;調節(jié)范圍:1ms--119ms
適用:用于ATQ229繼電器老化
*************************************************************************/
//#include "reg51.h" //包含此頭文件后,里面聲明的寄存器不需要再手動輸入,避免重復定義
#include "STC8GXX.h"
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
#define Baudrate1 115200UL
#define UART1_BUF_LENGTH 12
unsigned char TX1_Cnt; //發(fā)送計數
unsigned char RX1_Cnt; //接收計數
unsigned long MAIN_Fosc=11059200; //22118400L //定義主時鐘(精確計算115200波特率)
bit B_TX1_Busy; //發(fā)送忙標志
bit sign_usart1_receive12char=0; //串口1接收標志量
sbit DIP1_port =P1^7; //撥碼開關8個位
sbit DIP2_port =P5^5;
sbit DIP3_port =P3^7;
sbit DIP4_port =P3^6;
sbit DIP5_port =P3^5;
sbit DIP6_port =P3^4;
sbit DIP7_port =P3^3;
sbit DIP8_port =P3^2;
sbit C_BI_port =P1^0; //方波B向口
sbit C_FI_port =P1^1; //方波F向口
#define Timer0_Reload (MAIN_Fosc / 1000) //Timer 0 中斷頻率, 1000次/秒
unsigned char ch=0; //1----16 CHANNEL1 2:CHANEL16
unsigned char RX1_Buffer[UART1_BUF_LENGTH],r=0; //接收緩沖
unsigned char DIP_8SW_H=0,DIP_8SW_L=0,TH_MS_VAL=0;
unsigned char Xms_cnt=100;
unsigned char DELAY_CNT=5,delay_cnt=0; //B向 F向關閉后延時MS數 固定
//函數說明
void Timer0_init(void);
void delay_X100MS(unsigned char ts); //@11.0592MHz
void UART1_config(u8 brt); //選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
void PrintString1(u8 *puts);
void sendData(unsigned char dat);
void do_task(unsigned char x);
void execute_cmd(void);
void scan_dip_8SW();
//=================================================================================================================
//--------------------------------------------------------------------------------------------------
// 函數名稱: g_delay(unsigned int times)
// 入口參數:
// 函數功能: 幾個100MS時
//--------------------------------------------------------------------------------------------------
void delay_X100MS(unsigned char ts) //@11.0592MHz
{
unsigned char i, j, k;
for(;ts>0;ts--)
{
_nop_();
_nop_();
i = 5;
j = 52;
k = 195;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
}
//--------------------------------------------------------------------------------------------------
// 函數名稱:void Delay10ms() //@11.0592MHz
// 入口參數:
// 函數功能: 幾個100MS時
//--------------------------------------------------------------------------------------------------
void Delay10ms() //@11.0592MHz
{
unsigned char i, j;
i = 108;
j = 145;
do
{
while (--j);
} while (--i);
}
//--------------------------------------------------------------------------------------------------
// 函數名稱:void Delay1ms() //@11.0592MHz
// 入口參數:
// 函數功能: 幾個100MS時
//--------------------------------------------------------------------------------------------------
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
i = 15;
j = 90;
do
{
while (--j);
} while (--i);
}
//========================================================================
// 函數: void scan_dip_8SW()
// 描述: 串口1發(fā)送字節(jié)函數。
// 參數: dat: 字節(jié)
// 返回: none.
// 版本:
// 日期:
// 備注:
//========================================================================
void scan_dip_8SW() //檢測撥碼開關的值
{
unsigned char w_h, w_l;
DIP_8SW_H=0,DIP_8SW_L=0;
if(DIP1_port==0) w_l|=0x01;
else w_l&=0x0E;
if(DIP2_port==0) w_l|=0x02;
else w_l&=0x0D;
if(DIP3_port==0) w_l|=0x04;
else w_l&=0x0B;
if(DIP4_port==0) w_l|=0x08;
else w_l&=0x07;
if(DIP5_port==0) w_h|=0x01;
else w_h&=0x0E;
if(DIP6_port==0) w_h|=0x02;
else w_h&=0x0D;
if(DIP7_port==0) w_h|=0x04;
else w_h&=0x0B;
if(DIP8_port==0) w_h|=0x08;
else w_h&=0x07;
if(DIP_8SW_H==0xff &&DIP_8SW_L==0xff) //1秒鐘方波
{
TH_MS_VAL=1000;//1000MS
}
else //1MS到119MS方波
{
DIP_8SW_H=w_h&0x0F; //ms數的十位:0--11
if(DIP_8SW_H>11) DIP_8SW_H=11;
DIP_8SW_L=w_l&0x0f; //ms數的個位:0--9
if(DIP_8SW_L>9) DIP_8SW_L=9;
TH_MS_VAL=DIP_8SW_H*10+DIP_8SW_L; //1--119MS
}
//sendData(10*DIP_8SW_H); //通過串口檢測設置值
//sendData(DIP_8SW_L);
}
//========================================================================
// 函數: void sendData(unsigned char dat)
// 描述: 串口1發(fā)送字節(jié)函數。
// 參數: dat: 字節(jié)
// 返回: none.
// 版本:
// 日期:
// 備注:
//========================================================================
void sendData(unsigned char dat)
{
while (B_TX1_Busy); //等待前面的數據發(fā)送完成
B_TX1_Busy= 1;
SBUF = dat;//ACC; //寫數據到UART數據寄存器
}
//========================================================================
// 函數: void execute_cmd(void)
// 描述: 執(zhí)行通道切換 返回OK字符
// 參數: none.
// 返回: none.
// 版本:
// 日期:
// 備注:
//========================================================================
void execute_cmd(void)
{
if(sign_usart1_receive12char==1) //
{
//do_task(ch);ch=0XFF; //切到通道x //通道x的LED亮 //應答OK字符 //清除標志
}
scan_dip_8SW(); //檢測撥碼開關的狀態(tài)
}
//========================================================================
// 函數: void PrintString1(u8 *puts)
// 描述: 串口1發(fā)送字符串函數。
// 參數: puts: 字符串指針.
// 返回: none.
// 版本:
// 日期:
// 備注:
//========================================================================
void PrintString1(u8 *puts)
{
for (; *puts != 0; puts++) //遇到停止符0結束
{
SBUF = *puts;
B_TX1_Busy = 1;
while(B_TX1_Busy);
}
}
//========================================================================
// 函數: void UART1_config(u8 brt)
// 描述: UART1初始化函數。
// 參數: brt: 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
// 返回: none.
// 版本:
// 日期:
// 備注:
//========================================================================
void UART1_config(u8 brt)
{
/*********** 波特率使用定時器1 *****************/
TR1 = 0;
AUXR &= ~0x01; //S1 BRT Use Timer1;
AUXR |= (1<<6); //Timer1 set as 1T mode
TMOD &= ~(1<<6); //Timer1 set As Timer
TMOD &= ~0x30; //Timer1_16bitAutoReload;
//TH1 = (u8)((65536UL - (MAIN_Fosc / 4) / Baudrate1) / 256);
//TL1 = (u8)((65536UL - (MAIN_Fosc / 4) / Baudrate1) % 256);
TL1 = 0xE8; //
TH1 = 0xFF; //
ET1 = 0; //禁止中斷
//INT_CLKO &= ~0x02; //不輸出時鐘
INTCLKO&= ~0x02; //不輸出時鐘
TR1 = 1;
/*************************************************/
SCON = (SCON & 0x3f) | 0x40; //UART1模式, 0x00: 同步移位輸出, 0x40: 8位數據,可變波特率, 0x80: 9位數據,固定波特率, 0xc0: 9位數據,可變波特率
// PS = 1; //高優(yōu)先級中斷
ES = 1; //允許中斷
REN = 1; //允許接收
P_SW1 &= 0x3f; //串口1使用P3.0 P3.1
// 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
// PCON2 |= (1<<4); //內部短路RXD與TXD, 做中繼, ENABLE,DISABLE
// IPH|=0X10; //0X11 串口1中斷級為最高第3級
// PS=1;
IPH|=0X10; //0X11 串口1中斷級為最高第2級
PS=0;
B_TX1_Busy = 0;
TX1_Cnt = 0;
RX1_Cnt = 0;
}
//========================================================================
// 函數: void UART1_int (void) interrupt UART1_VECTOR
// 描述: UART1中斷函數。
// 參數: nine.
// 返回: none.
// 版本:
// 日期:
// 備注:
//========================================================================
void UART1_int (void) interrupt 4
{
// if(RI)
// {
// RI = 0;
// RX1_Buffer[RX1_Cnt] = SBUF;
// if(++RX1_Cnt >= UART1_BUF_LENGTH) RX1_Cnt = 0;
// }
// if(TI)
// {
// TI = 0;
// B_TX1_Busy = 0;
// }
if(RI)
{
RI = 0;
r= SBUF;
if(r==0xaa) RX1_Cnt=0;
RX1_Buffer[RX1_Cnt] = r;
//------
sign_usart1_receive12char=1; //收到了字節(jié) 標志位置1
//------
if(++RX1_Cnt >= UART1_BUF_LENGTH) RX1_Cnt = 0; //防溢出
}
if(TI)
{
TI = 0;
B_TX1_Busy = 0;
}
}
//========================================================================
// 函數: void Timer0_init(void)
// 描述: timer0初始化函數.
// 參數: none.
// 返回: none.
// 版本: V1.0, 2015-1-12
//========================================================================
void Timer0_init(void)
{
TR0 = 0; //停止計數
ET0 = 1; //允許中斷
INTCLKO &= ~0x01; //不輸出時鐘
AUXR |= 0x80; //1T
TMOD &= 0xF0; //定時器模式
TL0 = 0xCD; //初值 1ms
TH0 = 0xD4; //
TF0 = 0; //清除TF0
TR0 = 1; //開起 T0
}
//========================================================================
// 函數: void timer0_int (void) interrupt TIMER0_VECTOR
// 描述: timer0中斷函數.
// 參數: none.
// 返回: none.
// 版本: V1.0, 2015-1-12
//========================================================================
void timer0_int (void) interrupt 1
{
if(Xms_cnt) Xms_cnt--;
if(Xms_cnt==0)
{
Xms_cnt=TH_MS_VAL;
if(C_FI_port==1) //F向口切換,產生方波 //B向口切換,產生方波
{
C_BI_port=1;
//最好加1MS到幾MS延時
C_FI_port=0;
}
else
{
C_FI_port=1;
//最好加1MS到幾MS延時
C_BI_port=0;
}
}
}
//========================================================================
// 函數: void main(void)
// 描述: 主函數。
// 參數: none.
// 返回: none.
// 版本:
// 日期:
// 備注:
//========================================================================
void main(void)
{
//IO初始說明
//sfr PXM1 = 0xYY; //PxM1.n,PxM0.n =00--->Standard, 01--->push-pull
//sfr PXM0 = 0xYY; // =10--->pure input, 11--->open drain
start:
P1M1 = 0x00;
P1M0 = 0x03; //P1.1 1.0強輸出 其它口雙向口
// P3M1 = 0x00;
// P3M0 = 0xFC; //3.1 3.0 雙向口 其它口強輸出
P3M1 = 0x00;
P3M0 = 0x00; //3.1 3.0 雙向口 其它口雙向口
// P5M1 = 0x00;
// P5M0 = 0x30; //P5.5 5.4強輸出 其它口雙向口
P5M1 = 0x00;
P5M0 = 0x00; //P5.5 5.4雙向口 其它口雙向口
DIP1_port=1; //開關口置高
DIP2_port=1;
DIP3_port=1;
DIP4_port=1;
DIP5_port=1;
DIP6_port=1;
DIP7_port=1;
DIP8_port=1;
C_BI_port=0; //初始B向口一直為低,控制繼電器的通斷由F向口控制接通或 斷開
EA = 0; //關全局中斷
delay_X100MS(5); //delay_X100MS(5);
Timer0_init();
UART1_config(1); // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
//UART2_config(2); // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 無效.
delay_X100MS(1);
RX1_Cnt=0; RX1_Buffer[0]=0; RX1_Buffer[1]=0;RX1_Buffer[2]=0;RX1_Buffer[3]=0;
EA = 1; //允許全局中斷
while (1)
{
execute_cmd();
}
}
復制代碼
所有資料51hei附件下載:
STC8G1K08 HM2503_2.7z
(2.89 MB, 下載次數: 61)
2021-9-9 11:16 上傳
點擊文件名下載附件
壓縮包文檔
下載積分: 黑幣 -5
作者:
yanghgc
時間:
2024-1-11 23:05
感謝感謝。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1