⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 本程序在单片机C8051F020上将直流电动机当前的转速值在七段数码管上显示出来
💻 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 + -