1、/*/*课题:直流电机的转速控制(闭环调节)*/*/ #include “main.h“ /*/*声明使用的变量*/*/int set_value;int now_speed;int count;int N_C;/*/*主函数*/*/void main()lcd_init(); /LED初始化TL1 = 0x06; /设定方波周期为0.25msTH1 = 0x06;TMOD = 0X25; /设置定时器1工作方式1,计数器0的工作方式1(参考书本104页)TL0 = 0x00; /计数器的初值为0TH0 = 0x00;ET1 = 1; /打开定时器1中断TR1 = 1; /打开定时器1TR0
2、= 1; /打开定时器0EA =1; /打开全局中断while(1) keys(); /扫描设定转速 write_first(8,set_value); /1602第一行显示设定值write_second(8,now_speed); /1602第二行显示实际值N_C= (set_value-now_speed)/100.0; /调整/*/*中断函数:检测实际转速*/*/void timer1() interrupt 3 /定时器1中断,定时 count+;if(count60) /60个250uS 计数器一直计数count = 0;now_speed=(TH0*256+TL0)*17; /计算
3、转速TL0=0x00; /计数器初 值清0TH0=0x00; TF0=0; /清楚中断标志位if(count = (set_value/10+N_C) Pwm_out = 0; /调整PWM的输出,控制电机/*主函数编程结束*/*/*主函数的头文件定义*/*/#ifndef _main_h_#define _main_h_/*/*调用使用到的模块头文件*/*/#include “common.h“#include “intrins.h“#include “lcd1602.h“#include “keyscan.h“/*/*主函数的端口定义*/*/sbit Pwm_out = P31; /PWM
4、的输出/*/*声明可以外部调用的函数和变量*/*/extern int set_value;/*/#endif/*/*功能:定义一些各个模块都能用到的公共函数*/*/#include “common.h“/*/*死延时程序*/*/void delay(uint z)uint x,y;for(x=z;x0;x-)for(y=100;y0;y-);/*子模块编程结束*/*/*公共的头文件定义*/*/#ifndef _common_h_#define _common_h_/*/*调用使用到的公共头文件*/*/#include “reg52.h“/*/*公共宏定义*/*/#define uchar u
5、nsigned char #define uint unsigned int/*/*声明可以外部调用的函数和变量*/*/extern void delay(uint z);/*/#endif/*/*功能:按键输入设定的电机转速*/*/#include “keyscan.h“/*/*键盘扫描程序*/*/void keys() /键盘控制if(s1=0) /控制设定转速加10转/ 分delay(5);if(s1=0)while(!s1);set_value = set_value+10;if(set_value 600)set_value = 0;if(s2=0) /控制设定转速减10转/ 分de
6、lay(5);if(s2=0)while(!s2);set_value = set_value-10;if(set_value 600)set_value = 0;if(s4=0) /控制设定转速减100转/ 分delay(5);if(s4=0)while(!s4);set_value = set_value-100;if(set_value =0)set_value = 0;/*子模块编程结束*/*/*按键的头文件定义*/*/#ifndef _keyscan_h_#define _keyscan_h_/*/*调用使用到的模块头文件*/*/#include “common.h“#include
7、 “main.h“ /调用main.h中的set_value变量/*/*定义按键的4个输入端*/*/sbit s1 = P10;sbit s2 = P11;sbit s3 = P12;sbit s4 = P13;/*/*声明可以外部调用的函数和变量*/*/extern void keys();/*/#endif/*/*功能:LCD模块的程序,显示设定值和实际值*/*/#include “lcd1602.h“ /*/*定义两个数组*/*/uchar code table = “SET_N: 000 n/M “; /LCD的初始显示数据uchar code table1 = “NOW_N: 000
8、 n/M “; /*/*写指令函数(00)*/*/void write_com(uchar com) /写(0)指令(0)函数wr = 0; /写rd = 0; /指令P0 = com; /P0口输出指令delay(5);lcde = 1;delay(5); /一个高脉冲把指令取走lcde = 0;/*/*写数据函数(01)*/*/void write_date(uchar date) /写(0)数据(1)函数wr = 0; /写rd = 1; /数据P0 = date; /P0口输出数据delay(5);lcde = 1;delay(5);lcde = 0;/*/*初始化函数*/*/void
9、 lcd_init()uchar num;/ wr = 1; /一直为0,表示只写,不 读lcde = 0; /开始时为0,后可以产生高脉冲write_com(0x38); /显示模式设置write_com(0x0c); /开显示、光标不闪烁write_com(0x06); /输入方式设置,数据读写操作后, AC自动加1write_com(0x01); /清屏write_com(0x80); /第一行的开始地址for(num=0;num16;num+)write_date(tablenum);delay(3);write_com(0x80+0x40); /第二行的开始地址for(num=0;n
10、um16;num+)write_date(table1num);delay(3);/*/*液晶第一行显示(设定值)*/*/void write_first(uchar add,uint date) uchar bai,shi,ge; /分离设定值,分别显示bai = date/100;shi = date/10%10;ge = date%10;write_com(0x80+add); /操作显示的地址write_date(0x30+bai); /显示百位,依次write_date(0x30+shi);write_date(0x30+ge);/*/*液晶第二行显示(实时值)*/*/void wr
11、ite_second(uchar add,uint date) uchar aa,bb,cc; /分离设定值,分别显示aa = date/100;bb = date/10%10;cc = date%10;write_com(0x80+0x40+add); /操作显示的地址write_date(0x30+aa); /显示百位,依次write_date(0x30+bb); write_date(0x30+cc);/*子模块编程结束*/*/*LCD1602的头文件定义*/*/#ifndef _lcd1602_h_#define _lcd1602_h_/*/*调用使用到的模块头文件*/*/#include “common.h“/*/*定义LCD的三个控制位*/*/sbit rd = P26;sbit wr = P25;sbit lcde = P27;/*/*声明可以外部调用的函数和变量*/*/extern void lcd_init();extern void write_first(uchar add,uint date); extern void write_second(uchar add,uint date); /*/#endif