- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
pid 控制 绝对容易理解
pid 控制 绝对容易理解
文件: D:\我的文档\桌面\温控程序\PID.c 2009-10-6, 9:31:32
//////////////////////
// 温度控制系统 //
/////////////////////
#include REG52.H
#include ABSACC.H
#include STDIO.H
#define uint unsigned int
#define uchar unsigned char
#define LEN 5 //接收数据长度
sbit flag=P1^6;
sbit receive=P1^5;
sbit send=P1^4;
sbit dis0=P2^7; //键盘列
sbit dis1=P2^6;
sbit dis2=P2^5;
sbit dis3=P2^4;
sbit key1=P2^3; //键盘控制口1
sbit key0=P2^2; //键盘控制口0
sbit PWM=P3^7; //PWM控制端口
sbit ADAT=P3^6; //数据控制端口
sbit ACLK=P3^5; //时钟控制端口
sbit ADCS=P3^3; //片选控制端口
uchar sendok,control;
uchar count; //接收数据计数器
uchar disp[4],dis; //显示
uchar key,keyx; //键盘
uchar out; //输出
uint sum;
int para[8],ptr; //参数
int r,kp,ki,kd,e2,e1,e0,u; //PID控制参数
uchar code numtab[4]={0x80,0x40,0x20,0x10};
uchar code distab[16]={0x28,0xee,0x32,0xa2,0xe4,0xa1,0x21,0xea,
0x20,0xa0,0x60,0x25,0x39,0x26,0x31,0x71};
uchar code ledtab[8]={0x08,0x9f,0x8f,0x10,0xd9,0x07,0x04,0xd0};
//数码
int code param[8]={200,200,100,100,100,2,255,255};
//参数最大值
void time(uint t) //延时程序
{
uint i;
for(i=0;iT;I++); if(count count++; receive=~receive;
para[count]=control; { else {sendok=1;} if(control==211)
control=SBUF; RI=1,请求中断,CPU响应中断,从SBUF取出数据 if(RI)
串行中断 4 interrupt serial() void }LEN){count=1;}
}
}
else
{
第 1 页
文件: D:\我的文档\桌面\温控程序\PID.c 2009-10-6, 9:31:32
TI=0;
send=~send;
}
}
uint ADC0832() //ADC0832 的驱动程序
{
uchar x=0,i;
ADAT=1;ACLK=0;ADCS=0; //数据口赋初值
for(i=0;i4;i++) //4位数码显示
{
ACLK=0;
ADAT=1;
ACLK=1;
};
ACLK=0;
for(i=0;i8;i++) //8位AD转换
{
ACLK=1;
x=x1;
if(ADAT) x++;
ACLK=0;
}
ACLK=1;ADCS=1;
return x; //数据返回
}
void distran() //显示的数据位处理
{
disp[0]=distab[para[ptr]%10];
disp[1]=distab[(para[ptr]/10)%10];
disp[2]=distab[(para[ptr]/100)%10];
disp[3]=~ledtab[ptr];
}
void display() //键盘及数码管扫描
{
dis=(dis+1)%4;
P2=0xff;
P0=disp[dis];
P2=~numtab[dis];
key0=1; key1=1;
if(!key0) keyx=dis+1;
if(!key1) keyx=dis+5;
}
void keyproc() //键盘处理程序
{
if(key0)
{
switch(key)
{
case 1: para[ptr]--; break; //减1
case 5: para[ptr]++; break; //加1
case 2: para[ptr]-=10; break; //减10
case 6: para[pt
原创力文档


文档评论(0)