虫虫首页| 资源下载| 资源专辑| 精品软件
登录| 注册

sb-ADD

  • ICCAVR 入门

    ICCAVR简介ICCAVR 是一种使用ANSI 标准C 语言来开发微控制器(MCU)程序的一个工具,它是一个综合了编辑器和工程管理器的集成工作环境(IDE)。源文件全部被组织到工程之中,文件的编辑和工程(project)的构筑也在IDE 的环境中完成。编译错误在状态窗口中显示,用鼠标单击编译错误时,光标会自动跳转到出错行。这个工程管理器还能直接产生INTEL HEX格式的烧写文件和可以在AVR Studio 中调试的COFF 格式的调试文件。这里特别要提一下ICCAVR 中的应用构筑向导,可以在Tools 栏中选择“ApplicationBiulder”或者直接点击快捷工具栏中的“Application Biulder”图标,就可以打开应用构筑向导对话框,可以根据需要设定芯片种类,各个端口初始值,是否使用定时器,中断,UART等,选好以后单击“OK”就可以得到所需的硬件初始化程序段,非常可靠而且方便。图1给出了初始化UART 的一个例子:下面介绍一下创建并编译一个工程文件的简要步骤:1.新建一个源文件从file 菜单中选择new,创建一个新文件,在改文件中输入源程序并进行编辑和修改,然后存盘,在存盘时必须指定文件类型,如命名为:try.c 。写一个新文件的步骤:首先用Biulder 初始化需要用到的硬件资源,生成初始化程序,然后再写需要的代码实现所要的功能。2.新建一个project从projrct 菜单中选择new 命令,IDE 会弹出一个对话框,在对话框中用户可以指定工程存放的文件夹和工程的名称。在建立一个新工程之后,在工程管理器的窗口会出现三个子目录,Files, Headers, Documents,这时就可以将要编译的文件添加到project 中了。3.把文件添加到工程中可以在project-files 里单击右键,选择需要添加的文件;也可以在编辑窗口中单击右键选择弹出窗口的“Add To Project”命令。4.编译源文件在编译之前特别要注意在Project Options 中选择与硬件相应的芯片。如本次实验就选择ATMEGA8515,如图2 所示。在project 中选择make project,也可以直接单击快捷键F9,这时要是有错则会弹出出错信息,修改调试正确以后单击快捷键ISP 就可以烧写到硬件中去了。

    标签: ICCAVR

    上传时间: 2013-10-25

    上传用户:569342831

  • 单片机指令系统原理

    单片机指令系统原理 51单片机的寻址方式 学习汇编程序设计,要先了解CPU的各种寻址法,才能有效的掌握各个命令的用途,寻址法是命令运算码找操作数的方法。在我们学习的8051单片机中,有6种寻址方法,下面我们将逐一进行分析。 立即寻址 在这种寻址方式中,指令多是双字节的,一般第一个字节是操作码,第二个字节是操作数。该操作数直接参与操作,所以又称立即数,有“#”号表示。立即数就是存放在程序存储器中的常数,换句话说就是操作数(立即数)是包含在指令字节中的。 例如:MOV  A,#3AH这条指令的指令代码为74H、3AH,是双字节指令,这条指令的功能是把立即数3AH送入累加器A中。MOV  DPTR,#8200H在前面学单片机的专用寄存器时,我们已学过,DPTR是一个16位的寄存器,它由DPH及DPL两个8位的寄存器组成。这条指令的意思就是把立即数的高8位(即82H)送入DPH寄存器,把立即数的低8位(即00H)送入DPL寄存器。这里也特别说明一下:在80C51单片机的指令系统中,仅有一条指令的操作数是16位的立即数,其功能是向地址指针DPTR传送16位的地址,即把立即数的高8位送入DPH,低8位送入DPL。 直接寻址 直接寻址方式是指在指令中操作数直接以单元地址的形式给出,也就是在这种寻址方式中,操作数项给出的是参加运算的操作数的地址,而不是操作数。例如:MOV  A,30H  这条指令中操作数就在30H单元中,也就是30H是操作数的地址,并非操作数。 在80C51单片机中,直接地址只能用来表示特殊功能寄存器、内部数据存储器以及位地址空间,具体的说就是:1、内部数据存储器RAM低128单元。在指令中是以直接单元地址形式给出。我们知道低128单元的地址是00H-7FH。在指令中直接以单元地址形式给出这句话的意思就是这0-127共128位的任何一位,例如0位是以00H这个单元地址形式给出、1位就是以01H单元地址给出、127位就是以7FH形式给出。2、位寻址区。20H-2FH地址单元。3、特殊功能寄存器。专用寄存器除以单元地址形式给出外,还可以以寄存器符号形式给出。例如下面我们分析的一条指令 MOV  IE,#85H 前面的学习我们已知道,中断允许寄存器IE的地址是80H,那么也就是这条指令可以以MOV  IE,#85H 的形式表述,也可以MOV  80H,#85H的形式表述。 关于数据存储器RAM的内部情况,请查看我们课程的第十二课。 直接寻址是唯一能访问特殊功能寄存器的寻址方式! 大家来分析下面几条指令:MOV  65H,A       ;将A的内容送入内部RAM的65H单元地址中MOV  A,direct    ;将直接地址单元的内容送入A中MOV  direct,direct;将直接地址单元的内容送直接地址单元MOV  IE,#85H      ;将立即数85H送入中断允许寄存器IE 前面我们已学过,数据前面加了“#”的,表示后面的数是立即数(如#85H,就表示85H就是一个立即数),数据前面没有加“#”号的,就表示后面的是一个地址地址(如,MOV 65H,A这条指令的65H就是一个单元地址)。 寄存器寻址 寄存器寻址的寻址范围是:1、4个工作寄存器组共有32个通用寄存器,但在指令中只能使用当前寄存器组(工作寄存器组的选择在前面专用寄存器的学习中,我们已知道,是由程序状态字PSW中的RS1和RS0来确定的),因此在使用前常需要通过对PSW中的RS1、RS0位的状态设置,来进行对当前工作寄存器组的选择。2、部份专用寄存器。例如,累加器A、通用寄存器B、地址寄存器DPTR和进位位CY。 寄存器寻址方式是指操作数在寄存器中,因此指定了寄存器名称就能得到操作数。例如:MOV A,R0这条指令的意思是把寄存器R0的内容传送到累加器A中,操作数就在R0中。INC R3这条指令的意思是把寄存器R3中的内容加1 从前面的学习中我产应可以理解到,其实寄存器寻址方式就是对由PSW程序状态字确定的工作寄存器组的R0-R7进行读/写操作。 寄存器间接寻址 寄存间接寻址方式是指寄存器中存放的是操作数的地址,即操作数是通过寄存器间接得到的,因此称为寄存器间接寻址。 MCS-51单片机规定工作寄存器的R0、R1做为间接寻址寄存器。用于寻址内部或外部数据存储器的256个单元。为什么会是256个单元呢?我们知道,R0或者R1都是一个8位的寄存器,所以它的寻址空间就是2的八次方=256。例:MOV  R0,#30H  ;将值30H加载到R0中    MOV  A,@R0    ;把内部RAM地址30H内的值放到累加器A中    MOVX A,@R0    ;把外部RAM地址30H内的值放到累加器A中 大家想想,如果用DPTR做为间址寄存器,那么它的寻址范围是多少呢?DPTR是一个16位的寄存器,所以它的寻址范围就是2的十六次方=65536=64K。因用DPTR做为间址寄存器的寻址空间是64K,所以访问片外数据存储器时,我们通常就用DPTR做为间址寄存器。例:MOV   DPTR,#1234H  ;将DPTR值设为1234H(16位)    MOVX  A,@DPTR      ;将外部RAM或I/O地址1234H内的值放到累加器A中 在执行PUSH(压栈)和POP(出栈)指令时,采用堆栈指针SP作寄存器间接寻址。例:PUSH  30H    ;把内部RAM地址30H内的值放到堆栈区中堆栈区是由SP寄存器指定的,如果执行上面这条命令前,SP为60H,命令执行后会把内部RAM地址30H内的值放到RAM的61H内。 那么做为寄存器间接寻址用的寄存器主要有哪些呢?我们前面提到的有四个,R0、R1、DPTR、SP 寄存器间接寻址范围总结:1、内部RAM低128单元。对内部RAM低128单元的间接寻址,应使用R0或R1作间址寄存器,其通用形式为@Ri(i=0或1)。 2、外部RAM 64KB。对外部RAM64KB的间接寻址,应使用@DPTR作间址寻址寄存器,其形式为:@DPTR。例如MOVX A,@DPTR;其功能是把DPTR指定的外部RAM的单元的内容送入累加器A中。外部RAM的低256单元是一个特殊的寻址区,除可以用DPTR作间址寄存器寻址外,还可以用R0或R1作间址寄存器寻址。例如MOVX  A,@R0;这条指令的意思是,把R0指定的外部RAM单元的内容送入累加器A。 堆栈操作指令(PUSH和POP)也应算作是寄存器间接寻址,即以堆栈指针SP作间址寄存器的间接寻址方式。 寄存器间接寻址方式不可以访问特殊功能寄存器!! 寄存器间接寻址也须以寄存器符号的形式表示,为了区别寄存器寻址我寄存器间接寻址的区别,在寄存器间接寻址方式式中,寄存器的名称前面加前缀标志“@”。 基址寄存器加变址寄存器的变址寻址 这种寻址方式以程序计数器PC或DPTR为基址寄存器,累加器A为变址寄存器,变址寻址时,把两者的内容相加,所得到的结果作为操作数的地址。这种方式常用于访问程序存储器ROM中的数据表格,即查表操作。变址寻址只能读出程序内存入的值,而不能写入,也就是说变址寻址这种方式只能对程序存储器进行寻址,或者说它是专门针对程序存储器的寻址方式。例:MOVC  A,@A+DPTR这条指令的功能是把DPTR和A的内容相加,再把所得到的程序存储器地址单元的内容送A假若指令执行前A=54H,DPTR=3F21H,则这条指令变址寻址形成的操作数地址就是54H+3F21H=3F75H。如果3F75H单元中的内容是7FH,则执行这条指令后,累加器A中的内容就是7FH。 变址寻址的指令只有三条,分别如下:JMP    @A+DPTRMOVC   A,@A+DPTRMOVC   A,@A+PC 第一条指令JMP @A+DPTR这是一条无条件转移指令,这条指令的意思就是DPTR加上累加器A的内容做为一个16位的地址,执行JMP这条指令是,程序就转移到A+DPTR指定的地址去执行。 第二、三条指令MOVC   A,@A+DPTR和MOVC   A,@A+PC指令这两条指令的通常用于查表操作,功能完全一样,但使用起来却有一定的差别,现详细说明如下。我们知道,PC是程序指针,是十六位的。DPTR是一个16位的数据指针寄存器,按理,它们的寻址范围都应是64K。我们在学习特殊功能寄存器时已知道,程序计数器PC是始终跟踪着程序的执行的。也就是说,PC的值是随程序的执行情况自动改变的,我们不可以随便的给PC赋值。而DPTR是一个数据指针,我们就可以给空上数据指针DPTR进行赋值。我们再看指令MOVC   A,@A+PC这条指令的意思是将PC的值与累加器A的值相加作为一个地址,而PC是固定的,累加器A是一个8位的寄存器,它的寻址范围是256个地址单元。讲到这里,大家应可明白,MOVC   A,@A+PC这条指令的寻址范围其实就是只能在当前指令下256个地址单元。所在,这在我们实际应用中,可能就会有一个问题,如果我们需要查询的数据表在256个地址单元之内,则可以用MOVC   A,@A+PC这条指令进行查表操作,如果超过了256个单元,则不能用这条指令进行查表操作。刚才我们已说到,DPTR是一个数据指针,这个数据指针我们可以给它赋值操作的。通过赋值操作。我们可以使MOVC   A,@A+DPTR这条指令的寻址范围达到64K。这就是这两条指令在实际应用当中要注意的问题。 变址寻址方式是MCS-51单片机所独有的一种寻址方式。 位寻址 80C51单片机有位处理功能,可以对数据位进行操作,因此就有相应的位寻址方式。所谓位寻址,就是对内部RAM或可位寻址的特殊功能寄存器SFR内的某个位,直接加以置位为1或复位为0。 位寻址的范围,也就是哪些部份可以进行位寻址: 1、我们在第十二课学习51单片机的存储器结构时,我们已知道在单片机的内部数据存储器RAM的低128单元中有一个区域叫位寻址区。它的单元地址是20H-2FH。共有16个单元,一个单元是8位,所以位寻址区共有128位。这128位都单独有一个位地址,其位地址的名字就是00H-7FH。这里就有一个比较麻烦的问题需要大家理解清楚了。我们在前面的学习中00H、01H。。。。7FH等等,所表示的都是一个字节(或者叫单元地址),而在这里,这些数据都变成了位地址。我们在指令中,或者在程序中如何来区分它是一个单元地址还是一个位地址呢?这个问题,也就是我们现在正在研究的位寻址的一个重要问题。其实,区分这些数据是位地址还是单元地址,我们都有相应的指令形式的。这个问题我们在后面的指令系统学习中再加以论述。 2、对专用寄存器位寻址。这里要说明一下,不是所有的专用寄存器都可以位寻址的。具体哪些专用寄存器可以哪些专用寄存器不可以,请大家回头去看看我们前面关于专用寄存器的相关文章。一般来说,地址单元可以被8整除的专用寄存器,通常都可以进行位寻址,当然并不是全部,大家在应用当中应引起注意。 专用寄存器的位寻址表示方法: 下面我们以程序状态字PSW来进行说明 D7 D6 D5 D4 D3 D2 D1 D0 CY   AC  F0  RS1  RS0  OV    P  1、直接使用位地址表示:看上表,PSW的第五位地址是D5,所以可以表示为D5H   MOV  C,D5H 2、位名称表示:表示该位的名称,例如PSW的位5是F0,所以可以用F0表示   MOV  C,F0 3、单元(字节)地址加位表示:D0H单元位5,表示为DOH.5    MOV  C,D0H.5 4、专用寄存器符号加位表示:例如PSW.5    MOV C,PSW.5 这四种方法实现的功能都是相同的,只是表述的方式不同而已。 例题:   1. 说明下列指令中源操作数采用的寻址方式。   MOV R5,R7 答案:寄存器寻址方式   MOV A,55H 直接寻址方式   MOV A,#55H 立即寻址方式   JMP @A+DPTR 变址寻址方式   MOV 30H,C 位寻址方式   MOV A,@R0 间接寻址方式   MOVX A,@R0 间接寻址方式 改错题   请判断下列的MCS-51单片机指令的书写格式是否有错,若有,请说明错误原因。   MOV R0,@R3 答案:间址寄存器不能使用R2~R7。   MOVC A,@R0+DPTR 变址寻址方式中的间址寄存器不可使用R0,只可使用A。   ADD R0,R1 运算指令中目的操作数必须为累加器A,不可为R0。   MUL AR0 乘法指令中的乘数应在B寄存器中,即乘法指令只可使用AB寄存器组合。

    标签: 单片机指令 系统原理

    上传时间: 2013-11-11

    上传用户:caozhizhi

  • keil c51v805 完全汉化破解版

    keil c51v805 完全汉化破解版破解方法: 1.运行c51v808a.exe,直到安装完毕. 2.运行Keil_lic-v3.2.exe选择如下图: [ sn.JPG (21.79 KB) 2007-5-16 09:38 点击GENERATE ,获得注册码.打开文件菜单下的LICENSE对话框,将LICO框内的注册码COPY到LICENSE ID栏内.点击ADD ID. 3.复制ccKeilVxx.exe到安装目录下C:KeilC51BIN,覆盖原文件.大功告成!!!!!!!!!!!

    标签: c51v805 keil 汉化破解版

    上传时间: 2014-05-05

    上传用户:75119158

  • Keil uVision3下载 (破解版带注册机+中文版)

    Keil uVision3下载:keil uvision3注册机,keil uvision3中文版:Keil uVision3软件破解版与没破解版的区别就是一个没有代码限制,一个有2K代码限制。附件含有手册和教程。 1.点击c51v802.exe直接安装直到结束,安装路径最好选用默认的c:\keil与   原来的老板本放到相同的目录下会自动添加一个新的目录c:\keil\uv3 2.第一次运行请先进入file->License Management弹出窗口下输入注册码,   注册码由Keil_lic_v2.exe生成,选择V2选项,生成后复制LIC0内容到keil   弹出窗口的New License ID Code中然后点击Add LIC,注意看看注册后的使   用期限,如果太短可以用注册机重新生成,一般都可以找到30年左右:-) 3.复制ccKeilVxx.exe文件到c:\keil\c51\bin\下面并运行,以修正0xFD BUG.   至此安装完毕。

    标签: uVision3 Keil 破解版

    上传时间: 2013-10-14

    上传用户:ruixue198909

  • 单片机指令系统

    单片机指令系统 3.1 MCS-51指令简介 3.2 指令系统 3.1  MCS-51指令简介 二、MCS-51系列单片机指令系统分类 按寻址方式分为以下七种:按功能分为以下四种: 1、立即立即寻址         1、数据传送指令位操 2、直接寻址             2、算术运算指令 3、寄存器寻址           3、逻辑运算指令 4、寄存器间接寻址指令   4、控制转移类指令 5、相对寻址             5、位操作指令 6、变址寻址 7、位寻址 三、寻址方式 3、寄存器间接寻址    MOV A, @R1        操作数是通过寄存器间接得到的。 4、立即寻址               MOV  A, #40H        操作数在指令中直接给出。 5、基址寄存器加变址寄存器寻址        以DPTR或PC为基址寄存器,以A为变址寄存器,        以两者相加形成的16位地址为操作数的地址。                   MOVC A, @A+DPTR                   MOVC A, @A+PC 四、指令中常用符号说明 Rn——当前寄存器区的8个工作寄存器R0~R7(n=0~7); Ri——当前寄存器区可作地址寄存器的2个工作寄存器R0和R1(i=0,1); direct——8位内部数据存储器单元的地址及特殊功能寄存器的地址; #data——表示8位常数(立即数); #datal6——表示16位常数; add 16——表示16位地址; addrll——表示11位地址; rel——8位带符号的地址偏移量; bit——表示位地址; @——间接寻址寄存器或基址寄存器的前缀; ( )——表示括号中单元的内容 (( ))——表示间接寻址的内容; 五、MCS-51指令简介 1. 以累加器A为目的操作数的指令 2.  以Rn为目的操作数的指令 3.  以直接地址为目的操作数的指令 4.  以寄存器间接地址为目的操作数指令 应用举例1 8段数码管显示 应用举例2 3.2  指令系统 2、堆栈操作指令  3.  累加器A与外部数据传输指令 4.  查表指令    MOVC  A,   @A+PC  例子: 5.  字节交换指令 6.  半字节交换指令 二、算术操作类指令 PSW寄存器 2.  带进位加法指令 3.  加1指令 4.  十进制调整指令 5.  带借位减法指令(Subtraction) 6.  减1指令(Decrease) 7.   乘法指令(Multiplication) 8.  除法指令(Division)        三、逻辑运算指令 1.  简单逻辑操作指令 2.  循环指令 带进位左循环指令(Rotate  Accumulator Left   through  Carry  flag)      右循环指令(Rotate  Accumulator  Right) 带进位右循环指令(Rotate  A  Right  with  C) 3.   逻辑与指令 4.  逻辑或指令 5.  逻辑异或指令 四、控制转移类指令 1.  跳转指令 相对转移指令   SJMP   rel           PC←(PC)+2                                                                                                                            PC←(PC)+rel 程序中标号与地址之间的关系 2.  条件转移指令 3.  比较不相等转移指令 4.  减 1 不为 0 转移指令 5.  调用子程序指令 7.  中断返回指令 五、位操作指令 1.  数据位传送指令 2.  位变量逻辑指令 3.  条件转移类指令

    标签: 单片机 指令系统

    上传时间: 2013-10-27

    上传用户:xuanjie

  • 基于单片机的红外门进控制系统设计与制作(含源程序和原理图)

    基于单片机的红外门进控制系统设计与制作:我们所做的创新实验项目“基于单片机的红外门控系统”已基本完成,现将其工作原理简要说明。该系统主要分为两大部分:一是红外传感器部分。二是单片机计数显示控制部分。基本电路图如下:其中红外传感器部分我们采用红外对管实现,红外对管平行放置,平常处于接收状态,经比较器输出低电平,当有人经过时,红外线被挡住,接收管接收不到红外线,经比较器输出高电平。这样,当有人经过时便会产生一个电平的跳变。单片机控制部分主要是通过外部两个中断判断是否有人经过,如果有人经过,由于电平跳变的产生,进入中断服务程序,这里我们采用了两对红外传感器接到两个外部中断口,中断0作为入口,实现加1操作,中断1作为出口,实现减1操作。另外,我们通过P0口控制室内灯的亮暗,当寄存器计数值为0时,熄灯,不为0时,灯亮。显示部分,采用两位数码管动态显示,如有必要,可以很方便的扩展为四位计数。精益求精!在实验过程中,我们走了非常多的弯路,做出来的东西根本不是自己想要的,我们本想做成室内只有一个门的进出计数,原理已清楚,即在门的两边放置两对红外对管,进出时,挡住两对对管的顺序不同,因此,可判断是进入还是出去,从而实现加减计数,编程时,可分别在两个中断服务程序的入口置标志位,根据标志位判断进出,详细内容在程序部分。理论如此,但在实际过程中,还是发现实现不了上述功能,我们初步判定认为是程序掌握得不够好,相信随着自己对单片机了解的深入,应该会做出更好的 (因为我们是临时学的单片机),程序的具体内容如下: $MOD52    ORG   0000H         LJMP  MAIN         ORG   0003H         LJMP  0100H         ORG   0013H         LJMP  0150H         ORG   0050HMAIN:    CLR   A         MOV   30H , A           ;初始化缓存区         MOV   31H , A         MOV   32H , A         MOV   33H , A         MOV   R6  , A         MOV   R7  , A  SETB  EA  SETB  EX0  SETB  EX1  SETB  IT0  SETB  IT1  SETB  PX1NEXT1:   ACALL HEXTOBCDD        ;调用数制转换子程序         ACALL DISPLAY          ;调用显示子程序         LJMP  NEXT1          ORG   0100H  ;中断0服务程序 LCALL  DELY mov 70h,#2 djnz 70h,next JBC  F0,NEXT         SETB F0        CLR P0.0 LCALL  DELY0 SETB   P0.0                  MOV   A , R7   ADD   A , #1   MOV   R7, A   MOV   A , R6         ADDC  A , #0  MOV   R6 , A  CJNE  R6 , #07H , NEXT  CLR   A  MOV   R6 , A  MOV   R7 , ANEXT:  RETI  ORG   0150H    ;中断1服务程序 LCALL  DELY mov 70h,#2 djnz 70h,next2 JBC  F0,NEXT2 SETB  F0 CLR P0.0 LCALL  DELY0 SETB   P0.0    CLR C                     MOV   A , R7   SUBB   A , #1  MOV   R7, A  MOV   A , R6   SUBB  A , #0  MOV   R6 , A  CJNE  R6 , #07H , NEXT2  CLR   A  MOV   R6 , A  MOV   R7 , ANEXT2:  RETI   ORG   0200HHEXTOBCDD:MOV  A , R6               ;由十六进制转化为十进制         PUSH  ACC         MOV   A , R7         PUSH  ACC  MOV   A , R2         PUSH  ACC  CLR   A         MOV   R3 , A  MOV   R4 , A  MOV   R5 , A  MOV   R2 , #10HHB3:     MOV   A  , R7              ;将十六进制中最高位移入进位位中         RLC   A  MOV   R7 , A  MOV   A  , R6  RLC   A  MOV   R6 , A  MOV   A  , R5              ;每位数加上本身相当于将这个数乘以2  ADDC  A  , R5  DA    A  MOV   R5 , A  MOV   A  , R4  ADDC  A  , R4  DA    A                   ;十进制调整  MOV   R4 , A  MOV   A  , R3  ADDC  A  , R3  DJNZ  R2 , HB3  POP   ACC   MOV   R2 , A  POP   ACC   MOV   R7 , A  POP   ACC  MOV   R6 , A  RET  ORG   0250HDISPLAY:  MOV   R0 , #30H         MOV   A  , R5  ANL   A  , #0FH  MOV   @R0 , A  MOV   A  , R5  SWAP  A  ANL   A  , #0FH  INC   R0  MOV   @R0 , A  MOV   A  , R4  ANL   A , #0FH  INC   R0  MOV   @R0 , A  MOV   A   , R4  SWAP  A  ANL   A  , #0FH  INC   R0  MOV   @R0 , A  MOV   R0 , #30H  MOV   R2 , #11111110BAGAIN:   MOV   A  , R2         MOV   P2 , A         MOV   A  , @R0  MOV   DPTR , #TAB  MOVC  A  , @A+DPTR  MOV   P1 , A  ACALL DELAY  INC   R0  MOV   A  , R2  RL    A  MOV   R2 , A  JB    ACC.4  , AGAIN   RETTAB:     DB    03FH , 06H , 5BH , 4FH , 66H , 6DH , 7DH , 07H , 7FH , 6FH   ;七段码表DELY:    MOV   R1,#80D1:        MOV    R2,#100             DJNZ   R2,$ DJNZ    R1,D1 RET DELAY:   MOV   TMOD , #01H           ;延时子程序         MOV   TL0  , #0FEH         MOV   TH0  , #0FEH  SETB  TR0WAIT:    JNB   TF0  , WAIT         CLR   TF0  CLR   TR0  RETDELY0:   MOV  R1,  #200D3:  MOV  R2,#250          DJNZ  R2,$  DJNZ  R1,D3    RET          END       该系统实际应用广泛。可用在生产线上产品数量统计、公交车智能计数问候(需添加语音芯片)、超市内人数统计等公共场合。另外,添加串口通信部分便可实现与PC数据交换的功能。   由于,实验简化了,剩下不少零件和资金,所以我们又做了两项其他的实验。

    标签: 单片机 红外 控制系统设计 原理图

    上传时间: 2013-12-22

    上传用户:tangsiyun

  • 51程序库 (各种常用程序)

    ;片内RAM初始化子程序 IBCLR    :MOV    A,R0          MOV    R1,A          CLR    AIBC1     :MOV    @R1,A          INC    R1          DJNZ   R7,IBC1          RET ;片外RAM初始化子程序 EBCLR1   :MOV    A,ADDPL          MOV    DPL,A          MOV    A,ADDPH          MOV    DPH,A          CLR    CEBC11    :MOVX   @DPTR,A          INC    DPTR          DJNZ   R7,EBC11          RET ;片外RAM初始化子程序(双字节个单元) EBCLR2   :MOV    A,ADDPL          MOV    DPL,A          MOV    A,ADDPH          MOV    DPH,A          MOV    A,R7          JZ     EBC21          INC    R6EBC21    :CLR    A          MOVX   @DPTR,A          INC    DPTR          DJNZ   R7,EBC21          DJNZ   R6,EBC21          RET ;内部RAM数据复制程序;入口    :R0,R7;占用资源:A;堆栈需求:2字节;出口    :R1 IBMOV    :MOV    A,R0          ADD    A,R7          MOV    R0,A          MOV    A,R1          ADD    A,R7          MOV    R1,AIBM1     :DEC    R0          DEC    R1          MOV    A,@R0          MOV    @R1,A          DJNZ   R7,IBM1          RET ;外部RAM数据复制程序;入口    :ADDPH,ADDPL,R7;占用资源:ACC;堆栈需求:2字节;出口    :R0,R1 EBMOV1   :MOV    A,ADDPL          ADD    A,R7          MOV    DPL,A          CLR    A          ADDC   A,ADDPH          MOV    DPH,A          MOV    A,R7          ADD    A,R1          XCH    A,R0          ADDC   A,#00H          MOV    P2,AEBM11    :DEC    R0          CJNE   R0,#0FFH,EBM12          DEC    P2EBM12    :DEC    DPL          MOV    A,DPL          CJNE   A,#0FFH,EBM13          DEC    DPHEBM13    :MOVX   A,@R0          MOVX   @DPTR,A          DJNZ   R7,EBM11          RET ;外部RAM数据复制程序

    标签: 程序库 常用程序

    上传时间: 2013-10-30

    上传用户:bs2005

  • LC7461遥控解码子程序源代码

    //遥控解码子程序,LC7461,用户码为11C//external interrupt0void isr_4(){  unsigned char r_count;//定义解码的个数 unsigned long use_data=0;//定义16位的用户码,只用到13位 unsigned long use_code=0;//定义16位的用户反码,只用到13位 unsigned long data=0;//定义16位数据码,包括8位数据码和反码 unsigned char data_h=0;//数据反码 unsigned char data_l=0;//数据码 _clrwdt();// _delay(7000);//7461解码,延时7000// _delay(7000);//7461解码,延时7000//_delay(7000);//7461解码,延时7000 if(remote==1)  goto error; while(remote==0);//wait to high //_delay(9744);count_delay=0; while(count_delay<143); if(remote==1)  goto error;     /////用户码解码use_data//////////add//////////////////////////     for(r_count=13;r_count>0;r_count--)  {  while(remote==0);//wait to high  count_delay=0;     while(count_delay<24);//_delay(1680);  _c=remote;  if(_c==1)   {   _lrrc(&use_data);   count_delay=0;         while(count_delay<32);//_delay(2200);//wait to low   }  else   _lrrc(&use_data);  }  _nop(); //if(remote==1)  //_delay(1680);//wait to low while(remote==1);//wait to low     _nop();     ////////用户码解码finish/////////add/////////add////////     /////用户码反码解码use_code//////////add//////////////////////////     for(r_count=13;r_count>0;r_count--)  {  while(remote==0);//wait to high  count_delay=0;         while(count_delay<24);//_delay(1680);  _c=remote;  if(_c==1)   {   _lrrc(&use_code);   count_delay=0;         while(count_delay<32);//_delay(2200);//wait to low   }  else   _lrrc(&use_code);  } _nop(); //if(remote==1) // _delay(1680);//wait to low while(remote==1);//wait to low     _nop();     ////////用户码反码解码finish/////////add/////////add////////     ////数据码解码开始////data_l为用户码,data_h为数据码反码//////////// for(r_count=16;r_count>0;r_count--)  {  while(remote==0);//wait to high  count_delay=0;         while(count_delay<24);//_delay(1680);  _c=remote;  if(_c==1)   {   _lrrc(&data);   count_delay=0;         while(count_delay<32);//_delay(2200);//wait to low   }  else   _lrrc(&data);  } ////数据码解码结束//////////////////////////////////////////////// data_l=data; data_h=data>>8; ///用户码////// use_data>>=3; use_code>>=3; use_code=~use_code; //////// ////如果用户码等与0x11c并且数据码和数据反码都校验一致,解码成功 //if((~data_h==data_l)&&use_data==0x11c)//使用用户码 //跳过用户码 if(~data_h==data_l)//如果数据码和数据反码(取反后)相等,解码正确  {  _nop();  r_data=data_l;//r_data为解出的最终数据码  } //否则解码不成功 _nop(); _nop();error:  //r_data=nocode; _nop();    _nop(); _nop();}

    标签: 7461 LC 遥控 解码

    上传时间: 2014-03-27

    上传用户:shenlan

  • 红外遥控接收程序

    红外遥控接收;=================================================;; zsMCU51实验板配套学习例程;; 中山单片机学习网 智佳科技;; 作者:逸风 QQ:105558851;; http://www.zsmcu.com; E-mail:info@zsmcu.com;=================================================ORG 0000HLJMP START;转入主程序ORG 0010HSTART:MAIN:JNB P2.2,IRLJMP MAIN;以下为进入P3.2脚外部中断子程序,也就是解码程序IR:MOV R6,#9SB:ACALL DELAY882 ;调用882微秒延时子程序JB P2.2,EXIT ;延时882微秒后判断P3.2脚是否出现高电平如果有就退出解码程序DJNZ R6, SB ;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序;以上完成对遥控信号的9000微秒的初始低电平信号的识别。JNB P2.2, $ ;等待高电平避开9毫秒低电平引导脉冲ACALL DELAY2400JNB P2.2,IR_Rp ;ACALL DELAY2400 ;延时4.74毫秒避开4.5毫秒的结果码MOV R1,#1AH ;设定1AH为起始RAM区MOV R2,#4PP:MOV R3,#8JJJJ:JNB P2.2,$ ;等待地址码第一位的高电平信号LCALL DELAY882 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态MOV C,P2.2 ;将P3.2引脚此时的电平状态0或1存入C中 JNC UUU ;如果为0就跳转到UUULCALL DELAY1000UUU:MOV A,@R1 ;将R1中地址的给ARRC A ;将C中的值0或1移入A中的最低位MOV @R1,A ;将A中的数暂时存放在R1中DJNZ R3,JJJJ ;接收地址码的高8位INC R1 ;对R1中的值加1,换下一个RAMDJNZ R2,PP ;接收完16位地址码和8位数据码和8位数据,存放在1AH/1BH/1CH/1DH的RAM中MOV P1,1DH ;将按键的键值通过P1口的8个LED显示出来!CLR P2.3 ;蜂鸣器鸣响-嘀嘀嘀-的声音,表示解码成功LCALL DELAY2400LCALL DELAY2400LCALL DELAY2400SETB P2.3;蜂鸣器停止LJMP MAINIR_Rp:LJMP MAINEXIT:LJMP MAIN ;退出解码子程序;=============================882DELAY882: ;1.085x ((202x4)+5)=882MOV R7,#202DELAY882_A:NOPNOPDJNZ R7,DELAY882_ARET;=============================1000DELAY1000: ;1.085x ((229x4)+5)=999.285MOV R7,#229DELAY1000_A:NOPNOPDJNZ R7,DELAY1000_ARET;=============================2400

    标签: 红外遥控 接收程序

    上传时间: 2013-11-01

    上传用户:2525775

  • 4位八段数码管的十进制加计数仿真实验(含电路图和仿真文件)

    4位八段数码管的十进制加计数仿真实验,程序采用汇编语言编写。此程序在仿真软件上与EDN-51实验板上均通过。仿真图中的数码管位驱动采用74HC04,如按EDN-51板上用想同的PNP三极管驱动在仿真软件上则无法正常显示。程序共分5块,STAR0为数据初始化,STAR2为计数子程序,STAR3为4位数码管动态显示子程序,STAR4为按键扫描子程序,STS00是延时子程序。由于EDN-51实验板上没装BCD译码器,所以编写程序比较烦琐。 程序如下: ORG 0000H                LJMP STAR0                        ;转程序 SRAR0ORG 0200H                                          ;程序地址 0200HSTAR0:   CLR 00                                  ;位 00 清 0               MOV P1,#0FFH                    ;#0FFH-->P1               MOV P2,#0FH                      ;#0FH-->P2               MOV P0,#0FFH                    ;#0FFH-->P0               MOV 30H,#00H                    ;#00H-->30H               MOV 31H,#00H                    ;#00H-->30H               MOV 32H,#00H                    ;#00H-->30H               MOV 33H,#00H                    ;#00H-->30H               LJMP STAR3                        ;转程序 SRAR3STAR2:   MOV A,#0AH                       ;#0AH-->A               INC 30H                                ;30H+1               CJNE A,30H,STJE                 ;30H 与 A 比较,不等转移 STJE               MOV 30H,#00H                    ;#00H-->30H               INC 31H                                ;31H+1               CJNE A,31H,STJE                 ;31H 与 A 比较,不等转移 STJE               MOV 31H,#00H                    ;#00H-->31H               INC 32H                                ;32H+1               CJNE A,32H,STJE                 ;32H 与 A 比较,不等转移 STJE               MOV 32H,#00H                    ;#00H-->32H               INC 33H                                ;33H+1               CJNE A,33H,STJE                 ;33H 与 A 比较,不等转移 STJE               MOV 33H,#00H                    ;#00H-->33H               MOV 32H,#00H                    ;#00H-->32H               MOV 31H,#00H                    ;#00H-->31H               MOV 30H,#00H                    ;#00H-->30HSTJE:      RET                                        ;子程序调用返回STAR3:   MOV R0,#30H                      ;#30H-->R0                MOV R6,#0F7H                   ;#0F7H-->R6SMG0:    MOV P1,#0FFH                    ;#0FFH-->P1                MOV A,R6                            ;R6-->A                MOV P1,A                            ;A-->P1                RR A                                     ;A向右移一位                MOV R6,A                           ;A-->R6                MOV A,@R0                       ;@R0-->A                ADD A,#04H                        ;#04H-->A                MOVC A,@A+PC               ;A+PC-->                MOV P0,A                            ;A-->P0                AJMP SMG1                        ;转程序 SMG1SDATA:   DB 0C0H,0F9H,0A4H,0B0H,99H                DB 92H,82H,0F8H,80H,90H SMG1:     LCALL STAR4                    ;转子程序 SRAR4                LCALL STS00                     ;转子程序 STS00                INC R0                                 ;R0+1                CJNE R6,#07FH,SMG0       ;#07FH 与 R6 比较,不等转移 SMG0                AJMP STAR3                       ;转程序 SRAR3STAR4:    JNB P2.0,ST1                      ;P2.0=0 转 ST1                CLR 00                                 ;位 00 清 0                SJMP ST3                            ;转ST3ST1:         JNB 00,ST2                          ;位 00=0 转 ST2                SJMP ST3                            ;转 ST3ST2:         LCALL STAR2                    ;调子程序 STAR2                SETB 00                               ;位 00 置 1ST3:         RET                                      ;子程序调用返回ORG 0100H                                         ;地址 0100HSTS00:     MOV 60H,#003H                ;#003H-->60H  (211)DE001:     MOV 61H,#0FFH               ;#0FFH-->61H (255)DE002:     DJNZ 61H,DE002               ;61H 减 1 不等于 0 转 DE002                 DJNZ 60H,DE001               ;60H 减 1 不等于 0 转 DE001                 RET                                     ;子程序调用返回                 END                                    ;结束 上次的程序共有293句,经小组成员建议,本人经几天的研究写了下面的这个程序,现在的程序用了63句,精简了230句。功能没有减。如谁有更简练的程序,请发上来,大家一起学习。 4位八段数码管的十进制加计数仿真实验(含电路图和仿真文件)

    标签: 数码管 十进制 仿真实验 仿真

    上传时间: 2013-10-11

    上传用户:sssl