单片机bcd码转换程序编c语言选2组p口?

T89S51单片机的P1.0-P1.3接四个发光二极管L1-L4,P1.4-P1.7接了四个开关K1-K4,编程将开关的状态反映到发光二极管上。(开关闭合,对应的灯亮,开关断开,对应的灯灭)

}

《第四MCS单片机的程序设计B》由会员分享,可在线阅读,更多相关《第四MCS单片机的程序设计B(28页珍藏版)》请在人人文库网上搜索。

1、单片机原理与控制技术单片机原理与控制技术电气学院:王欣第第04章:章:MCS51单片机的程序设计单片机的程序设计主要内容:l 汇编语句格式与伪指令l 简单程序与分支程序举例与分析l 循环程序举例与分析l 子程序举例(查表)l C51初步(程序段例示)3、常用的典型子程序(掌握,能记能背!)l 顺序(直线)程序l 分支程序l 循环程序(单循环、多循环)l 散转l 子程序与参数传递l 查表程序l 数制转换l 数学运算程序4)散转程序设计散转程序设计 散转程序是分支程序的一种散转程序是分支程序的一种, , 它可根据运算结果或输入数据将程序它可根据运算结果或输入数据将程序转入不同的分支。转入不同的分支

2、。 MCS - 51 MCS - 51 指令系统中有一条跳转指令指令系统中有一条跳转指令JMP A+DPTRJMP A+DPTR, , 用它可以很用它可以很容易地实现散转功能。该指令把累加器的容易地实现散转功能。该指令把累加器的8 8 位无符号数与位无符号数与 16 16 位数据指位数据指针的内容相加针的内容相加, , 并把相加的结果装入程序计数器并把相加的结果装入程序计数器PC, PC, 控制程序转向目标控制程序转向目标地址去执行。地址去执行。 此指令的特点在于此指令的特点在于, , 转移的目标地址不是在编程或汇编时预先确转移的目标地址不是在编程或汇编时预先确定的定的, , 而是在程序运行过

3、程中动态地确定的。而是在程序运行过程中动态地确定的。目标地址是以数据指针目标地址是以数据指针 DPTRDPTR的内容为起始的的内容为起始的 256 256 字节范围内的指定地址字节范围内的指定地址, , 即由即由 DPTRDPTR的内容决的内容决定分支转移程序的首地址定分支转移程序的首地址, , 由累加器由累加器A A的内容来动态选择其中的某一个的内容来动态选择其中的某一个分支转移程序。分支转移程序。例例8(8(同例同例3)3):根据工作寄存器根据工作寄存器R0 内容的不同内容的不同, 使程序转入相应的分支:使程序转入相应的分支: (R0)=0 对应的分支程序标号为对应的分支程序标号为PR0;

KB范围的存储区内的情形。范围的存储区内的情形。若超出若超出 2 KB范围范围可在分支程序入口处安排一条长跳转指令可在分支程序入口处安排一条长跳转指令, 可采用如下程序可采用如下程序: MOV DPTR, TABMOV A, R0 MOV B, 03H

6、 ; 长跳转指令占长跳转指令占 3 个字节个字节MUL ABXCH A, B; 成绩的高成绩的高8位送入位送入A中中 ADD A, DPH; 对分支转移参数高位进行处对分支转移参数高位进行处理,把它加到理,把它加到DPH中去中去MOV DPH, A;修正修正DPTRXCH A, BJMP A+DPTR; 跳至散转表中相应的位置跳至散转表中相应的位置TAB: LJMP PR0;

7、功能编制为程序段作通常把一些基本操作功能编制为程序段作为独立的子程序为独立的子程序, , 以供不同程序或同一程序反以供不同程序或同一程序反复调用。在程序中需要执行这种操作的地方放复调用。在程序中需要执行这种操作的地方放置一条调用指令置一条调用指令, , 当程序执行到调用指令当程序执行到调用指令, , 就就转到子程序中完成规定的操作转到子程序中完成规定的操作, , 并返回到原来并返回到原来的程序继续执行下去。的程序继续执行下去。 子程序是如何调用的?子程序是如何调用的? 调用子程序的指令调用子程序的指令有有“ACALLACALL”和和“LCALLLCALL”, , 执行调用指令时执行调用指令时,

