📄 main.c
字号:
#include "c8051f020.h"
#include <intrins.h>
sfr16 DAC0 = 0xd2; // DAC0 data
#define PRT0CF P0MDOUT
#define PRT1CF P1MDOUT
#define PRT2CF P2MDOUT
unsigned int SetSpeed;// 设定稳定转速,转一圈3个脉冲
unsigned int Count1s=1000;
unsigned int SaveMotorCount=0;// 每秒脉冲个数
unsigned int MotorCount=0;
unsigned int iDAC0=0x0b00;
int SD;
unsigned char Count1ms;
void DispLED(char *DispBuf,char ShowDot); //ShowDot 显示小数点位
void TestMotor(bit LoopFlag);
void Delay1us(unsigned char us)
{
while (us)
{
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
--us;
}
}
void SYSCLK_Init (void)
{
int i; // delay counter
OSCXCN = 0x67; // start external oscillator with
// 18.432MHz crystal
for (i=0; i < 256; i++) ; // Wait for osc. to start up
while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
OSCICN = 0x88; // select external oscillator as SYSCLK
// source and enable missing clock
// detector
}
void PORT_Init (void)
{
XBR0 = 0x04; // Enable UART0
XBR1 = 0x06; // P10<---int0
XBR2 = 0x40; // Enable crossbar and weak pull-ups
}
void Timer0_Init (void)
{
CKCON|=0x8; // 使用系统时钟
TMOD|=0x1; // 16Bit
Count1ms=10;
TR0 = 0; // STOP Timer0
TH0 = (-SYSCLK/1000) >> 8; // set Timer0 to overflow in 1ms
TL0 = -SYSCLK/1000;
TR0 = 1; // START Timer0
IE|= 0x2;
}
void Timer0_ISR (void) interrupt 1 //1ms
{
TH0 = (-SYSCLK/1000) >> 8;
TL0 = -SYSCLK/1000;
if (Count1ms) Count1ms--;
if (Count1s) Count1s--;
else
{
Count1s=1000;
SaveMotorCount=MotorCount;
MotorCount=0;
SD=SaveMotorCount-SetSpeed; // 转速差额
SaveMotorCount*=20;// 转速为脉冲个数乘20
iDAC0-=SD; // 调整输出电压
DAC0=iDAC0;
}
}
void Int0_ISR (void) interrupt 0
{
MotorCount++;
}
void Delay1ms(unsigned char T)
{
Count1ms=T;
while (Count1ms);
}
void Delay1s(unsigned char T)
{
while (T)
{
Delay1ms(200);
Delay1ms(200);
Delay1ms(200);
Delay1ms(200);
Delay1ms(200);
T--;
}
}
void main (void)
{
WDTCN = 0xde;
WDTCN = 0xad; // 关看门狗
SYSCLK_Init (); // 初始化时钟
Timer0_Init(); // 初始化定时器
PORT_Init (); // 初始化IO口
CPT1CN|=0x80; // 使能比较器1
REF0CN = 0x07; // 使能片内参考电压
DAC0CN |= 0x80; // 使能DAC0
DAC0H=0; DAC0L=0;
IT0=1;
IE |= 0x01; // 使能INT0中断
EA=1; // 开中断
TestMotor(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -