标题:
基于STCw204单键控制几种工作模式的按摩器的单片机程序和原理图(已量产)
[打印本页]
作者:
lzp2009cwq
时间:
2018-7-12 11:16
标题:
基于STCw204单键控制几种工作模式的按摩器的单片机程序和原理图(已量产)
测试指导
开机,关机,模式切换都通过按键操作
1.长按开机,按住按键红灯亮是正常,松开后。蓝灯会闪。
2.按1秒松开后,切换模式一,仅有3种模式循环切换。模式一为红灯,模式二为蓝灯,模式三为绿灯
3.长按3秒关机。
4.无操作3秒关机
按摩器电路原理图如下:
0.png
(67.97 KB, 下载次数: 58)
下载附件
2018-7-12 17:57 上传
按摩器的单片机源程序如下:
//本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
//若无特别说明,工作频率一般为11.0592MHz
#include "STC15W204S.h"
#include "intrins.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define FOSC 33177600L //系统频率
#define BAUD 115200 //串口波特率
#define T1MS (65536-FOSC/1000) //1T模式
#define NONE_PARITY 0 //无校验
#define ODD_PARITY 1 //奇校验
#define EVEN_PARITY 2 //偶校验
#define MARK_PARITY 3 //标记校验
#define SPACE_PARITY 4 //空白校验
#define PARITYBIT EVEN_PARITY //定义校验位
//sfr P_SW1 = 0xA2; //外设功能切换寄存器1
#define S1_S0 0x40 //P_SW1.6
#define S1_S1 0x80 //P_SW1.7
#define LED P36 //发光二极管 “0”有效
#define BED P10 //发光二极管 “0”有效
#define RED P11 //发光二极管 “0”有效
#define C_MO P15 //马达控制 “0”有效
#define C_FR P14 //远红外控制 “0”有效
#define sys_pw_lock P32 //电源锁定 “0”有效
#define sys_pw_sp P12 //开机按键
#define motor P13 //马达控制 “0”有效
#define LEDEN P37 //DC插头检测 高电平已插进
#define DO P33 //无线模块
#define UXLmodeoneH 300
#define UXLmodeoneL 1
#define UXLmodetwoH 400
#define UXLmodetwoL 0
#define UXLmodethrH 400
#define UXLmodethrL 10
#define LDLmodeoneH 5
#define LDLmodeoneL 20
#define LDLmodetwoH 50
#define LDLmodetwoL 25
#define LDLmodethrH 80
#define LDLmodethrL 30
//char dataBuffer[24]=0;
//char bitBuffer[24]=0;
//char senddataBuffer[15]=0;
WORD conchar;
//long conchar1=0x12345678;
char *conint;
BYTE xinflag=1;
BYTE low=0;
BYTE high=0;
BYTE next1=0;
BYTE next2=0;
BYTE lowcount=0;
BYTE highcount=0;
BYTE timebit=0;
bit FLAG; //1:上升沿中断 0:下降沿中断
BYTE timecnt=0;
BYTE cpdata=0x89;
WORD tempaddr;//接收地址缓存
WORD tempkey;//接收数据缓存
bit busy;
BYTE i=0;
BYTE i1=0;
BYTE i2=0;
BYTE i4=0;
BYTE j=0;
BYTE k=0;
bit busytw;
bit keyon=0;
bit turnon=1;
bit turnon1=0;//开机控制
bit timetickflag=0;
bit Beepbit;
bit Poweron=0;
bit StartFlag=0;
bit UXLStartflag=0;
bit LDLStartflag=0;
bit switchflag=0;
bit switchflag1=0;
WORD Timedatabuffer=0x0f;
WORD fungtiontimecount=0;
WORD fungtiontimecount1=0;
WORD oneminuecount=0;
WORD DelayTimeCoun=0;
WORD testeep=0;
BYTE cycount1=0;
WORD cycount2=0;
BYTE cycount3=0;
BYTE cycount4=0;
BYTE cycount5=0;
BYTE cycount6=0;
WORD cycount7=0;
BYTE cycount8=0;
WORD cycount9=0; //延时计时
WORD cycount10=0; //延时计时
WORD cycount11=0; //按键计时
BYTE Poweroncount=0;
BYTE Powerontime=0;
WORD BeepCount=0;
BYTE UR=0;
BYTE mode=0;
BYTE modeon=0;
BYTE timestart=0;
BYTE modeuxl=1;
BYTE modeldl=1;
BYTE mode3=0;
BYTE charge=6;
WORD TenSecand=300; //设定待机最高为3分钟
BYTE powerlow=0;
BYTE sendlow=0;
BYTE eep=0;
BYTE eep1=0;
BYTE eep2=0;
BYTE ldlFungtionopenMax=0;
BYTE ldlFungtioncloseMax=0;
BYTE uxlFungtionopenMax=0;
BYTE uxlFungtioncloseMax=0;
BYTE DelayCloseFlag;
void Delay500ms(); //@33.1776MHz
void SendData(BYTE dat);
void SendString(char *s);
void Timer0Init(void);
void datahandle(void);
void UXLFungtionInit(void);
void LDLFungtionInit(void);
void UXLFungtion(void);
void LDLFungtion(void);
void Powkey(void);
void DelayClose(void);
void Delay100ms();
void Delay10us();
void main()
{
// ACC = P_SW1;
// ACC &= ~(S1_S0 | S1_S1); //S1_S0=0 S1_S1=0
// P_SW1 = ACC; //(P3.0/RxD, P3.1/TxD)
//Timer0Init();
//P3M1=0X08; //P3口方向设置
// P3M0=0X08; //P3口方向设置
C_FR=0;
C_MO=0;
P1M1=0X04; //P3口方向设置
P1M0=0X34; //P3口方向设置
/*
motor=0;
for(cycount9=0;cycount9<6000;cycount9++)
{
for(cycount10=0;cycount10<5;cycount10++)
{
Delay10us();
Delay10us();
Delay10us();
Delay10us();
Delay10us();
}
}
motor=1;
*/
CMPCR1=0x80; // 10000000
// D5(PIE) =0; 关闭比较器输出由LOW变HIGH的事件引发CMPIF_p = 1产生中断
// D4(NIE) =0; 关闭比较器输出由HIGH变LOW的事件引发CMPIF_n = 1产生中断
CMPCR2=0x00; // 0000 0000,比较器只延时0.1uS
DO = 1;
IT1 = 0; //设置INT1的中断类型 (1:仅下降沿 0:上升沿和下降沿)
// EX1 = 1; //使能INT1中断
EA = 1;
//DO=1;
// ACC = P_SW1;
// ACC &= ~(S1_S0 | S1_S1); //S1_S0=1 S1_S1=0
// ACC |= S1_S0; //(P3.6/RxD_2, P3.7/TxD_2)
// P_SW1 = ACC;
//
// ACC = P_SW1;
// ACC &= ~(S1_S0 | S1_S1); //S1_S0=0 S1_S1=1
// ACC |= S1_S1; //(P1.6/RxD_3, P1.7/TxD_3)
// P_SW1 = ACC;
#if (PARITYBIT == NONE_PARITY)
SCON = 0x50; //8位可变波特率
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
SCON = 0xda; //9位可变波特率,校验位初始为1
#elif (PARITYBIT == SPACE_PARITY)
SCON = 0xd2; //9位可变波特率,校验位初始为0
#endif
T2L = (65536 - (FOSC/4/BAUD)); //设置波特率重装值
T2H = (65536 - (FOSC/4/BAUD))>>8;
AUXR = 0x14; //T2为1T模式, 并启动定时器2
AUXR |= 0x01; //选择定时器2为串口1的波特率发生器
ES = 1; //使能串口1中断
EA = 1;
// IE=0x9f; /*8是允许中断,a是TIMER0,TIMER1中断致能位*/
/*| 7 6 5 4 | 3 2 1 0 |*/
/*| EA | | ET2| ES | ET1| EX1| ET0| EX0|*/
// IP=0x01;
i=0;
lowcount=0;
sys_pw_lock=0; //上电自锁锁住
turnon=0;
for(cycount3=0;cycount3<25;cycount3++)
{
Delay100ms();
}
cycount3=0;
motor=0;
Delay100ms();
Delay100ms();
motor=1;
SendString("KML10\r\n");
LEDEN=0;
BED=0;
RED=1;
LED=1;
while(RED==0)
{
C_FR=1;
C_MO=1;
}
C_FR=0;
C_MO=0;
while(1)
{
if((turnon1==0)&&(sys_pw_sp==1))
{
turnon1=1;//没松按键前不置1
turnon=1;
}
if(sys_pw_sp==0)
{
SendData(cycount11);
if( cycount11>10)//大于3秒
{
sys_pw_lock=1; //上电自锁锁住
}
if((cycount11>1)&&( cycount11<10)&&(turnon==1))//大于3秒
{
mode++;
SendData(turnon);
C_MO=0;
LDLStartflag=1;
StartFlag=1; //开时间倒计时
Timedatabuffer=0x0f;
if(mode==3)//模式1是20分钟
{
Timedatabuffer=0x0f;
}
cycount4=0;
turnon=0;
modeon=1;
}
if(mode>3)//切换模式超3后复位1
{
mode=1;
}
//
}
else
{
//turnon=1;
cycount11=0;
}
if(cycount1++>250)
{
cycount1=0;
// LEDEN=~LEDEN;
cycount5++;
DelayClose();
if(cycount7++>400)
{
cycount7=0;
if(cpdata==0)
{
LEDEN=~LEDEN; //工作蓝灯闪
cycount8++;//电源报警灯计数
}
}
if(cycount2++>2300)
{
cycount2=0;
cycount4++;
cycount6++;//电源报警灯计数
SendData(Timedatabuffer);
if(StartFlag==1)
{
cycount6=0;
// BED=~BED;
C_FR=0;
if(mode==3) //自动模式 强按摩1分钟+52度工作5分钟,弱2分钟,发热4分钟,工作时间20分钟
{
turnon=1;
BED=1;
LED=0;
if((cycount4==1)||(cycount4==21)||(cycount4==41))
{
modeldl=4;
}
if((cycount4==11)||(cycount4==31)||(cycount4==51))
{
modeldl=6;
}
switch(Timedatabuffer)
{
//SendString("m1");
case 15:
{
LDLStartflag=1; //关LDL功能
C_FR=1;
UXLStartflag=1; //关UXL功能
modeuxl=7;
}; break;
case 14:
{
LDLStartflag=0; //关LDL功能
C_MO=0;
}; break;
case 11:
{
LDLStartflag=1; //LDL功能
}; break;
case 10:
{
LDLStartflag=1; //LDL功能
UXLStartflag=0; //关UXL功能
C_FR=0;
}; break;
case 9:
{
UXLStartflag=1; //关UXL功能
C_FR=1;
LDLStartflag=0; //关LDL功能
C_MO=0;
}; break;
case 6:
{
LDLStartflag=1; //LDL功能
}; break;
case 5:
{
UXLStartflag=0; //关UXL功能
C_FR=0;
}; break;
case 4:
{
UXLStartflag=1; //关UXL功能
C_FR=1;
LDLStartflag=0; //LDL功能
C_MO=0;
}; break;
case 1:
{
LDLStartflag=1; //LDL功能
UXLStartflag=0; //关UXL功能
C_FR=0;
}; break;
case 0:
{
LDLStartflag=0; //LDL功能
C_MO=0;
StartFlag=0;
}; break;
default: break;
}
}
else if(mode==1) //高效模式
{
RED=0;
LED=1;
turnon=1;
// SendString("mode1\r\n");
if((cycount4==1)||(cycount4==21)||(cycount4==41))
{
modeldl=6;
}
if((cycount4==11)||(cycount4==31)||(cycount4==51))
{
modeldl=5;
}
switch(Timedatabuffer)
{
case 15:
{
LDLStartflag=1; //关LDL功能
UXLStartflag=1; //关UXL功能
C_FR=1; //直接打开
// UXLStartflag=1; //关UXL功能
modeuxl=5;
}; break;
case 14:
{
LDLStartflag=0; //关LDL功能
C_MO=0;
}; break;
case 12:
{
LDLStartflag=1; //关LDL功能
}; break;
case 11:
{
LDLStartflag=0; //关LDL功能
C_MO=0;
}; break;
case 9:
{
LDLStartflag=1; //关LDL功能
}; break;
case 8:
{
LDLStartflag=0; //关LDL功能
C_MO=0;
}; break;
case 6:
{
LDLStartflag=1; //关LDL功能
}; break;
case 5:
{
LDLStartflag=0; //关LDL功能
C_MO=0;
}; break;
case 3:
{
LDLStartflag=1; //关LDL功能
}; break;
case 2:
{
LDLStartflag=0; //关LDL功能
C_MO=0;
}; break;
case 1:
{
LDLStartflag=1; //关LDL功能
C_FR=0; //直接打开
UXLStartflag=0; //关UXL功能
}; break;
case 0:
{
LDLStartflag=0; //关LDL功能
C_MO=0;
StartFlag=0;
modeon=1;
}; break;
default:
{
C_FR=1; //直接打开
}
break;
}
}
else if(mode==2) //舒适模式
{
turnon=1;
//SendString("mode2\r\n");
RED=1;
BED=0;
LED=1;
if((cycount4==1)||(cycount4==21)||(cycount4==41))
{
modeldl=2;
}
if((cycount4==11)||(cycount4==31)||(cycount4==51))
{
modeldl=1;
}
switch(Timedatabuffer)
{
case 15:
{
LDLStartflag=1; //关LDL功能
C_FR=1; //直接打开
modeuxl=7;
}; break;
case 14:
{
LDLStartflag=0; //关LDL功能
C_MO=0;
UXLStartflag=1; //关UXL功能
}; break;
case 8:
{
UXLStartflag=0; //关UXL功能
C_FR=0;
}; break;
case 7:
{
UXLStartflag=1; //关UXL功能
}; break;
case 0:
{
UXLStartflag=0; //关UXL功能
C_FR=0;
StartFlag=0;
modeon=1;
}; break;
default: break;
}
}
LDLFungtionInit();
UXLFungtionInit();
}
else
{
RED=1;
LED=1;
BED=~BED;
}
cpdata= CMPCR1&0x01; // 取比较器结果
}
}
if(cycount5>7) //5MS工作一次
{
UXLFungtion(); //u线导射功能函数
LDLFungtion(); //律动能疗功能函数
cycount5=0;
cycount11++; // 按键按下计时
}
if((cycount4>59)&&(StartFlag==1)&&(Timedatabuffer!=0))
// if((cycount4>5)&&(StartFlag==1)&&(Timedatabuffer!=0))
{
Timedatabuffer--;
cycount4=0;
SendData(Timedatabuffer);
SendData(mode);
}
if(Timedatabuffer==0)
{
LDLStartflag=0;
StartFlag=0;
mode=0;
C_MO=0;
UXLStartflag=0; //关UXL功能
C_FR=0;
StartFlag=0;
if(modeon==1)//工作初始化
{
modeon=0;
motor=0;
SendString("moto\r\n");
Delay100ms();
Delay100ms();
Delay100ms();
Delay100ms();
Delay100ms();
Delay100ms();
motor=1;
}
}
}
}
/*----------------------------
UART 中断服务程序
-----------------------------*/
void Uart() interrupt 4 using 1
{
if (RI)
{
RI = 0; //清除RI位
P0 = SBUF; //P0显示串口数据
P22 = RB8; //P2.2显示校验位
}
if (TI)
{
TI = 0; //清除TI位
busy = 0; //清忙标志
}
}
/*----------------------------
发送串口数据
----------------------------*/
void SendData(BYTE dat)
{
while (busy); //等待前面的数据发送完成
ACC = dat; //获取校验位P (PSW.0)
if (P) //根据P来设置校验位
{
#if (PARITYBIT == ODD_PARITY)
TB8 = 0; //设置校验位为0
#elif (PARITYBIT == EVEN_PARITY)
TB8 = 1; //设置校验位为1
#endif
}
else
{
#if (PARITYBIT == ODD_PARITY)
TB8 = 1; //设置校验位为1
#elif (PARITYBIT == EVEN_PARITY)
TB8 = 0; //设置校验位为0
#endif
}
busy = 1;
SBUF = ACC; //写数据到UART数据寄存器
}
/*----------------------------
发送字符串
----------------------------*/
void SendString(char *s)
{
while (*s) //检测字符串结束标志
{
SendData(*s++); //发送当前字符
}
}
void Timer0Init(void) //5微秒@33.1776MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
//TL0 = 0x66; //设置定时初值//5微秒@33.1776MHz
// TH0 = 0x7E; //设置定时初值
//TL0 = 0; //设置定时初值//5微秒@33.1776MHz
// TH0 = 0; //设置定时初值
TL0 = 0x0; //设置定时初值//100微秒@33.1776MHz
TH0 = 0x0; //设置定时初;
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 0; //使能定时器0中断
EA = 1;
}
//中断服务程序
void exint1() interrupt 3 //INT1中断入口
{
FLAG=DO;
TR0 = 0; //定时器0开始计时
lowcount=TL0;
highcount=TH0;
TL0=0;
TH0=0;
UR=1;
TR0 = 1; //定时器0开始计时
//TR0=0;
// UR=1;
// }
}
void tm0_isr() interrupt 1 using 2
{
timebit++;
}
void datahandle(void) //一位数据处理
{
for(i2=0;i2<4;i2++)
{
conint = (char*)&conchar; //2字节转换成单字节
SendData(*conint);
SendData(*(conint+1));
//SendData(0x99);
xinflag=1; //重新等待下一次同步头
i1=0;
}
}
//****************************************
void UXLFungtionInit(void)
{
switch(modeuxl)
{
case 1:
{
uxlFungtionopenMax=UXLmodeoneH;
uxlFungtioncloseMax=UXLmodeoneL;
charge=0;
}; break;
case 2:
{
uxlFungtionopenMax=UXLmodetwoH;
uxlFungtioncloseMax=UXLmodetwoL;
charge=0;
}; break;
case 3:
{
uxlFungtionopenMax=UXLmodethrH;
uxlFungtioncloseMax=UXLmodethrL;
charge=1;
}; break;
case 4:
{
uxlFungtionopenMax=400;
uxlFungtioncloseMax=40;
charge=1;
}; break;
case 5:
{
uxlFungtionopenMax=400;
uxlFungtioncloseMax=45;
charge=1;
}; break;
case 6:
{
uxlFungtionopenMax=400;
uxlFungtioncloseMax=55;
charge=1;
}; break;
case 7:
{
uxlFungtionopenMax=400;
uxlFungtioncloseMax=70;
charge=1;
}; break;
default: break;
}
}
//----------------------------------------
void LDLFungtionInit(void)
{
switch(modeldl)
{
case 1:
{
ldlFungtionopenMax=5;
ldlFungtioncloseMax=30;
}; break;
case 2:
{
ldlFungtionopenMax=5;
ldlFungtioncloseMax=20;
}; break;
case 3:
{
ldlFungtionopenMax=5;
ldlFungtioncloseMax=10;
}; break;
case 4:
{
ldlFungtionopenMax=50;
ldlFungtioncloseMax=25;
}; break;
case 5:
{
ldlFungtionopenMax=80;
ldlFungtioncloseMax=30;
}; break;
case 6:
{
ldlFungtionopenMax=120;
ldlFungtioncloseMax=30;
}; break;
case 7:
{
ldlFungtionopenMax=150;
ldlFungtioncloseMax=30;
}; break;
default: break;
}
}
void UXLFungtion(void)
{
if(UXLStartflag==1)
{
cycount6=0;
DelayTimeCoun=0;
if(switchflag==0)
{
if(fungtiontimecount++ > uxlFungtionopenMax) //open
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
soft.rar
(30.03 KB, 下载次数: 99)
2018-7-12 11:15 上传
点击文件名下载附件
代码
下载积分: 黑币 -5
KML02-S10.V1.1.pdf
(55.53 KB, 下载次数: 73)
2018-7-12 11:15 上传
点击文件名下载附件
原理图
下载积分: 黑币 -5
作者:
gauffer
时间:
2019-11-26 13:36
好东西啊,感谢分享
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1