?? main.c
字號:
/*
Main.C
直流電機測速程序
*/
#include <REG51.H>
#include <ABSACC.H>
#include <CTYPE.H>
//定義I/O接口
sbit PWM = P1^6; //PWM方波輸出(接至MotorA,控制直流電機轉速)
sbit KEY1 = P2^0; //按鍵1(電機加速)
sbit KEY2 = P2^1; //按鍵2(電機減速)
//定義全局變量
unsigned char DispBuf[8]; //定義數碼管顯示緩沖區(由T1定時中斷自動掃描)
unsigned char Speed; //預設的電機轉速值,范圍20~250
bit SWTR; //軟件定時器運行標志
bit SWTF; //軟件定時器溢出標志
unsigned int SWTV; //軟件定時器定時值
/*
函數:T1INTSVC()
功能:定時器T1的中斷服務函數(每100μs中斷一次)
*/
void T1INTSVC() interrupt 3
{
code unsigned char com[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
static unsigned char n = 0;
static unsigned char t = 0;
//掃描數碼管
P0 = 0xFF; //暫停顯示
XBYTE[0xE800] = ~DispBuf[n]; //更新掃描數據
P0 = ~com[n]; //重新顯示
n++;
n &= 0x07;
//產生PWM方波,驅動電機
t++;
if ( t < Speed )
{
PWM = 1;
}
else
{
PWM = 0;
}
//模擬一個軟件定時器
if ( SWTR )
{
if ( --SWTV == 0 ) SWTF = 1;
}
}
/*
函數:DispChar()
功能:在數碼管上顯示字符
參數:
x:顯示位置(0~7)
c:要顯示的字符(僅限0~9、AbCdEF和-)
*/
void DispChar(unsigned char x, unsigned char c)
{
code unsigned char Tab[] =
{//0123456789AbCdEF的數碼管字型數據
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71
};
unsigned char t;
x &= 0x07;
x = 7 - x;
if ( c == '-' )
{
DispBuf[x] = 0x40;
}
else
{
t = toint(c);
if ( t < 16 )
{
DispBuf[x] = Tab[t];
}
}
}
/*
函數:DispStr()
功能:在數碼管上顯示字符串
參數:
x:起始顯示位置(0~7)
*s:要顯示的字符串(其中的字符僅限0~9、AbCdEF和-)
*/
void DispStr(unsigned char x, unsigned char *s)
{
unsigned char c;
for (;;)
{
c = *s++;
if ( c == '\0' ) break;
DispChar(x++,c);
}
}
/*
函數:Delay()
功能:延時0.1ms~6.5536s
參數:
t>0時,延時(t*0.1)ms
t=0時,延時6.5536s
*/
void Delay(unsigned int t)
{
SWTV = t; //軟件定時器賦初值
SWTR = 1; //啟動軟件定時器
while ( !SWTF ); //等待溢出
SWTR = 0; //停止軟件定時器
SWTF = 0; //清除溢出標志
}
/*
函數:ByteToStr()
功能:字節型變量c轉換為十進制字符串
*/
void ByteToStr(unsigned char idata *s, unsigned char c)
{
code unsigned char Tab[] = {100,10};
unsigned char i;
unsigned char t;
for ( i=0; i<2; i++ )
{
t = c / Tab[i];
*s++ = '0' + t;
c -= t * Tab[i];
}
*s++ = '0' + c;
*s = '\0';
}
/*
函數:MeasureSpeed()
功能:測量電機轉速
返回:轉速值(單位:轉/秒)
*/
unsigned char MeasureSpeed()
{
TH0 = TL0 = 0; //清除計數器T0
TR0 = 1; //啟動計數器T0
Delay(2500); //延時250ms(因為直流電機轉盤上正好有4個槽)
TR0 = 0; //停止計數
TF0 = 0; //清除(可能的)溢出標志
return TL0; //返回結果(單位:轉/秒;已知電機轉速不會超過100)
}
/*
函數:KeyScan()
功能:鍵盤掃描
返回:掃描到的鍵值
*/
unsigned char KeyScan()
{
unsigned char k = '\0';
if ( KEY1 == 0 ) k = '+';
if ( KEY2 == 0 ) k = '-';
return k;
}
/*
函數:SysInit()
功能:系統初始化
*/
void SysInit()
{
unsigned char i;
for ( i=0; i<8; i++ )
{
DispBuf[i] = 0x00; //數碼管初始化為全滅
}
Speed = 30; //設置電機初始轉速
SWTR = 0;
SWTF = 0;
SWTV = 0;
TMOD &= 0x0F;
TMOD |= 0x20; //設置T1為8位定時器,自動重裝
TH1 = TL1 = 0xA4; //設置T1初值,對應100μs
ET1 = 1; //使能T1中斷
TR1 = 1; //啟動T1
EA = 1; //使能總中斷
TMOD &= 0xF0;
TMOD |= 0x05;
}
void main()
{
unsigned char k;
unsigned char spd;
unsigned char s[4];
SysInit();
for (;;)
{
for (;;)
{
spd = MeasureSpeed();
ByteToStr(s,spd);
DispStr(5,s);
k = KeyScan(); //鍵盤掃描
if ( k != '\0' ) break; //如果有鍵按下,退出循環
}
switch ( k ) //判斷鍵值,執行具體功能
{
case '+':
if ( Speed < 250 ) Speed += 5;
break;
case '-':
if ( Speed > 20 ) Speed -= 5;
break;
default:
break;
}
for (;;)
{
spd = MeasureSpeed();
ByteToStr(s,spd);
DispStr(5,s);
if ( KeyScan() == '\0' ) break; //如果按鍵抬起,退出循環
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -