1、调用片选函数前注意A的变化acall select_mov cjne r2,#4,loop djnz R3,loop select_mov:p2的初值238 push 0e0h mov a,p2 rl a mov p2,a pop 0e0h delay_5ms:mov r6,#5 signed_5ms:call delay_1ms djnz r6,signed_5ms 篇二:单片机动态数码显示设计实验报告 微机原理与接口技术 实验报告 实验题目:指导老师:班 级:计算机科学与技术系 姓 名:动态数码显示设计 2014年 12月3日 实验十三 动态数码显示设计 一、实验目的 1.掌握动态数码显示
2、技术的设计方法。 2.掌握扫描在程序设计中的应用。二、设计原理 如图13.1所示,在单片机的P1端口接动态数码管的字形码笔段,在单片机的P2端口接动态数码管的数位选择端。在单片机P3.0管脚处接一个开关,当开关连接高电平时,态数码管上显示“12345”字样;当开关连接低电平时,态数码管上显示“HELLO”字样。三、参考电路 图13.1 动态数码显示电路原理图 四、电路硬件说明 (1)在“单片机系统”区域中,把单片机的P1.0,P1.7端口连接到“动态数码显示”区域中的a,h端口上。(2)在“单片机系统”区域中,把单片机的P2.0,P2.7端口通过8联拨动拨码开关JP1连接到“动态数码显示”区域
3、中的S1,S8端口上。(3)在“单片机系统”区域中,把单片机的P3.0端口通过8联拨动拨码开关JP2连接到拨动开关区域中的SW1端口上。五、程序设计内容 (1)动态扫描方法:动态接口采用各数码管循环轮流显示的方法,当循环显示频率较高时,利用人眼的暂留特性,看不出显示的闪烁现象,这种显示需要一个接口完成字形码的输出(字形选择),另一接口完成各数码管的轮流点亮(数位选择)。(2)在进行数码显示的时候,要对显示单元开辟8个显示缓冲区,在每个显示缓冲区装有显示的不同数据即可。(3)对于显示不同字形码的数据采用查表方法来完成。六、程序流程图 (如图13.2所示 ) 图13.2 动态数码显示程序流程图 七
4、、汇编源程序 START:PANDUAN:SW:Q1:XIANSHI:NEXT:入口地址;ORG 0000HLJMPSTARTORG 0003HRETIORG 000BHRETIORG 0013HRETIORG 001BHRETIORG 0023HRETIORG 002BHRETI ;主程序入口;ORG 0100H LCALLPANDUANLCALLXIANSHILJMPSTART ;判断开关的状态;JB P3.0,SWLCALLDELAY10MSJB P3.0,SWMOV DPTR,#TABLE2SJMPQ1JNB P3.0,PANDUANMOV DPTR,#TABLE1RET ;显示程序;
5、MOV R0,#00HMOV R1,#7FHMOV A,R0MOVCA,A+DPTRMOV P0,AMOV A,R1MOV P2,ALCALLDELAYINC R0RR AMOV R1,ACJNER1,#0FBH,NEXT DELAY10MS: D1:DELAY: LOOP:TABLE1: TABLE2:RET ;10ms延时程序; MOV R6,#20 MOV R7,#248 DJNZR7,$ DJNZR6,D1 RET ;200ms延时程序; MOV R5,#20 LCALLDELAY10MS DJNZR5,LOOP RET ;共阴字母码表; DB 76H,79H,38H,38H,3FH
6、;共阴数码表;DB 06H,5BH,4FH,66H,6DH ;结束标志; END 八、C语言源程序 #includeAT89X51.H unsigned char code table1=0x06,0x5b,0x4f,0x66,0x6d; unsigned char code table2=0x76,0x79,0x38,0x38,0x3f; void main(void) unsigned char i,j,k,m;while(1) j=0x7f;for(i=0;i5;i+) /运行5次取出表中的5个数/ if(P3_0=0)/如果开关为0,则显示12345/ P0=table1i; /送P1
7、口显示/ else /如果开关为1,显示HELLO/ P0=table2i; /送P1口显示/ P2=j; /显示码送入P2口/ j=0x7f; /重赋初值/ k=j(i+1);/右移i+1位/ m=j(7-i);/左移7-i位/ j=k|m;for(k=4;k0;k-) /每隔一段时间显示一次/ for(m=248;m0;m-); 篇三:数码管实验报告 篇一:实验八 数码管led实验报告 苏州大学实验报告 院、系 年级专业 姓名 学号课程名称 成绩指导教师同组实验者实验日期 实验名称: 数码管led实验 一(实验目的 理解8段数码管的基本原理,理解8段数码管的显示和编程方法,理解4连排共阴极
8、8段数码管lg5641ah与mcu的接线图。 二(实验内容 理解8段数码管原理,运行与理解各子程序,编制一个4连排8段数码管程序,mcu的排8段数码管显示mcu复位后的开始到现在的运行时间。由于只有四个数码管,所以只显示mcu运行到目前为止的分钟和秒,当计时达到一个小时,就重新从00:00开始计时。另外,也可以通过pc方的串口通信程序,指定计时的开始值。三(实验过程 (一)原理图 图8-2数码管外形 dp a b c e f g dp 图8-1 数码管(二)接线图 图8-3 mcu与4连排8段数码管的连接第1页 (三)基本原理 8段数码管一般由8个发光二极管(llight-emitting d
9、iode,led)组成,每一个位段就是一个发光二极管。一个8段数码管分别由a、b、c、d、e、f、g位段,外加上一个小数点的位段h(或记为dp)组成。根据公共端所接电平的高低,可分为共阳极和共阴极两种。有时数码管不需要小数点,只有7个位段,称7段数码管。共阴极8段数 码管的信号端高电平有效,只要在各个位段上加上相应的信号即可使相应的位段发光,比如:要使a段发光,则在发光。四(编程 (一)流程图 图8-4 数码管led显示流程图(及其中断子程序) (二)所用寄存器名称及其各个位 程序中没有使用与led显示相关的控制和状态寄存器,仅仅使用了通用i/o口a口和b口。(三)主要代码段 1第2页第3页
10、2(c 第4页 第5页 单片机实验报告 一、实验名称 数码管动态扫描显示01234567(实验五) 二、实验目的 (1)掌握数码管显示数字的原理。(2)通过不同的编程实现灵活运用数码管。三、实验原理 四、相关原理图 五、实验内容 数码管显示12345678 c程序:#include reg51.h #include intrins.h unsigned char data dis_digit;unsigned char code dis_code11= 0x28, 0x7e, 0xa2, 0x62, 0x74, 0x61, 0x21, 0x7a, 0x20, 0x60,0xff;/0,1,2,
11、3,4,5,6,7,8,9,关显示,数码管码表 unsigned char data dis_buf8;/ 显示缓冲区 unsigned char data dis_index;char code sst5163 _at_ 0x003b;void main() p0 = 0xff;p2 = 0xff;tmod = 0x01;th0 = 0xfc;tl0 = 0x17;ie = 0x82;dis_buf0 = dis_code0x1;dis_buf1 = dis_code0x2;dis_buf2 = dis_code0x3;dis_buf3 = dis_code0x4;dis_buf4 = di
12、s_code0x5;dis_buf5 = dis_code0x6;dis_buf6 = dis_code0x7;dis_buf7 = dis_code0x8;dis_digit = 0xfe;dis_index = 0;tr0 = 1;while(1);void timer0() interrupt 1 / 定时器0中断服务程序, 用于数码管的动态扫描 / dis_index - 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量 / dis_digit - 位选通值, 传送到p2口用于选通当前数码管的数值, 如等于0xfe时, / 选通p2.0口数码管 / dis_buf- 显于缓冲区基地
13、址 / 先关闭所有数码管 p0 = dis_bufdis_index; / 显示代码传送到p0口 p2 = dis_digit;dis_digit = _crol_(dis_digit,1);/ 位选通值左移, 下次中断时选通下一位数码管 dis_index+;dis_index &= 0x07; / 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描 汇编程序:code_seg segment code data_seg segment data rseg data_seg dis_digit: ds 1 dis_index:dis_buf: ds 8 stack: ds 20
14、 = cseg at 00000h ; reset向量 ljmp main cseg at 0000bh ; 定时器0中断向量 ljmp timer0 rseg code_seg org0080h main:mov sp,#(stack-1); 初始化堆栈指针 movp0,#0ffh; 初始化i/o口 movp2,#0ffh movtmod,#01h; 初始化timer0 movth0,#0fch movtl0,#017h movie,#082h mov dptr, #dis_code; 设定显示初值 mov a,#1 movdis_buf,a mov a,#2 movdis_buf+01h,
15、a mov a,#3 movdis_buf+02h,a mov a,#4 movdis_buf+03h,amov a,#5 movdis_buf+04h,a mov a,#6 movdis_buf+05h,a mov a,#7 movdis_buf+06h,a mov a,#8 movdis_buf+07h,a movdis_digit,#0feh; 初始从第一个数码管开始扫描 movdis_index,a setb tr0 ; 启动定时器0,开始动态扫描显示 main_lp: 主程序循环,增加其它代码 sjmp main_lp using 0 timer0: 定时器0中断服程序, 用于数码管
16、的动态扫描 dis_index - 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量 dis_digit - 位选通值, 传送到p2口用于选通当前数码管的数值, 如等于0xfe时, ; 选通p2.0口数码管 dis_buf- 显于缓冲区基地址 push acc push psw push ar0 movp2,#0ffh ; 先关闭所有数码管 mova,#dis_buf ; 获得显示缓冲区基地址 adda,dis_index ; 获得偏移量 movr0,a; r0 = 基地址 + 偏移量 mova,r0; 获得显示代码 movp0,a; 显示代码传送到p0口 movp2,dis_digit
17、;mov a,dis_digit ; 位选通值左移, 下次中断时选通下一位数码管 rl a篇三:数码管动态显示实验报告 实验四 数码管动态显示实验一 一、实验要求 1. 在proteus软件中画好51单片机最小核心电路,包括复位电路和晶振电路 2. 在电路中增加四个7段数码管(共阳/共阴自选),将p1口作数据输出口与7段数码管数据引脚相连 ,p2.0p2.3引脚输出选控制信号 3. 在keil软件中编写程序,采用动态显示法,实现数码管分别显示数字1,2,3,4 1. 2. 3. 4. 巩固proteus软件和keil软件的使用方法 学习端口输入输出的高级应用 掌握7段数码 管的连接方式和动态显
18、示法 掌握查表程序和延时等子程序的设计 三(实验说明 本实验是将单片机的p1口做为输出口,将四个数码管的七段引脚分别接到p1.0至p1.7。由于电路中采用共阳极的数码管,所以当p1端口相应的引脚为0时,对应的数码管段点亮。程序中预设了数字0-9的段码。由于是让四个数码管显示不同的数值,所以要用扫描的方式来实现。因此定义了scan函数,接到单片机的p2.0至p2.3 在实验中,预设的数字段码表存放在数组tab中,由于段码表是固定的,因此存储类型可设为code。在proteus软件中按照要求画出电路,再利用keil软件按需要实现的功能编写c程序,生成hex文件,把hex文件导到proteus软件中
19、进行仿真。为了能够更好的验证实验要求,在编写程序时需要延时0.5s,能让人眼更好的分辨;89c51的一个机器周期包含12个时钟脉冲,而我们采用的是12mhz晶振,每一个时钟脉冲的时间是1/12us,所以一个机器周期为1us。在keil程序中,子函数的实现是用void delay_ms(int x),其中x为1时是代表1ms。四、硬件原理图及程序设计 (一)硬件原理图设计 电路中p1.0到p1.7为数码管七段端口的控制口,排阻rp1阻值为220,p2.0到p2.3为数码管的扫描信号。at89c51单片机的9脚(rst)为复位引脚,当rst为高电平的时间达到2个机器周期时系统就会被复位;31引脚(
20、ea)为存取外部存储器使能引脚,当ea为高电平是使用单片机内部存储器,当ea为低电平时单片机则使用外部存储器。18、19引脚是接晶振脚。而接地和电源端在软件中已经接好,所以不用在引线。 如下图所示:(二)流程图与程序设计(三)程序设源代码 #include reg51.h /定义8051寄存器头文件 #define seg7p p1 /定义扫描信号的位置 #define scanp p2 /定义数码管的位置 char code tab10=0xc0, 0xf9, 0xa4, 0xb0, 0x99, /数字04的码值 0x92, 0x83, 0xf8, 0x80, 0x98 ; /数字59的码值
21、 char disp4=1,2,3,4;/定义要显示的数值 void delay_ms(int x); /声明延时函数 char scan4=0xfe,0xfd,0xfb,0xf7; /定义扫描 char i,j; /定义变量i,j main() /主函数的开始 while(1) /无限循环 for(i=0;i4;i+) /从 j=disp3-i; /取出显示的数值 scanp =scani; /扫描的顺序 seg7p =tabj; /将tab的数值赋给数码管delay_ms(4);/延时4ms void delay_ms(int x) int i,j;for (i=0;ix;i+) for (j=0;j120;j+);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1