12864显示程序
#include
#include
//#include"44.h"
#include"LCD12864.h"
//#include"PID.h"
#define uint unsigned int #define uchar unsigned char #define CP 100
#define CI 0.6
#define CD 1
int sbai,sshi,sge;//定义设定值的百位,十位,个位 uchar fbai,fshi,fge;//定义返回的百位,十位,个位 int wbai,wshi,wge;//定义误差的百位,十位,个位 int setpoint;//设定目标转速
uint pwm;//用于计算pwm
sbit pwmout=P3^1; //l298使能,用于pwm控制电机的转速 sbit l298interrupt1=P3^2;//l298的输入,用于控制电机转动方向 code unsigned char a[]=; void delay(uint z)
{
uint x,y;
for(x=120;x>0;x--)
for(y=z;y>0;y--);
}
uchar temp,gone,back;
uint num;
void keyscan();
void keyscan1();
void keyscan2();
uchar i,j;
uchar shuzi;//读取设定的数字
int speed;//实测每秒转速
uint set_rps;//设定每秒转速
int wc;//用来存放误差变量的
uint speed1;//处理过了的采样回来的速度
void init()
//========================================================================
// 语法格式: int DCMotor_Speed_PID(int SetSpeed, int CurSpeed)
// 实现功能: 增量式PID计算: u0 = u1 + CP*(e0-e1) + CI*e0 + CD*(e0-2*e1+e2)
// 参数: SetSpeed: 设定的转速
// CurSpeed: 实际测得转速
// 返回值: 直流电机速度等级(PWM占空比) //========================================================================
int DCMotor_Speed_PID(int SetSpeed,int CurSpeed)
{
int e0, u0;
static int u1 = 0; // 前一次输出值(为避免浮点运算将该值扩大16倍)
static int e1 = 0, e2 = 0;
e0 = SetSpeed - CurSpeed; // 当前速度偏差
wc=e0;
u0 = u1
+ CP * (e0 - e1) // 比例项
+ CI * e0 // 积分项
+ CD * (e0 - e1 - e1 + e2); // 微分项
if(u0 > 1023) u0 = 1023; // 输出值应小于64(扩大16倍)
if(u0 < 16) u0 = 16; // 输出值应不小于1(扩大16倍)
u1 = u0; // 更新u1、e1和e2
e2 = e1;
e1 = e0;
return u0; // 返回u0 }
void PID_ctrl()//PID控制
void main()
{
j=0;
Delay400Ms(); //启动等待,等LCD讲入工作状态
LCDInit(); //LCD初始化
Delay5Ms(); //延时片刻
LCDClear();
DisplayListChar(2,2,a); //显示字库中的中文数字
DisplayListChar(4,3,b); //显示字库中的中 文数字
i=1;
init();
l298interrupt1=1;
while(1)
{
keyscan();
keyscan1();
// keyscan2();
if(gone==1)
{
DCMotor_Speed_PID(setpoint,speed);
PID_ctrl();
// speed=1980;
// speed1=speed/8;
// wc=setpoint-speed1;
fbai=speed1/100;
fshi=speed1%100/10;
fge=speed1%10;
wbai=wc/100;
wshi=wc%100/10;
wge=wc%10;
DisplayOneChar(5,3,f[fbai]);
DisplayOneChar(6,3,f[fshi]);
DisplayOneChar(7,3,f[fge]);
if(wc>=0)
else if (out>pwm&&pwm<100) //周期分为100分
else if (out>pwm&&pwm<100) //周期分为100分