收藏 分享(赏)

第一章 交互式c语言.ppt

上传人:scg750829 文档编号:9173088 上传时间:2019-07-26 格式:PPT 页数:89 大小:839.50KB
下载 相关 举报
第一章   交互式c语言.ppt_第1页
第1页 / 共89页
第一章   交互式c语言.ppt_第2页
第2页 / 共89页
第一章   交互式c语言.ppt_第3页
第3页 / 共89页
第一章   交互式c语言.ppt_第4页
第4页 / 共89页
第一章   交互式c语言.ppt_第5页
第5页 / 共89页
点击查看更多>>
资源描述

1、第一章 交互式程序设计,胡真华 湖南工业大学电气与信息工程学院,内容简介,程序设计的目标及原则 交互式C语言的编程环境 交互式C语言的学习(参照标准C),程序设计,软件项目开发的目标 在给定成本、进度的前提下,开发出具有: 正确性、可靠性、有效性、 可理解性、可修改性、可维护性、可移植性、 可重用性和可追踪性 的软件产品,1.关于软件的运行特征,正确性:软件满足规格说明及完成用户目标的程度 可靠性:在给定时间间隔内,软件成功运行的概率 有效性:软件的时空效率 完整性:控制未被授权人员访问程序和数据的程度 可用性:使用软件的难易程度,2.关于软件承受修改的能力,可理解性:结构清晰,直接反映问题需

2、求,易理解 可维护性:软件交付使用后进行修改的难易程度 灵活性:改变软件的功能或行为所需的工作量,3.关于软件对新环境的适应能力,可移植性:软件从一个环境移到另一个的难易程度 可重用性:软件可以在多种场合应用的程度 可互操作性:多个软件交换信息并相互使用已交换信息的能力,程序设计规则:,统一的、有意义的变量命名与函数命名方法 统一的编码风格与格式 统一的、准确的、完整的程序注解 变量与函数的作用域尽量小 尽量采用简单的算法 模块之间的接口尽量简单、自然,算法,货郎担问题 冒泡算法与快速排序算法,交互式c语言编程环境,JC由两部分组成:编译环境(包含交互式命令行编辑和调试功能)、能力风暴操作系统

3、 JC 语句交互运行方式,可以不用编写完整程序,在机器人上直接运行一条或多条JC 语句,观察执行结果。此功能可用于快速学习JC 语言,同时这也是强大的调试手段,可以在机器人运行时调试程序。 在JC 代码编辑界面中可以看到,交互信息窗口上方有一行编辑框,是JC 语句的交互输入区。在JC 语句输入区可以直接输入JC 语句和调用库函数,语句数量不限。输入好后敲一下回车键,连接好串口通信线,打开机器人电源开关, VJC 会把语句编译后下载到机器人上立即运行。运行结果会在交互信息窗口中显示,如果输入语句有语法错误,也会显示出来。,例1:输入beep(),并回车。机器人马上执行这一语句,响一声,在交互信息

4、窗口显示出运行结果。本例中显示:表示beep()无返回值。,例2:输入photo(1),并回车。 photo(1)是检测左光敏的值,本例机器人返回数值 203,说明这一时刻左光敏传感器检测到的光强值是203。,例3:输入int p=0; p=photo(1); printf(“%dn“,p);并回车。这个例子稍复杂点,执行3 条JC 语句,最后机器人在LCD 上显示出检测到的光强值。,编译方式:不直接编译生成针对特定处理器的机器代码,而是先编译生成基于堆栈虚拟机的伪代码,然后由能力风暴操作系统解释执行。这种编译方式的优点是: 解释执行:允许检查运行错误。例如:JC在运行时,数组下标的检查。,设

