1.png (71.85 KB, 下載次數: 26)
下載附件
2023-4-10 15:54 上傳
2.png (71.69 KB, 下載次數: 29)
下載附件
2023-4-10 15:54 上傳
部分單片機源碼:
#define uchar unsigned char#define uint unsigned int
void delay(uint x) //延時函數
{
uint i,j;
for(i=x;i>0;i--)
for(j=0;j<110;j++); //執行110次約為1ms
}
void SystemInt() //系統初始化
{
TMOD = 0x51; //T0定時器 T1計數器 均采用方式1
TH0 = (65536-250)/256;
TL0 = (65536-250)%256; //定時250us
ET0 = 1; TR0 = 1; //打開T0
ET1 = 1;TR1 = 1; //打開T1
TH1 = 0;
TL1 = 0; //計數器初值為0
EA = 1; //開啟總中斷
IN1 = 1;
IN2 = 0; //初始正轉
}
void PWMOUT() //PWM輸出控制
{
if(cnt<PWMTime) //小于計數變量,輸出高電平
{
PWM=1;
}
else
{
PWM=0; //大于計數變量,低電平
}
if(cnt>100)
cnt=0;
}
void SetSpeed() //速度設定
{
if(Add==0) //速度加
{
delay(100); //按鍵消抖
if(Add==0)
{
PWMTime+=10; //PWM波占空比增加10%
dw += 1; //檔位加1
if(dw>9)
{
dw = 9;
}
while(Add==0); //松手檢測
}
}
if(Sub==0) //如果速度減
{
delay(100); // 按鍵消抖
if(Sub==0)
{
PWMTime-=10; //PWM波占空比減少10%
dw -= 1; //檔位減1
if(dw<0)
{
dw = 0;
}
while(Sub==0);
}
}
if(zhen==0) //正轉
{
delay(100);
if(zhen==0)
{
IN1 = 1;
IN2 = 0;
while(zhen==0);
}
}
if(fan==0) //反轉
{
delay(100);
if(fan==0)
{
IN1 = 0;
IN2 = 1;
while(fan==0);
}
}
if(Stop==0) //停止
{
delay(100);
if(Stop==0)
{
IN1 = 1;
IN2 = 1;
while(Stop==0);
}
}
}
void xianshi() //數碼管顯示速度和檔位
{
uint shi,ge;
shi=speed/10;
ge=speed%10;
WE1 = 0;
P0 = table[ge]; //速度個位顯示
delay(1);
WE1 = 1;
WE2 = 0;
P0 = table[shi]; //速度十位顯示
delay(1);
WE2 = 1;
WE3 = 1;
WE4 = 0;
P0 = table[dw]; //檔位顯示
delay(1);
WE4 = 1;
}
void timer0() interrupt 1 //定時器
{
TH0 = (65536-250)/256;
TL0 = (65536-250)%256; //250us一次脈沖
cnt++;
time++;
if(time==4000) //1s時間內T1的脈沖次數 1除以250us
{
time = 0; //計數置0
TR0 = 0;TR1 = 0; //先關閉定時器
speed = TH1;
speed = speed << 8; //左移8位
speed += TL1; //賦值
speed = speed*2.2; //電機轉一圈產生24個脈沖,轉速為speed/24*60 r/min
TH1 = 0;TL1 = 0; //清0重新計數
TR0 = 1;TR1 = 1; //重新啟動定時器
}
}
|