单片机数码管显示实验总结 篇一:
单片机c语言版数码管动态显示实验报告 数码管动态显示实验
一、实验要求
1. 在Prteus软件中画好51单片机最小核心电路,包括复位电路和晶振电路
2. 在电路中增加四个7段数码管(共阳/共阴自选),将P1口作数据输出口与7段数码 管数据引脚相连 ,P 2.0~P
2.3引脚输出选控制信号
3. 在Keil软件中编写程序,采用动态显示法,实现数码管显示变量unsigned int sh_value的值(sh_value的值范围为0000~9999),即把sh_value的千百十个位的值用数码管显示出来。 二、实验目的
1. 巩固Prteus软件和Keil软件的使用方法
2. 学习端口输入输出的高级应用
3. 掌握7段数码管的连接方式和动态显示法
4. 掌握查表程序和延时等子程序的设计 三.实验说明 (条理清晰,含程序的一些功能分析计算) 如下图
(五)所示,由P1口将要显示的数字输给七段数码管;再由P2第四位输给数码管的公共端,作为扫描输入信号;用外部中断P 3.2和P
3.3分别接PB1与PB2,实现数字的增减。所要实现的功能是,开始运行电路功能图时,四个数码管分别显示0000,按下PB1增1,直
到9999回到0000,相反按下PB2减1,直到0000回到9999。 在算相关数据时,由于要显示个十百千的不同数字,要调用disp函数, disp[0]=sh/1000; //显示千位的值 disp[1]=sh%1000/100; //显示百位的值 disp[2]=sh%100/10; //显示十位的值 disp[3]=sh%10; //显示个位的值 本实验需要用到IE寄存器与TCN寄存器。 四、硬件原理图及程序设计 (一)硬件原理图设计 图
(五) 开始运行prteus,四个数码管显示0000,按下PB1数码管增1,按下PB2数码管减1。
(二)程序流程图设计 三)程序设源代码 #include reg5 1.h #define SEG7P P1 #define SCANP P2 //定义8051寄存器头文件 // 定义数码管输入信号接P1 //定义数码管扫描信号接P2 char cde TAB[10]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, //数字0~4 0x92, 0x83, 0xf8, 0x80, 0x98 };//数字5~~9 char disp[4]={0,0,0,0}; //显示数组 vid delay_ms(int x); //声明延迟函数 char scan[4]={0xfe,0xfd,0xfb,0xf7}; //声明输入扫描信号 char i,j; //声明变量 vid display; //显示数组dis的内容 int sh=0000; //定义初始值 vid get_disp; //声明返回diap main { IE=0X85; TCN=0X05; hile
(1) { get_disp; display; //主程序开始 //开IE寄存器,允许INT0和INT1中断 //开INT0,INT1 //无穷循环 } vid delay_ms(int x) { int i,j; fr (i=0;i i++) fr (j=0;j j++); } vid display //声明延迟函数 //定义变量 //开始计数,计数x次 //计数120次,延迟1ms //声明显示函数 { fr(i=0;i i++) // { j=disp[3-i]; //diap SCANP=scan[i]; // SEG7P=TAB[j]; // delay_ms
(4); // } } vid INT0_ISR(vid) interrupt 0 //INT0 { if(sh 9999) //9999 sh++; // else sh=0; // } vid_INT1_ISR(vid) interrupt 2 //INT1序开始 { if(sh 0) 大于0 sh--; // else sh=9999; 9999 } vid get_disp { disp[0]=sh/1000; // disp[1]=sh%1000/100; // disp[2]=sh%100/10; //开始计数 ,计数4次 的值附到变量j 显示扫描 信号 显示数字到数码管 延迟4ms 中断子程序开始 如果显示
数值小于 显示数值自增1 否则显示数值0 中断子程 //如果显示数值 显示数值自减1 //否则显示数值 显示千位的值 显示百位的值 显示十位的 disp[3]=sh%10; //显示个位的值 } 五.实验总结 实验过程中遇到的问题及解决方法、体会 问题1: 运行电路原理图时,数码管都不亮。 解决方法:
定义IE寄存器时,没有开启总开关EA,导致数码管不能正常显示数字。 问题2:
按下PB1或PB2,数码管乱码。 解决方法:因为使用了两个外部中断,所以INT0和INT1都要开启,在声明INT0和INT1时,起初写成if(sh 9999);sh--;if(sh 0);sh++;而应该是if(sh 9999);sh++;if(sh sh--;最电路原理图能正常显示0000~9999。 体会:科学的魅力太强大了,从之前的一个数码管亮0~9,现在只要你想要几个数码管亮就可以接几个,写入正确的程序,就能实现你想要的效果。程序一直在增多,实现的功能也在无穷的变换着,越来越觉得单片机实现的功能,在生活中也随处可见。 篇二:
单片机实验报告——LED数码管显示实验 《微机实验》报告 LED数码管显示实验 指导教师: 专业班级: 姓名 : 学号 : 联系方式 :
一、 任务要求 实验目的:
理解LED七段数码管的显示控制原理,掌握数码管与MCU的接口技术,能够 编写数码管显示驱动程序;熟悉接口程序调试方法。 实验内容:
利用C8051F310单片机控制数码管显示器 基本要求:
利用末位数码管循环显示数字0-9,显示切换频率为1Hz。 提高
要求:
在4位数码管显示器上依次显示当天时期和时间,显示格式如下: yyyy (年份) mm.dd(月份.日) hh.mm(小时.分钟) 思考题: 数码管采用动态驱动方式时刷新频率应如何选择?为什么? 二、 设计思路 C8051F310单片机片上晶振为2 4.5MHz,采用8分频后为
3.0625MHz ,输入时钟信号采用48个机器周期。 0到9对应的断码为:
FCH、60H、DAH、F2H、66H、B6H、BEH、E0H、FEH、F6H 基础部分:
由于只需要用末位数码管显示,不需要改变位码,所以只需要采用LED的静态显示。采用查表的方法,通过循环结构,每次循环查找数据表下一地址,循环十次后重新开始循环。每次循环延时1s,采用定时器0定时方式1。 提高部分:
四个数码管都要显示,所以采用LED的动态显示。由于数码管的位选由P0.
7、P0.6控制,P0端口的其他引脚都没用到,所以对P0端口初始化赋00H,每次循环加40H、选中下一位,四次后十六进制溢出,P0端口变又为00H回到第一个数码管。 每位数码管显示一个段码后都延时1ms(否则数码管太亮,刺眼)采用定时器0定时方式1,依然采用查表法改变段码值。通过循环:
DJNZ R5,BACK MV R5,#250 DJNZ R4,BACK MV R4,#8 来控制每种模式的切换时间,我采用2s切换一次(8*250*1ms=2s)。 切换模式,可以采用改变查表法的偏移量来实现,没切换一次模式,偏移量加04H,三次后回到初始偏移量,来实现三种模式的循环显示。 三、 资源分配 基础部分: P0. 7、P0.6:
控制数码管的位选 P1: 控制数码管段码的显示 R0: 控制段选 提高部分:
P0. 7、P0.6:
控制数码管的位选 P1: 控制数码管段码的显示 R0: 控制位选 R1: 控制段选 R3:
用于改变偏移量来切换模式 R 4、R5:
控制循环次数,控制模式切换时间 四、 流程图 基础部分: 提高部分 篇三:
单片机应用实验报告 2键盘、LED 数码管显示实验 西华大学实验报告(理工类) 开课学院及实验室:
机械工程与自动化学院计算机机房 实验时间 : 201X年 5月20 日
一、 实验目的 二、 实验内容 三、实验电路
四、实验程序 #include reg5
2.h sbit key0=P2^0; sbit key1=P2^1; sbit key2=P2^2; sbit red=P1^2; sbit yell=P1^1; sbit gre=P1^0; sbit LED1=P2^7; sbit LED2=P2^6; int num=0; unsigned char cde dispcde[]= {0x30,0xfc,0xa2,0xa4,0x6c, 0x25,0x21,0xbc,0x20,0x24}; vid init { key0=1; key1=1; key2=1; } vid delayms(int a) { int b=0; fr(a;a a--) fr(b=110;b b--); } int judge { if(key0==0) { delayms(100); if(key0==0) { red=0; yell=1; gre=1; num++; if(num==10) num=0; } } if(key1==0) { delayms
(5); if(key1==0) { red=1; yell=0; gre=1; } } if(key2==0)
{ delayms
(5); if(key2==0) { red=1; yell=1; gre=0; } } return 0; } vid xianshi { delayms
(5); P0=dispcde[num]; LED1=0; LED2=1; delayms (5); } int main { init; hile (1) { judge; xianshi; } return 0; } 五、实验步骤 六、附录篇四:
单片机实验两位数码管显示报告
一、实验目的
1、在之前单键实验和中断控制数码管“静态”显示实验的基础上,把单键判断、数码管显示和中断结合起来编写中断程序实现单键控制一位数码管;
2、在实现控制一位数码管显示的基础上用单键控制两位数码管显示。
二、实验所需器材与软件 硬件: 电脑、传输线、AT89S52单片机 软件: 编程软件Keil uVisin3;读写软件MePr V 5.02
三、实验程序的及其分析:
1、单键控制一位数码管显示 主要设计思路:
在中断主程序后加入单键判断键按下情况判断语句,把数码管显示程序放在中断子程序中。当有键按下且有中断请求时,重新给数码管显示偏移地址赋值,从而改变显示内容。 程序:
RG 0000H AJMP MAIN ;转向主程序 RG 001BH ;中断矢量地址 AJMP T_INT ;转向中断服务程序 MAIN: ;主程序标号 MV R3,#0 ;表偏移地址 MV DPTR,#TAB ;把表头地址赋值给寄存器DPTR MV TMD,#10H ;设定定时器工作于模式1 MV TH1,#0FEH ;定时器赋初值 MV TL1,#0EH SETB ET1 ;开中断 SETB EA SETB TR1 ;启动定时
器 LP1:JNB P
1.4, LP4 AJMP LP1 LP4:ACALL DELAY JNB P
1.4, LP_ADD 单键按下判断程序 LP_ADD:INC R3 CJNE R3,#10,LP8 MV R3,#0 LP8: AJMP LP1 T_INT: MV TH1,#0FEH MV TL1,#0EH MV A,R3 中断程序内嵌的数码管显示程序 MVC A,@A+DPTR MV P0,A MV P2,#11111110B RETI TAB:DB
0C0H,0F9H,0A4H,0B0H ,99H,92H,82H,0F8H ;表内容 DB 80H,90H DELAY:MV R5,#64H LP5:MV R7,#0FFH LP6:NP NP 用于单键按下防抖动的延时程序 DJNZ R7,LP6 DJNZ R5,LP5 RET 2、单键控制两位数码管显示 设计思路:
用两个寄存器分别存放数码管显示的个位和十位,并且在数码管显示程序中用移位指令对数码管的位码进行移位,使每次执行中断程序时显示一位数,循环两次中断程序后“静态”显示两位数字。 程序:
RG 0000H AJMP MAIN RG 001BH AJMP T_INT MAIN: MV R0,#0 ;用来判断中断程序显示内容的位数 MV R3,#0 ;把数码管显示的个位偏移地址存放在R3 MV R1,#0 ;把数码管显示的十位偏移地址存放在R1 MV R4 ,#0FEH ;数码管位码内容 MV R2,#0 ;用于计算数码管位码移位次数 MV DPTR,#TAB ;把表头地址赋给DPTR MV TMD,#10H MV TH1,#0FEH MV TL1,#0EH SETB ET1 中断启动初始化 SETB EA SETB TR1 LP1:JNB P
1.4, LP4 ;键按下判断程序 AJMP LP1 LP4:ACALL DELAY JNB P 1.4,LP_ADD LP_ADD:INC R3 ;当有键按下时,个位偏移地址加一位 CJNE R3, #10, LP8 ;判断个位显示的数值是否超过9 INC R1 ;个位数值到9后十位进一位 MV R3,#0 ;使个位显示为“0” CJNE R1,#10,LP8 ;判断十位显示数值是否超过9 MV R1,#0 ;显示满“99”后将数码管置“00” LP8: AJMP LP1 T_INT:MV TH1,#0FEH MV TL1,#0EH CJNE R0, #2, LP10 MV A, R3 INC R0 数码管个位和十位切换操作指令 AJMP LP11 LP10:MV A,R1 MV R0,#2 LP11:MVC A,@A+DPTR MV P0,A MV P2,R4 MV A,R4 RL A ;显示完一个数码管后对位码向左移一位 MV R4,A INC R2 ;记录移位次数 CJNE R2,#2,LP9 ;当移位次数为两次
时,执行位码赋初始值指令 MV R4,#0FEH ;令位码返回初始值 MV R2,#0 ;移位次数清零 LP9:RETI TAB:DB
0C0H,0F9H,0A4H,0B0H ,99H,92H,82H,0F8H ;表内容 DB 80H,90H DELAY:MV R5,#99H LP5:MV R7,#0FFH LP6:NP NP 键防抖动延时判断程序 DJNZ R7,LP6 DJNZ R5,LP5 RET
四、实验结果分析 经过艰辛的调试工作,单键的按下判断程序能成功区分抖动键,实现按下与否判断,一位数码管和两位数码管显示均能按预定要求工作,但两位数码管显示程序设计逻辑有局限性,在自己所设计逻辑的模式下难以向上扩展,要实现三位以上数码管显示时有很大困难。
五、实验心得体会 每一次的实验内容都是在之前实验基础上进行的,因此,从多次实验经验来看,要想顺利完成当次实验,课前回顾之前所做实验内容也是颇为重要的。在写程序时应先想好程序设计基本思路,避免在原来的程序模板中漫无目的地插入程序,靠投机取巧实现实验要求,每次在实验中都有深深的体会,在编程序前想好思路,然后循着思路琢磨着怎么实现会比较容易,且能更好掌握程序逻辑结构,免得实现了实验要求,自己却看懂所写的程序。在这次实验中,虽然实现了两位数码管的显示,但是数码管显示的个位和十位是通过存放在两个寄存器中实现的,再向上扩展至多位数码管显示却是难以实现,因此不是一个优良的程序结构,这也是这次实验最难突破的难点。 注:
1、报告内的项目或内容设置,可根据实际情况加以调整和补充。 2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。篇五:
单片机数码管静态显示实验 实验五 串行口静态显示 一.实验目的
1.学习用单片机的串行口扩展74LS164 实现静态显示方法。 2.学习用单片机I/ 口模拟串口工作实现静态显示的编程方法。 3.掌握静态显示的编程方法和数码管显示技术。 二.实验任务 1.根据共阳数码管的功能结构,自编一组0~F 的笔形码,并按顺
序存放建立程序数据表格。
2.利用单片机串行口扩展74LS164,完成串--并转换输出,实现静态显示:
要求循环显示0~F 这数字,即输出数字“0”时,四位同时显示0,显示1 秒后再输出数字“1”,即四位同时显示1, 依次类推,相当于数字自检循环显示。
3.利用单片机串行口(RXD、TXD)编写静态显示程序,在数码显示器上30H、31H 单元的内 容,30H、31H 单元为任意的十六进制数。 4.用P 1. 6、P
1.7 分别替代RXD、TXD 做模拟串口完成任务3 的静态显示程序。 三.实验电路 静态显示实验电路 连线方法: 静态显示只要连接2 根线:
单片机的RXD 与DAT 节点连接,TXD 与CLK 接点连 接,要把电源短路片插上。P11 是电源端。 四.实验原理说明
1.静态显示实际上动态的过程,静态的显示,单片机串行口输出的数据通过74LS164 串并转换 输出,每输出一个数据,把原先的的数据推挤到下一个显示位上显示。实验时,单片机串行口应工作在方式0,RXD(P
3.0)输出串行数据,TXD(P
3.1)输出移位时钟,在移位时钟的作用下,串行口发送缓冲器的数据一位一位地从RXD 移入到74LS164 中,并把后面送入的数据推挤原先的数据到下一个级联的74LS164 中输出,每输出一个数据可以延时1ms。实验时,通过改变延时时间,可以更清楚地观察到数据推挤的过程。
2.串行口工作在方式0 时,串行传输数据为8 位,只能从RXD 端输入输出。TXD 端用于输出移位同步时钟信号,其波特率固定为振荡频率的1/12,由软件置位串行控制寄存器SCN 的REN位才能启动串行接收。在CPU 将数据写入SBUF 寄存器后,立即启动发送,第8 位数据输送完后,硬件将SCN 寄存器的TI 位置1,必须由软件对它清
0 才能启动发送下一帧数据。 3.静态显示笔型码: 笔形码:
0 1 2 3 4 5 6 7 8 9 A B C D E F
11H,D7H,98H,92H,56H,32H,30H,97H,10H,12H,14H,70H,39H,D0H,38H,3CH 五.程序流程图和资源分配
1.编程思路 单片机串行口应工作在方式0,RXD(P 3.0)输出串行数据,TXD(P
3.1)输出移位时钟。使用R0作指针,将30H单元指向R0.采用查表方式,先取单元中低字节,查表后发送内容,再取单元高字节,再发送。再指针加1,重复上述。 2.算法流程图
3.资源分配 用R0作指针,R7作控制显示数
4.程序设计 RG MV MV MV MV MV ANL MVC MV JNB CLR MV SAP ANL MVC MV JNB CLR INC DJNZ DB END 0000 SCN,#00 DPTR,#TAB R0,#30H R7,#02 A,@R0 A,#0FH A,@A+DPTR SBUF,A TI,$ TI A,@R0 A A,#0FH A,@A+DPTR SBUF,A TI,$ TI R0 R7,LP
11H,0D7H,98H,92H,56H,32H,30H,97H,10H,12H,14H,70H,39H,0D0H,38H,3CH LP: TAB: 六.调试
1.第一次调试时发现数码管显示的数字错码,认真检查程序没发现错误。分析原因可能是笔形码错误,改正笔形码。
2.改正笔形码后,程序能够正常运行,并且能够显示正常。 七.结果分析和总结
1.结果分析: 在30H和31H中分别置数12H和34H,数码管显示3412。结果正确。
2.总结: 问题1:
数码管显示数据错乱。 解决办法: 笔形码错误,改正笔形码。 体会:
以前只在生活中看到过数码管显示数据,这次试验通过自己从编程,到接线再到自己调试,把生活中看到的通过自己的动手和理论分析将它实现了,科学的魅力极大啊。以后一定得努力学习科学知识
!
因篇幅问题不能全部显示,请点此查看更多更全内容