5、计方便:一方面为一个堆栈编写编译器比为特定处理器编写编译器更容易;另一方面因为JC伪代码与机器硬件无关,所以从一种机器移植到另一种机器上,只需重写操作系统解释模块,而不是重写编译器。 代码更精简:伪代码比机器代码更简短 便于多任务设置:由于伪代码是完全基于堆栈的,进程状态完全由它的堆栈和程序计数器所决定。因此只需要装载新的堆栈指针和程序计数器就可以方便地实现任务切换。任务切换由操作系统处理,而不是编译器。但上述优点的代价是牺牲了一部分的执行速度,JC 语言的学习(参照标准 C),C 语言的复习内容: 1、函数 2、条件判断语句:if 、 if else 、 if else if 3、while

6、 、 for 、 break 和 continue 4、局部变量和全局变量 5、数组与指针 6、位运算,函数 一个C程序可由一个主函数和若干个函数构成。由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次。 程序参见 、 C程序设计P143,void main() int i; for(i=0 ; i4 ; i+) drive( 80 , 0 ); wait( 0.500000 ); stop(); drive( 0 , 80 ); wait( 0.100000 ); stop(); ,void main() int b; b = sound(10); pr

7、intf(“%dn”,b); int sound(int n) int i; for(i=0;in;i+) beep(); return(micphone(); 代码调用了sound 函数,让机器人叫10 下,并将sound(10)的返回值在机器人液晶屏上显示出来。,变量的定义、作用域范围(参见); 例:int a; 定义了一个整型变量a。 或=; 例:float P=1.5; 定义了一个浮点型变量P,并初始化为1.5。 在JC中,可为整型(int)、长整型(long)、浮点数型float)、字符型(char)或指针类型,它决定所定义变量的存储方式和运算方法。这是定义变量的一般形式。在定义指针

8、和数组时,形式会有所改变,这将在后面说明。,变量的初始化(P) 局部变量和全局变量可在定义时初始化。若不给出初始值,变量初始化为零。 所有的全局变量必须初始化为常量。局部变量可被初始化为任意表达式的值,包括任意的全局变量、函数调用、函数参数或已初始化的局部变量。,int i=50; long j=100L; float PI=3.14159; float permeter(float r) int x; float y=PI; y = 2.0 * PI * r; return y; ,任何时候只要运行函数,该函数中包含的局部变量将被初始化。 任何时候只要复位情况出现,全局变量将会初始化。复位情

9、况包括: 代码下载; 主程序main()运行; 系统硬件复位(按能力风暴上的复位按钮或打开电源开关时)。,常量:程序运行过程,其值不能被改变的量称为常量。(P10) a) 整型常量 整型常量可定义为十进制形式、使用“0x“前缀的十六进制形式、使用“0b”前缀的二进制形式、但不支持使用零前缀的八进制常量。 b) 长整型常量 通过在十进制整数后加上后缀“ L ”或“ l ”,可创建长整型常量。例如,0L是长整型的零。 c) 浮点数型常量 浮点数可使用科学计数法 (例, “ 10e3“ 或“10E3“) 或用小数点分段。例如,浮点数零可以“0.“,“0.0“或“0E1“的形式给出,而不能仅仅用“0“

10、。由于能力风暴智能机器人无浮点运算硬件,浮点运算将比整型运算慢,要节省地使用浮点运算。,d) 字符型与字符串型常量 单引号括起的字符型常量的值是其 ASCII 码值 。字符串型常量用成对的双引号定义。 e) NULL NULL是一个特殊常量,NULL具有零值,可对指针或数组变量赋值,或进行比较。通常,其它常量是不能转成指针类型,所以很多情况下要用到NULL。 例如,为检查指针是否已初始化,需要将其与NULL进行比较,避免试图对空指针读写。 又如,在一个链表结构中,每个元素包含一个数值和指向下一个元素的指针,为了找到链表的结尾,就需将指向下一个元素的指针与NULL进行比较。,数据类型(P10)

