直流电机调速控制系统的C语言程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//MCU:A T89S51

//晶振:12M

#include "regX52.H"

#include "math.h"

#include "intrins.h"

#define LCDIO P0 //定义P0口与LCD1602的数据口相接#define ON 1

#define OFF 0

sbit LCD_RS=P2^6;

sbit LCD_RW=P2^5;

sbit LCD_EN=P2^4;

sbit LCD_BUSY=LCDIO^7;

sbit SW4=P2^0; // 速度设置加

sbit SW3=P2^1; // 速度设置减

sbit SW2=P2^2; // 停

sbit SW1=P2^3; // 反转

sbit IN2=P3^4; // 红色的线

sbit PWM=P3^5; // 黄色的线

sbit IN1=P3^6; // 紫色的线

int display;

int flag;

int time;

int a;

int s=25;

unsigned long int p;

unsigned long int xiao;

unsigned long int h;

unsigned long int v;

unsigned char dispbuff[4]; //存放各位数据

/*******1ms延时子程序***********/

void delay_nms(unsigned int n)

{

unsigned int i;

unsigned char j;

for(i=0;i

for(j=0;j<120;j++)

; //空操作

}

/*******1ms延时子程序***********/

/*******0.1ms延时子程序***********/

void control_speed(unsigned int n)

{

unsigned char j;

for(j=0;j

; //空操作

}

/*******0.1ms延时子程序***********/

#define uchar unsigned char

#define uint unsigned int

//LCD驱动

void LCD_check_busy(void) //检测LCD状态,看它是不是还在忙呢{

do

{

LCD_EN=0;

LCD_RS=0;

LCD_RW=1;

LCDIO=0xff;

LCD_EN=1;

}

while(LCD_BUSY==1);

LCD_EN=0;

}

/************LCD1602写命令*******************************/ void LCD_send_command(uchar command,busy1)

{

if(busy1)

LCD_check_busy();

LCD_RS=0;

LCD_RW=0;

LCD_EN=1;

LCDIO=command;

LCD_EN=0;

}

/*****************LCD1602写数据**************************/

void LCD_send_data(uchar dat)

{

LCD_check_busy();

LCD_RS=1;

LCD_RW=0;

LCD_EN=1;

LCDIO=dat;

LCD_EN=0;

}

void LCD_write_char(uchar x,uchar y,uchar dat)

{

unsigned char address;

if (x==0)

address=0x80+y;

else

address=0xc0+y;

LCD_send_command(address,0);

LCD_send_data(dat);

}

/******************LCD1602显示字符串*********************/ void LCD_disp_string(uchar x,uchar y,uchar *Data)

{

if(x==0)

{

if(y<16)

{

LCD_send_command(0x80+y,0);

for(;y<16&&*Data!='\0';y++)

{

LCD_send_data(*(Data));

Data++;

}

if(*Data!='\0')

{

y=0;

x=1;

}

}

}

if(x==1)

{

LCD_send_command(0xc0+y,0);

for(;y<16&&*Data!='\0';y++)

LCD_send_data(*(Data));

Data++;

}

}

}

void LCD_init(void)

{

delay_nms(15);

LCD_send_command(0x38,0);

delay_nms(5);

LCD_send_command(0x38,0);

delay_nms(5);

LCD_send_command(0x38,0);

delay_nms(5);

LCD_send_command(0x38,1);//设置lcd1602为每个字符5×7显示

LCD_send_command(0x0f,1); //开显示,光标显示并闪烁

LCD_send_command(0x06,1);//光标移动设置,每写一个数,光标自动加一LCD_send_command(0x01,1); //清屏

}

/**************LCD1602的初始化完毕***************************/

/***********************初始化函数*********************/

void init()

{

IT1=1; //脉冲触发方式

EA=1; //中断总允许

EX1=1; //允许外部中断1

TMOD=0x91;

TH0=0x3c;

TL0=0xb0; //给定时器赋初值

ET0=1; //允许定时中断

TR0=1; //启动定时器

}

/******定时器,外部中断初始化******/

void main()

相关文档
最新文档