




已阅读5页,还剩76页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机控制技术实验 邵长友 实验一 串口通信实验 一 实验目的 1 认识串口在控制中的应用2 学会用C语言给串口编程二 实验器材 PC机 串口线三 实验内容 用C语言编程实现两个PC机之间的串行通信 实验一 串口通信实验 一 认识串口 在PC机上 有各种各样的接头 其中有两个9针的接头区 见这就是串行通信端口 PC机上的串行接口有多个名称 232口 串口 通信口 COM口 异步口等 实验一 串口通信实验 相关知识一 认识串口 实验一 串口通信实验 一 认识串口 1 查看设备信息进入Windows 我的电脑 系统属性 在 设备管理器 列表中有端口COM和LPT设备信息 如图所示 实验一 串口通信实验 一 认识串口 RS 232 C标准 信号电平标准 逻辑 1 15V 5V逻辑 0 5V 15V 实验一 串口通信实验 RS 232 C控制信号的定义 实验一 串口通信实验 一 认识串口二 实验 1 用串口调试助手实现两个PC之间的通信 2 用C语言编程实现两个PC之间的通信三 编写程序实现PC和单片机之间的串行通信 单片机程序 实验一 串口通信实验 编程知识 编程知识 COM1与COM2的I O端口地址 线路状态寄存器 读 写 D0 接收数据就绪 D1 超越错 D2 奇偶校验错 D3 帧格式错 D4 间断错 D5 发送保持寄存器空 D6 发送移位寄存器空 D7 恒为0 接收数据寄存器收到了一个完整的字符 CPU可以读这个数据 接口可以接收下一个要发送的字符 CPU可以写数据 编程知识 地址 3FDH 线路状态寄存器 读 写 D0 接收数据就绪 D1 超越错 D2 奇偶校验错 D3 帧格式错 D4 间断错 D5 发送保持寄存器空 D6 发送移位寄存器空 D7 恒为0 接收数据寄存器收到了一个完整的字符 CPU可以读这个数据 可以接收下一个要发送的字符 CPU可以写数据 编程知识 地址 3FDH TurboC的串口通信函数 intbioscom intcmd charbyte intport cmd 0 设置通讯参数byte的值1 把字符按字节送到通讯线上2 从通讯线上接收一个字符3 返回通讯端口的状态 port 0 COM1 port 1 COM2 初始化串口 byte值是下列各位的组合 0 x027个数据位0 x038个数据位 0 x00110波特率0 x20150波特率0 x40300波特率0 x60600波特率0 x801200波特率0 xa02400波特率0 xc04800波特率0 xe09600波特率 0 x001个停止位0 x042个停止位 0 x00无校验0 x08奇校验0 x18偶校验 若要求 8位数据位 1个停止位 奇校验 9600波特 byte 0 x03 0 x00 0 x08 0 xe0D7D6D5D4D3D2D1D0 include includemain inti bioscom 0 0 x83 0 do i inportb 0X3fd if i 初始化串口11200波特 无校验 1位停止位 8个数据位 读线路状态寄存器 判断是否有错 D1 超越错D2 奇偶校验错D3 帧格式错D4 间断错 判断接收数据是否就绪 读接收数据寄存器 显示字符 判断发送保持寄存器是否空 如果有键按下 写发送保持寄存器输出字符 实验二 8254定时器实验 一 实验目的 1 掌握8254定时器 计数器的工作原理与编程2 熟悉8259中断控制器的工作原理和使用方法3 掌握硬件中断程序设计的原理与编程方法4 为数据采集程序打下控制采样的基础二 实验内容 1 用TPC UP微机原理实验箱上的定时器芯片编程完成脉冲计数 2 编写程序使PC机主板上的芯片完成定时器 已经集成到一个大的芯片组中 中断实验 微机原理实验箱上的片选地址280h 280h 方式控制字 方式0 计数初值一个八位数 二进制 控制字10h 实验箱上的电路 参考程序 可编程定时器 计数器 一 8253CS 280H 287HGATE0 5VCLK0 单脉冲OUT0 逻辑笔 include include include ApiEx h pragmacomment lib ApiEx lib voidmain BYTEdata if Startup 打开设备 printf ERROR OpenDeviceError n return PortWriteByte 0 x283 0 x10 设8253计数器0工作方式0 只写低字节 PortWriteByte 0 x280 0 x0f 写入计数初值16 while kbhit 有键按下则退出 PortReadByte 0 x280 关闭设备 include includevoidinterruptmyint8 void voidmain void disable outportb 0 x43 0 x36 0 x43是定时器控制寄存器地址outportb 0 x40 0 x9d 0 x40是定时器0通道地址outportb 0 x40 0 x2e 0 x9d 0 x2e分别是计数值低八位和高八位setvect 0 x08 myint8 设置中断向量enable while 1 利用PC机上的定时器通道0工作在方式3 计数时间到产生中断 voidinterruptmyint8 void putchar 8 outportb 0 x20 0 x20 第一个0 x20主8259的OCW2的 地址 第二个0 x20是中断结束命令 includevoidinterruptmyint8 void intcount 1 voidmain void disable outportb 0 x43 0 x30 outportb 0 x40 0 x0 outportb 0 x40 0 x0 setvect 0 x08 myint8 enable while 1 voidinterruptmyint8 void chars 中国海洋大学青岛学院机电工程系 FILE fp fp fopen E test txt w fwrite s 2 15 fp fclose fp outportb 0 x20 0 x20 通道0 方式0 定时时间到调用中断服务程序 实验三 RS485总线实验 实验目的 1 理解RS485的通信原理2 学会RS485的C语言编程实验内容 1 利用RS232 RS485无源转换器给PC机组网2 利用C语言编写RS485的通信程序 1 RS 485的电气特性 逻辑 1 以两线间的电压差为 2 6 V表示 逻辑 0 以两线间的电压差为 2 6 V表示 接口信号电平比RS 232 C降低了 就不易损坏接口电路的芯片 且该电平与TTL电平兼容 可方便与TTL电路连接 2 RS 485的数据最高传输速率为10Mbps 3 RS 485接口是采用平衡驱动器和差分接收器的组合 抗共模干能力增强 即抗噪声干扰性好 4 RS 485接口的最大传输距离标准值为4000英尺 实际上可达3000米 另外RS 232 C接口在总线上只允许连接1个收发器 即单站能力 而RS 485接口在总线上是允许连接多达128个收发器 即具有多站能力 这样用户可以利用单一的 RS485网络 RS485网络 连线时 手拉手 实验程序 通信协议 发送的命令 xxRn 命令前导符xx 两位ASCII从机地址R 表示要求从机发送数据n 一位ASCII码0 9 表示发送数据的类型 命令结束符接收的数据格式 xxddddddddd 命令前导符xx 两位ASCII从机地址ddddddddd 九位ASCII码数据 命令结束符 通信协议 发送的命令 xxRn 命令前导符xx 两位ASCII从机地址R 表示要求从机发送数据n 一位ASCII码0 9 表示发送数据的类型 命令结束符接收的数据格式 xxddddddddd 命令前导符xx 两位ASCII从机地址ddddddddd 九位ASCII码数据 命令结束符 include includemain inti j k n charc cmd xxRn charaddress xx chardata xxAAAAAAAAA bioscom 0 0 x83 0 do printf pleaseinputtheslavecomputeraddressyouwanttocommunicatewith 00 99 scanf d 主机程序 通信协议 接收到的信号 xxRn 命令前导符xx 两位ASCII从机地址R 表示要求从机发送数据n 一位ASCII码0 9 命令结束符发回的数据格式 xxddddddddd 命令前导符xx 两位ASCII从机地址ddddddddd 九位ASCII码数据 命令结束符 include includemain inti j n charc cmd 5 charaddress 00 chardata0 AAAAAAAAA chardata1 BBBBBBBBB chardata2 CCCCCCCCC chardata3 DDDDDDDCC printf pleasesetupthiscomputeraddress 00 99 scanf d 从机程序 实验四 pid程序演示实验 一 实验目的 理解数字PID控制器的设计方法二 实验内容 1 运行C语言PID演示程序 分析设定值 被控量 偏差 控制量的变化 2 编写PIDMATLAB仿真程序 分析运行结果 实验四 pid程序演示实验 y k y k 1 0 9753 y k 2 0 00003284 u k 0 00006568 u k 1 0 00003248 u k 2 U s C语言PID演示程序 include includetypedefstructPID doubleCommand 输入指令doubleProportion 比例系数doubleIntegral 积分系数doubleDerivative 微分系数doublepreErr 前一拍误差doublesumErr 误差累积 PID doublePIDCale PID p doublefeedback doubledErr Err Err p Command feedback 当前误差p sumErr Err 误差累加dErr Err p preErr 误差微分p preErr Err return p Proportion Err 比例项 p Derivative dErr 微分项 p Integral p sumErr 积分项 typedefstructmotor doublelastY doublepreY doublelastU doublepreU motor voidmotorInit motor m memset m 0 sizeof motor y k y k 1 0 9753 y k 2 0 00003284 u k 0 00006568 u k 1 0 00003248 u k 2 doublemotorCal motor m doubleu doubley 1 9753 m lastY 0 9753 m preY 0 00003284 u 0 00006568 m lastU 0 00003284 m preU 二阶系统m preY m lastY m lastY y m preU m lastU m lastU u returny y k y k 1 0 9753 y k 2 0 00003284 u k 0 00006568 u k 1 0 00003248 u k 2 voidmain FILE fp fopen data txt w PIDsPID motorm motor intk 0 doubleu doubley 0 PIDInit while k 1000 fprintf fp d设定值 f被控量 f偏差 f控制量 f n k sPID Command y sPID Command y u u PIDCale C语言程序 include includetypedefstructPID doubleCommand 输入指令doubleProportion 比例系数doubleIntegral 积分系数doubleDerivative 微分系数doublepreErr 前一拍误差doublesumErr 误差累积 PID doublePIDCale PID p doublefeedback doubledErr Err Err p Command feedback 当前误差p sumErr Err 误差累加dErr Err p preErr 误差微分p preErr Err return p Proportion Err 比例项 p Derivative dErr 微分项 p Integral p sumErr 积分项 voidPIDInit PID p memset p 0 sizeof PID 初始化 typedefstructmotor doublelastY doublepreY doublelastU doublepreU motor voidmotorInit motor m memset m 0 sizeof motor doublemotorCal motor m doubleu doubley 1 9753 m lastY 0 9753 m preY 0 00003284 u 0 00006568 m lastU 0 00003284 m preU 二阶系统m preY m lastY m lastY y m preU m lastU m lastU u returny voidmain FILE fp fopen E data txt w PIDsPID motorm motor intk 0 doubleu doubley 0 PIDInit clearall closeall ts 0 001 sys tf 50 0 125 7 0 dsys c2d sys ts z num den tfdata dsys v u 1 0 0 u 2 0 0 y 1 0 0 y 2 0 0 x 0 0 0 error 1 0 error 2 0 fork 1 1 1000time k k ts S 2 ifS 1kp 10 ki 0 1 kd 15 StepSignalrin k 1 elseifS 2kp 10 ki 0 1 kd 15 SineSignalrin k 0 5 sin 2 pi k ts end 设一被控对象G s 50 0 125s 2 7s 用增量式PID控制算法编写仿真程序 输入分别为单位阶跃 正弦信号 采样时间为1ms 控制器输出限幅 5 5 仿真曲线包括系统输出及误差曲线 du k kp x 1 kd x 2 ki x 3 PIDControlleru k u 1 du k Restrictingtheoutputofcontrollerifu k 5u k 5 endifu k 5u k 5 end Linearmodelyout k den 2 y 1 den 3 y 2 num 2 u 1 num 3 u 2 error k rin k yout k Returnofparametersu 2 u 1 u 1 u k y 2 y 1 y 1 yout k x 1 error k error 1 CalculatingPx 2 error k 2 error 1 error 2 CalculatingDx 3 error k CalculatingIerror 2 error 1 error 1 error k endfigure 1 plot time rin b time yout r xlabel time s ylabel rin yout figure 2 plot time error r xlabel time s ylabel error 增量式PID控制算法Matlab仿真程序 clearall closeall ts 0 001 sys tf 50 0 125 7 0 dsys c2d sys ts z num den tfdata dsys v u 1 0 0 u 2 0 0 y 1 0 0 y 2 0 0 x 0 0 0 error 1 0 error 2 0 fork 1 1 1000time k k ts S 2 ifS 1kp 10 ki 0 1 kd 15 rin k 1 StepSignalelseifS 2kp 10 ki 0 1 kd 15 SineSignalrin k 0 5 sin 2 pi k ts enddu k kp x 1 kd x 2 ki x 3 PIDControlleru k u 1 du k Restrictingtheoutputofcontrollerifu k 5u k 5 endifu k 5u k 5 end Linearmodelyout k den 2 y 1 den 3 y 2 num 2 u 1 num 3 u 2 error k rin k yout k Returnofparametersu 2 u 1 u 1 u k y 2 y 1 y 1 yout k x 1 error k error 1 CalculatingPx 2 error k 2 error 1 error 2 CalculatingDx 3 error k CalculatingIerror 2 error 1 error 1 error k endfigure 1 plot time rin b time yout r xlabel time s ylabel rin yout figure 2 plot time error r xlabel time s ylabel error 实验五 标度变换和非线性补偿 实验目的 1 理解标度变换和非线性补偿原理2 学会标度变换和非线性补偿C语言编程实验内容 1 标度变换的C语言编程2 非线性补偿的C语言编程3 牛顿迭代法的C语言编程 一 标度变换 某热处理炉温度测量仪表的量程为0 800 C 在某一时刻计算机采样并经数字滤波后的数字量为CDH 求此时的温度是多少 设该仪表的量程是线性的 8位A D 0 800 C经热电偶和信号调理电路后0 5V 再经过模数转换后 0 255 0 FFH include stdio h defineAM800 defineA00 defineNM255 defineN00intScale transform intx inty y A0 AM A0 x N0 NM N0 return y voidmain void intx y printf 提示 输入 1退出程序 n do printf 请输入整数0 255 scanf d 标度变换程序 include stdio h defineAM800 defineA00 defineNM255 defineN00intScale transform intx inty y A0 AM A0 x N0 NM N0 return y voidmain void intx y printf 提示 输入 1退出程序 n do printf 请输入整数0 255 scanf d 二 非线性补偿 线性插值算法 退火炉的温度 0 800 检测采用K型热电偶 经过150倍两级放大 变成0 5V的标准电压信号 再经过A D转换变为0 FFH的数字信号 其热电势V与温度t之间的分度值下表所示 可以看出 热电偶温度与mV变化曲线比较平缓 故可采用线性插值法进行补偿 非线性补偿程序 Note YourchoiceisCIDE include stdio h intvolttotmp unsignedcharvlt unsignedcharvolt 0 0 x0f 0 x1f 0 x2f 0 x3e 0 x4e 0 x5d 0 x6d 0 x7d 0 x8e 0 x9e 0 xae 0 xbf 0 xcf 0 xdf 0 xef 0 xff inttemp 0 50 100 150 200 250 300 350 400 450 500 550 600 650 700 750 800 inti tmp for i 0 i 17 i if vlt volt i 1 tmp temp i temp i 1 temp i vlt volt i volt i 1 volt i break return tmp voidmain intvlt temp for printf pleaseinputanumber 00 ff scanf x 3 流量标度变换所用的牛顿迭代法 例 压差流量计 其流量与差压的公式为 牛顿迭代程序 include stdio h include math h voidmain floaty last y x while 1 printf 请输入一个正数 printf 请输入一个正数 scanf f do last y y y last y x last y 2 while fabs y last y 0 001 printf f的平方根 f n x y 牛顿迭代法演示程序 include stdio h include math h voidmain floaty last y x printf 提示 输入 1退出程序 n while 1 printf 请输入一个正数 scanf f 实验六 键盘和LED显示实验 实验目的 1 理解非编码矩阵键盘的扫描原理2 理解LED动态扫描工作原理3 理解串行通信的工作原理实验内容 1 4X4矩阵扫描的C语言编程2 74HC595串行移位的C语言编程3 LED动态显示的C语言编程 4X4矩阵键盘 4X4矩阵键盘 rcode 0 xEF 逐行扫描初值for i 0 i 4 i P2 rcode 输出行扫描码if P2 行扫描码左移一位 P20 P23 列P24 P27 行 74HC595 74HC595 DS SH CP SH CP MR反 OE反 74HC595 st cp595 0 for i 0 i 8 i sh cp595 0 m segcode m 程序main cledkey cledkey h main c includeintmain void unsignedcharkey while 1 if Keydown key KeyVal senddata table key key 8 return0 ledkey c includesbitds595 P1 0 sbitst cp595 P1 1 sbitsh cp595 P1 2 voiddelay 延时子程序 unsignedcharn m for n 100 n 0 n for m 300 m 0 m unsignedcharKeydown void 判断是否有键按下 P2 0 x0F 发全0行扫描码 列线输入if P2 ledkey h ifndef ledkey H define ledkey H includesbitds595 P1 0 sbitst cp595 P1 1 sbitsh cp595 P1 2 unsignedcharcodetable 0 xc0 0 xf9 0 xa4 0 xb0 0 x99 0 x92 0 x82 0 xf8 0 x80 0 x90 0 x88 0 x83 0 xc6 0 xa1 0 x86 0 x8e 共阳数码管显示0 Fvoiddelay 延时子程序unsignedcharKeydown void 判断是否有键按下unsignedcharKeyscan void 按键扫描程序 返回键编码voidsenddata unsignedcharsegcode unsignedcharposition unsignedcharKeyVal endif 实验七 数字滤波实验 实验目的 1 理解数字滤波的基本原理2 学会编写数字滤波的C语言程序实验内容 1 程序判断滤波2 中位值滤波3 平均值滤波4 加权平均值滤波5 一阶滞后滤波 程序判断滤波 Note YourchoiceisCIDE include stdio h includefloatprogram detect filter floatold value floatnew value floatoffset floatsample value if fabs new value old value offset sample value old value elsesample value new value return sample value main inti floatvalue floata 12 2 2 3 8 1 2 5 3 3 2 9 5 4 3 3 7 3 3 6 7 2 3 9 for i 0 i 12 i printf 1f a i printf n for i 0 i 11 i a i 1 program detect filter a i a i 1 0 5 for i 0 i 12 i printf 1f a i getch 中位值滤波 Note YourchoiceisCIDE include stdio h floatmiddle filter floatmiddle value intcount floatsample value data inti j for i 1 i i j if middle value j 1 middle value j data middle value j 1 middle value j 1 middle value j middle value j data sample value middle value count 1 2 return sample value main floatx floata 5 2 9 5 2 7 0 x middle filter a 5 printf f x printf hekkk getch 算术平均值滤波 Note YourchoiceisCIDE include stdio h floatmiddle filter floatmiddle value intcount floatsample value data inti j for i 1 i i j if middle value j 1 middle value j data middle value j 1 middle value j 1 middle value j middle value j data sample value middle value count 1 2 return sample value main floatx floata 5 2 9 5 2 7 0 x middle filter a 5 printf f x printf hekkk getch 加权平均值滤波 Note YourchoiceisCIDE include stdio h includefloattimes filter floatdata buf floatsample value floatfilter k 5 0 05 0 15 0 25 0 25 0 3 sample value filter k 0 data buf 0 filter k 1 data buf 1 filter k 2 data buf 2 filter k 3 data buf 3 filter k 4 data buf 4 return sample value main floatx floata 5 2 2 4 5 9 x times filter a printf f x getch 一阶惯性滤波 Note YourchoiceisCIDE include stdio h includefloatlow filter floatsensing val
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论