数码管循环显示
- 格式:docx
- 大小:11.79 KB
- 文档页数:1
设计任务及指标:用LED数码管间隔显示数字,按下S0依次间隔2s循环显示0~9十个数字,按S1依次间隔2s显示0~9中奇数,5秒后,依次间隔2s显示0~9中偶数,并且实现奇偶的循环。
在显示的过程中,只要有一键按下,就立即实现该键的功能,且计数初值为相应循环的初值。
设计思路:设计可以分为循环模式切换的控制部分、间隔2s的循环控制部分、编码部分和输出部分四大模块。
1.循环模式切换的控制部分:定义:X000:0~9循环X001:奇偶循环M200:用来切换显示模式的中间继电器M203:用来恢复初值的中间继电器工作过程:按下X000时,M200不得电,M200的触点不工作,实现0~9循环的所有中间继电器接通,并且在X000的启动下,其中的显示0的中间继电器M0开始工作;当按下X001时,M200得电,M200的触点工作,使奇偶循环的所有中间继电器接通,实现切换。
同时,当X000与X001中只要任意一个按下时,M203得电,M203的常闭触点断开,使第2~10组控制显示的中间继电器与时间继电器失电,从而保证只有第一组能工作,防止在切换过程中出现两组同时工作导致乱码。
梯形图如下:2.间隔2s的循环控制部分:定义:控制显示的部分M0显示0、M1显示1、M2显示2、M3显示3、M4显示4、M5显示5、M6显示6、M7显示7、M8显示8、M9显示9;M10显示1、M11显示3、M12显示5、M13显示7、M14显示9、M15显示0、M16显示2、M17显示4、M18显示6、M19显示8;间隔2s的循环部分:T0~T9的延迟时间为2s,T10的延迟时间为5s ;工作过程:起动时按下X000,M0开始工作,显示0,T0也开始工作;2s后T0的常开触点闭合,M1开始工作,显示1,同时M1的常闭触点断开,使得M0失电。
重复上述过程,即可实现0~9的循环显示;此时按下X001,M200、M203工作,M203的常闭触点断开使M1~M9、M11~M19、T1~T9失电,M200的常开触点闭合,常闭触点断开,使得M0~M9一直处于断开,M10~M19接通;与此同时,X001按下使得M10上电显示1,其工作过程与0~9循环时一样,区别在于此时T4处于断开T10接通代替T4工作,以此来实现奇偶变换时5s 的延时。
4位数码管循环4位数码管可以显示0-9的数字,因此可以通过循环实现数字的循环显示。
一种简单的方式是使用四个数码管分别显示个位、十位、百位和千位的数字。
通过循环不断更新这四个数码管的显示内容,就可以实现数字的循环显示。
以下是一个示例代码:```c#include <avr/io.h>#include <avr/delay.h>void displayDigit(uint8_t digit){// 根据数字设置对应的数码管段亮起switch (digit) {case 0:PORTA = 0b00111111;break;case 1:PORTA = 0b00000110;break;case 2:PORTA = 0b01011011;break;case 3:PORTA = 0b01001111;break;case 4:PORTA = 0b01100110;break;case 5:PORTA = 0b01101101;break;case 6:PORTA = 0b01111101;break;case 7:PORTA = 0b00000111;break;case 8:PORTA = 0b01111111;break;case 9:PORTA = 0b01101111;break;default:// 如果传入的数字不在0-9之间,将所有数码管熄灭 PORTA = 0b00000000;break;}}int main(void){// 设置端口A为输出端口DDRA = 0xFF;while (1) {for (int i = 0; i < 10000; i++) {int thousands = i / 1000;int hundreds = (i % 1000) / 100;int tens = (i % 100) / 10;int ones = i % 10;// 分别显示千位、百位、十位和个位的数字displayDigit(thousands);_delay_ms(10);displayDigit(hundreds);_delay_ms(10);displayDigit(tens);_delay_ms(10);displayDigit(ones);_delay_ms(10);}}return 0;}```此代码使用的是ATmega系列的单片机,使用了端口A的8个引脚来控制四个数码管的段的亮灭。
数码管动态显示原理
数码管的动态显示原理是通过快速地切换数字的显示段来实现连续的数字显示。
数码管通常由7个显示段构成,分别代表数字0-9的不同显示形式。
这些段也被称为a、b、c、d、e、f和
g段。
在动态显示过程中,每个数字被逐个切换显示的时间非常短,通常为几毫秒。
这个时间非常短,以至于人眼无法察觉数字的切换。
因此,当多个数码管以高速切换显示数字时,人眼会感觉到所有数码管上的数字同时显示。
要实现动态显示,需要使用一个计数器来控制切换显示的时间。
这个计数器通常是一个定时器,它会以一定的频率触发中断,每次中断时触发一次显示切换。
通过不断增加计数值,可以控制不同数字的显示时间。
为了显示一个多位数,需要使用多个数码管并连接到控制器上。
控制器会根据待显示的数字,将适当的段信号发送到对应的数码管上。
通过在不同的数码管上切换显示,就可以实现多位数的动态显示。
动态显示的基本原理如下:
1. 设置初始的数码管选择位,使其对应第一个数码管。
2. 将第一个数码管对应的段信号置为显示的数字。
3. 延时一段时间,使人眼无法察觉到数字的切换。
4. 将第一个数码管的段信号置为低电平(或不显示的状态)。
5. 设置下一个数码管的选择位,使其对应下一个数码管。
6. 重复2-5步骤,直至所有数码管都完成一轮显示。
7. 返回第一步,重复整个过程,以实现连续的动态显示。
通过以上步骤的循环,不断切换显示的数字会给人一种连续而平滑的显示效果。
这就是数码管动态显示的基本原理。
编写程序使实验板上八段数码管循环显示0 到9 字符1.八段数码管嵌入式系统中,经常使用八段数码管来显示数字或符号,由于它具有显示清晰、亮度高、使用电压低、寿命长的特点,因此使用非常广泛。
结构八段数码管由八个发光二极管组成,其中七个长条形的发光管排列成“日”字形,右下角一个点形的发光管作为显示小数点用,八段数码管能显示所有数字及部份英文字母。
见图1。
图1 八段数码管的结构类型八段数码管有两种不同的形式:一种是八个发光二极管的阳极都连在一起的,称之为共阳极八段数码管;另一种是八个发光二极管的阴极都连在一起的,称之为共阴极八段数码管。
工作原理以共阳极八段数码管为例,当控制某段发光二极管的信号为低电平时,对应的发光二极管点亮,当需要显示某字符时,就将该字符对应的所有二极管点亮;共阴极二极管则相反,控制信号为高电平时点亮。
电平信号按照dp,g,e…a 的顺序组合形成的数据字称为该字符对应的段码,常用字符的段码表如下:表1 常用字符的段码表显示方式八段数码管的显示方式有两种,分别是静态显示和动态显示。
静态显示是指当八段数码管显示一个字符时,该字符对应段的发光二极管控制信号一直保持有效。
动态显示是指当八段数码管显示一个字符时,该字符对应段的发光二极管是轮流点亮的,即控制信号按一定周期有效,在轮流点亮的过程中,点亮时间是极为短暂的(约1ms),由于人的视觉暂留现象及发光二极管的余辉效应,数码管的显示依然是非常稳定的。
基础知识地址0x10000004为数码管的数据寄存器,控制数码管的段码输出.数码管扫描控制地址为0x10000006,8位访问Bit0 –控制数码管0 –低电平有效Bit1 –控制数码管1 –低电平有效Bit2 –控制数码管2 –低电平有效Bit3 –控制数码管3 –低电平有效Bit4 –控制数码管4 –低电平有效Bit5 –控制数码管5 –低电平有效实验说明1、制作LED字符与码段对应表unsigned char seg7table[16] = {/* 0 1 2 3 4 5 6 7*/0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,/* 8 9 A B C D E F*/0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e };2、扫描控制*((U8*) 0x02000006) = 0x3E; /* 使能第一个数码管 */段码输出*((U8*) 0x02000004) = seg7table[0]; /* 输出数据 0 */思考:简述LED的显示原理以及LED的显示办法静态显示和动态显示各有什么优缺点设计"HELLO"的码表,编写程序循环显示"HELLO"。
实验二用8个七段数码管实现“HELLO”的循环显示实验报告专业班级:2011级计算机1班学号:1137030 姓名:赵艺湾实验地点:理工楼901 实验时间:2012.9.26实验二用8个七段数码管实现“HELLO”的循环显示一、实验目的1、了解显示译码器的结构和理解其工作原理。
2、学习在QuartusⅡ9.0封装和使用自己设计的电路。
3、学习对复杂电路分类简化进行设计。
二、实验内容在实验一的基础上,把5个字符扩展到8个(包括空白字符)。
要求8个数码管(HEX7,HEX6,HEX5,HEX4,HEX3,HEX2,HEX1,HEX0)的显示与三个控制开关SW17,SW16,SW15的对应关系如下:其中“HELO空白”5个字符的编码及其与开关的对应关系如下表所示:三、实验仪器及设备:一、PC机二、QuartusⅡ9.0 三、DE2-70 四、显示器四、实验步骤1. 参考设计框图如下:2. 七段HELLO字符译码器参见实验一的设计。
3. 五选一选择器的设计框图如下:其真值表为:可用多个2选一选择器实现:2选1封装2选1内部电路5选15选1内部电路4. 8个不同的选择译码器sed7sed6sed5sed4sed3sed2sed1sed05. 将各部分按照参考设计框图连接即可。
五、实验心得通过本次用8个七段数码管实现“HELLO”的循环显示的实验,了解了QuartusⅡ9.0中自己设计电路的封装和使用;加深了对组合逻辑电路设计的了解;学习了选择器的工作原理。
六、实验结论可以通过不同的方法实现“HELLO”的循环显示,但要设计8个不同的选择器来实现对五种信号“H”、“E”、“L”、“O”、“空白”的选择。
七、实验思考题思考:实验中遇到的主要问题是什么?答:对电路整体结构、工作原理不理解;不知道选择器的工作原理。
通过实验你对组合电路的设计有何体会?答:我觉得电路设计需要认真的态度、严谨的思维。
要先弄清楚整个设计思路,为什么这么设计,再开始着手。
最新文件---------------- 仅供参考--------------------已改成-----------word文本 --------------------- 方便更改赠人玫瑰,手留余香。
实验101、结果:同时显示012345代码:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY sweep ISPORT(clk,clr:IN STD_LOGIC; --clk输入时钟;clr状态清零a:OUT STD_LOGIC_VECTOR (6 DOWNTO 0); --输出数码管相同段sweep:OUT STD_LOGIC_VECTOR (5 DOWNTO 0) --输出cat(数码管选通控制信号)端);END sweep;ARCHITECTURE sweep_arch OF sweep ISSIGNAL sweep_arc:STD_LOGIC_VECTOR (5 DOWNTO 0); --声明内部信号(选通控制信号) SIGNAL b:STD_LOGIC_VECTOR (6 DOWNTO 0); --声明内部信号(相同段信号)BEGINPROCESS(sweep_arc)BEGINIF (clk'event and clk='1') THENIF clr='0' THEN --状态清零sweep_arc <="011111" ; b <="0000000";ELSEcase sweep_arc IS --选通控制信号 WHEN"011111" => sweep_arc <="111110"; WHEN"111110" => sweep_arc <="111101"; WHEN"111101" => sweep_arc <="111011"; WHEN"111011" => sweep_arc <="110111"; WHEN"110111" => sweep_arc <="101111"; WHEN"101111" => sweep_arc <="011111"; WHEN OTHERS => sweep_arc <="011111"; END CASE;CASE sweep_arc IS --相同段信号 WHEN"011111" => b <="1011011";WHEN"101111" => b <="0110011";WHEN"110111" => b <="1111001";WHEN"111011" => b <="1101101";WHEN"111101" => b <="0110000";WHEN"111110" => b <="1111110";WHEN OTHERS => b <="0000000";END CASE;END IF;END IF;sweep<=sweep_arc;a<=b;END PROCESS;END;仿真:管脚:2、(1)结果:循环显示:012345—123450—234501—345012—450123—501234—012345代码:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY sweep2 ISPORT(clk:IN STD_LOGIC; --clk输入时钟sweep2:OUT STD_LOGIC_VECTOR(5 DOWNTO 0); --输出数码管相同段a:OUT STD_LOGIC_VECTOR(6 DOWNTO 0) --输出cat(数码管选通控制信号)端);END sweep2;ARCHITECTURE arc_sweep2 OF sweep2 ISSIGNAL number:INTEGER RANGE 0 TO 6; --状态声明(6种状态,7种状态值)SIGNAL n:INTEGER RANGE 0 TO 6; --声明数码管(6个管,7个值)SIGNAL flag:INTEGER RANGE 0 TO 50; --同一状态运行次数BEGINPROCESS(clk)BEGINIF (clk'event AND clk='1') THENIF n>5 THENn<=0;ELSE n<=n+1;flag<=flag+1;END IF;IF flag>20 THENflag<=0;number<=number+1;END IF;IF number>5 THENnumber<=0;END IF;CASE number ISWHEN 0=> --状态0,输出012345CASE n ISWHEN 0=>sweep2<="011111"; a<="1111110";WHEN 1=>sweep2<="101111"; a<="0110000";WHEN 2=>sweep2<="110111"; a<="1101101";WHEN 3=>sweep2<="111011"; a<="1111001";WHEN 4=>sweep2<="111101"; a<="0110011";WHEN 5=>sweep2<="111110"; a<="1011011";WHEN OTHERS=>sweep2<="111111";END CASE;WHEN 1=> ----状态1,输出123450CASE n ISWHEN 0=>sweep2<="011111"; a<="0110000";WHEN 1=>sweep2<="101111"; a<="1101101";WHEN 2=>sweep2<="110111"; a<="1101101";WHEN 3=>sweep2<="111011"; a<="1111001";WHEN 4=>sweep2<="111101"; a<="0110011";WHEN 5=>sweep2<="111110"; a<="1111110";WHEN OTHERS=>sweep2<="111111";END CASE;WHEN 2=> --状态2,输出234501CASE n ISWHEN 0=>sweep2<="011111"; a<="1101101";WHEN 1=>sweep2<="101111"; a<="1111001";WHEN 2=>sweep2<="110111"; a<="0110011";WHEN 3=>sweep2<="111011"; a<="1011011";WHEN 4=>sweep2<="111101"; a<="1111110";WHEN 5=>sweep2<="111110"; a<="0110000";WHEN OTHERS=>sweep2<="111111";END CASE;WHEN 3=> --状态3,输出345012CASE n ISWHEN 0=>sweep2<="011111"; a<="1111001";WHEN 1=>sweep2<="101111"; a<="0110011";WHEN 2=>sweep2<="110111"; a<="1011011";WHEN 3=>sweep2<="111011"; a<="1111110";WHEN 4=>sweep2<="111101"; a<="0110000";WHEN 5=>sweep2<="111110"; a<="1101101";WHEN OTHERS=>sweep2<="111111";END CASE;WHEN 4=> --状态4,输出450123CASE n ISWHEN 0=>sweep2<="011111"; a<="0110011";WHEN 1=>sweep2<="101111"; a<="1011011";WHEN 2=>sweep2<="110111"; a<="1111110";WHEN 3=>sweep2<="111011"; a<="0110000";WHEN 4=>sweep2<="111101"; a<="1101101";WHEN 5=>sweep2<="111110"; a<="1111001";WHEN OTHERS=>sweep2<="111111";END CASE;WHEN 5=> --状态5,输出501234CASE n ISWHEN 0=>sweep2<="011111"; a<="1011011";WHEN 1=>sweep2<="101111"; a<="1111110";WHEN 2=>sweep2<="110111"; a<="0110000";WHEN 3=>sweep2<="111011"; a<="1101101";WHEN 4=>sweep2<="111101"; a<="1111001";WHEN 5=>sweep2<="111110"; a<="0110011";WHEN OTHERS=>sweep2<="111111";END CASE;WHEN OTHERS=>sweep2<="111111";END CASE;END IF;END PROCESS;END arc_sweep2;仿真:仿真时将循环次数改为1方便观察波形,共6种状态管脚:2、(2)结果:循环显示:012345—12345X—2345XX—345XXX—45XXXX—5XXXXX—XXXXXX—XXXXX0—XXXX01—XXX012—XX0123—X01234—012345代码:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY sweep3 ISPORT(clk:IN STD_LOGIC; --clk输入时钟sweep3:OUT STD_LOGIC_VECTOR(5 DOWNTO 0); --输出数码管相同段a:OUT STD_LOGIC_VECTOR(6 DOWNTO 0) --输出cat(数码管选通控制信号)端);END sweep3;ARCHITECTURE arc_sweep3 OF sweep3 ISSIGNAL number:INTEGER RANGE 0 TO 12; --状态声明(12种状态,13种状态值)SIGNAL n:INTEGER RANGE 0 TO 6; --声明数码管(6个管,7个值)SIGNAL flag:INTEGER RANGE 0 TO 50; --同一状态运行次数BEGINPROCESS(clk)BEGINIF clk'event AND clk='1' THENIF n>5 THENn<=0;ELSE n<=n+1;flag<=flag+1;END IF;IF flag>20 THENflag<=0;number<=number+1;END IF;IF number>11 THENnumber<=0;END IF;CASE number ISWHEN 0=> --状态0,输出012345CASE n ISWHEN 0=>sweep3<="011111"; a<="1111110";WHEN 1=>sweep3<="101111"; a<="0110000";WHEN 2=>sweep3<="110111"; a<="1101101";WHEN 3=>sweep3<="111011"; a<="1111001";WHEN 4=>sweep3<="111101"; a<="0110011";WHEN 5=>sweep3<="111110"; a<="1011011";WHEN OTHERS=>sweep3<="111111";END CASE;WHEN 1=> --状态1,输出12345XCASE n ISWHEN 0=>sweep3<="011111"; a<="0110000";WHEN 1=>sweep3<="101111"; a<="1101101";WHEN 2=>sweep3<="110111"; a<="1101101";WHEN 3=>sweep3<="111011"; a<="1111001";WHEN 4=>sweep3<="111101"; a<="0110011";WHEN 5=>sweep3<="111111"; a<="1111110";WHEN OTHERS=>sweep3<="111111";END CASE;WHEN 2=> --状态2,输出2345XXCASE n ISWHEN 0=>sweep3<="011111"; a<="1101101";WHEN 1=>sweep3<="101111"; a<="1111001";WHEN 2=>sweep3<="110111"; a<="0110011";WHEN 3=>sweep3<="111011"; a<="1011011";WHEN 4=>sweep3<="111111"; a<="1111110";WHEN 5=>sweep3<="111111"; a<="0110000";WHEN OTHERS=>sweep3<="111111";END CASE;WHEN 3=> --状态3,输出345XXXCASE n ISWHEN 0=>sweep3<="011111"; a<="1111001";WHEN 1=>sweep3<="101111"; a<="0110011";WHEN 2=>sweep3<="110111"; a<="1011011";WHEN 3=>sweep3<="111111"; a<="1111110";WHEN 4=>sweep3<="111111"; a<="0110000";WHEN 5=>sweep3<="111111"; a<="1101101";WHEN OTHERS=>sweep3<="111111";END CASE;WHEN 4=> --状态4,输出45XXXXCASE n ISWHEN 0=>sweep3<="011111"; a<="0110011";WHEN 1=>sweep3<="101111"; a<="1011011";WHEN 2=>sweep3<="111111"; a<="1111110";WHEN 3=>sweep3<="111111"; a<="0110000";WHEN 4=>sweep3<="111111"; a<="1101101";WHEN OTHERS=>sweep3<="111111";END CASE;WHEN 5=> --状态5,输出5XXXXXCASE n ISWHEN 0=>sweep3<="011111"; a<="1011011";WHEN 1=>sweep3<="111111"; a<="1111110";WHEN 2=>sweep3<="111111"; a<="0110000";WHEN 3=>sweep3<="111111"; a<="1101101";WHEN 4=>sweep3<="111111"; a<="1111001";WHEN 5=>sweep3<="111111"; a<="0110011";WHEN OTHERS=>sweep3<="111111";END CASE;WHEN 6=> --状态6,输出XXXXXXCASE n ISWHEN 0=>sweep3<="111111"; a<="1111110";WHEN 1=>sweep3<="111111"; a<="0110000";WHEN 2=>sweep3<="111111"; a<="1101101";WHEN 3=>sweep3<="111111"; a<="1111001";WHEN 4=>sweep3<="111111"; a<="0110011";WHEN 5=>sweep3<="111111"; a<="1011011";WHEN OTHERS=>sweep3<="111111";END CASE;WHEN 7=> --状态7,输出XXXXX0CASE n ISWHEN 0=>sweep3<="111111"; a<="0110000";WHEN 1=>sweep3<="111111"; a<="1101101";WHEN 3=>sweep3<="111111"; a<="1111001";WHEN 4=>sweep3<="111111"; a<="0110011";WHEN 5=>sweep3<="111110"; a<="1111110";WHEN OTHERS=>sweep3<="111111";END CASE;WHEN 8=> --状态8,输出XXXX01CASE n ISWHEN 0=>sweep3<="111111"; a<="1101101";WHEN 1=>sweep3<="111111"; a<="1111001";WHEN 2=>sweep3<="111111"; a<="0110011";WHEN 3=>sweep3<="111111"; a<="1011011";WHEN 4=>sweep3<="111101"; a<="1111110";WHEN 5=>sweep3<="111110"; a<="0110000";WHEN OTHERS=>sweep3<="111111";END CASE;WHEN 9=> --状态9,输出XXX012CASE n ISWHEN 0=>sweep3<="111111"; a<="1111001";WHEN 1=>sweep3<="111111"; a<="0110011";WHEN 2=>sweep3<="111111"; a<="1011011";WHEN 3=>sweep3<="111011"; a<="1111110";WHEN 4=>sweep3<="111101"; a<="0110000";WHEN 5=>sweep3<="111110"; a<="1101101";WHEN OTHERS=>sweep3<="111111";END CASE;WHEN 10=> --状态10,输出XX0123CASE n ISWHEN 0=>sweep3<="111111"; a<="0110011";WHEN 1=>sweep3<="111111"; a<="1011011";WHEN 2=>sweep3<="110111"; a<="1111110";WHEN 3=>sweep3<="111011"; a<="0110000";WHEN 4=>sweep3<="111101"; a<="1101101";WHEN 5=>sweep3<="111110"; a<="1111001";WHEN OTHERS=>sweep3<="111111";END CASE;WHEN 11=> --状态11,输出X01234CASE n ISWHEN 0=>sweep3<="111111"; a<="1011011";WHEN 1=>sweep3<="101111"; a<="1111110";WHEN 2=>sweep3<="110111"; a<="0110000";WHEN 3=>sweep3<="111011"; a<="1101101";WHEN 4=>sweep3<="111101"; a<="1111001";WHEN 5=>sweep3<="111110"; a<="0110011";WHEN OTHERS=>sweep3<="111111";END CASE;WHEN OTHERS=>sweep3<="111111";END CASE;--END IF;END IF;END PROCESS;END arc_sweep3;仿真:仿真时将循环次数改为1方便观察波形,共12种状态管脚:最新文件---------------- 仅供参考--------------------已改成-----------word文本 --------------------- 方便更改赠人玫瑰,手留余香。
单只数码管循环显示0-9报告设计题目:单只数码管循环显示0~9设计要求:单片机控制1只数码管,循环显示0~9需求分析:本设计要求单只数码管循环显示0~9,这里采用的是共阴极数码管。
让数码管显示数字的步骤为:1)使数码管的公共端接地(共阴极)上。
2)将显示码送到单片机的P0口,向数码管的各个段输出不同的电平,使单个数码管循环显示0-9这10个数字。
复位电路:在上电或复位过程中,控制CPU的复位状态:这段时间让CPU保持复位状态,而不是一上电或刚复位完毕就工作,防止CPU发出错误的指令、执行错误操作,也可以提高电磁兼容性能。
无论用户使用哪种类型的单片机,总要涉及到单片机复位电路的设计。
而单片机复位电路设计的好坏,直接影响到整个系统工作的可靠性。
许多用户在设计完单片机系统,并在实验室调试成功后,在现场却出现了“死机”、“程序走飞”等现象,这主要是单片机的复位电路设计不可靠引起的。
基本的复位方式单片机在启动时都需要复位,以使CPU及系统各部件处于确定的初始状态,并从初态开始工作。
89系列单片机的复位信号是从RST引脚输入到芯片的施密特触发器中的。
当系统处于正常工作状态时,且振荡器稳定后,如果RST引脚上有一个高电平并维持2个机器周期(24个振荡周期)以上,则CPU就可以响应并将系统复位。
设计原理:一、数码管显示原理我们最常用的是七段式和八段式LED数码管,八段比七段多了一个小数点,其他的基本相同。
所谓的八段就是指数码管里有八个小LED发光二极管,通过控制不同的LED的亮灭来显示出不同的字形。
数码管又分为共阴极和共阳极两种类型,其实共阴极就是将八个LED的阴极连在一起,让其接地,这样给任何一个LED的另一端高电平,它便能点亮。
而共阳极就是将八个LED的阳极连在一起。
其原理图如下。
其中引脚图的两个COM端连在一起,是公共端,共阴数码管要将其接地,共阳数码管将其接正5伏电源。
一个八段数码管称为一位,多个数码管并列在一起可构成多位数码管,它们的段选线(即a,b,c,d,e,f,g,dp)连在一起,而各自的公共端称为位选线。
案例3-1 数码管循环显示数字
1.案例原理与提示
(1) 数码管的ABCDEFG七段对应Y0~Y6,计数器循环计数。
(2) 用数据寄存器存放变化的数字,用INC(加1)指令使数字不断递增,用CMP(比较)指令实现数据的循环。
(3) 也可以用功能指令直接七段译码。
2. 案例实施过程
1) I/O分配
数码显示控制输入/输出端口分配表如下表所示。
数码显示控制输入/输出端口分配表
2) 控制程序编写
数码显示控制程序梯形图如下图所示。
数码显示控制程序梯形图
用数据寄存器D0存放变化的数字0~9。
由特殊功能继电器M8013产生秒脉冲,采用加1指令使D0中的数据不断递增,每过一秒加1。
当D0中的数据递增为10时,D0中再次
赋值为0。
程序中M8002对程序初始化,把K0(十制数0)放入数据寄存器D0中。
当比较指令(CMP)的比较结果为等于时(D0=10),M11=1,则D0中赋值0。
当SB12断开时,D0=0,[INCP D0]指令不工作,数码管上显示0。
3) 接线与调试
数码显示控制外部接线图如下图所示。
数码显示控制外部接线图
3. 思考与提升
(1) 当SB12开关闭合时,数码管就循环显示0~A,每个数字显示0.5s;当SB12开关断开时,数码管上显示“H”。
(2) 当SB12开关闭合时,数码管就循环显示9~0,每个数字显示0.8s。
单只数码管循环显示0~9【任务】在单个数码管上循环显示数字0~9,实现类似于计时(或计数)显示的功能。
【硬件平台】在51单片机最小系统的基础上,以端口P0控制一个七段数码管。
为提高驱动能力,增加了上拉排阻RP1(10k)。
【编程思路】因为这里使用了共阴数码管,所以当P0端口相应引脚为高电平时,点亮相应的数码段。
0~9的段码按相同的时间间隔从单片机内存读到P0口,由此产生从0到9的循环显示效果。
先写下前面三板斧,内涵不赘述:#include <reg51.h>#define uchar unsigned char#define uint unsigned int因为0~9的段码是固定的,不妨将其保存为code类型的数组。
注意是共阴接法,比如要显示“0”,那么P0端口的各引脚电平为:a=b=c=d=e=f=1,g=0,闲置的P0.7=0(按字节给端口赋值,所以闲置位也赋值),表示为二进制是P0.7gfedcba=00111111,对应的十六进制为0x3F。
其余段码可类似分析:uchar code display_code[ ]={0x3F,0x06,0x5B,0x4F,0x66,0x66,0x6D,0x7D,0x7F,0x6F,0x00 }; //0x00表示段码全灭显示不同的数字之间要有时间间隔,须定义一个延时函数以便主函数调用实现间隔延时:最后编写主函数:【代码展示】#include <reg51.h>#define uchar unsigned char#define uint unsigned intuchar codedisplay_code[ ]={0x3F,0x06,0x5B,0x4F,0x66,0x66,0x6D,0x7D,0x 7F,0x6F,0x00};void delay(uint x){uchar i;while(x--) for(i=0;i<100;i++);}void main(){uchar i=0; //定义数组下标变量,用以遍历数组P0=0x00; //数码管初始不亮while(1){P0=display_code[i]; //0~9对应的段码送给P0口,显示9后段码熄灭(0x00)i=(i+1)%10;//从0循环到9,超过10后又回到0,%为取余数算符}}。
【概述】单片机是一种集成了微处理器、存储器和输入输出设备的微型计算机系统,广泛应用于电子产品中。
八段数码管是一种常见的显示器件,可以显示0-9和A-F共16个字符。
本文将以汇编语言为例,介绍如何利用单片机控制一个八段数码管循环显示0-F的过程。
【正文】1. 了解八段数码管八段数码管是由8个LED灯组成,可以显示16种不同的字符。
每个LED代表一个数码,通过控制LED的亮灭来显示相应的字符。
在汇编语言中,我们可以通过控制单片机的输出引脚来实现对八段数码管的控制。
2. 开发环境准备我们需要准备好单片机的开发环境,包括单片机开发板、编程软件等。
常用的单片机有51系列、AVR系列等,在使用之前需要熟悉其指令集和寄存器等相关知识。
3. 控制八段数码管在汇编语言中,我们可以通过对单片机的输出引脚进行控制来操作八段数码管。
具体的操作包括设置引脚状态、发送数据等。
通过编写相应的汇编语言程序,我们可以实现循环显示0-F的功能。
4. 编写汇编语言程序我们需要定义八段数码管每个数字对应的LED亮灭状态。
在主程序中编写循环语句,通过不断改变LED的状态来实现循环显示的效果。
在编写程序时,需要考虑到八段数码管的工作原理和时序要求,以确保程序的稳定性和准确性。
5. 调试和优化在编写完汇编语言程序后,我们需要进行调试和优化。
通过单步调试等手段来检查程序的运行情况,找出可能存在的问题。
可以根据实际情况对程序进行优化,提高程序的执行效率和稳定性。
6. 实际应用完成汇编语言程序的编写和调试后,我们可以将程序烧录到单片机中进行测试。
通过连接八段数码管和单片机的引脚,我们可以观察到八段数码管循环显示0-F的效果。
这个简单的实例展示了如何利用汇编语言控制八段数码管,为我们进一步深入了解单片机的应用奠定了基础。
【总结】通过本文的介绍,我们了解了如何利用汇编语言控制单片机实现八段数码管的循环显示。
汇编语言作为一种底层语言,对于理解单片机的工作原理和功能有着重要的作用。
电子信息工程学院电子设计应用软件训练任务【训练任务】:1、熟练掌握PROTEUS软件的使用;2、按照设计要求绘制电路原理图;3、能够按要求对所设计的电路进行仿真;【基本要求及说明】:1、按照设计要求自行定义电路图纸尺寸;2、设计任务如下:利用51单片机、BCD译码芯片和两位LED构成一个数码管扫描显示系统,两个数码管同时循环显示0~9。
3、按照设计任务在Proteus 6 Professional中绘制电路原理图;4、根据设计任务的要求编写程序,在Proteus下进行仿真,实现相应功能。
【按照要求撰写总结报告】指导教师年月日负责教师年月日学生签字年月日成绩评定表摘要该专业是前沿学科,现代社会的各个领域及人们日常生活等都与电子信息技术有着紧密的联系。
全国各地从事电子技术产品的生产、开发、销售和应用的企事业单位很多,随着改革步伐的加快,这样的企事业单位会越来越多。
为促进市场经济的发展,培养一大批具有大专层次学历,能综合运用所学知识和技能,适应现代电子技术发展的要求,从事企事业单位与本专业相关的产品及设备的生产、安装调试、运行维护、销售及售后服务、新产品技术开发等应用型技术人才和管理人才是社会发展和经济建设的客观需要,市场对该类人才的需求越来越大。
为此电子信息工程专业的人才有着广泛的就业前景,毕业生可从事电子设备、信息系统和通信系统的研究、设计、制造、应用和开发工作。
目录一、任务说明 (1)1.1 专业介绍 (1)1.2 专业背景与市场预测 (1)1.3 本课题分析 (1)二、绘制原理图 (2)2.1 Proteus软件介绍 (2)2.2 原理图绘制说明 (2)2.3 原理图绘制步骤 (3)三、程序编译说明及程序流程图 (6)3.1 Main程序说明 (6)3.2 初始化子程序说明 (6)3.3 display(uchar tmp)子程序说明 (7)3.4 延时子程序说明 (8)3.5 中断子程序说明 (9)四、Proteus仿真说明 (11)4.1 导入仿真文件 (11)4.2 进行仿真 (12)五、课程设计体会及合理化建议 (14)致谢 (16)一、任务说明1.1专业介绍电子信息工程是一门应用计算机等现代化技术进行电子信息控制和信息处理的学科,主要研究信息的获取与处理,电子设备与信息系统的设计、开发、应用和集成。
设计任务及指标:用 LED数码管间隔显示数字 , 按下 S0 依次间隔 2s 循环显示 0~9 十个数字,按 S1 依次间隔 2s 显示 0~9 中奇数, 5 秒后,依次间隔 2s 显示 0~9中偶数,并且实现奇偶的循环。
在显示的过程中,只要有一键按下,就立即实现该键的功能,且计数初值为相应循环的初值。
设计思路:设计可以分为循环模式切换的控制部分、间隔2s 的循环控制部分、编码部分和输出部分四大模块。
1.循环模式切换的控制部分:定义: X000:0~9 循环X001:奇偶循环M200:用来切换显示模式的中间继电器M203:用来恢复初值的中间继电器工作过程:按下 X000时,M200不得电, M200的触点不工作,实现0~9循环的所有中间继电器接通,并且在X000的启动下,其中的显示0的中间继电器 M0开始工作;当按下 X001时,M200得电,M200的触点工作,使奇偶循环的所有中间继电器接通,实现切换。
同时,当X000与X001 中只要任意一个按下时,M203 得电, M203的常闭触点断开,使第 2~10 组控制显示的中间继电器与时间继电器失电,从而保证只有第一组能工作,防止在切换过程中出现两组同时工作导致乱码。
梯形图如下:2.间隔 2s 的循环控制部分:定义:控制显示的部分M0显示 0、M1显示 1、M2显示 2、M3显示 3、M4显示 4、M5显示 5、M6显示 6、M7显示 7、M8显示 8、M9显示 9;M10显示 1、M11显示 3、M12显示 5、M13显示 7、M14显示 9、M15显示 0、M16显示 2、M17显示 4、M18显示 6、M19显示 8;间隔 2s 的循环部分:T0~T9的延迟时间为 2s,T10 的延迟时间为 5s ;工作过程:起动时按下X000,M0开始工作,显示0,T0 也开始工作;2s 后 T0 的常开触点闭合, M1开始工作,显示 1,同时 M1的常闭触点断开,使得 M0失电。
两位数码管循环显示00~99的实验现在让我们用实验板上的两个数码管来做一个循环显示00~99数字的实验,先来完成必要的硬件部分,数码管有共阴和共阳的区分,单片机都可以进行驱动,但是驱动的方法却不同,并且相应的0~9的显示代码也正好相反。
首先我们来介绍两位共阳数码管的单片机驱动方法,电路如下图:网友可以看到:P2.6和P2.7端口分别控制数码管的十位和个位的供电,当相应的端口变成低电平时,驱动相应的三极管会导通,+5V通过IN4148二极管和驱动三极管给数码管相应的位供电,这时只要P0口送出数字的显示代码,数码管就能正常显示数字。
因为要显示两位不同的数字,所以必须用动态扫描的方法来实现,就是先个位显示1毫秒,再十位显示1毫秒,不断循环,这样只要扫描时间小于1/50秒,就会因为人眼的视觉残留效应,看到两位不同的数字稳定显示。
下面我们再介绍一种共阴数码管的单片机驱动方法,电路如下图:网友可以看到:+5V通过1K的排阻直接给数码管的8个段位供电,P2.6和 P2.7端口分别控制数码管的十位和个位的供电,当相应的端口变成低电平时,相应的位可以吸入电流。
单片机的P0口输出的数据相当于将数码管不要显示的数字段对地短路,这样数码管就会显示需要的数字。
网友可以看到,共阴数码管的硬件更简单,所以在批量生产时,硬件开销小,节省PCB面积,减少焊接工作量,降低综合成本,所以采用共阴数码管更有利于批量生产,现在销售的试验板都是采用共阴数码管了。
以下是用AT89C51实验板的两位数码管显示00~99依次循环的汇编语言程序a_bit equ 20h ;数码管个位数存放内存位置b_bit equ 21h ;数码管十位数存放内存位置temp equ 22h ;计数器数值存放内存位置star: mov temp,#0 ;初始化计数器,从0开始stlop: acall display;调用显示子程序inc temp;对计数器加1mov a,tempcjne a,#100,next ;判断计数器是否满100?mov temp,#0;满100就清零重新开始next: ljmp stlop;不满就循环执行;显示子程序display: mov a,temp ;将temp中的十六进制数转换成10进制mov b,#10 ;10进制/10=10进制div abmov b_bit,a ;十位在amov a_bit,b ;个位在bmov dptr,#numtab ;指定查表启始地址mov r0,#4dpl1: mov r1,#250 ;dplop: mov a,a_bit ;取个位数MOVC A,@A+DPTR ;查个位数的7段代码mov p0,a ;送出个位的7段代码clr p2.7 ;开个位显示acall d1ms ;显示162微秒setb p2.7;关闭个位显示,防止鬼影mov a,b_bit ;取十位数MOVC A,@A+DPTR ;查十位数的7段代码mov p0,a ;送出十位的7段代码clr p2.6 ;开十位显示acall d1ms ;显示162微秒setb p2.6;关闭十位显示,防止鬼影djnz r1,dplop ;循环执行250次djnz r0,dpl1 ;循环执行250X4=1000次ret;2+2X80=162微秒,延时按12MHZ计算D1MS: MOV R7,#80DJNZ R7,$RET;实验板上的7段数码管0~9数字的共阴显示代码numtab: DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBH end;如果是共阳数码管的显示代码numtab: DB 30H,0FCH,0A2H,0A4H,06CH,25H,21H,0BCH,20H,24H 两位数码管显示00--99依次循环实验设备JS100A,JS200,JS300等仿真器,实验板都可直接实验。
数码管实现00到99循环工作原理
数码管显示00到99的循环工作原理可以简述如下:
1. 数字生成:使用计数器或者其他逻辑电路,生成00-99的数字,输出给数码管控制电路。
2. 数码管控制电路:根据输入的数字,选择对应的数码管段进行驱动,使其显示出数字的相应部分。
3. 数码管段的驱动:数码管由七段或者十六段LED组成,分别对应数字的各个部分。
驱动电路会根据输入的数字,使不同的LED点亮或者熄灭,来显示出对应的数字。
4. 循环实现:当数码管驱动显示数字99时,计数器或者其他逻辑电路会自动将计数值归零,重新开始计数,从而实现00-99的循环工作。
需要注意的是,为了保证数码管的正常工作,需要适当控制每个LED的亮度和电流,以及使用适当的电容和电阻进行防抖降噪等措施。
同时,为了方便调试和使用,可以在控制电路中添加按钮或者旋转编码器等输入设备,以便手动调节显示数字。
;此程序为在两个数码管上实现00-99的循环显示;设置ramDATA_IN DATA 20H ;接收数据缓冲寄存器DATA_OUT DATA 21H ;发送数据缓冲寄存器BIT_COUNT DATA 22H ;数据位数寄存器// HOUR DATA 23H// MINITE DATA 24H// SECOND DATA 25H// MSECOND DATA 26HORG 0000HLJMP INITORG 000BHLJMP TIME0 定时器0中断入口ORG 0013HLJMP KBHIT;初始化ORG 0030HINIT: MOV DPTR,#4000H ;HD7279A 的地址MOV A,#10011111B ;HD7279A 初始化CS、CLK、DATAMOVX @DPTR,ALCALL DELAY25MS ;延时后进入工作状态MOV DATA_OUT,#1O1OO1OOB ;HD7279A 复位指令LCALL SEND ;发送指令MOV A,#10011111B ;设回CS为高电平MOVX @DPTR,A// MOV R4,#20 ;定时器一个周期内的中断数MOV R2,#0MOV R3,#0MOV R4,#0MOV R5,#0// MOV MSECOND,#O// MOV SECOND,#。
// MOV MINITE,#0// MOV HOUR,#0 ;数字计数器MOV R6,#0 ;个位寄存器MOV R7,#0 ;十位寄存器SETB EA 开总中断SETB ET0;开定时器0中断SETB EX1SETBTR0;开始计时;把数字转换为2个BCD 码 ;个位放在R6 ;十位放在R7译码,找到了第1个数码管MOVTMOD,#1方式1// MOV TH0,#3CH //MOV TL0,#0B0HMOVTH0,#0FCHMOVTL0,#18H;设置定时器0工作模式为;设置定时器定时值;设置定时器定时值注程序MAIN:MOV A,R2MOVB,#10DIVABMOVR6,BMOVR7,AMOVDATA_OUT,#11001000B;下载数据且按方式 1LCALL SENDLCALL DELAY25 ;T4,指令与数据时间间隔MOV DATA_OUT,R1;指令的数据部分,显示个位LCALL SENDMOV A,#10011111BMOVX @DPTR,AMOV DATA_OUT,#11001001B ;下载数据且按方式- 译码,找到了第2个数码管LCALL SENDLCALL DELAY25 ;T4,指令与数据时间间隔MOV DATA_OUT,R2;指令的数据部分,显示个位LCALL SENDMOV A,#10011111BMOVX @DPTR,AMOV DATA_OUT,#11OO1O1OB ;下载数据且按方式1译码找到了第3个数码管LCALL SENDLCALL DELAY25 ;T4,指令与数据时间间隔MOV DATA_OUT,R3;指令的数据部分,显示个位LCALL SENDMOV A,#10011111BMOVX @DPTR,A// LCALL DELAY1MS ;显示延时MOV A,R4 ;把数字转换为2个BCD码MOV B,#10DIV ABMOV R6,B ;个位放在R6MOV R7,A ;十位放在R7MOV DATA_OUT,#11001011B ;下载数据且按方式1译码找到了第4个数码管LCALL SENDLCALL DELAY25 ;T4,指令与数据时间间隔MOV DATA_OUT,R6 ;指令的数据部分,显示个位LCALL SENDMOV A,#10011111BMOVX @DPTR,A// LCALL DELAY1MS ;显示延时MOV DATA_OUT,#11OO11OOB ;下载数据且按方式1译码找到了第5个数码管LCALL SENDLCALL DELAY25 ;T4,指令与数据时间间隔MOV DATA_OUT,R7 ;指令的数据部分,显示十位LCALL SENDMOV A,#10011111BMOVX @DPTR,A// LCALL DELAY1MS ;显示延时MOV A,R5 ;把数字转换为2个BCD码MOV B,#10DIV ABMOV R6,B ;个位放在R6MOV R7,A ;十位放在R7MOV DATA_OUT,#11OO11O1B ;下载数据且按方式1译码找到了第6个数码管LCALL SENDLCALL DELAY25 ;T4,指令与数据时间间隔MOV DATA_OUT,R6 ;指令的数据部分,显示个位LCALL SENDMOV A,#10011111BMOVX @DPTR,A// LCALL DELAY1MS ;显示延时MOV DATA_OUT,#11001110B ;下载数据且按方式1译码找到了第7个数码管LCALL SENDLCALL DELAY25 ;T4,指令与数据时间间隔MOV DATA_OUT,R7 ;指令的数据部分,显示十位LCALL SENDMOV A,#10011111BMOVX @DPTR,A// LCALL DELAY1MS ;显示延时LJMP MAIN ;下一循环SJMP $;发送子程序SEND: CLR ET0 加锁MOV BIT_COUNT,#8;无论指令还是数据,一次只发送8位MOV A,#00011111B ;设CS为低电平MOVX @DPTR,ALCALL DELAY50 ;T1,从CS下降沿至CLK脉冲时间;发送循环,HD7279A 采用串行方式与微处理器通讯,一次发送一位 SENDLOOP: MOV A,DATA_OUT 最高位 MOV C,ACC.7 ;串行发送从高位到低位发送,故先取 MOV A,#00011111B 输出到DAT 位MOV ACC.5,CMOVX @DPTR,ASETB C设CLK 为高电平MOV ACC.6,CMOVX @DPTR,ALCALL DELAY8 ;T2,传送指令时CLK 脉冲宽度CLRC设CLK 为低电平MOV ACC.6,CMOVX@DPTR,ALCALL DELAY8 ;T3,字节传送中CLK 脉冲时间MOV A,DATA_OUT;移位待发送的指令或数据,为下;取出发送的指令或数据 一位的发送作准备 RLAMOV DATA_OUT,ADJNZ BIT_COUNT,SENDLOOP;发送不到8位,继续循环 MOVA,#00011111B;发送完毕,恢复DATMOVX @DPTR,ASETB ET0 释放锁RET;接收子程序(本程序中用不到,但在添加按键操作的时候用于读取键值)RECEIVE: CLR ET0 加锁MOV BIT_COUNT,#8 ;接收8位数据MOV DATA_IN,#0 ;清空接收数据缓冲寄存器MOV A,#00111111B ;设CS为低电平,同时保证DAT 为高电平(输入状态)MOVX @DPTR,ALCALL DELAY25 ;T5,读键盘指令中指令与数据时间间隔,HD7279A米用串行方式与微处理器通讯,一次接收一位;接收循环RECEIVELOOP:SETB ACC.6 设CS为高电平MOVX @DPTR,ALCALL DELAY8 ;T6,输出键盘数据建立时间MOV A,DATA_IN ;接收数据缓冲寄存器向左移位,准备接收一位数据,数据的高位会先发送RL;定时器0中断程序DJNZR4,NEXT 淀时器一个周期内中断数不够 就继续计时MOV DATA_IN,A MOVX A,@DPTR;读取数据 MOV C,ACC.5;取出数据位DATMOV A,DATA_INMOV ACC.0,CMOV DATA_IN,A ;数据放进接收数据缓冲寄存器 MOVA,#00111111B;设CS 为低电平,同时保证DAT(输入状态)MOVX @DPTR,ALCALL DELAY8;T7,读键盘数据是CLK 脉冲宽DJNZ BIT_COUNT,RECEIVELOOP;接收不到8位,继续循环 MOV A,#00011111B;接收完毕,恢复DATMOVX @DPTR,ASETBET0释放锁RET为高电平 INCR2;数字加1TIMEO: //// MOV R4,#20CJNE R2,#100,NEXTMOV R2,#0INC R3CJNE R3,#10,NEXTMOV R3,#0INC R4CJNE R4,#60,NEXTMOV R4,#0INC R5CJNE R5,#60,NEXTMOV R5,#0NEXT: MOV TH0,#0FCH 设置定时器定时值;重置定时器一个周期内中断数数字不够100继续加1;数字到达100就清零;定时器方式1中断后需要重新MOV TL0,#18HRETIKBHIT: PUSH PSWPUSH ACCPUSH DPHPUSH DPLSTART: PUSH DATA_OUTPUSH BIT_COUNTMOV A,R0PUSH ACCMOV A,R1PUSH ACCMOV DATA_OUT,#00010101B LCALL SENDLCALL DELAY25LCALL RECEIVEMOV A,DATA_INJZ STARTDEC ADEC AJZ STOPDEC AJZ CLEARSJMP OUTSETB TR0SJMP OUTSTOP: CLRSJMP TR0 OUTCLEAR: MOV R2,#0MOV R3,#0MOV R4,#0MOV R5,#0OUT: POP ACCMOV R1,APOP ACCMOV R0,APOP BIT_COUNTPOP DATA_OUTPOP DPLPOP DPHPOP ACCPOP PSWRETI;延时25ms子程序DELAY25MS: MOV R0,#49 D11: MOV R1,#253NOPD12: DJNZ R1,D12DJNZ R0,D11RET涎时50阴子程序DELAY50: MOV R0,#23NOPD21: DJNZ R0,D21RET涎时25阴子程序DELAY25: MOV R0,#11D31: DJNZ R0,D31RET;延时8阳子程序MOV R0,#2NOPDJNZ R0,D41RETENDDELAY8:D41:D51:D52:;延时1ms 子程序MOVR0,#2NOPMOVR1,#247NOPDJNZ R1,D52 DJNZR0,D51RETDELAY1MS:。