华中科技大学C51单片机应用与C语言程序设计课件-总纲

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Slide1DEPUSH中级机器人制作与编程第一讲C51单片机与应用(2)ISP下载线①②③④⑥⑦⑧⑨⑤①—串行接口;②—ISP接口;③—电源接口;④—三位开关;⑤—绿色LED电源指示灯;⑥—AT89S52单片机;⑦—“Reset”按钮;⑧—面包板;⑨—专用电机控制接口插座Slide21.KeiluVision2IDE——开发环境,生成可执行文件2.SLISP——将可执行文件下载到单片机3.串口调试终端——显示单片机与PC机交互信息Slide3实验过程第一步:建立项目(KeiluVision2IDE)1.新建工程2.芯片选型3.添加源程序(新建、保存、添加)4.生成执行文件第二步:将执行文件输入单片机(SLISP)1.参数选择2.选择执行文件3.下载第三步:查看单片机输出信息(串口调试终端)1.串口选择2.打开串口Slide4DEPUSH中级机器人制作与编程通讯测试:第一个程序Slide5DEPUSH中级机器人制作与编程通信参数设置及器件选择Slide6DEPUSH中级机器人制作与编程程序分析#includeuart.hintmain(void){uart_Init();//串口初始化printf(Hello,thisisamessagefromyourRobot\n);}添加头文件uart.h程序入口,main()函数printf()函数,打印输出,在终端上显示“//”表示注释,后面内容将被编辑器忽视Slide7输入/输出(I/O)接口是单片机和外部设备之间信息交换和控制的桥梁。它主要有以下几个作用:(1)实现和不同外部设备的速度匹配不同的外设工作速度差别很大,而且一般来讲外设的响应速度远远小于CPU的运算速度。所以接口电路就必须适应CPU和外设的速度上的这个矛盾。(2)改变数据传送的方式I/O数据有并行和串行两种方式。(3)按照需要为CPU提供更多资源,如RAM和ROM(4)改变信号的性质和电平CPU和外设之间的信号有几类:数据型(程序代码和计算结果等)、状态型(反映外设的工作状态,如启动、忙、空闲等)和控制型(控制外设的工作状态,如外设的开和关、电机的转动和停止、速度的控制等)。1接口的作用第二讲输出接口与机器人伺服电机控制Slide851系列单片机有4个8位的并行I/O口:P0、P1、P2和P3。既可作为普通的I/O口、也可用作特殊功能。AT89S52引脚I/O定义图2AT89S52引脚Slide9DEPUSH中级机器人制作与编程使用P1端口的第一脚(P1_0)来控制发光二极管(LED)闪烁。while(1){P1_0=1;//P1_0输出高电平delay_nms(500);//延时500msP1_0=0;//P1_0输出低电平delay_nms(500);//延时500ms}●while循环函数●delay_nms延时函数单灯闪烁:Slide10DEPUSH中级机器人制作与编程时序图反应的是高、低电压信号与时间的关系图时序图简介Slide11DEPUSH中级机器人制作与编程伺服电机控制语句零点标定信号时序图while(1){P1_0=1;//P1_0输出高电平delay_nus(1500);//延时1.5msP1_0=0;//P1_0输出低电平delay_nus(20000);//延时20ms}delay_nus(1500);延时时间(μm)Slide12DEPUSH中级机器人制作与编程伺服电机安装伺服电机与教学底板的连线原理图(左)和实际接线示意图(右)Slide13DEPUSH中级机器人制作与编程伺服电机测试1.3ms的控制脉冲序列使电机顺时针全速旋转1.7ms的连续脉冲序列使电机逆时针全速旋转while(1){P1_0=1;delay_nus(1300);P1_0=0;delay_nus(20000);}while(1){P1_0=1;delay_nus(1700);P1_0=0;delay_nus(20000);}Slide14DEPUSH中级机器人制作与编程伺服电机旋转时间控制for循环for(表达式1;表达式2;表达式3)语句按如下方式理解for(循环变量赋初值;循环条件;循环变量增值)语句for(Counter=1;Counter=100;i++){P1_1=1;delay_nus(1700);P1_1=0;delay_nms(20);}Slide15DEPUSH中级机器人制作与编程用PC机控制机器人的运动scanf(格式控制,地址表列);printf(ProgramRunning!\n);printf(Pleaseinputpulsenumber:\n);scanf(%d,&PulseNumber);printf(Pleaseinputpulseduration:\n);scanf(%d,&PulseDuration);for(Counter=1;Counter=PulseNumber;Counter++){……delay_nus(PulseDuration);……}Slide16DEPUSH中级机器人制作与编程基本巡航动作机器人及其前进方向的定义向前巡航for循环的参数控制了发送给电机的脉冲数量。由于每个脉冲的时间是相同的,因而for循环的参数也控制了伺服电机运行的时间。for(counter=0;counter130;counter++)//运行3秒{P1_1=1;delay_nus(1700);P1_1=0;//左轮逆时针P1_0=1;delay_nus(1300);P1_0=0;//右轮顺时针delay_nms(20);}第三讲机器人巡航控制Slide17DEPUSH中级机器人制作与编程其它巡航动作将delay_nus函数的参数n以不同的值组合就可以使机器人以其它的方式运行向后行走P1_1=1;delay_nus(1300);P1_1=0;//左轮顺时针P1_0=1;delay_nus(1700);P1_0=0;//右轮逆时针delay_nms(20);原地左转P1_1=1;delay_nus(1300);P1_1=0;//左轮顺时针P1_0=1;delay_nus(1300);P1_0=0;//右轮顺时针delay_nms(20);原地右转P1_1=1;delay_nus(1700);P1_1=0;//左轮逆时针P1_0=1;delay_nus(1700);P1_0=0;//右轮逆时针delay_nms(20);Slide18DEPUSH中级机器人制作与编程其它巡航动作——以某一轮子为支点旋转从前面向左旋转P1_1=1;delay_nus(1500);P1_1=0;//左轮静止P1_0=1;delay_nus(1300);P1_0=0;//右轮顺时针delay_nms(20);从前面向右旋转P1_1=1;delay_nus(1700);P1_1=0;//左轮逆时针P1_0=1;delay_nus(1500);P1_0=0;//右轮静止delay_nms(20);从后面向左旋转P1_1=1;delay_nus(1500);P1_1=0;//左轮静止P1_0=1;delay_nus(1700);P1_0=0;//右轮逆时针delay_nms(20);从后面向右旋转P1_1=1;delay_nus(1300);P1_1=0;//左轮顺时针P1_0=1;delay_nus(1500);P1_0=0;//右轮静止delay_nms(20);Slide19DEPUSH中级机器人制作与编程匀变速运动:防止机器人加速过快for(pulseCount=10;pulseCount=200;pulseCount=pulseCount+1){P1_1=1;delay_nus(1500+pulseCount);P1_1=0;P1_0=1;delay_nus(1500-pulseCount);P1_0=0;delay_nms(20);}定义运动子函数:Forward()、Left_Turn()、Right_Turn()、Backward()voidForward(void){inti;for(i=1;i=65;i++){P1_1=1;delay_nus(1700);P1_1=0;P1_0=1;delay_nus(1300);P1_0=0;delay_nms(20);}}Slide20DEPUSH中级机器人制作与编程建立复杂运动函数如果要让机器人执行一个更长,更复杂的动作,前面讲到的方法将会很麻烦。●用字符数组存储运动动作●用switch语句解释这些动作charNavigation[10]={'F','L','F','F','R','B','L','B','B','Q'};while(Navigation[address]!='Q'){switch(Navigation[address]){case'F':Forward();break;case'L':Left_Turn();break;case'R':Right_Turn();break;case'B':Backward();break;}address++;}switch(表达式){case常量表达式1:语句1;break;case常量表达式2:语句2;break;…case常量表达式n:语句n;break;default:语句n+1;break;}switch分支语句一般形式:Slide21DEPUSH中级机器人制作与编程第四讲输入接口与机器人触觉导航通过前面两章的学习,你已经掌握如何用单片机的端口来控制机器人的各种运动。当时,连接机器人伺服电机的端口是作为输出使用。从本章开始,单片机端口将作为输入使用。触觉导航触须(胡须)硬件安装好胡须的机器人Slide22DEPUSH中级机器人制作与编程第四讲输入接口与机器人触觉导航测试胡须胡须电路图intP1_4state(void)//获取P1_4的状态{return(P1&0x10)?1:0;}intP2_3state(void)//获取P2_3的状态{return(P2&0x08)?1:0;}C语言的一种运算符——?表达式1?表达式2:表达式3Slide23单片机AT89S52的四个端口P0、P1、P2和P3是可以按位来操作,从低到高依次为第0口、第1口……第7口,书写分别为PX.0、PX.1、……、PX.7(X取0到3)。P1&0x10和P2&0x08分别提取了P1.4和P2.3的值,屏蔽了其他位。Slide24DEPUSH中级机器人制作与编程第四讲输入接口与机器人触觉导航胡须导航if((P1_4state()==0)&&(P2_3state()==0)){Backward();Left_Turn();Left_Turn();}elseif(P1_4state()==0){Backward();Left_Turn();}elseif(P2_3state()==0){Backward();Right_Turn();}elseForward();两边同时碰到,后退,左转两次}右边碰到,后退再左拐}}左边碰到,后退再右拐没有障碍物,前进Slide25DEPUSH中级机器人制作与编程第四讲输入接口与机器人触觉导航当机器人进入墙角时,左胡须触墙,于是它右转,向前行走,右胡须触墙,于是左转前进,又碰到左墙,再次碰到右墙…。如果不是你把它从墙角拿出来,它就会一直困在墙角里而出不来。逃离墙角死区修改程序让机器人碰到上述问题时逃离死区。技巧是记下胡须交替触动的总次数。技巧的关键是程序必须记住每个胡须的前一次触动状态,并和当前触动状态对比。如果状态相反,就在交替总数上加1。如果这个交替总数超过了程序中预先给定的阀值,那么就该做一个“U”型转弯,并且把胡须交替计数器复位。编程实现依赖于if…else嵌套语句if(P1_4state()!=P2_3state()){if((old2!=P1_4state())&&(old3!=P2_3state())){counter=counter+1;old2=P1_

1 / 54
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功