標(biāo)題:
電動(dòng)牙刷的MCU驅(qū)動(dòng)程序
[打印本頁]
作者:
小胖波波
時(shí)間:
2019-6-17 13:32
標(biāo)題:
電動(dòng)牙刷的MCU驅(qū)動(dòng)程序
這是電動(dòng)牙刷的驅(qū)動(dòng)程序,電路可以采用電池供電,也可以USB供電,可以檢測(cè)電量的多少
單片機(jī)源程序如下:
#include "main.h"
void main(void)
{
SystemInit();
while(1)
{
BatteryVoltageWarning();
KeyScan();
switch (key_flag)
{
case 0: Led50 = 1;Led70 = 1;Led100 = 1; //檔位指示燈全滅
MotorA = 1;MotorB = 1; //電機(jī)不轉(zhuǎn)
break;
case 1: Led50 = 0;Led70 = 1;Led100 = 1; //1擋指示燈亮
MotorA = 0;MotorB = 1;
break;
case 2: Led50 = 1;Led70 = 0;Led100 = 1; //2擋指示燈亮
break;
case 3: Led50 = 1;Led70 = 1;Led100 = 0; //3擋指示燈亮
break;
default: break;
}
if(time_flag == 4) //time_flag為4時(shí),即4*30s=120s,2分鐘,此時(shí)電機(jī)停轉(zhuǎn)
key_flag = 0;
}
}
/******延時(shí)x毫秒******/
void DelayMs( uint x ) //@11.0592MHz
{
uint a;
for(a=0;a<x;a++)
{
uchar i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
/*******系統(tǒng)初始化******/
void SystemInit()
{
Led50 = 1;
Led70 = 1;
Led100 = 1;
LedPower = 1;
ModeKey = 1;
MotorA = 1;
MotorB = 1;
Timer0Init();
}
/*******定時(shí)器0初始化*****/
void Timer0Init() //333us @11.0592MHz 0.03%誤差
{
TMOD &= 0xF0; //設(shè)置定時(shí)器模式
TMOD |= 0x01; //設(shè)置定時(shí)器模式
TL0 = 0xCD; //設(shè)置定時(shí)初值
TH0 = 0xFE; //設(shè)置定時(shí)初值
TF0 = 0; //清除TF0標(biāo)志
TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
ET0 = 1; //開啟定時(shí)器0中斷
EA = 1; //開啟總中斷
}
/*******讀ADC0832函數(shù)******/
uchar Adc0832(uchar channel) //AD轉(zhuǎn)換,返回結(jié)果
{
uchar i=0;
uchar j;
uint dat=0;
uchar ndat=0;
if(channel==0)channel=2;
if(channel==1)channel=3;
ADDI=1;
_nop_();
_nop_();
ADCS=0; //拉低CS端
_nop_();
_nop_();
ADCLK=1; //拉高CLK端
_nop_();
_nop_();
ADCLK=0; //拉低CLK端,形成下降沿1
_nop_();
_nop_();
ADCLK=1; //拉高CLK端
ADDI=channel&0x1;
_nop_();
_nop_();
ADCLK=0; //拉低CLK端,形成下降沿2
_nop_();
_nop_();
ADCLK=1; //拉高CLK端
ADDI=(channel>>1)&0x1;
_nop_();
_nop_();
ADCLK=0; //拉低CLK端,形成下降沿3
ADDI=1; //控制命令結(jié)束
_nop_();
_nop_();
dat=0;
for(i=0;i<8;i++)
{
dat|=ADDO; //收數(shù)據(jù)
ADCLK=1;
_nop_();
_nop_();
ADCLK=0; //形成一次時(shí)鐘脈沖
_nop_();
_nop_();
dat<<=1;
if(i==7)dat|=ADDO;
}
for(i=0;i<8;i++)
{
j=0;
j=j|ADDO; //收數(shù)據(jù)
ADCLK=1;
_nop_();
_nop_();
ADCLK=0; //形成一次時(shí)鐘脈沖
_nop_();
_nop_();
j=j<<7;
ndat=ndat|j;
if(i<7)ndat>>=1;
}
ADCS=1; //拉低CS端
ADCLK=0; //拉低CLK端
ADDO=1; //拉高數(shù)據(jù)端,回到初始狀態(tài)
dat<<=8;
dat|=ndat;
return(dat); //return ad k
}
/*******電池低電量警告******/
void BatteryVoltageWarning()
{
ad_data =Adc0832(0); //讀取電池電壓采樣值
//ADC0832模數(shù)轉(zhuǎn)換是8位ADC芯片,轉(zhuǎn)換回來的數(shù)值是0-255,0V時(shí)是0,5V時(shí)是255,相應(yīng)的倍數(shù)就是255/5=51
//因此,將轉(zhuǎn)換回來的數(shù)除以51,就得到相應(yīng)的電壓值了
battery_voltage = (double)(ad_data)/51.0;
if(battery_voltage < 0.7) //當(dāng)電池電壓小于0.7V,即電量低于20%時(shí),低電量指示燈亮
LedPower = 0;
else
LedPower = 1;
}
/*******按鍵掃描******/
uchar KeyScan()
{
if(!ModeKey)
{
DelayMs(10);
if(!ModeKey)
{
time_30s = 0;
time_flag = 0; //每次按檔位模式按鍵,電機(jī)轉(zhuǎn)動(dòng)都要復(fù)位,即清零已經(jīng)轉(zhuǎn)動(dòng)的時(shí)間
key_flag++;
if(key_flag > 3)
key_flag = 0;
}
while(!ModeKey);
}
return key_flag;
}
/*******產(chǎn)生電機(jī)PWM******/
void MotorControl(uchar pwm, uchar ab)
{
if(pwm > 10)
pwm = 10;
if(time_30s > 90000) //約為90000*333us=30s
{
time_30s = 0;
time_flag++; //每30s停轉(zhuǎn)一次,每停轉(zhuǎn)一次time_flag就加一
if(time_flag > 4) //time_flag加到4,即4*30s=120s,2分鐘
time_flag = 0;
MotorA = 1;
MotorB = 1;
DelayMs(1000); //電機(jī)每隔30s停轉(zhuǎn)1s
}
else
{
if(time_pwm > 10) //PWM周期為10*333us=3.33ms,頻率約為1/3.33ms=300.3Hz
time_pwm = 0;
if(ab=='A') //如果參數(shù)為A
{
MotorB = 0; //則產(chǎn)生正脈沖,此時(shí)電機(jī)正轉(zhuǎn)
if(time_pwm < pwm) //占空比為(pwm/10*100%),改變pwm值(范圍0-10)即改變占空比(對(duì)應(yīng)0-100%),從而可以改變電機(jī)的速度
MotorA = 1;
else
MotorA = 0;
}
else if(ab=='B') //如果參數(shù)為B
{
MotorA = 0; //則產(chǎn)生負(fù)脈沖,此時(shí)電機(jī)反轉(zhuǎn)
if(time_pwm < pwm) //占空比為(pwm/10*100%),改變pwm值(范圍0-10)即改變占空比(對(duì)應(yīng)0-100%),從而可以改變電機(jī)的速度
MotorB = 1;
else
MotorB = 0;
}
}
}
/*******定時(shí)器0中斷******/
void Time0(void) interrupt 1
{
TL0 = 0xCD;
TH0 = 0xFE; //重新賦初值333us,0.03%誤差
time_pwm++;
time_30s++; //每333us進(jìn)入一次中斷,同時(shí)time_pwm、time_30s值各加一
}
復(fù)制代碼
所有資料51hei提供下載:
程序.zip
(44.38 KB, 下載次數(shù): 65)
2019-6-17 13:30 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
admin
時(shí)間:
2019-6-17 15:56
本帖需要重新編輯補(bǔ)全電路原理圖,源碼,詳細(xì)說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
作者:
小胖波波
時(shí)間:
2019-6-18 14:00
admin 發(fā)表于 2019-6-17 15:56
本帖需要重新編輯補(bǔ)全電路原理圖,源碼,詳細(xì)說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
我上傳一個(gè)仿真圖吧
作者:
mcu_mpu
時(shí)間:
2019-8-12 10:19
好東西,學(xué)習(xí)下。
作者:
cabot
時(shí)間:
2019-8-28 16:05
樓主有沒原理圖,謝謝
作者:
cba_cba
時(shí)間:
2019-9-10 12:00
看看,能不能有用。
作者:
m182892
時(shí)間:
2019-9-11 08:50
下載看了一下,牙刷里面就是一個(gè)電機(jī),正轉(zhuǎn)反轉(zhuǎn)線路怎么接,還是要有原理圖才清楚。
作者:
IdeaMing
時(shí)間:
2019-9-11 09:48
admin 發(fā)表于 2019-6-17 15:56
本帖需要重新編輯補(bǔ)全電路原理圖,源碼,詳細(xì)說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
管理員建議太好了
作者:
我要打十個(gè)
時(shí)間:
2019-10-31 20:14
希望樓主能上傳看看
作者:
cabot
時(shí)間:
2019-11-15 15:24
樓主,程序我有看了,有問題啊,你都沒有調(diào)動(dòng)MotorControl(uchar pwm, uchar ab)這個(gè)函數(shù)
作者:
SilentK
時(shí)間:
2020-3-18 09:30
下下來研究研究。!
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1