您的位置:网站首页 > 电器维修资料网 > 正文 >
会造句就会编程-编程技巧
来源: 日期:2013-11-12 11:54:07 人气:标签:
我们以智能红外干手机为例,介绍其编程技巧。此智能红外干手机线路简捷明快,能很方便地利用程序来解决抗干扰问题,若改变负.载,可实现其它控制。本文还要讲一下累加器a“为零转移”和“非零转移”等指令,并作必要的程序执行结果分析,提高大家的编程能力。
1、工作原理
电原理见下图。该系统主要由at89c2051、6mhz晶振及简单的输入输出等器件组成。图中经r2、r8分压后使pl.0的电压为0.5v。此电压作为输入检测基准。系统上电复位后进行初始化,先向p1.3送高电位,于是,光耦ic2截止,使vt1亦截止,可控硅ks1关断,切断执行负截的电源,电热丝rll和风扇yd不工作。然后向p1.2送低电位,使vd1导通发射红外线。此时调用检测子程序检测片内比较器输出端p3.6的电位。如果有人靠近,vd1发射的红外线就会被反射到vd2的接收窗口上,使vd2的电阻变小,导致vt2发射极电流增大,r9上的压降便升高。当其值超过0.5v时,pl.l的电位高于pl.0的电位,at89c2051内部比较器输出端p3.6的状态发生跳变,呈低电位,否则呈高电位。这样,检测到p3.6呈低电位,就可判断vd2接收到了红外光。为区别干扰信号,还需关掉vd1,再进行检测。向p1.2送高电位,使vd1截止,不再发射红外线。
此时,因vd2收不vd1发出的红外线而截止,使pl.l的电压远小于0.5v,即pl.l的电位低于pl.0的电位。因此,检测p3.6应为高电位。此时若检测到p3.6为低电位,说明vd2仍然受到红外线的照射,此红外线一定是干扰信号。这样就把正确动作信号和干扰信号区别开了。
编程时采用多次采样比较的方式,判断无误后再执行清位p1.3,向p1.3送低电位使光耦ic2导通,推动vt1饱和,触发ks1导通,使yd和rll通电。风扇yd将电热丝产生的热量送出。这样,整个系统就十分可靠了。hd、vd3、vd4、vd5、用作状态提示或指示。上电和完成一次开关动作返回时,hd都要发出乐声;进入等待状态后,vd3以1hz的频率闪烁作为等待状态指示。当有人靠近时,vd4、vd5同时点亮使之呈黄色表示准备动作;当人的靠近时间超过0.5秒时,系统即确认为有效靠近,接通负载,并使vd4、vd5输流导通,使之交替变换红色和绿色。有效靠近解除,系统仍使负载延迟通电3秒,之后才返回等待状态。此线路无需调试,只要焊接正确,编好程序后,上电即能可靠运行。
2、程序分析
由于主程序是从003bh处开始安放的,所以,在程序存贮区的ooooh至0002h的这三个单元内要安放一条转移指令:“转移ql”,用以引导cpu复位后无条件地跳转到003bh处去执行程序。因此,ooooh至0002h中应写入机器码02003bho初始化过程由ql至q2共5条指令组成,“送数pl,#ffh”和“送数p3,#ffh”,使图1中ic1的“2、3、6、7、8、9、11”和“12、13、14、15、16、17、18、19”引脚呈高电位,这样vd1、vd3、vd4.5都不发光,ks1截止,使yd和rll.断电,整个系统的负载皆不工作。“送数sp.#30h”,其结果是修改了堆栈指针,使压栈数据从片内ram的31h开始压入。有关堆栈的作用将在以后的智能产品开发中说明。“送数20h,#ooh”,是为检测系统有无人员靠近情况作准备的,我们将片内ram的20h单元作为靠近情况,记录单元,知果无靠近情况,20h中的内容为#ooh,如果有靠近情况20h中的内容则为#ffh,此记录是由检测子程序来完成的(单片机内部有一些标志位是可以供用户作记录使用的,但在此文中不做说明)。因此,在系统上电后调用检测子程序前必须将其清零,以擦除以往或错误的记录。“调用qs1”能使hd发出一段乐音,提示系统初始化完成,然后送上指示灯闪烁时间常数,使指示灯能间歇发光,以作系统正常工作的指示。q3至q8中的大部分指令我们已经学过,下面重点分析一下指令“非零转移”的操作过程。初始化并设置好闪烁常数以后,系统执行q6调用检测子程序qj1,然后再检查是否有靠近记录。由于在程序中是将靠近情况记录在20h之中的,所以,每每调用检测子程序以后,只要对20h的内容进行判断就行了。如果20h中的内容为零,说明该时间内无人靠近系统;如果20h中的内容为非零(#ffh),说明有人靠近系统,应立即转去判断靠近时间的长短,以确认该次靠近是否为有效靠近,继而确定是否通电输出热风。而20h中的内容是否为零,cpu是不能直接对其进行判断的。必须将其传送到累加器a中才行。所以,q7:“传数a,20h”一句,就将20h单元内所存的数据传递到累加器a中,这和以前讲过的的送数是有一点区别的。
q8就是判断a中的数据是否为零的指令。“非零转移”被操作的对象是累加器ao如果a中的数据不为零,就转移至指令中指出的目的地址;如果a中的数据为零,就接着执行下面的转序。“非零转移”的指令代码是70h,后面的字节指出了转移量。如上述“q6,非零转移q16”的机器码是7017h。其执行结果是,如果a中的数据不为零,说明有靠近情况发生,就向下转移17h个字节,也就是由0056h-下子跳转到了006eh空间去,进行靠近时间长短的判断;如果a中的数据为零,说明没有靠近情况发生,接着执行0057h以下的程序,进行闪烁指示并进行下一轮调用检测子程序和对检测结果进行判断的过程。明白了“非零转移”,“为零转移”也就理解了,其它程序的操作结果,大家可根据工作原理和程序注释来分析。
3、程序流程图(见下图)。
4、程序清单
【看看这篇文章在百度的收录情况】
相关文章
- 上一篇: PIC16F62X单片机主要特点及内部资源
- 下一篇: SIM84软硬件模拟器运行与调试