11、JC支持以下的数据类型: 16位整型 16位整型由int类型标识符表示。其取值范围从-32,768到+32,767(十进制数)。 32位整型 32位整型由long类型标识符表示。其取值范围从-2,147,483,648到+2,147,483,647(十进制数)。 32位浮点型 32位浮点型由float类型标识符表示。约有七位有效数字,其范围从10-38到1038。 8位字符型 8位字符型是由char类型标识符表示,字符的取值一般是标准ASCII字符集中的可打印字符,但不是绝对的。字符型变量可表示任意的8位整数。,JC中数组不能变为指针,也不可以进行指针运算。 数组作为参数传递 当一个数组以变量

12、的形式传递给一个函数时,实际上是传递了数组指针,而不是传递了数组本身。如果函数修改了作为参数的数组,则原数组亦被修改,这是因为在内存中只有数组的一个实例。 在标准中,有两种途径来声明一个数组型参数:数组或数组元素类型的指针。在JC中数组指针与一个数组元素的指针是不兼容的,因此参数只能声明为数组. 当传递一个数组变量给一个函数时,实际上是传递了数组指针的值而不是其中的一个元素,所以不用方括号。,int light10= 0, 40, 50, 68, 117, 201; int height=11,12,13,14,15; void main() int a,b; a=get(3, light);

13、 b=get(2,height); printf(“a=%d b=%dn“,a,b); int get(int index, int array) return arrayindex; ,对给定类型对象的指针定义,类似于一般对象的类型定义,只是在变量名前加上*。 存取指针指向的变量的值需在表达式前加上* 操作符以计算指针值。该操作称为“间接引用”。在变量、数组元素前加上& 操作符可得到变量的地址。 使用给定类型变量与给定类型变量的指针有两个主要的区别: (1) 存储空间分配 定义某一类型的对象(如长整型的x)意味着分配存储变量所需的内存空间。由于JC中长整型数在内存中占四个字节,所以x占了四个

14、字节。然而,像pW这样的指针不需要占用与所指对象一样的字节数。所以使用指针可以节省内存空间。 (2) 初始值 即使未初始化,引用指针以外的变量通常是安全的。但在安全使用指针之前必须赋给合法的地址值,否则可能产生错误。,long X;/*定义一个长整型变量X*/ long *pW;/* pW是指针。*pW是一个长整型变量,是pW所指的对象*/ X=50L; *pW=50L; 第一条语句是有效的:它将x的值设为50L。第二条语句不正确,pW还没有正确初始化,该语句会破坏内存。,Int X=50; int *Xptr; Xptr=,指针安全。代码中的指针必须指向内存中的有效对象.试图引用无效的内存地

15、址会导致系统崩溃。(P11) 原则: 首先,在使用指针前,判断其是否等于NULL(一种特殊的零指针) 。定义指针变量时必须将其初始化为NULL,存取指针前也应判断是否等于NULL; 其次,不要在函数体外引用指向该函数内局部变量的指针。函数运行结束时,其局部变量内存全部释放。因此,对这些指针的引用不仅会返回不正确的值,而且会导致严重的数据破坏。一个好的解决办法是绝不从函数中返回局部变量的地址,而且决不用生存期大于函数本身的对象(全局指针,数组)来存储局部变量的地址。全局变量和主函数中的变量一旦定义,地址就已固定,其指针可视为安全的。,指针作为参数传递 指针可传给函数,且函数可改变指针所指向的对象

16、值。术语称之为“引用传递”。 对变量的引用或变量的指针可传给被调用的函数。与之相反的是值传递,变量的值传给所调用的函数。值传递是函数调用的标准方法。 下例定义了一个检测光线亮度的函数getlight,参数为一整型指针 maxlight。该函数比较检测到的亮度值和传递进来的历史上最亮的亮度值,并把最亮的值存在指针所指的变量 *maxlight中。多次调用该函数后,变量*maxlight里保存的就是多次检测结果中最亮的值。,int getlight(int *maxlight) int light= 0; /*定义一个整型变量light*/ light = photo(1); /*将左光敏检测值存

17、在light*/ if(light *maxlight) * maxlight = light; /* 光敏检测值小代表亮*/ return light; /*函数getlight返回左光敏检测值*/ ,从函数返回指针 可以从函数返回指针。像定义其他类型指针一样,在函数名前加上星号*可定义函数返回值是指针类型,不妨称之为指针函数。 int left, right, other; int *dirptr(int dir) /* dirptr 是函数,返回值是指针 */ if(dir=1) return( ,支持大部分标准C语言的控制语句,如IF ELSE、WHILE、FOR、BREAK,但不支持

18、SWICH控制语句。 屏幕显示、格式化字符汇总、注意事项(P19) int a,b; printf(“A=%x B=%xn“, a, b);,格式化字符汇总 %d:输出类型:int 描述:十进制整数 %x:输出类型:int 描述:十六进制整数 %b:输出类型:int 描述:低位字节为二进制数 %c:输出类型:int 描述:低位字节为ASCII字符 %f:输出类型:float 描述:浮点数 %s:输出类型:char 描述:字符数组(字符串),注意事项 a) LCD液晶屏幕上的最右下字符位置被作为系统的“状态指示“。当能力风暴操作系统运行正常时,该处的太极字符持续闪烁。若停止闪烁,则说明能力风暴操

19、作系统运行出错。这时需更新操作系统。 b) 若显示字符超出31个,则被截断,超出部分不显示。 c) 显示字符长度大于16时,长出部分折到下一行显示。 d) 目前不支持长整数(32位)输出。 e) 如果显示格式化字符与显示类型不匹配,会有意外错误。,多任务的设置。多任务设置是JC的一个强大的功能。在运行期间,进程动态地建立和撤消,可以方便实施目前处于机器人学前沿的行为控制方法。 问题: 什么情况下需要多任务功能? 如何实现多任务的功能?(硬件和软件) 是否可以用函数调用的方式实现多任务? 通过本内容的学习,有哪些可以借鉴的思路或思想?(学习他们解决问题的方法),JC 的一个强大的功能是支持多任务

20、。在用户程序运行期间,进程可以动态地建立和撤消,一个进程就是一个独立运行的任务。 任何函数都可以作为一个独立的进程使用。可以创建多个进程运行同一段代码(如调用同一个函数),在每个进程中此代码都有对应的局部变量。 进程通过全局变量进行通讯:在一个进程中给全局变量赋值,在另外一个进程中可以读这个全局变量的值。 多个进程运行是通过分配时间片实现的。每个进程一次只执行一定数量的时间片(以毫秒为单位)。这个值在每个进程创建时确定。缺省的片数为,因此,在一个“轮次”中,一个进程将运行毫秒,然后交给下一个进程运行。所有的进程依次放在一个进程表中,系统从头到尾每轮一遍进程表,每个进程都运行一次(运行时间对应于

21、各自的时间片长度)。,每个进程都有自己的栈,用于函数调用传递参数,存放局部变量,存放函数调用的返回地址。栈的大小在进程创建时确定。一个进程栈的缺省大小为256 字节。,进程的创建、撤消(P27-28 、 P53) int start_process(function-call( ),ticks,stack-size) 是 创 建 进程函数, 可以用来创建新进程。star_process 取得一个进程标识,function-call(.)是进程函数。创建进程有两个可选参数:进程的时间片数TICKS和栈大小STACK-SIZE。如果只给定一个参数,它被认为是时间片数,栈的大小为缺省值。start_

22、process 返回一个整数,它就是新进程的进程标识ID。 用 start_process 函数加上可选参数,可以很方便地创建一个非缺省时间片数和非缺省栈大小的进程,例如: start_process(check_sensor(2), 1, 50); 将创建一个 check_sensor 进程,它每次运行毫秒,栈大小为50 个字节(此处check_sensor 使用较小的栈更有效)。,void check_sensor(int n) /*定义进程函数,检测和显示模拟口n的值*/ while (1) printf(“Sensor %d is %dn“, n, analogport(n); wai

23、t(0.1); void main() start_process(check_sensor(2); /*创建进程*/ ,正常情况下一个函数结束时,它会返回一个值或者无返回值。如果一个函数是作为进程来运行的,则在它结束时的返回值(如果有)是得不到。这是允许的,因为进程间的通讯是通过将结果存于全局部量中进行的,而不是通过返回值来返回的。在上面的例子中,check_sensor 定义为一个无限循环函数,以保证其一直运行,除非机器人被复位或执行了撤消进程命令。 从以上的例子可以看到,进程的存在时间应当不小于主程序 void main()的存在时间,否则就会出错。,撤消进程 int kill_proc

24、ess(int pid); 用于撤消进程。撤消一个进程,是通过将进程标识 ID 传给kill_process 来实现的。 kill_process 的返回值表明撤消进程是否成功。如果返回值是,表明进程被撤消。如果返回值是,表示没有找到该进程。 Pid=start_process(); kill_process(int pid); 下面的代码显示创建一个 check_sensor 进程,秒钟后终止该进程的例子:,void main() int pid; pid= start_process(check_sensor(2); wait(1.0); kill_process(pid); ,问题:1、

25、多个进程如果进行通讯怎么办? 2、进程之间如果发生冲突,怎么办?,进程间的通讯:通过全局变量进行.(P27 、 P53) 多进程的实现:任何一个函数都可以作为一个进程来调用;多个进程运行通过分时间片实现;进程间通过全局变量进行通讯。(P53) 多进程实现的难点:多进程之间的通讯及同步问题。遵循的原则:1)一种设备只在一个进程中访问 ;2)同时只能有一个进程写一个全局变量,但可以有多个进程同时读。(参见P53的程序),JC错误处理,使用会遇到两种类型的错误:编译错误和运行错误。 编译错误包括:语法错误和数据类型不匹配 运行错误发生时,将在液晶屏幕上显示错误号。(P29) 程序设计的目标及规则,伪

26、代码,伪码类似于自然语言(自然语言就是人们日常使用的语言,可以是汉语、 英语或其他语言),是帮助程序员制定算法的智能化的信息语言 伪码常用来描述算法,伪码实例,计算10个学生的平均成绩 1.学生的个数(10) 2.学生的总成绩,一个一个地输入(循环) 有一个变量用来累加学生的总成绩(total) 累加前其值应初始化为0 有一个变量记录循环的次数(grade counter) 进入循环前,该变量值应初始化为1 平均成绩由总成绩除以10得到,伪码表示,Set total to zero Set grade counter to one While grade counter is less tha

27、n or equal to tenInput the next gradeAdd the grade into the totalAdd one to the grade counter Set the class average to total divided by ten Print the class average,标准C语言简单回顾(二),If/else的嵌套结构(C程序设计) If (grade=90) printf(“An”); Else If (grade=80) printf(“Bn”); Else If (grade=70) printf(“Cn”); Else If (

28、grade=60) printf(“Dn”); Else printf(“Fn”);,标准C语言简单回顾(二),伪码表示为: if students grade is greater than or equal to 90Print “A” Elseif students grade is greater than or equal to 80,标准C语言简单回顾(二),Print “B” elseif students grade is greater than or equal to 70 Print “C” else,标准C语言简单回顾(二),if students grade is g

29、reater than or equal to 60 Print “D” ElsePrint “F”,标准C语言简单回顾(三),while循环结构(C程序设计P107) /*求10个学生的平均成绩*/ #include Main ( ) int counter,grade,total,average;total=0;counter=1;,标准C语言简单回顾(三),While(counter=10) printf (“enter grade:”);scanf (“%d”,标准C语言简单回顾(三),Average=total/10; Printf (“class average is %d n”,

30、average); Return 0; ,标准C语言简单回顾(四),for循环结构(C程序设计p110) Int x=2; Int y=10; For (j=x; j=4*x*y; j+=y/x)printf (“%dn”, j); 注意:各控制语句中 的使用,标准C语言简单回顾(五),Break语句通常用来及早地退出某个循环 Int x; For (x=1; x=10; x+) if (x=5) break;printf (“%d”,x); Printf (“nbroke out of loop at x=%d”,x);,数组与指针,数组:数组是有序数据的集合,是一组相关的存储单元,这些存储

31、单元具有相同的名字和数据类型。通过一个统一的数组名和下标来唯一地确定数组中的元素。 例:int n =1,2,3,4,5,6 数组元素可以作为函数实参,其用法与变量相同。具体参见C程序设计P164。,6,Main() int large(int x,int y);int a10,b10,I,n=0,m=0,k=0;printf(“enter array a:n”);for (i=0;ibi %d times nai=bi %d times naibi %d times n”,n,m,k);,If (nk) printf(“array a is large than b n”); Else if

32、 (ny) flag=1;else if (xy) flag=-1;else flag=0;return(flag); ,数组,数组名也可以作为实参和形参,传递的是数组首地址。 当一个数组以变量的形式传递给一个函数时,实际上是传递了数组指针,而不是其中的一个元素,所以用数组名做函数参数,实参和形参都应用数组名。 具体参见P14(数组作为参数传递)及C程序设计P165。,指针,指针是C语言中的一个重要的概念,也是C语言的一个重要特色,不掌握指针就是没有掌握C语言的精华。 正确而灵活的运用指针,可以有效地表示复杂的数据结构;能动态分配内存;能方便的使用字符串;有效而方便地使用数组;在调用函数时能得

33、到多于1个的值;能直接处理内存地址等,这对设计系统软件是很必要的。,指针:是把内存地址作为其值的变量。变量通常包含一个具体的值,而指针包含的是拥有具体值的变量的地址。6,countptr,6,count,6,count,6,如图所示,变量名直接引用了一个值,而指针是间接引用了一个值,指针详述(一),有两个相关的运算符 &:取地址运算符 *:指针运算符 指针的定义和使用:C语言规定所有变量在使用前必须定义,指定其类型,并按此分配内存单元。指针变量不同于其他变量,它是专门用来存放地址的,具体应用参见P12及C程序设计P207、208。,指针详述(二),例: Void main ( ) int a;

34、int *aptr;a=7;aptr= ,指针详述(三),运行以上程序,当&a=FFF4时 Aptr= *aptr= & * aptr= * & aptr=,FFF4,FFF4,7,FFF4,指针可传给函数,且函数可改变指针所指向的对象值。对变量的引用或变量的指针可传给被调用的函数。与之相反的是值传递,变量的值传给所调用的函数。,传值调用与传引用调用(一),传值调用:是建立参数的一份拷贝,并把它传给调用函数,在调用函数中修改参数值的拷贝,而不影响原始的变量值。 传引用调用:允许修改原始变量的值 数组会自动地模拟传引用调用,地址运算符和间接引用运算符模拟传引用调用也是可能的。,传值调用与传引用调

35、用(二),例: Int a=10; F(a); Void f(n) n+=2; 问题:运行以下程序,a、n的值各为多少? 传值调用还是传引用调用?,10,a,copy,n,10+2=12,传值调用与传引用调用(三),例: Int b=10; F( ,nptr,10+2=12,b,标准C中数组与指针转换关系,Int b =10,20,30; Int *bptr=b; B0=? B1=? Bptr0=? Bptr1=? *(b+0)=10 *(b+1)=? *(bptr+0)=? *(bptr+1)=? 难题: C程序设计P230 例10.14,局部变量和全局变量,局部变量:在一个函数内部定义的变

36、量,它只在本函数范围内有效,也就是说,只有在本函数内才能使用他们,在此函数以外是不能使用这些变量的。 具体参见C程序设计P169的程序及说明。,全局变量,全局变量:在函数体外定义的变量,可以为本文件中其他函数所共用。它的有效范围从定义变量的位置开始到本源文件结束。 参见C程序设计P170的程序及说明。 编程时,应注意全局变量和局部变量的使用,有时候可能会影响到程序的实验结果。,专题项目,红外避障。机器人前进,发现障碍物就转向。(相关模块:红外测障、条件判断、永远循环、直行、转向)拓展项目:跟人走。 自己制作硬件,并进行软件编程。 撰写论文。内容包括:相关的研究资料;硬件设计、制作详细说明,并画

37、出硬件电路图;详细的软件驱动程序,附加必要的软件说明;测试运行效果图,或者运行的录象;工作总结与展望。,参考的硬件电路及程序,参考程序(main.h),#include“reg52.h“ #include #define uchar unsigned char #define uint unsigned int #define left_infrare 0 #define right_infrare 1 uchar flage =0x00; uchar display_flage=0x00;,#define state1 0X5F /前进 #define state2 0X4F /右转 #de

38、fine state3 0X1F /左转 #define state4 0X0F /后退 #define state5 0XfF /停车 #define light_off 0x0f /关转向灯 #define left_light 0X1F /左转向灯 #define right_light 0X2F /右转向灯 #define back_light 0XcF /刹车灯 #define front_light 0x3f /前灯 #define light_on 0xff /开所有灯 #define true 1 #define false 0 uchar code Product = “ C

39、reate-RBcar “; uchar code webcom = “ www.create.cc“; uchar code talk1=“Mastor: please“;/14 characters uchar code talk2=“touch my head“; /12 characters uchar code talk3=“thank you!“; /10 characters uchar code talk4=“Im running“; /11 characters,extern void LCMInit(void); extern void WriteCommandLCM(un

40、signed char WCLCM,BuysC); /BuysC为0时忽略忙检测 extern void DisplayListChar(uchar X, uchar Y,uchar ListLength, uchar *DData,uchar n);/* sbit ledcs=P12; /74H573的片选信号 sbit left_led=P02; /左红外发射管 sbit right_led=P03; /右红外发射管 */,main.c文件,/* 程序名称:小车避障程序 程序说明:硬件原理,小车左右两个红外二极管发射38KHz载波的信号(P02,P03),一个一体化的红外接收头接收载波信号

41、(p32)。 */*红外线接收子程序 */ #include “main.h“void infrared_ray()interrupt 0 using 3 flage=0x01;display_flage=1;IE ,/ 延时子程序 void delay(uint n) while(-n); void Init0(void) IE |=0X80; /EA=1;TCON |=0x01; /IT0=1; void seng_wave(uchar timer,bit n)/timer -通过载波发射信号的时间,n-左右发射管的选择 uchar i;P1 |= 0X04; /ledcs=1; IE |

42、= 0X01; /EX0 =1;P0 |=0x04;,for(i=timer;i0;i-)if(n) P0 =0x08; / 右发射管通过载波发射信号else P0 =0x04; / 左发射管通过载波发射信号delay(10000); P1 ,void control(uchar n,uchar state,uchar light) uchar i;light_control(light); /转向指示灯P2 =state; /行使方向改变for(i=n;i0;i-)delay(5000);P2=state5;delay(2000);light_control(light_off); /关闭P

43、2=state1; ,void move_car(void) uchar temp =0x00;/*检测程序段*/ seng_wave(2,left_infrare); /左边红外管发射 if(flage=0x01)temp |=0x01;flage=0x00; seng_wave(2,right_infrare); /右边红外管发射 if(flage=0x01)temp |=0x02;flage=0x00;/*控制程序段*/左边有障碍物,右转if(temp=0x01) control(5,state2, right_light);/右边有障碍物,左转else if(temp=0x02) control(5,state3,left_light ); /两个方向都有障碍物,后退,右转else if(temp=0x03) control(10,state4,back_light );control(5,state2,right_light );temp =0x00; ,void main(void) uchar dis_flage=0x00;Init0();P1 |= 0X04; /ledcs=1; P0 = 0xFf;P1 ,while(1)move_car();if(display_flage=0x01 ) ,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报