欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
基于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.raoushi.com/bbs/)
Powered by Discuz! X3.1