📄 dianji.c
字号:
*******************************************************************/
#pragma optimize(8,size)
#pragma SYMBOLS
#pragma NOAREGS
#pragma small
#include<reg52.h>
#include "STC12C4052.h"
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define Control_Key P1
sbit Control_Time=P1^5; //控制定时 初始值为1,检测是否控制定时操作
sbit Control_ZZ=P1^2; //控制正转 初始值为1,停止
sbit Control_FZ=P1^4; //控制反转 初始值为1,停止
sbit Control_Speedup=P1^1; //控制加速 初始值为1,检测是否加速
sbit Control_Slowdown=P1^3; //控制减速 初始值为1,检测是否加速
sbit Control_Power=P1^0; //INT0 控制控制器的关闭/启动 初始值为1,检测是否加速
sbit _Buzzer_5V=P1^7; //蜂鸣器 初始值为1,不报警蜂鸣器不响
sbit Elect_ZZ=P3^2; //正转输出信号 初始值为1,断开继电器
sbit Elect_FZ=P3^3; //反转输出信号 初始值为1,断开继电器
sbit _74LS164_CLK=P3^4; //74LS164时钟线 初始值为1
sbit _74LS164_DS=P3^5; //74LS164数据线 初始值为1
sbit _PWM_Point=P3^7; //PWM输出脚 初始值为低电平0,禁止电机正转
/*uchar code table[]={0xb7,0x06,0x73,0x57,0xc6, //数码管显示0---9的数字代码
0xd5,0xf5,0x07,0xf7,0xd7};*/
uchar code table[]={0x88,0xf9,0x4c,0x68,0x39, //数码管显示0---9的数字代码
0x2a,0x0a,0xf8,0x08,0x28,0xff};
uchar PWM_Pace; //速度0--20档 初始值为0,表示0转速
uchar Time_Mun; //给控制器定时时间有0、5、10、15分钟,0为初始值,表示没有开定时关机
uint Time_Addup; //定时控制累加器变量,初始值为0
uchar bdata _Control_Sign; //控制标志,包括显示方式,等待等
sbit Time_SignSetup = _Control_Sign^0; //判断是否进入定时操作,0为可以进入,1为不能进入,初始值为0
sbit Time_Begin = _Control_Sign^1; //确认有进行定时操作,0为没有进入定时操作,1为有进入,初始值0,
sbit Time_EndWait = _Control_Sign^2; //倒计时完毕等待关机标志,其他操作禁止运行,0为不等待关机,1为等待 初始值0
sbit Time_End = _Control_Sign^3; //倒计时完毕关闭电机标志,0为不等待关机,1为等待 初始值0
sbit Time_DSorDJS = _Control_Sign^4; //档数和倒计时时间,分别显示标志位,0为单显示档数,1为显示倒计时时间
sbit Time_ShowAllow = _Control_Sign^5; //可以显示数字,现在是5S显示一次,显示完毕后就清零0,显示器需要显示时就负值1
sbit Control_BeginOrEnd = _Control_Sign^6; //关闭/启动控制器标志,0为控制器在开机状态,1为关机状态,初始值0
void Ini_WS_Control_Begin();//无刷电机控制器的开机初始化处理程序
void Ini_WS_Control_End(); //无刷电机控制器的关机初始化处理程序
void Ini_Timer(bit one); //定时器初始化,并且开启
void End_Timer0(); //关闭定时器
void PWM_Out(uchar CCA,bit th);//设置PWM输出不同频率和占空比的方波,输出0--5V的电压,有20个等级
//每个等级0.25V
void Con_Buzzer(uint ch1,uint ch2); //蜂鸣器响起
void PWM_Timing(); //功能选择函数,主要是6个按键的处理程序
void ConTime(); //进入时间调整
//void ConZZ(); //进入电机正转
//void ConFZ(); //进入电机反转
void ConZZorFZ(uchar ZorF); //进入电机正转或者反转
void ConSpeedup(); //进入电机加速
void ConSlowdown();//进入电机减速
void Con_ShowDSorDJS(bit ShowDSorDJS);//显示器轮流显示倒计时时间或者是档数
void ConPower_TmerEnd(); //使用定时器进行电源开/关操作,此时等待Power键按下关机
void ConPower_KeyEnd(); //使用按键进行电源开/关操作
void _74LS164_Show(uchar * SBuf_one,uchar * SBuf_two,uchar Mun_Long);//数码管输出
/*==============================STC12C4052系统初始化=======================
作者:许XX 编写时间:20070808
功能:无刷电机控制器的开机初始化处理程序
主要设置了禁止ALE输出,P1口和P3口的模式(为准双向口),给P1和P3口初始值
P1.0---P1.5设置为输出高电平1,进行键盘的检测
P1.6设置为低电平0,这个脚不用
P1.7设置为高电平1,控制蜂鸣器
初始化定时器,是2个定时器工作在定时器方式1,但是不开定时器
入口:无
出口:无
影响资源:
==========================================================================*/
void Ini_WS_Control_Begin() //无刷电机控制器的开机初始化处理程序
{
uchar key[2]={0x00,0x00}; //键盘操作缓冲区
AUXR = 0x01; //禁止ALE输出
P1M0 = 0x00; //将IO口设置为准双向口
P1M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P1=0xbf;
P3=0x30;
Ini_Timer(0);
_74LS164_Show(key,table,2); //开机初始显示00
End_Timer0();//关闭定时器
//PWM_Out(0,0); //输出电压为0V ,第一个0表示输出电压,第二个0表示强制使PWM脚输出低电平0
//WDT_CONTR = 0x3c; //开看门狗
/*对变量负值*/
PWM_Pace = 0x00; //速度0--20档 初始值为0,表示0转速
Time_Mun = 0x00; //给控制器定时时间有0、5、10、15分钟,0为初始值,表示没有开定时关机
Time_Addup = 0x00; //定时控制累加器变量,初始值为0
_Control_Sign = 0x00; //控制标志,包括显示方式,等待等
Con_Buzzer(300,1); //开机提示,长鸣一声
//Time_SignSetup = 0; //判断是否进入定时操作,0为可以进入,1为不能进入,初始值为0
//Time_Begin = 0; //确认有进行定时操作,0为没有进入定时操作,1为有进入,初始值0,
//Time_EndWait = 0; //倒计时完毕等待关机标志,其他操作禁止运行,0为不等待关机,1为等待 初始值0
//Time_End = 0; //倒计时完毕关闭电机标志,0为不等待关机,1为等待 初始值0
//Time_DSorDJS = 0; //档数和倒计时时间,分别显示标志位,0为单显示档数,1为显示倒计时时间
//Time_ShowAllow = 0; //可以显示数字,现在是5S显示一次,显示完毕后就清零0,显示器需要显示时就负值1,初始值为0
//Control_BeginOrEnd = 0; //关闭控制器标志,0为不关机,1为有关机,初始值0,
}
//=========================================================================
//作者:许XX 编写时间:20070808
//功能:初始化电机控制器
//入口:无
//出口:无
//影响资源:P1口和P3口的模式,
//==========================================================================
void Ini_WS_Control_End() //无刷电机控制器的关机初始化处理程序
{
uchar key[2]={0x00,0x00}; //键盘操作缓冲区
End_Timer0();//关闭定时器
PWM_Out(0,0); //关闭电机
_74LS164_Show(key,table,2); //开机初始显示00
P1=0x81; //只有Power按键才能有按键作用
P3=0x30;
Con_Buzzer(300,1); //关机提示
//PWM_Out(0,0); //输出电压为0V ,第一个0表示输出电压,第二个0表示强制使PWM脚输出低电平0
//还要设置看门狗
/* */
}
//==============================STC12C4052系统初始化=======================
//作者:许XX 编写时间:20070808
//功能:初始化电机控制器
//入口:无
//出口:无
//影响资源:P1口和P3口的模式,
//==========================================================================
void Ini_Timer(bit one)//定时器初始化,并且开启
{
ET1 = 1; /* 允许定时器0中断 */
ET0 = 0; /* 允许定时器1中断 */
TMOD = 0x11; /* 定时器工作方式选择 */
//TMOD = 0x01; /* 定时器工作方式选择 */
TF1 = 0;
TL1 = 0xb0; /*晶振为6MHz,定时100ms*/
TH1 = 0x3c; /* 定时器赋予初值 */
//Time_Addup = 0; //给累计时变量为0值
//TL1 = 0x06;
//TH1 = 0x00; /* 定时器赋予初值 */
EA = 1; /* 开总中断 */
TR1 = one; /* 启动定时器 */
//TR1 = 1; /* 启动定时器*/
}
void STC_Delay_1ms(uint delay_mun) //1ms
{
//uint i,j;
TL0 = 0x0c;
TH0 = 0xfe; /* 定时器0赋予初值 */
TF0 = 0;
TR0 = 1; /* 启动定时器0*/
do{
while(!TF0);
TR0=0;
TF0=0;
TL0 = 0x0c;
TH0 = 0xfe; /* 定时器0赋予初值 */
TR0=1;
--delay_mun;
//WDT_CONTR = 0x3c; //喂看门狗0.5s
}while(delay_mun);
TR0 = 0; /* 关闭定时器0*/
//for(i=120;i>0;i--)
//for(j=delay_mun;j>0;j--);
}
void End_Timer0()//关闭定时器1
{
ET1 = 0; /* 允许定时器1中断*/
TR1 = 0; /* 关闭定时器 */
EA = 0; /* 开总中断 */
}
//==============================STC12C4052系统初始化=======================
//作者:许XX 编写时间:20070808
//功能:进入中断要100ms
//入口:无
//出口:无
//影响资源:
//==========================================================================
void timer1(void) interrupt 3 using 2
{
TL1 = 0xb0; /*晶振为6MHz,定时100ms*/
TH1 = 0x3c; /* 定时器赋予初值 */
TF1 = 0; /* 清楚中断标志 */
if((++Time_Addup)==600) //一分钟进入一次
{
if((--Time_Mun)==0)
{
Time_EndWait=1; //关机标志,启动自动关机
Time_End=1; //倒计时完后,关闭电机标志
TR1 = 0; //关闭倒计时,准备关机
//Time_Addup = 0; //清累计时变量为0
}
Time_Addup = 0;
}
if((Time_Addup%50)==0) //指示5S转换一次显示标志,倒计时时间和档数轮流显示
{
Time_ShowAllow=1; //标志可以显示,每5S只能显示一次
Time_DSorDJS=!Time_DSorDJS; //轮流显示档数和倒计时时间,0位显示档数,1为显示倒计时时间
}
}
//==============================STC12C4052系统初始化=======================
//作者:许XX 编写时间:20070808
//功能:初始化电机控制器
//入口:无
//出口:无
//影响资源:P1口和P3口的模式,
//==========================================================================
/*void timer1(void) interrupt 3 using 1
{
TL1=0x06;
TH1=0x00;
} */
//==============================STC12C4052PWM设置===========================
//作者:许XX 编写时间:20070808
//功能:设置PWM输出不同频率和占空比的方波
//入口:CCA 调节占空比
// th 0关PWM 1开PWM
//出口:无
//影响资源:PWM输出脚:_PWM_Point
//==========================================================================
void PWM_Out(uchar CCA,bit th)
{
/*uchar code PWM[]={0xff,225,222,220,215,212, //0.6V---1.6V
210,207,204,202,199,197,
194,192,189,187,184,181,
179,176,174,172};//20个档位的电压调速,分别是
//0,5%,10%...90%,95%,100%
uchar code PWM[]={0xff,210,201,191,182,173, //0.9V---4.5V
164,155,145,136,127,118,
108,90,81,72,62,53,
44,35,25};//20个档位的电压调速,分别是
//0,5%,10%...90%,95%,100%*/
uchar code PWM[]={0xff,174,166,159,151,144, //1.6V---4.5V
137,129,122,114,107,100,
92,85,77,70,63,55,45,37,25};//20个档位的电压调速,分别是
//0,5%,10%...90%,95%,100%
CR = 0; //关闭PCA定时器
//CMOD = 0x02; //设置PCA定时器0000.0010
CMOD = 0x00; //设置PCA定时器0000.0010 fsoc/12
//CL = 0x00;
//CH = 0x00;
CL = 0xBC; //37ms 频率为1.953KHz
CH = 0xB7;
//CCAP0L = 0xc0; //设置CCAP0H
//CCAP0H = 0xc0; //设置占空比为25%
CCAP0L = PWM[CCA]; //设置CCAP0H
CCAP0H = PWM[CCA]; //设置占空比为
CCAPM0 = 0x42; //0100,0010 设置PCA为PWM模式0
if(th==0)
{
_PWM_Point=0;
th=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -