标题:
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.检测拨码开关状态,以确定IO口输出方波的时间长短
程序工作流:
1.上电IO产生方波,
2.检测拨码开关状态,自动调节方波时间,最长1000MS为固定;调节范围: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; //发送计数
unsigned char RX1_Cnt; //接收计数
unsigned long MAIN_Fosc=11059200; //22118400L //定义主时钟(精确计算115200波特率)
bit B_TX1_Busy; //发送忙标志
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发送字节函数。
// 参数: dat: 字节
// 返回: 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发送字节函数。
// 参数: dat: 字节
// 返回: none.
// 版本:
// 日期:
// 备注:
//========================================================================
void sendData(unsigned char dat)
{
while (B_TX1_Busy); //等待前面的数据发送完成
B_TX1_Busy= 1;
SBUF = dat;//ACC; //写数据到UART数据寄存器
}
//========================================================================
// 函数: void execute_cmd(void)
// 描述: 执行通道切换 返回OK字符
// 参数: none.
// 返回: none.
// 版本:
// 日期:
// 备注:
//========================================================================
void execute_cmd(void)
{
if(sign_usart1_receive12char==1) //
{
//do_task(ch);ch=0XFF; //切到通道x //通道x的LED亮 //应答OK字符 //清除标志
}
scan_dip_8SW(); //检测拨码开关的状态
}
//========================================================================
// 函数: void PrintString1(u8 *puts)
// 描述: 串口1发送字符串函数。
// 参数: 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; //高优先级中断
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; //收到了字节 标志位置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.51hei.com/bbs/)
Powered by Discuz! X3.1