8、 , 先将程序地址指针先将程序地址指针PCPC改变改变(“ACALLACALL”加加2, 2, “LCALLLCALL”加加3 3), , 然后然后 PCPC值压入值压入堆栈堆栈, , 用新的地址值代替。执行返回指令时用新的地址值代替。执行返回指令时, , 再再将将 PCPC值弹出。值弹出。 子程序调用中子程序调用中, , 主程序应先把有关的参数存主程序应先把有关的参数存入约定的位置入约定的位置, , 子程序在执行时子程序在执行时, , 可以从约定的可以从约定的位置取得参数位置取得参数, , 当子程序执行完当子程序执行完, , 将得到的结果将得到的结果再存入约定的位置再存入约定的位置, , 返

9、回主程序后返回主程序后, , 主程序可以主程序可以从这些约定的位置上取得需要的结果从这些约定的位置上取得需要的结果, , 这就是这就是参参数的传递。数的传递。 子程序编程与调用子程序编程与调用 例例9:试编写多字节加法子程序试编写多字节加法子程序 分析:设这两个多字节数分别存放在起始地址为分析:设这两个多字节数分别存放在起始地址为FIRST和和SECOND的连续区域中(从的连续区域中(从低位字节开始存放),两个数的字节数存放在低位字节开始存放),两个数的字节数存放在NUMBER单元中,最后求得的和存放在单元中,最后求得的和存放在FIRST开始的区域中。现采用单字节加法指令进行多字节的加法运算,

11、R1 DJNZ R2,LOOP ;计数及循环控制计数及循环控制 RET ;子程序返回子程序返回 END 这里使用了存储区域这里使用了存储区域FIRST 和和SECOND以及存储单元以及存储单元NUMBER作为数据、结果交接区。作为数据、结果交接区。 子程序编程与调用子程序编程与调用 例例9:试编写多字节加法子程序试编写多字节加法子程序 分析:设这两个多字节数分别存放在起始地址为分析:设这两个多字节数分别存放在起始地址为FIRST和和SECOND的连续区域中(从的连续区域中(从低位字节开始存放),两个数的字节数存放在低位字节开始存放),两个数的字节数存放在NUMBER单元中,最后求得的和存放在单

12、元中,最后求得的和存放在FIRST开始的区域中。现采用单字节加法指令进行多字节的加法运算,因此可用循环开始的区域中。现采用单字节加法指令进行多字节的加法运算,因此可用循环程序来实现。程序来实现。编写子程序,供其它程序调用编写子程序,供其它程序调用:FIRST EQU 08H SECOND EQU 30H NUMBER EQU 70H ORG 3000HAABB: MOV

13、MOV R0, A ;存放结果存放结果 INC R0 ;修改地址指针修改地址指针 INC R1 DJNZ R2,LOOP ;计数及循环控制计数及循环控制 RET ;子程序返回子程序返回 END 这里使用了存储区域这里使用了存储区域FIRST 和和SECOND以及存储单元以及存储单元NUMBER作为数据、结果交接区。作为数据、结果交接区。子程序名分析:假设一个字节的分析:假设一个字节的1616进制数在内部进制数在内部RAMRAM的的40H40H和和41H41H单元,查表求得对应的两位单元,查表求得对应的两位ASCIIASCII并将结果存入并将结果存入50H50H、51H51H单元,可用堆栈进行参

14、数传递单元,可用堆栈进行参数传递 1 1)子程序)子程序HEASCHEASC的功能:取出堆栈中的数据,查表将低半字节转换成的功能:取出堆栈中的数据,查表将低半字节转换成ASCIIASCII送累加器送累加器A A。2 2)分别将待转换数据入栈)分别将待转换数据入栈, ,然后调用子程序然后调用子程序HEASC, HEASC, 程序如下程序如下: : MAIN: MOV SP, 30H

15、; 存低半字节转换结果存低半字节转换结果 PUSH 41H LCALL HEASC POP A MOV 51H, A ; 存高半字节转换结果存高半字节转换结果END;位置对吗?位置对吗?HEASC: DEC SP DEC SP ; SP 指向十六进制数参数地址 子程序编程与调用子程序编程与调用 例例10:查表求出数据的查表求出数据的ASCII码码, 再以字符形式输出。再以字符形式输出。 POP A ;取入口参数取入口参数 ;查表求ASCII码 PUSH A;保存出口参数 INC SP;指向返回地址 INC SP RET TAB: DB 0,1, ;ASCII码表 在编写子程序时,需要注意以下两

16、点在编写子程序时,需要注意以下两点 1)保护现场与恢复现场(堆栈的使用)保护现场与恢复现场(堆栈的使用)。子程序执行时,可能要使。子程序执行时,可能要使用累加器和某些工作寄存器。在调用子程序之前,这些寄存器中用累加器和某些工作寄存器。在调用子程序之前,这些寄存器中可能存放有主程序的中间结果,这些中间结果在子程序返回后可可能存放有主程序的中间结果,这些中间结果在子程序返回后可能仍需要使用。这就需要在子程序使用累加器和这些工作寄存器能仍需要使用。这就需要在子程序使用累加器和这些工作寄存器之前,先将其中的内容转移到安全区域保护起来,即保护现场。之前,先将其中的内容转移到安全区域保护起来,即保护现场。

17、当子程序执行完后,即返回主程序之前,再将这些内容取出,送当子程序执行完后,即返回主程序之前,再将这些内容取出,送回到累加器和原来的工作寄存器中,这一过程称为恢复现场。回到累加器和原来的工作寄存器中,这一过程称为恢复现场。 2)数据连接点(参数传递)数据连接点(参数传递)。例如,当要求。例如,当要求sin45时,可用正弦函时,可用正弦函数子程序。但在调用之前必须把数子程序。但在调用之前必须把45送到某一交接处,调用子程序送到某一交接处,调用子程序后,子程序从交接处取回后,子程序从交接处取回45,并求它们的正弦值。在正弦函数求,并求它们的正弦值。在正弦函数求出后,返回主程序之前必须把计算结果送到交

18、接处。在返回主程出后,返回主程序之前必须把计算结果送到交接处。在返回主程序后,主程序从交接处取得结果。在通常情况下,常以累加器序后,主程序从交接处取得结果。在通常情况下,常以累加器A作为数据交接寄存器,也可使用工作寄存器作为数据交接寄存器,也可使用工作寄存器R0R7。这在编写和这在编写和调用子程序时必须统一。调用子程序时必须统一。6)6)查表程序设计查表程序设计 什么是查表程序?什么是查表程序? 查表程序是一种常用程序查表程序是一种常用程序, 它广泛使用于它广泛使用于 LED显示控制、显示控制、 打印机打印机打印控制、数据补偿、数值计算、转换等功能程序中打印控制、数据补偿、数值计算、转换等功能

19、程序中, 这类程序具有简单、这类程序具有简单、执行速度快等特点。执行速度快等特点。 所谓查表法所谓查表法, 就是预先将满足一定精度要求的表示变量与函数值之就是预先将满足一定精度要求的表示变量与函数值之间关系的一张表求出间关系的一张表求出, 然后把这张表存于单片机的程序存储器中然后把这张表存于单片机的程序存储器中, 这时自这时自变量值为单元地址变量值为单元地址, 相应的函数值为该地址单元中的内容。查表相应的函数值为该地址单元中的内容。查表, 就是根就是根据变量据变量 X在表格中查找对应的函数值在表格中查找对应的函数值 Y, 使使 Y=f(X)。 MCS - 51指令系统中指令系统中, 有两条查表

20、指令有两条查表指令: MOVC A, A+PC MOVC A, A+DPTR如何实现查表操作?如何实现查表操作? S1:将需要查表的首地址用:将需要查表的首地址用MOV指令来装入数据指针指令来装入数据指针DPTR,(用(用PC不需此步!)不需此步!) S2:然后再将需要查访表的项数用:然后再将需要查访表的项数用MOV指令装入累加器指令装入累加器A中,中, S3:最后用:最后用MOVC A ,A+DPTR指令将查表中相应项的内容送累加器指令将查表中相应项的内容送累加器A中,中,这时这时A中的内容即为需要从表中查访到的内容。中的内容即为需要从表中查访到的内容。对于较短的表数据指针对于较短的表数据指

21、针DPTR可装入一个常数。对于较长的表(项数超过可装入一个常数。对于较长的表(项数超过256)或)或较复杂的数据处理,数据指针较复杂的数据处理,数据指针DPTR中的内容需要进行一些变换,有时需将中的内容需要进行一些变换,有时需将DPTR拆开成拆开成DPH和和DPL,用标准算术指令进行运算或修改。用标准算术指令进行运算或修改。 MCS - 51指令系统中指令系统中, 有两条查表指令有两条查表指令: MOVC A, A+PC;PC为当前指令的程序地址,不需另外赋值为当前指令的程序地址,不需另外赋值 MOVC A, A+DPTR 查表子程序的编程查表子程序的编程 例例11:试编:试编写写:若累加器若

