




已阅读5页,还剩73页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机控制技术实验 邵长友 实验一、串口通信实验 一、实验目的: 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 6 5 9 CD:载波检测 1 RxD:接收数据 2 TxD:发送数据 3 DTR:数据终端就绪 4 GND:地线 5 DSR:数据设备就绪 6 RTS:请求发送 7 CTS:清除发送 8 RI:振铃指示 9 外部 设备 DCE 主 机 DTE 实验一、串口通信实验 一、认识串口 二、实验 (1)用串口调试助手实现两个PC之间的通信 (2)用C语言编程实现两个PC之间的通信 三、编写程序实现PC和单片机之间的串行通信 (单片机程序) 实验一、串口通信实验 PC机中的串行口资资源默 认认配置 COMxI/O端口地址中断号 COM13F83FFhIRQ4 COM22F82FFhIRQ3 COM33E83EFhIRQ4* COM42E82EFhIRQ3* 编程 知识 编程 知识 COM1COM2DLAB寄存器名称及作用 3F8H2F8H0写发送保持寄存器 3F8H2F8H0读接收数据寄存器 3F8H2F8H1写入波特率因子LSB 3F9H2F9H1写入波特率因子MSB 3F9H2F9H0写中断允许寄存器 3FAH2FAH写中断标识 寄存器 3FBH2FBH写线路控制寄存器 3FCH2FCH写MODEM控制寄存器 3FDH2FDH读线路状态寄存器 3FEH2FEH读MODEM状态寄存器 DLAB是线路控制寄存器D7位 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 Turbo C的串口通信函数 int bioscom(int cmd ,char byte , int port ); cmd= 0:设置通讯参数 byte 的值 1:把字符按字节送到通讯线上 2:从通讯线上接收一个字符 3:返回通讯端口的状态 port = 0 : COM1; port= 1 : COM2 初 始 化 串 口 byte值是下列各位的组 合 0x027个数据位 0x038个数据位 0x00 110波特率 0x20 150波特率 0x40 300波特率 0x60 600波特率 0x801200波特率 0xa02400波特率 0xc04800波特率 0xe09600波特率 0x001个停止位 0x042个停止位 0x00无校验 0x08奇校验 0x18偶校验 若要求:8位数据位,1个停止位,奇校验,9600波特。 byte=0x03|0x00|0x08|0xe0 D7 D6 D5 D4 D3 D2 D1 D0 11101011 #include #include main() int i; bioscom(0,0x83,0); do i=inportb(0X3fd); if(i else if(i if(i while(1); 初始化串口1 1200波特,无校验,1位停止位,8个数据位 10000011 读线路状态寄存器, 判断是否有错(D1:超越错D2:奇偶校验 错D3:帧格式错D4:间断错) 判断接收数据是否就绪 读接收数据寄存器,显示字符。 判断发送保持寄存器是否空 如果有键按下, 写发送保持寄存器输出字符 。 实验二、8254定时器实验 一、实验目的: 1)掌握8254定时器/计数器的工作原理与编程 2)熟悉8259中断控制器的工作原理和使用方法 3)掌握硬件中断程序设计的原理与编程方法 4)为数据采集程序打下控制采样的基础 二、实验内容 (1)用TPC-UP微机原理实验箱上的定时器芯片 编程完成脉冲计数 (2)编写程序使PC机主板上的芯片完成定时器 (已经集成到一个大的芯片组中)中断实验 微机原理实验箱上的片选地址 280h 280h 方式控制字 方式0:计数初值一个八位数()二进制,控制字10h 实验箱上的电路 参考程序 /*/ /* 可编程定时器计数器(一) */ /*/ /* 8253CS-280H-287H GATE0-+5V CLK0-单脉冲 OUT0-逻辑笔 */ #include #include #include “ApiEx.h“ #pragma comment(lib,“ApiEx.lib“) void main() BYTE data; if(!Startup() /*打开设备*/ printf(“ERROR: Open Device Error!n“); return; PortWriteByte(0x283,0x10);/*设8253计数器0工作方式0, 只写低字节*/ PortWriteByte(0x280,0x0f);/*写入计数初值16*/ while(!kbhit()/*有键按下则退出*/ PortReadByte(0x280, printf(“%xn“,data);/*打印计数器值*/ Cleanup();/*关闭设备*/ #include #include voidinterrupt myint8(void); voidmain(void) disable(); outportb(0x43,0x36); / 0x43是定时器控制寄存器地址 outportb(0x40,0x9d); /0x40是定时器0通道地址 outportb(0x40,0x2e); /0x9d,0x2e分别是计数值低八位和 高八位 setvect(0x08,myint8); /设置中断向量 enable(); while(1); 利用PC机上的定时器通道0工作 在方式3,计数时间到产生中断 voidinterrupt myint8(void) putchar(8); outportb(0x20,0x20); / 第一个0x20主8259的OCW2的 地址,/第二个0x20是中断结束命令 IR7IR6IR6IR4IR3IR2IR1IR0 0x0f0x0 e 0x0 d 0x0 c 0x0 b 0x0 a 0x0 9 0x0 8 #include void interrupt myint8(void); int count=1; void main(void) disable(); outportb(0x43,0x30); outportb(0x40,0x0); outportb(0x40,0x0); setvect(0x08,myint8) ; enable(); while(1); void interrupt myint8(void) char s=“中国海洋大学 青岛学院机电工程系“; FILE *fp; fp=fopen(“E:test.txt“,“w“); fwrite(s,2,15,fp); fclose(fp); outportb(0x20,0x20); 通道0,方式0,定时时 间到调用中断服务程序 实验三、中断方式实现串口通 信 通过“设备管理器查看键盘和COM1的中断源 8259主片中断源: IR7IR6IR6IR4IR3IR2IR1IR0 0x0f0x0e 0x0d0x0c0x0b 0x0a 0x09 0x08 IR3 IR4 中断控制器8259 IR0 IR1 IR5 IR7 IR6 INT IR2 键盘 COM1 IR7IR6IR6IR4IR3IR2IR1IR0 0x0f0x0e 0x0d0x0c0x0b 0x0a 0x09 0x08 #include #include main() int i; disable(); bioscom(0,0x83,0); do i=inportb(0X3fd); if(i else if(i if(i while(1); 初始化串口1: 1200波特,无校验,1位停止位,8个数据位 实验四、pid 程序演示实验 一、实验目的: 理解数字PID控制器的设计方法 二、实验内容 (1)运行C语言PID演示程序,分析设定 值、被控量、偏差,控制量的变化 (2)编写PID MATLAB仿真程序,分析 运行结果 C语言PID演示程序 #include #include typedef struct PID double Command; /输入指令 double Proportion; /比例系数 double Integral; /积分系数 double Derivative; /微分系数 double preErr; /前一拍误差 double sumErr; /误差累积 PID; void motorInit(motor *m) memset(m,0,sizeof(motor); double PIDCale(PID *p,double feedback) double dErr,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); /积分项 typedef struct motor double lastY; double preY; double lastU; double preU; motor; void motorInit(motor *m) memset(m,0,sizeof(motor); double motorCal(motor *m,double u) double y=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; return y; y(k)= y(k-1)-0.9753*y(k-2)+0.00003284*u(k) +0.00006568*u(k-1)+0.00003248*u(k-2) void main() FILE *fp=fopen(“data.txt“,“w+“); PID sPID; motor m_motor; int k=0; double u; double y=0; PIDInit( sPID.Proportion=2; sPID.Derivative=1; sPID.Integral=0.00001; sPID.Command=10; motorInit( while(k=5 u(k)=5; end if u(k) #include main() int i,j,k,n; char c,cmd=“#xxRn$“; char address=“xx“; char data=“=xxAAAAAAAAA$“; bioscom(0,0x83,0); do printf(“please input the slave computer address you want to communicate with(00-99):“); scanf(“%d“, cmd1=n/10+0x30; cmd2=n%10+0x30; printf(“please input the type of data(0-3):“); scanf(“%d“, cmd4=n+0x30; i=inportb(0X3fd); if(i else for(k=0;k #include main() int i,j,n; char c,cmd5; char address=“00“; char data0=“AAAAAAAAA$“; char data1=“BBBBBBBBB$“; char data2=“CCCCCCCCC$“; char data3=“DDDDDDDCC$“; printf(“please setup this computer address(00-99):“); scanf(“%d“, address0=n/10+0x30; address1=n%10+0x30; bioscom(0,0x83,0); do j=0; for(;) i=inportb(0X3fd); if(i else if(i if(c=$)break; cmdj+=c; if(cmd0=#) if(cmd1=address0) for(j=0;j=0.001); printf(“%f的平方根:%fn“,x,y); 实验六、键盘和LED显示实验 实验目的: 1、理解非编码矩阵键盘的扫描原理 2、理解LED动态扫描工作原理 3、理解串行通信的工作原理 实验内容: 1、4X4矩阵扫描的C语言编程 2、74HC595串行移位的C语言编程 3、LED动态显示的C语言编程 4X4矩阵键盘 4X4矩阵键盘 rcode = 0xEF; / 逐行扫描初值 for(i=0;i float program_detect_filter(float old_value, float new_value,float offset) float sample_value; if(fabs(new_value-old_value)offset) sample_value=old_value; else sample_value=new_value; return(sample_value); main() int i; float value; float a12=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=i;j-) if(middle_valuej-1middle_valuej) data=middle_valuej-1; middle_valuej-1=middle_valuej; middle_valuej=data; sample_value=middle_value(count-1)/2; return(sample_value); main() float x; float a5=2,9,5.2,7,0; x=middle_filter(a,5); printf(“%f“,x); printf(“hekkk“); getch(); 算术平均值滤波 /* Note:Your choice is C IDE */ #include “stdio.h“ float middle_filter(float middle_value , int count) float sample_value, data; int i, j; for (i=1; i=i;j-) if(middle_valuej-1middle_valuej) data=middle_valuej-1; middle_valuej-1=middle_valuej; middle_valuej=data; sample_value=middle_value(count-1)/2; return(sample_value); main() float x; float a5=2,9,5.2,7,0; x=middle_filter(a,5); printf(“%f“,x); printf(“hekkk“); getch(); 加权平均值滤波 /* Note:Your choice is C IDE */ #include “stdio.h“ #include float times_filter(float data_buf) float sample_value; float filter_k5=0.05,0.15,0.25,0.25,0.3; sample_value=filter_k0*data_buf0+filter_k1*data_buf1+ filter_k2*data_buf2+ filter_k3*data_buf3+ filter_k4* data_buf4; return(sample_value); main() float x; float a5=2,2,4,5,9; x=times_filter(a); printf(“%f“,x); getch(); 一阶惯性滤波 /* Note:Your choice is C IDE */ #include “stdio.h“ #include float low_filter(float sensing_value,float previous_value,float factor) float sample_value; sample_value=(1-factor)*sensing_value + factor*previous_value; return(sample_value); main() int i; float x; float a10=1.9,2,2.1,5,2.3,2.4,2.8,5,3.0,3.2; float b10; for(i=0;i #include #include “ApiEx.h“ #pragma comment(lib,“ApiEx.lib“) void main() BYTEdata,i,tab1=0x03,0x06,0x0c,0x09,tab2=0x03,0x09,0x0c,0x06; int buf = 0x33,d; printf(“Press any key to begin!nn“); getch(); printf(“press any key
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 上海高一(下)期末物理测试题及答案
- 家用电器产品维护维修服务协议
- 2022学年上海交大附中高一(下)期中地理试题及答案
- 探望同学150字(10篇)
- 历史朝代变迁及重要事件探究教案
- 八年级英语阅读活动方案
- 农户与农业种植合作社种植协议
- 公交公司避暑活动方案
- 公交营运活动方案
- 公众聚餐活动方案
- 砌筑挡土墙搭设脚手架专项方案设计
- 长篇情感电台读文(10篇)精选
- “文化引导型”城市更新思想思考与实践课件
- 卷心菜中过氧化物酶热稳定性的初步研究
- DB35_T 169-2022 森林立地分类与立地质量等级
- 涡轮增压器系统及常见故障案例
- 动火作业危害识别及控制措施清单
- 宋大叔教音乐第三单元进阶版讲义2
- 26个科室建设指南
- 安全带检测报告(共8页)
- 河道治理监理月报
评论
0/150
提交评论