標(biāo)題:
單片機(jī)pwm直流電機(jī)轉(zhuǎn)速控制和測量裝置
[打印本頁]
作者:
zyn0
時間:
2019-12-16 07:44
標(biāo)題:
單片機(jī)pwm直流電機(jī)轉(zhuǎn)速控制和測量裝置
/**************************************************************************************
實(shí)驗現(xiàn)象:k3控制電機(jī)加速,k4控制電機(jī)減速,一個檔位對應(yīng)一種蜂鳴器頻率,兩個定時器,一個用于控制電機(jī)轉(zhuǎn)速pwm,另一個控制蜂鳴器頻率
接線說明: (具體接線圖可見開發(fā)攻略對應(yīng)實(shí)驗的“實(shí)驗現(xiàn)象”章節(jié))
本實(shí)驗基于普中51單片機(jī)開發(fā)板
1,單片機(jī)-->LED&交通燈模塊
P20-->D1
P0-->J6
LSA=P2^2;
LSB=P2^3;
LSC=P2^4;
led=P2^0; //定義P20口是beep
P21; //定義P21 為脈寬輸出引腳
注意事項:
***************************************************************************************/
#include "reg52.h" //此文件中定義了單片機(jī)的一些特殊功能寄存器
#include "intrins.h"
typedef unsigned int u16; //對數(shù)據(jù)類型進(jìn)行聲明定義
typedef unsigned char u8;
sbit beep=P2^0; //定義P20口是Beep(high)
sbit P21=P2^1; //定義P21 為脈寬輸出引腳--接電機(jī)
//sbit k1=P1^0; //定義period增加
//sbit k2=P1^1;//定義period減少
sbit k3=P2^5;//定義high增加
sbit k4=P2^6;//定義high減少
sbit k5=P2^7;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//顯示0~F-x的值
u16 period=100;
u16 high=50;
u16 high1=65;
void led();
/*******************************************************************************
* 函 數(shù) 名 : delay
* 函數(shù)功能 : 延時函數(shù),i=1時,大約延時10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函 數(shù) 名 : digdisplay
* 函數(shù)功能 : 顯示
******************************/
void DigDisplay()
{
u8 i;
u8 index[8]={0};
u8 ration=high/period*100;//占空比
index[0]=period/1000;
index[1]=period%1000/100;
index[2]=period%1000%100/10;
index[3]=period%1000%100%10;
// index[4]=high/1000;
// index[5]=high%1000/100;
index[6]=high/10;
index[7]=high%10;
for(i=0;i<8;i++)
{
switch(i) //位選,選擇點(diǎn)亮的數(shù)碼管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//顯示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//顯示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//顯示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//顯示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//顯示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//顯示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//顯示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//顯示第7位
}
P0=smgduan[index[i]];//發(fā)送段碼
delay(100); //間隔一段時間掃描
P0=0x00;//消隱
}
}
/*******************************************************************************
* 函 數(shù) 名 : keypros
* 函數(shù)功能 : 按鍵處理函數(shù),判斷按鍵K1是否按下
*******************************************************************************/
void keypros()
{
if(high<0||high==90)
{
high=50;
led();
}
if(k3==0) //檢測按鍵K1是否按下
{
delay(1000); //消除抖動 一般大約10ms
if(k3==0) //再次判斷按鍵是否按下
{
TR0=1;
TR1=1;
high+=10;
led();
}
while(!k3); //檢測按鍵是否松開
}
if(k4==0) //檢測按鍵K1是否按下
{
delay(1000); //消除抖動 一般大約10ms
if(k4==0) //再次判斷按鍵是否按下
{
TR0=1;
TR1=1;
high-=10;
led();
}
while(!k4); //檢測按鍵是否松開
}
if(k5==0) //檢測按鍵K1是否按下
{
delay(1000); //消除抖動 一般大約10ms
if(k5==0) //再次判斷按鍵是否按下
{
TR0=0;
TR1=0;
P21=0;
beep=0;
high=0;
led();
}
while(!k5); //檢測按鍵是否松開
}
}
void led()
{
switch(high)
{
case 0:P1=~0x00;break;
case 10:P1=~0x01;high1=5;break;
case 20:P1=~0x03;high1=20;break;
case 30:P1=~0x07;high1=35;break;
case 40:P1=~0x0f;high1=50;break;
case 50:P1=~0x1f;high1=65;break;
case 60:P1=~0x3f;high1=80;break;
case 70:P1=~0x7f;high1=90;break;
case 80:P1=~0xff;high1=100;break;
}
}
/*******************************************************************************
* 函 數(shù) 名 : Timer0Init
* 函數(shù)功能 : 定時器0初始化
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void TimerInit()
{
TMOD|=0X11;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。
TH0=0XFC; //給定時器賦初值,定時1ms
TL0=0X18;
ET0=1;//打開定時器0中斷允許
EA=1;//打開總中斷
TR0=1;//打開定時器
TH1=0XFC; //給定時器賦初值,定時1ms
TL1=0X18;
ET1=1;//打開定時器1中斷允許
TR1=1;//打開定時器
}
/*******************************************************************************
* 函 數(shù) 名 : main
* 函數(shù)功能 : 主函數(shù)
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void main()
{
TimerInit(); //定時器初始化
led();
while(1)
{
keypros();
DigDisplay();
}
}
/*******************************************************************************
* 函 數(shù) 名 : void Timer0() interrupt 1
* 函數(shù)功能 : 定時器0中斷函數(shù)
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void Timer0() interrupt 1
{
static u16 time;
TH0=0XFC; //給定時器賦初值,定時1ms
TL0=0X18;
time++;
if(time==high)
{
P21=0;
}
else if(time==100)
{
P21=1;
time=0;
}
}
void Timer1() interrupt 3
{
static u16 time1;
TH1=0XFC; //給定時器賦初值,定時1ms
TL1=0X18;
time1++;
if(time1==high1)
{
beep=0;
}
else if(time1==200)
{
beep=1;
time1=0;
}
}
復(fù)制代碼
作者:
admin
時間:
2019-12-16 12:27
本帖需要重新編輯補(bǔ)全電路原理圖,源碼,詳細(xì)說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
作者:
18894048956
時間:
2019-12-20 16:37
admin 發(fā)表于 2019-12-16 12:27
本帖需要重新編輯補(bǔ)全電路原理圖,源碼,詳細(xì)說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
查看內(nèi)容
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1