22、累加器A中存放的是某一位十进中存放的是某一位十进制数的七段码,通过查表程序,将其转换为相应的制数的七段码,通过查表程序,将其转换为相应的BCD码,仍存在累加器码,仍存在累加器A中。中。 分析:设由于七段码不是有序码,其间排列没什么规律可循,因此不能用通分析:设由于七段码不是有序码,其间排列没什么规律可循,因此不能用通常的查表程序那样一次查表求得。但仍可以列出一个七段码表,从第一个码常的查表程序那样一次查表求得。但仍可以列出一个七段码表,从第一个码开始取出并与开始取出并与A中的代码进行比较,同时记下比较次数,待到取出的代码与中的代码进行比较,同时记下比较次数,待到取出的代码与A中的代码一致时,停

23、止继续比较。此时所记下的次数就是所要求的中的代码一致时,停止继续比较。此时所记下的次数就是所要求的BCD码。码。 MOVR1,#00H;R1为计数器为计数器 MOVB,A MOVDPTR,#KTAB ;取取KTAB所在位置的地址所在位置的地址LOOP:MOVA,R1;从第零项开始查表;从第零项开始查表 MOVCA,A+DPTR CJNEA,B,NEXT ;若不等于源代码,则转移;若不等于源代码,则转移 SJMP RESV ;找到七段码的找到七段码的BCD值,退出值,退出LOOP循环循环NEXT:INCR1;计数器加;计数器加1SJMPLOOP;继续查表比较;继续查表比较RESV:MOVA,R1

温度模拟信号由温度模拟信号由 10 10 位位A/DA/D输入。试将输入。试将A/DA/D结果转换为对应温度值输出。结果转换为对应温度值输出。 分析:可采用查表方法实现。分析:可采用查表方法实现。 先由实验测试出整个温度量程范围内的先由实验测

25、试出整个温度量程范围内的A/D转换结果转换结果, 把把A/D转换结果转换结果000H3FFH所对应的温度值组织为一个表存储在程序存储器中所对应的温度值组织为一个表存储在程序存储器中, 那那么就可以根据检测到的模拟量的么就可以根据检测到的模拟量的 A/D转换值查找出相应的温度值。转换值查找出相应的温度值。 设测得的设测得的A/DA/D转换结果已存入转换结果已存入20H#,21H20H#,21H单元中(高位字节在单元中(高位字节在20H20H中中, , 低位字节在低位字节在21H21H中)中), , 查表得到的温度值存放在查表得到的温度值存放在22H#,23H22H#,23H单元(高位字节在单元(

27、C DPTR MOVC A, A+DPTR; 查表得温度查表得温度值低字节值低字节MOV 23H, A RETTAB: DW 7)7) 中断服务子程序的编写中断服务子程序的编写数制转换编程实例数制转换编程实例 例例13:要要求用求用P1口高口高4位位P1.7P1.4输入输入4个开关个开关状态,每个开关状态,每个开关K闭合用闭合用P1.3P1.0输输出驱动点亮指示灯。出驱动点亮指示灯。用用INT1的中断程的中断程序将开关状态读入单片机序将开关状态读入单片机内,经过高内,经过高4位与低位与低4位互换后再向位互换后再向P1.3P1.0输出,输出,灯发光顺序与开关顺序对应,要求利用灯发光顺序与开关顺序

28、对应,要求利用INT1控制这个输入开关状态到输出显控制这个输入开关状态到输出显示过程。示过程。分析:在分析:在ISR中读入按键状态,用键值去中读入按键状态,用键值去驱动对应的驱动对应的LED发光。发光。 中断初始化:中断初始化:选择选择INT1负跳变触发负跳变触发中断(将中断(将TCON中中IT1置置1);开放中);开放中断断INT1(使(使IE中的中的EX1 和和EA置置1)

;以下为以下为INT1中断服务程序:中断服务程序:ISR_1 : MOV A,#0FFH;中断服务子程序中断服务子程序 MOV P1,A;准备读;准备读P1口引脚状态口引脚状态 MOV A,P1;读;读P1口高四位口高四位P

30、1.7P1.4开关状态开关状态 SWAP A;P1口高、低口高、低4位交换位交换 MOV P1,A;输出开关状态,点灯;输出开关状态,点灯 RETI ;返回断点;返回断点 END8)8) 数制转换数制转换程序程序数制转换编程实例数制转换编程实例 例例14:将一个字节二进制数转换成将一个字节二进制数转换成 3 位非压位非压缩型缩型BCD码码HEXBCD: MOV A, 40H MOV B, 100;100作为除数送入作为除数送入B DIV AB MOV 50H, A;A的商作为百位数送的商作为百位数送(50H)单元,余数在)单元,余数在B中中 MOV A, 10;分离十位和个位数分离十位和个位数

