数字调节器数字技术微电子技术实现闭环控制调节器称数字调节仪表接受生产程测量信号部数字电路微处理机作数字处理定调节规律产生输出数字信号模拟信号驱动执行器完成生产程闭环控制
次智仪表课程设计目设计种数字PID调节器PID控制算法历史悠久生命力强种控制算法迄止通控制方法提供种反馈控制通积分作消稳态误差通微分作预测未设计PID数字调节器采 STC89C52RC单片机作控单元采ADC0832作AD转换器具数字滤波等功通PID算法实现调节功调节器设定值参数通四独立键设置采LED数字显示通AD420模块电路输出模拟信号
关键词 数字调节器 PID控制算法LED显示AD转换器
目 录
摘 2
第1章 前 言 5
11调节器原理作 5
12 PID控制算法简介 5
121 模拟PID算法 5
122 数字PID算法 6
第2章 总体方案设计 7
第3章 硬件选择电路设计 8
31单片机选择 8
32 系统设计 9
321 时钟电路 9
322 复位电路 9
33 AD转换器ADC0832简介电路设计 10
34 LED数码显示方式电路设计 11
341 静态显示动态显示 11
342 LED显示硬件接线图设计 11
35 键电路设计 11
36 DA转换电路设计 12
361 AD420简介 12
362 DA转换电路设计 13
第4章 软件设计 14
41调节器程序设计 14
42输入输出模块程序设计 14
421 输入模块程序设计 14
422 输出模块程序设计 15
43键程序设计 16
44 PID程序设计 17
45 LED程序设计 17
第5章 软硬件调试 19
51硬件调试 19
52软件调试 19
第6章 总结 20
参考文献 21
l 附录A 22
l 附录B 23
第1章 前 言
11 调节器原理作
调节器动控制系统中作——测量输入信号值PV定值SV进行较出偏差e然根预先设定控制规律偏差e进行运算相应控制值通输出口4~20mADC电流(1~5VDC电压)传输执行器实际调节器均具定数量输入端口输出端口外调节器般测量值输出值定值显示功极方便仪表调整系统监控操作
12 PID控制算法简介
121 模拟PID算法
例积分微分控制规律(PID)输入输出关系列公式表示:
(11)
式见PID控制作输出分例积分微分三种控制作输出叠加输入偏差e幅值A阶跃信号时实际PID控制器输出特性图11示P1D控制器调整参数KCTITD适选取三参数数值获较控制质量
式(1)进行拉氏变换PID控制规律传递函数:
(12)
图11 PID控制器输出特性 图12 PID控制规律Bode图
PID控制规律综合例积分微分三种控制规律优点具较控制性应范围更广温度成分控制系统中更广泛应
122 数字PID算法
智调节器运数字PID模拟PID理想控制规律:
(13)
离散化数字PID理想控制规律:
(14)
增量型PID算法:根式难第(k1)采样周期控制量
(15)
式(14)式(15)相减第k采样时刻控制量增量
(16) 式中例增益积分系数微分系数
式(16)中应第k采样时刻阀门位置增量称式(16)增量型算式第k采样时刻实际控制量
(17)
编写程序方便式(16)改写
(18)
式中
见利需 三历史数
第2章 总体方案设计
智调节器单片机程输入输出通道机接口电路通信接口电路等部分组成结构原理图图21示
图21 智调节器整体设计方框图
中单片机STC89C52RCCPU存储器(ROMEPROMRAM)定时计数器IO接口等组成智调节器核心实现仪表数运算处理组成部分间理程输入通道完成模拟信号采样转换形成计算机处理数字信号程输出通道计算机系列处理数字信号转换成模拟信号输出显示键盘属机接口部分键盘输入参数等控制信息LED显示测量信息定信息机接口部件般操作钮显示部件组成实现调节器员间种信息交流通信接口电路智调节器控制设备间数通信采串级传输方式
第3章 硬件选择电路设计
31单片机选择
STC89C52RC美国Atmel公司生产低电压高性CMOS 8位单片机片含8KB反复檫写程序存储器12B机存取数存储器(RAM)器件采Atmel公司高密度非易失性存储技术生产兼容标准MCS51指令系统片配置通8位中央处理器(CPU)Flash存储单元功强STC89C52RC单片机灵活应种控制领域STC89C52RC单片机属STC89C51RC单片机增强型Intel公司80XC52引脚排列硬件组成工作特点指令系统等方面兼容脚图图31
图31 STC89C52RC脚图
ST89C52RC40 脚双列直插封装8 位通微处理器采工业标准C51核部功脚排布通89XC52 相会聚调整时功控制功包括会聚IC 部寄存器数RAM外部接口等功部件初始化会聚调整控制会聚测试图控制红外遥控信号IR接收解码板CPU通信等脚:XTAL1(19 脚)XTAL2(18 脚)振荡器输入输出端口外接12MHz 晶振RSTVpd(9 脚)复位输入端口外接电阻电容组成复位电路VCC(40 脚)VSS(20 脚)供电端口分接+5V电源正负端P0~P3 编程通IO 脚功途软件定义设计中P0 端口(32~39 脚)定义N1 功控制端口分N1相应功脚相连接13 脚定义IR输入端10 脚11脚定义I2C总线控制端口分连接N1SDAS(18脚)SCLS(19脚)端口12 脚27 脚28 脚定义握手信号功端口连接板CPU 相应功端前制式检测会聚调整状态进入控制功
32 系统设计
时钟电路复位电路单片机工作基电路单片机加两部分
电路构成单片机系统单片机系统工作
321 时钟电路
STC89C52RC然部振荡电路形成时钟必须外部附加电路STC89C52RC单片机时钟产生方法两种部时钟方式外部时钟方式设计采部时钟方式利芯片部振荡电路XTAL1XTAL2引脚外接定时元件部振荡电路便产生激振荡设计采常部时钟方式外接晶体电容组成联谐振回路设计原理图32
图32 STC89C52RC时钟产生电路
322 复位电路
复位电路通常采电动复位钮复位两种方式
简单电动复位电路中电动复位通外部复位电路电容充电实现图33(a)电复位外时需键手动复位设计键手动复位键手动复位电方式脉方式两种中电复位通RST端电阻电源Vcc接通实现设计图33(b)
(a) (b)
图33 动复位电路
33 AD转换器ADC0832简介电路设计
ADC0832 美国国家半导体公司生产种8 位分辨率双通道AD转换芯片体积兼容性性价高深受单片机爱者企业欢迎目前已高普率
ADC0832 8位分辨率AD转换芯片高分辨达256级适应般模拟量转换求部电源输入参考电压复芯片模拟电压输入0~5V间芯片转换时间仅32μS双数输出作数校验减少数误差转换速度快稳定性强独立芯片输入器件挂接处理器控制变更加方便通DI 数输入端轻易实现通道功选择原理分析设计器电路图图35
图35 AD转换器硬件电路
34 LED数码显示方式电路设计
341 静态显示动态显示
LED显示器工作方式两种:静态显示方式动态显示方式静态显示特点数码必须接8位锁存器锁存显示字形码送入次字形码显示字形直保持直送入新字形码止种方法优点占CPU时间少显示便监测控制缺点硬件电路较复杂成较高
动态显示特点位数码段选线联起位选线控制位数码效样没必位数码配锁存器简化硬件电路选亮数码采动态扫描显示谓动态扫描显示轮流位数码送出字形码相应位选利发光余辉眼视觉暂留作感觉位数码时显示动态显示亮度静态显示差选择限流电阻时应略静态显示电路中
342 LED显示硬件接线图设计
分析静态显示需接口较选择动态显示原理图图36
图36数码接线图
35 键电路设计
常键矩阵键盘独立键键数量较时减少IO口占通常键排列成矩阵形式图37示矩阵式键盘中条水线垂直线交叉处直接连通通键加连接样端口(P1口)构成4*416键直接端口线键盘出倍线数越区越明显
加条线构成20键键盘直接端口线出键(9键)见需键数较时采矩阵法做键盘合理 矩阵式结构键盘显然直接法复杂识复杂图中列线通电阻接正电源行线接单片机IO口作输出端列线接IO口作输入样键没时输入端高电代表键行线输出低电旦键输入线会拉低样通读入输入线状态知否键
图37矩阵键盘接线图
然场合键较少矩阵键盘显浪费独立键原理图简单适合键较少场合设计键较少济简单角度考虑采独立键设设计图图38
图38 独立键
36 DA转换电路设计
361 AD420简介
AD420具灵活串行数字接口(速率达33 Mbs)方便性价高抑制干扰力强非常适合高精度远程控制系统AD420单片机接口方式2种:3线制异步制单片机系统通AD420实现连续模拟量输出特点:
l 宽泛电源电压范围12 V—32 V输出电压范围0V—25 V
l 带3线模式SPIMicrowire接口采集连续模拟输入信号采异步模式时仅需少量信号线
l 数输出引脚AD420器件连接成菊链型
l 电初始化时输出值0 mA4 mAO V
l 具异步清零引脚输出复位值(0mA4 mA0V)
l BOOST引脚连接外部晶体吸收回路电流降低功耗
l 需外接少量外部器件达较高精度
362 DA转换电路设计
原理分析电路设计图图39
图39 DA转换电路
第4章 软件设计
41调节器程序设计
设计务分析硬件求设计调节器程序流程图图41
图41 程序流程图
42 输入输出模块程序设计
421 输入模块程序设计
ADC0832未工作时CS输入端应高电时芯片禁进行AD转换时须先CS端置低电保持低电直转换完全结束时芯片开始转换工作时处理器芯片时钟输入端CLK输入时钟脉DODI端DI端输入通道功选择数信号第1时钟脉沉前DI端必须高电表示启始信号第23脉沉前DI端应输入2位数选择通道功2位数10时CH0进行单通道转换2位数11时CH1进行单通道转换2位数00时CH0作正输入端IN+CH1作负输入端IN进行输入2位数01时CH0作负输入端INCH1作正输入端IN+进行输入
工作原理设计程序流程图图42
图41 ADC0832程序流程图
422 输出模块程序设计
AD420输出级置放值低l V驱动值时信号会产生障输出端跳转限制达求前保持变较输出放反馈网络进行输出精度通开环增益保持稳定障检测输出变效前没输出误差3数字接口包括数输入CLOCKLATCH果户想质安全应电路具少流电隔离器数目AD420配置异步模式工作种模式LATCH通限流电阻连接Vcc实现数值通O1进行组合构造信息触发LATCH信号驱动程序流程图图42
图43 AD420程序流程图
43键程序设计
键盘实际组键开关集合中键开关量输入装置键闭合否取决机械弹性开关通断状态反应电压呈现出高电低电高电表示断开低电表明键闭合通电状态(高低)检测便确定相应键否已键程序包括键值判断滤波防抖等程序流程图44
图44 键程序流程图
44 PID程序设计
PID算法工业中广泛应算法形式前言已出通较设计采增量式算法位置式算法次输出整状态关计算式中偏差累加值容易产生较积累误差增量式需计算增量存计算误差精度足时控制量计算影响较流程图图45
图45增量式PID流程图
45 LED程序设计
静态显示特点数码必须接8位锁存器锁存显示字形码送入次字形码显示字形直保持直送入新字形码止种方法优点占CPU时间少显示便监测控制缺点硬件电路较复杂成较高程序包括位码段码控制流程图图46
图46 LED显示控制流程图
第5章 软硬件调试
进行方案证软硬件设计做出成品进行系统调试测试调试中产生问题加解决改进章介绍软硬件调试
51硬件调试
系统硬件调试排查PCB连接问题硬件调试中产生工艺性设计性两类错误缺陷调试方法:首先检查电路板元器件焊接情况虚焊漏焊者连焊然万表检查电源芯片IO口短路接着加芯片接通电源检查焊点电压否正常接芯片接通电源观测工作电流否
52软件调试
软件调试程序调试排查错误程序错误语法错误逻辑错误功错误系统软件调试KEIL软件进行程序调试编程器 软件调试中出现错误解决方法:
1时会出现程序点错误没正常运行现象发现程序中指令书写规范导致例RET返回指令定正确格式书写两行指令间留空行
2编程程中注意加注释分割线否程序长时容易变乱便查找更改
3程序结构设计合理避免乱调现象样会程序更加清晰化
第6章 总结
通次PID数字控制器设计控制系统总体方案设计硬件设计软件设计编程调试整体详解数字PID控制技术更加深刻认识
整设计程中硬件部分专业老师提供处理器选芯片STC89C52RCAD转换部分选芯片ADC0832AD接收模拟信号电位器05V模拟量转换成0255数字量PID算法采增量型算式数字形式差分方程代连续系统微分方程LED显示模块四独立键实现调节器参数设定功
次设计组单位进行五组负责部分组长带领讨子程序模块子程序调方式组合起软件编程调试终成功程序调试程中深刻认识团队合作精神重性团队合作力量穷融入集体身价值化进推动社会更更快发展
参考文献
[1] 李忠虎程参数检测技术仪表[M]北京:中国计量出版社2009
[2] 李文涛程控制[M]北京:科学出版社 2012
[3] 潘新民微型计算机控制技术北京:电子工业出版社 1988年
03月第二版
[4] 王凌强基数字PID控制器仿真[J]科技信息(学术版) 200604
[5] 王燕芳潘新民微型计算机控制技术北京:电子工业出版社
20061
[6] 姚永STC89C51RC+系列单片机器件手册宏晶科技2007年11月
[7] 董永祥智仪器设计发展山西电子技术2006年第1期
[8] 郝长胜C语言程序设计蒙古学出版社2005年12月 第版
[9] 赵茂泰智仪器原理应北京:电子工业出版社2004年7 月
[10] 潘永雄新编单片机原理应西安电子科技学出版社2007年02月 第二版
[12] 雷力鸣单片机数字调节器中应西南动化研究兵工动化1997年 第3期
[13] 蔡杏山Protel 99 SE 电路设计北京:民邮电出版社2007年07月
[14] 俞云奎编程序调节器控制器原理应1997年05月
l 附录A
l 附录B
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define N 12
sbit LED_CLKP1^1 LED时钟线
sbit LED_DATP1^0 LED数线
sbit k1P1^4
sbit k2P1^5
sbit k3P1^6
sbit k4P1^7
sbit DATA P2^0
sbit CLOCK P2^1
sbit LATCH P2^2
sbit ADCS P2^0 ADC0832 chip seclect
sbit ADDI P3^7 ADC0832 data in
sbit ADDO P3^7 ADC0832 data out
sbit ADCLK P3^6 ADC0832 clock signal
typedef unsigned char uint8
typedef unsigned int uint16
typedef unsigned long int uint32
uchar code LED_FONT[22]{ 数字'1''2''3'七段码字库
0xfc0x600xDA 0xF2 0x66 0xb6 0xbe 0xe0 0xfe 0xf6 09
0xEE0x3E0x9C0x7A0x9E0x8E AbCdEF
0x70 J 16
0xCE P 17
0x02 18
0x00 null 19
0x0C L 20
0xBC G 21
}
uchar getdatahctiaobuf[8]{00000000}
void InitTimer0(void) 初始化
{
TMOD 0x01
TH0 0xDC 10ms
TL0 0x00
EA 1
ET0 1
TR0 1
tiao0
P10xff
}
typedef struct PIDValue
{
uint32 Ek_Uint32[3] 差值保存定反馈差值
uint8 EkFlag_Uint8[3] 符号1应负数0应正数
uint8 KP
uint8 KI
uint8 KD
uint16 Uk 时刻控制电压
uint16 RK 设定值
uint16 CK 实际值
}PIDValueStr
PIDValueStr PID
uint8 out 加热输出
uint8 count 输出时间单位计数器
*PIDUk+KP*[E(k)E(k1)]+KI*E(k)+KD*[E(k)2E(k1)+E(k2)](增量型PID算式)*
void PIDOperation (void)
{
uint32 Temp[3] 中间时变量
uint32 PostSum 正数
uint32 NegSum 负数
Temp[0] 0
Temp[1] 0
Temp[2] 0
PostSum 0
NegSum 0
if( PIDRK > PIDCK ) 设定值实际值否?
{
if( PIDRK PIDCK >10 ) 偏差10否?
{
PIDUk 100 } 偏差10限幅值输出
else
{
Temp[0] PIDRK PIDCK 偏差<10计算E(k)
PIDEkFlag_Uint8[1]0 E(k)正数
数值移位
PIDEk_Uint32[2] PIDEk_Uint32[1]
PIDEk_Uint32[1] PIDEk_Uint32[0]
PIDEk_Uint32[0] Temp[0]
****************************************
if( PIDEk_Uint32[0] >PIDEk_Uint32[1] ) E(k)>E(k1)否?
{
Temp[0]PIDEk_Uint32[0] PIDEk_Uint32[1] E(k)>E(k1)
PIDEkFlag_Uint8[0]0 } E(k)E(k1)正数
else
{
Temp[0]PIDEk_Uint32[0] PIDEk_Uint32[1] E(k)
****************************************
Temp[2]PIDEk_Uint32[1]*2 2E(k1)
if( (PIDEk_Uint32[0]+ PIDEk_Uint32[2])>Temp[2] ) E(k2)+E(k)>2E(k1)否?
{
Temp[2](PIDEk_Uint32[0]+ PIDEk_Uint32[2])Temp[2] E(k2)+E(k)>2E(k1)
PIDEkFlag_Uint8[2]0 } E(k2)+E(k)2E(k1)正数
else
{
Temp[2]Temp[2](PIDEk_Uint32[0]+ PIDEk_Uint32[2]) E(k2)+E(k)<2E(k1)
PIDEkFlag_Uint8[2]1 } E(k2)+E(k)2E(k1)负数
****************************************
Temp[0] (uint32)PIDKP * Temp[0] KP*[E(k)E(k1)]
Temp[1] (uint32)PIDKI * PIDEk_Uint32[0] KI*E(k)
Temp[2] (uint32)PIDKD * Temp[2] KD*[E(k2)+E(k)2E(k1)]
*部分代码讲正数项叠加负数项叠加*
**********KP*[E(k)E(k1)]**********
if(PIDEkFlag_Uint8[0]0)
PostSum + Temp[0] 正数
else
NegSum + Temp[0] 负数
********* KI*E(k)****************
if(PIDEkFlag_Uint8[1]0)
PostSum + Temp[1] 正数
else
空操作E(K)>0
****KD*[E(k2)+E(k)2E(k1)]****
if(PIDEkFlag_Uint8[2]0)
PostSum + Temp[2] 正数
else
NegSum + Temp[2] 负数
***************U(K)***************
PostSum + (uint32)PIDUk
if(PostSum > NegSum ) 否控制量正数
{ Temp[0] PostSum NegSum
if( Temp[0] < 100 ) 限幅值计算值输出
PIDUk (uint16)Temp[0]
else
PIDUk 100 否限幅值输出
}
else 控制量输出负数输出0(限幅值输出)
PIDUk 0
}
}
else
{ PIDUk 0 }
}
*****************LED显示函数*********************
void display_char(char ch) 显示ch字符
{
char imask0x01huanLED_FONT[ch]
for(i0i<8i++)
{
LED_CLK0
LED_DAT(huan & mask)
maskmask<<1
LED_CLK1 升移位
}
}
void display_clear() 清屏
{
char ij
for(i0i<7i++)
{
for(j0j<7j++)
{
LED_CLK0
LED_DAT0
LED_CLK1
}
}
}
void Delay_1ms(uchar i)10ms延时
{
uchar xjk
for(k0k
for(x0x<148x++)
}
void xs()
{ uchar i
for(i0i<8i++)
display_char(buf[i])
}
******************键处理函数****************
void keyw()
{ Delay_1ms(1)
if(k10)
{tiao1
k11
if(tiao1)
{ hcPIDRK
while(tiao1)
{ if(tiao1)break
buf[1]21
buf[2]0xd
buf[0]buf[3]buf[4]19
buf[7]hc10
buf[6](hc10)10
buf[5]hc100
Delay_1ms(25)
xs()
if(k20)
{ Delay_1ms(1)
if(k20){
hc++
if(hc110)hc0
k21}
}
if(k30)
{ Delay_1ms(1)
if(k30){
if(hc0)hc110
hc
k31}
}
if(k10)
{ Delay_1ms(1)
if(k10) {tiao2PIDRKhc k11 }
}
if(k40)
{ Delay_1ms(1)
if(k40){ PIDRKhcbreak } }
}
}
if(tiao2)
{ hcPIDKP
while(tiao2)
{ if(tiao2)break
buf[1]19
buf[2]17
buf[0]buf[3]buf[4]19
buf[7]hc10
buf[6](hc10)10
buf[5]hc100
Delay_1ms(25)
xs()
if(k20)
{ Delay_1ms(1)
if(k20){
hc++
k21}
}
if(k30)
{ Delay_1ms(1)
if(k30){
if(hc0)hc255
hc
k31}
}
if(k10)
{ Delay_1ms(1)
if(k10) {tiao3PIDKPhc k11 }
}
if(k40)
{ Delay_1ms(1)
if(k40) { PIDKPhcbreak } }
}
}
if(tiao3)
{ hcPIDKI
while(tiao3)
{ if(tiao3)break
buf[1]19
buf[2]20
buf[0]buf[3]buf[4]19
buf[7]hc10
buf[6](hc10)10
buf[5]hc100
Delay_1ms(25)
xs()
if(k20)
{ Delay_1ms(1)
if(k20){
hc++
k21}
}
if(k30)
{ Delay_1ms(1)
if(k30){
if(hc0)hc255
hc
k31}
}
if(k10)
{ Delay_1ms(1)
if(k10) {tiao4PIDKIhc k11 }
}
if(k40)
{ Delay_1ms(1)
if(k40) { PIDKIhcbreak } }
}
}
if(tiao4)
{ hcPIDKD
while(tiao4)
{ if(tiao4)break
buf[1]19
buf[2]0XD
buf[0]buf[3]buf[4]19
buf[7]hc10
buf[6](hc10)10
buf[5]hc100
Delay_1ms(25)
xs()
if(k20)
{ Delay_1ms(1)
if(k20){
hc++
k21}
}
if(k30)
{ Delay_1ms(1)
if(k30){
if(hc0)hc255
hc
k31}
}
if(k10)
{ Delay_1ms(1)
if(k10)
{tiao5PIDKDhcDelay_1ms(25)k11}
}
if(k40)
{ Delay_1ms(1)
if(k40){ PIDKDhcbreak } }
}
}
}
}
******************adc0832****************************
unsigned int Adc0832(unsigned char channel)
{
uchar i0 j ndat0
uint dat0
if(channel0)channel2 通道选择
if(channel1)channel3
ADDI1
_nop_()_nop_()
ADCS0 拉低CS端
_nop_()_nop_()
ADCLK1 拉高CLK端
_nop_()_nop_()
ADCLK0 拉低CLK端形成降1
_nop_()_nop_()
ADCLK1 拉高CLK端
ADDIchannel&0x1
_nop_()_nop_()
ADCLK0 拉低CLK端形成降2
_nop_()_nop_()
ADCLK1 拉高CLK端
ADDI(channel>>1)&0x1
_nop_()_nop_()
ADCLK0 拉低CLK端形成降3
ADDI1 控制命令结束
_nop_()_nop_()
dat0
for(i0i<8i++)
{
dat|ADDO 收数
ADCLK1
_nop_()_nop_()
ADCLK0 形成次时钟脉
_nop_()_nop_()
dat<<1
if(i7)dat|ADDO
}
for(i0i<8i++)
{
j0
jj|ADDO 收数
ADCLK1
_nop_()_nop_()
ADCLK0 形成次时钟脉
_nop_()_nop_()
jj<<7
ndatndat|j
if(i<7)ndat>>1
}
ADCS1 拉低CS端
ADCLK0 拉低CLK端
ADDO1 拉高数端回初始状态
dat<<8
dat|ndat
return(dat) 返回值
}
*************采样滤波**********排序采泡法***************8*
char filter() 采样滤波
{
char count1ijtemp
char value_buf[N]
int sum0
for (count10count1
value_buf[count1] Adc0832(0)
Delay_1ms(1)
}
for (j0j
for (i0i
if ( value_buf[i]>value_buf[i+1] )
{
temp value_buf[i] 实现排列
value_buf[i] value_buf[i+1]
value_buf[i+1] temp
}
}
}
for(count11count1
return (char)(sum(N2))
}
******************DA转换输出****************************************
void send(unsigned int bye) 两锁存脉间发送16位时钟数
{
unsigned char i
_nop_()_nop_()_nop_()
LATCH0
DATA0
for(i0i<16i++)
{
CLOCK0
_nop_()_nop_()_nop_()
if(bye&0x8000)
{
DATA1
}
else
{
DATA0
}
_nop_()_nop_()_nop_()
_nop_()_nop_()_nop_()
CLOCK1
_nop_()_nop_()_nop_()
_nop_()_nop_()_nop_()
_nop_()_nop_()_nop_()
byebye*2
}
LATCH1
_nop_()_nop_()_nop_()
_nop_()_nop_()_nop_()
_nop_()_nop_()_nop_()
_nop_()_nop_()_nop_()
}
void main()
{ int m
uchar n
InitTimer0()
PIDKP1
PIDKI0
PIDKD0
PIDRK18 设定值
PIDCK16 实际值
PIDOperation ()
buf[0] 21
buf[4]0xc
buf[1]PIDRK100
buf[2]PIDRK1010
buf[3]PIDRK10
buf[5] PIDUk100
buf[6] PIDUk1010
buf[7] PIDUk10
xs()
while(1)
{
nfilter() 51 *20
m n*20 51
getdatam
Delay_1ms(50)
PIDCKgetdata
PIDOperation ()
buf[0] 21
buf[1]PIDRK100
buf[2]PIDRK1010
buf[3]PIDRK10
buf[4]0xc
buf[5] PIDCK100
buf[6] PIDCK1010
buf[7] PIDCK10
send(PIDUk*655)
xs()
}
}
void Timer0Interrupt(void) interrupt 1
{
TL0 | 0x00
TH0 0xDC
count
if(k10)keyw()
}
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档