分析:二进制数转换成分析:二进制数转换成BCDBCD码一般的方码一般的方法是把二进制数除以法是把二进制数除以、100100、1010等等1010的各次幂,所得到的商分别为的各次幂,所得到的商分别为BCDBCD码码的千位数、百位数、十位数,余数为个的千位数、百位数、十位数,余数为个位数。位数。 单字节二进制数在单字节二进制数在0255之间,之间,设单字节二进制数在内部设单字节二进制数在内部RAM 40H单单元元, 转换结果放入内部转换结果放入内部RAM 50H, 51H, 52H单元中(高位在前)单元中(高位在前) 9)9) 数学运算数学运算程序程序网上可下载到相关的定点、浮点运算子程序库本讲小结本讲小结l 散转程序(多路分支程序的一种) JMP A+DPTRl 子程序与参数传递l 查表程序编程及典型应用 MOVC A,A+PC MOVC A,ADPTRl 中断服务子程序编程l 数制转换子程序编程l C51编程初步 2、 编写8位十进制(BCD)码数加法子程序,设被加数存放在内部RAM的33H、32H、31H、30H单元,加数存在43H 、

}

  MCS51是指由美国INTEL公司(对了,就是大名鼎鼎的INTEL)生产的一系列的总称,这一系列单片机包括了好些品种,如51,52等,其中8051是早典型的产品,该系列其它单片机都是在8051的基础上进行功能的增、减、改变而来的,所以人们习惯于用8051来称呼MCS51系列单片机,而8031是前些年在我国的单片机,所以很多场合会看到8031的名称。但如是对一般的系统而言,这些功能往往闲置不用。那么就可以选用一些本来闲置不用的口线作为选通信号来进行并行口的扩展,这样就能充分利用单片机有限的i/o资源,在本设计中是将p1口扩展成一个或几个8位并行口,在每一个八位口上接入8个发光二极管做为输出,二极管是做开关量来使用的,在这里设计了跑马灯和流水灯程序,做到对开关量的开断控制;配合开关量的控制笔者设计了一个共阳led数码管,用来显示当前发光二极管发亮的序号,做到更加直观的双重控制效果,然后再将p0口通过d/a转换器和一放大器输出一个模拟信号,其结果可以通过示波器看出。这样整个系统即有了数字信号输出和模拟信号输出,也有数码管显示功能,实用性能大提高了。

  2 基于89c51的系统硬件设计

  2.1 并行口的扩展的电路设计

  AT89C51是一种带4K字节FLASH(FPEROM-FlashProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

  众所周知,c51系列的单片机都有四个i/o口(p0、p1、p2、p3),那么at89c51也不例外,但我们通常仅仅使用p1口作为并行口,而令其余口(p2、p3)处于闲置状态,所以这次设计,我们就是使用闲置不用的p3口做为选能信号线来将p1口进行并行口扩展。

  (1) 种方式的并行口扩展优点

  不占用存储器空间;

  (2) 编程也方便灵活。但也有很大的缺点

  并行口扩展能力有限,(如使用74ls573(74ls373)且不进行驱动处理,则多可扩展4个同样类型的并行输出端口,当然还需要与之对应的四个选通信号。)

  如扩展较多,选通信号占用并行口位数太多,例如欲扩展8个并行输出端口,则需要8个选能信号,此时,仅选能信号就占用了一个8位并行口,这对在i/o端口线有限的单片机系统中,如此浪费资源的现象是不能容忍的。在本次的设计中,采用芯片74hc573(带三态输出的八进制透明d型锁存器)对p1口进行了一个8位并行口的扩展,选通信号选用p3口的p3.3引脚。原理图如图1所示:


  2.2 拟信号输出的电路设计

  数模转换器,又称D/A转换器,简称DAC,它是把数字量转变成模拟的器件。D/A转换器基本上由4个部分组成,即权电阻网络、、基准电源和模拟开关。模数转换器中一般都要用到数模转换器,模数转换器即A/D转换器,简称ADC,它是把连续的模拟信号转变为离散的数字信号的器件。常见的数模转换器是将并行二进制的数字量转换为直流电压或直流电流,它常用作过程控制计算机系统的输出通道,与执行器相连,实现对生产过程的自动控制。数模转换器电路还用在利用反馈技术的模数转换器设计中。

  模拟信号的输出需要用到d/a转换器,这里我使用常用的8位的d/a转换器dac0832来转换数字电压信号。因dac0832是并行d/a转换,其输出为电流型,在使用时,必须额外增加一个运算放大器,才能得到电压信号,在本次电路中使用了1个lm741放大器来放大信号输出,lm741是一个普通的单操作的放大器,具有输入电压范围大,短路电压保护,高增益和不需频率补偿等优点。dac0832的片选端口与单片机的p2.2相连,xfer和wr2接地,使之一直处于使能状态,即输入数据寄存器中的数字信号可直接转换为模拟信号。d/a转换电路的输出是一个周期的正弦波,通过外接示波器可以清淅的看到。另外模拟信号的输出引在一个外接端子上,可以与其它系统相连接,做到通用性的效果。d/a转换原理图如图2所示:


  2.3 静态数码管显示的电路设计

  静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个呢:),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。

  数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个"8"可分为1位、2位、4位等等数码管; 数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。这里我们所设计的电路显示是属于静态显示那种,是两位静态数码管显示,其主要的功能是显示当前发光led的序号,比如如果当前是l1灯在亮的话,数码管将显示11,是l2灯亮,数码管显示22字样等。电路的设计使用2个8位的移位寄存器(74hc164),和两个八段的led数码管(共阳的)加上2个8×330ω的构成。静态数码管显示的优点在于,编写程序相对比较简单,一旦将欲显示的数据发送出去,只要当前显示的数据没有变化,就无须理睬它。不足之处在于,如果显示的位数太多,硬件的开销和电源的功耗问题将会很严重(比如这里,只需显示两位,就需要用到两块74hc164和2个排阻)。电路原理图如图3所示:


  2.4 电源部分电路的设计

  整个电路系统使用9v~12v的直流电源供电,故使用一个拔码开关和一个二极管,以起保护作用,这里拔码开关只起到电源开关的作用。由于cpu电源为5v,所以使用l7805三端稳压来供cpu电源,电源指示灯一个。电源部分电路图如图4所示:


  2.5 复位部分电路设计

  本电路的复位电路是用一个复位芯片max706p来设计的,并带有复位按钮一个。这里复位是低电平有效的,有手动复位按钮,当程序跑飞或无响应时可以选用手动复位。复位信号来自于cpu的p22口。复位电路原理图如图5所示。


  3 系统软件部分设计与应用

  程序已经调试通过,整个程序实现的功能如下:

  p1口的八位扩展,控制8个开关led指示灯,程序实验了对这8个指示灯的开关跑马控制,实验程序可以编写从l1至l8的循环发亮,在每个发光二极管发光的同时,数码管显示当前发亮led的序号,比如11、22、33等等。也可让每个二极管闪烁,可以规定闪烁时间为半秒钟或更长,然后再在每一个led指示灯闪烁的同时,让led数码管显示当前闪烁的指示灯的序号,比如,l1灯闪烁时,数码管显示11字样,l2灯闪烁时,数码管显示22字样等等。在数模转换这一子函数的编写上,是使用指针数组来写的,dac0832实现da的转换的芯片,实现的功能是输出一正弦波模拟信号,当在端子口接一示波器时,示波器将输出一正弦波图形。主程序流程图如(图6)所示。以上所述是整个系统的功能,所有的程序都已经通过调试试验,实验证明是可行的。

  整个系统的软件已经完全通过调试,证明是切实可行的,整个系统的硬件设计是本着单片机系统设计的简单化原则来设计,显的简炼有序,软件编写也非常简单易懂。本系统设计比较适合于在小型系统中应用。

}

我要回帖

更多关于 单片机bcd码转换程序 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信