单片机c语言版数码管动态显示实验报告
- 格式:doc
- 大小:61.50 KB
- 文档页数:5
单片机数码管实验报告单片机数码管实验报告引言:单片机作为一种重要的嵌入式系统,被广泛应用于各个领域。
在本次实验中,我们将探索单片机与数码管的结合,通过编程控制数码管的显示,实现不同的功能。
本文将详细介绍实验的背景、目的、方法和结果,并对实验过程中遇到的问题进行讨论和总结。
一、实验背景数码管是一种常见的输出设备,用于显示数字和字母等信息。
而单片机则是一种集成了微处理器、存储器和输入输出接口等功能的芯片,具有高度集成、灵活性强的特点。
将单片机与数码管结合起来,可以实现对数字的显示和控制,为实际应用提供了很大的便利。
二、实验目的本次实验的目的是通过编程控制单片机,实现对数码管的显示和控制。
具体包括以下几个方面:1. 学习单片机的基本原理和编程方法;2. 掌握数码管的工作原理和接口电路;3. 理解数码管的编码方式和显示原理;4. 实现基本的数码管显示功能,如显示数字、字母、符号等;5. 探索数码管的扩展应用,如时钟、计时器等。
三、实验方法1. 实验器材准备:本次实验所需的器材包括单片机开发板、数码管、连接线等。
2. 实验步骤:(1)搭建实验电路:将数码管与单片机开发板连接,并根据实验要求进行接线。
(2)编写程序:使用C语言编写程序,通过单片机的GPIO口控制数码管的显示。
(3)下载程序:将编写好的程序下载到单片机开发板上。
(4)实验验证:通过观察数码管的显示情况,验证程序的正确性。
四、实验结果经过实验验证,我们成功实现了对数码管的显示和控制。
通过编写不同的程序,我们可以实现以下几种功能:1. 显示数字:通过控制数码管的不同段点亮,可以显示0-9的数字。
2. 显示字母:通过控制数码管的不同段点亮,可以显示A-Z的字母。
3. 显示符号:通过控制数码管的不同段点亮,可以显示一些常见的符号,如"+"、"-"、"*"等。
4. 显示动画:通过快速切换数码管的显示内容,可以实现简单的动画效果,如闪烁、滚动等。
一、实训目的本次实训旨在通过实际操作,让学生掌握数码管动态显示的原理,了解数码管动态扫描显示电路的设计方法,提高学生使用Verilog HDL进行层次化设计电路的能力。
通过实训,学生能够理解并应用动态扫描显示数码管、数据选择器及其信号分配方法,同时熟悉使用可编程芯片(如FPGA/CPLD)控制多位动态扫描数码管的显示。
二、实训环境1. 实训设备:FPGA开发板、数码管、信号源、示波器等。
2. 软件工具:Quartus II、ModelSim等。
3. 实训教材:相关电子设计教材、Verilog HDL编程指南。
三、实训原理数码管动态显示技术是利用人眼的视觉暂留效应,通过快速切换显示不同的数码管,使观察者感觉多个数码管同时显示。
具体原理如下:1. 数码管结构:数码管由若干个LED段组成,通过点亮不同的段来显示数字或字符。
2. 共阳/共阴数码管:数码管分为共阳和共阴两种类型。
共阳数码管的阳极连接在一起,共阴数码管的阴极连接在一起。
3. 动态扫描:通过控制每个数码管的点亮和熄灭,实现多位数码管的动态显示。
4. 数据选择器:用于选择要显示的数字或字符对应的段编码。
四、实训过程1. 设计3位数码管动态扫描显示电路:- 使用Verilog HDL设计数码管显示模块,包括段编码生成、位选控制、时钟分频等。
- 设计数据选择器,用于选择要显示的数字或字符对应的段编码。
- 设计主控制器,用于控制动态扫描的时序。
2. 实现显示功能:- 将学号的后3位数字输入到数码管显示电路中。
- 使用可编程芯片(如FPGA/CPLD)实现电路的编译和下载。
3. 提高性实验:- 增加一个功能切换控制开关,实现数码管显示数字的自动循环移位。
- 设计其他显示功能,如显示不同的字符或图案。
4. 实验测试:- 使用示波器观察数码管显示电路的时序信号,确保电路正常工作。
- 使用Quartus II进行仿真测试,验证电路的功能。
五、实验结果与分析1. 3位数码管动态扫描显示电路:- 成功实现了学号后3位数字的动态显示。
1. 理解数码管的工作原理及显示方法。
2. 掌握单片机与数码管之间的接口连接方法。
3. 学会使用C语言编写单片机控制程序,实现数码管的动态显示。
4. 提高动手实践能力和分析问题、解决问题的能力。
二、实训器材1. 单片机开发板(如STC89C52RC、AT89C51等)2. 数码管(共阴极或共阳极)3. 电阻、电容等电子元件4. 连接线、面包板等5. 编译器(如Keil、IAR等)6. Proteus仿真软件三、实训原理数码管是一种用于显示数字和字符的半导体显示器件。
根据显示段数的不同,可分为七段数码管和十六段数码管。
本实训采用七段数码管,由七个发光二极管(LED)组成,分别代表数字0-9。
数码管的显示原理:通过控制数码管各个段对应的引脚的高低电平,使相应的LED点亮或熄灭,从而显示数字或字符。
四、实训内容1. 数码管识别与测试2. 单片机与数码管的连接3. 编写单片机控制程序4. 实现数码管的动态显示5. Proteus仿真与调试1. 数码管识别与测试(1)识别数码管的段码,共阴极数码管的段码为1,共阳极数码管的段码为0。
(2)测试数码管各段LED的正负极,确定段码。
2. 单片机与数码管的连接(1)将数码管的段引脚与单片机的I/O口相连。
(2)将数码管的共阴极或共阳极引脚与单片机的地或正电源相连。
3. 编写单片机控制程序(1)定义数码管段码,如共阴极数码管的段码为0x3F(01111111B)。
(2)编写延时函数,实现延时功能。
(3)编写显示函数,根据需要显示的数字,选择相应的段码。
(4)编写主函数,实现数码管的动态显示。
4. 实现数码管的动态显示(1)初始化数码管,设置段码和位选。
(2)循环遍历数码管,依次显示每个数字。
(3)根据需要调整显示速度。
5. Proteus仿真与调试(1)打开Proteus软件,新建一个项目,添加单片机和数码管。
(2)连接单片机与数码管的引脚。
(3)编写Proteus仿真程序,实现数码管的动态显示。
第1篇一、实验目的1. 熟悉数码显示模块的结构和工作原理;2. 掌握51单片机控制数码显示模块的方法;3. 学会使用移位寄存器实现数码显示的动态扫描;4. 提高单片机编程能力和实践操作能力。
二、实验原理数码显示模块是一种常见的显示器件,主要由7段LED组成,可以显示0-9的数字以及部分英文字符。
51单片机通过控制数码显示模块的段选和位选,实现数字的显示。
移位寄存器是一种常用的数字电路,具有数据串行输入、并行输出的特点。
在本实验中,使用移位寄存器74HC595实现数码显示的动态扫描。
三、实验仪器与材料1. 51单片机实验板;2. 数码显示模块;3. 移位寄存器74HC595;4. 电阻、电容等电子元件;5. 电路连接线;6. 编译软件Keil uVision;7. 仿真软件Proteus。
四、实验步骤1. 电路连接(1)将51单片机的P1口与数码显示模块的段选端相连;(2)将74HC595的串行输入端Q(引脚14)与单片机的P0口相连;(3)将74HC595的时钟端CLK(引脚11)与单片机的P3.0口相连;(4)将74HC595的锁存端LR(引脚12)与单片机的P3.1口相连;(5)将数码显示模块的位选端与74HC595的并行输出端相连。
2. 编写程序(1)初始化51单片机的P1口为输出模式,P3.0口为输出模式,P3.1口为输出模式;(2)编写数码显示模块的段码数据表;(3)编写74HC595的移位和锁存控制函数;(4)编写数码显示模块的动态扫描函数;(5)编写主函数,实现数码显示模块的循环显示。
3. 编译程序使用Keil uVision编译软件将编写的程序编译成hex文件。
4. 仿真实验使用Proteus仿真软件进行实验,观察数码显示模块的显示效果。
五、实验结果与分析1. 编译程序后,将hex文件下载到51单片机实验板上;2. 使用Proteus仿真软件进行实验,观察数码显示模块的显示效果;3. 通过实验验证,数码显示模块可以正常显示0-9的数字以及部分英文字符;4. 通过实验,掌握了51单片机控制数码显示模块的方法,学会了使用移位寄存器实现数码显示的动态扫描。
一、实训背景随着科技的不断发展,单片机在电子设备中的应用越来越广泛。
动态显示作为一种重要的显示方式,在嵌入式系统中具有广泛的应用前景。
本次实训旨在通过学习单片机动态显示技术,掌握其基本原理和实现方法,提高实际动手能力和创新意识。
二、实训目的1. 了解单片机动态显示的基本原理和实现方法。
2. 掌握单片机动态显示程序的设计与编写。
3. 提高单片机在实际应用中的编程能力和调试技巧。
4. 培养团队协作和创新能力。
三、实训内容1. 动态显示基本原理动态显示是指通过快速切换显示模块,使显示内容呈现出连续变化的效果。
在单片机动态显示中,通常采用扫描法来实现。
扫描法包括逐行扫描和逐列扫描两种方式。
2. 动态显示实现方法(1)硬件电路设计硬件电路主要包括单片机、显示模块、驱动电路等。
以LCD为例,硬件电路设计如下:①单片机:选用AT89C52单片机作为核心控制器。
②显示模块:选用LCD显示屏,如12864LCD。
③驱动电路:选用74HC595芯片作为LCD的行驱动器,选用74HC138芯片作为LCD的列驱动器。
(2)软件设计软件设计主要包括主程序和中断服务程序。
①主程序:主要负责初始化硬件资源,设置定时器中断,循环调用显示函数。
②中断服务程序:负责接收外部事件,如按键输入,控制显示内容。
3. 动态显示程序设计以逐行扫描方式为例,动态显示程序设计如下:(1)初始化初始化LCD显示模块,设置显示参数,如字体、背景色等。
(2)显示函数编写显示函数,实现字符、图形的显示。
显示函数主要包括以下步骤:①根据需要显示的内容,将数据存储在显示缓冲区中。
②逐行扫描显示缓冲区,实现动态显示。
(3)定时器中断设置定时器中断,实现显示刷新。
定时器中断函数负责调用显示函数,刷新显示内容。
四、实训结果与分析1. 实训结果通过本次实训,成功实现了单片机动态显示功能。
显示内容包括字符、图形等,动态效果良好。
2. 实训分析(1)动态显示原理掌握程度:通过本次实训,对动态显示原理有了深入理解,掌握了扫描法的实现方法。
51单片机数码管显示实验实验内容:1)编写程序让8只数码管初始显示0,每隔大约1s加1显示(可以用延时函数实现),到数码管显示9后,再从0开始显示,如此循环反复。
2)C语言程序#include<reg52.h>#define uint unsigned intvoid display();void num();int i;unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e}; //共阳极数码管0-F编码表void delayms(uint);void main(){while(1){num();display();}}void display(){P2=0xff;//消隐P0连接段选,P1节位选P1=0x00;//8个数码管同时显示P2=table[i];//数码管显示数码0 delayms(1000);//延时5ms}void num(){if(i<9)i++;elsei=0;}void delayms(uint x){uint i,j;for(i=0;i<x;i++)for(j=0;j<110;j++);}3)汇编语言:ORG 0000HLJMP MAINORG 0100H;P2连接段选,P1节位选MAIN: MOV P1,#00H ;所有的数码管都显示MOV R2,#00H ;从0开始显示LOOP: MOV A,R2 ;为下面的基址加变址寄存器寻址方式做准备MOV DPTR,#TAB1 ;把数组的首地址赋给DPTRMOVC A,@A+DPTR ;取数组中的数字MOV P2,A ;把取得的值送给P0口显示ACALL DELAY ;延时一会INC R2 ;为取下一个数加一CJNE R2,#10,LOOP ;只要数小于10就继续循环显示MOV R2,#00H ;如果加到10后重新从0开始LJMP LOOP ;进入循环函数;****************************************** TAB1: DB 0C0H,0F9H,0A4H,0B0H,99H; 数组DB 92H,82H,0F8H,80H,90HRET;****************************************** DELAY: MOV R3,#3 ;延时函数DE1: MOV R4,#0FFHDE2: MOV R5,#0FFHDJNZ R5,$DJNZ R4,DE2DJNZ R3,DE1RET;*************************************************END(3)编写程序学习数码管的动态显示,让8只数码管从从左往右显示1、2、3……8。
单片机数码管显示实验报告篇一:单片机应用实验报告 2键盘、LED 数码管显示实验西华大学实验报告(理工类)开课学院及实验室:机械工程与自动化学院计算机机房实验时间 : 2014年 5月20 日一、实验目的二、实验内容三、实验电路四、实验程序#includereg52.hsbit key0=P2 ;sbit key1=P2 ;sbit key2=P2 ;sbit red=P1 ;sbit yell=P1 ;sbit gre=P1 ;sbit LED1=P2 ;sbit LED2=P2 ;int num=0;unsigned char code dispcode[]={0x30,0xfc,0xa2,0xa4,0x6c,0x25,0x21,0xbc,0x20,0x24};void init(){key0=1;key1=1;key2=1;}void delayms(int a) { int b=0;for(a;a0;a--)for(b=110;b0;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;}void xianshi(){delayms(5);P0=dispcode[num];LED1=0;LED2=1;delayms(5);}int main(){init();while(1){judge();xianshi();}return 0;}五、实验步骤六、附录篇二:单片机实验两位数码管显示报告一、实验目的1、在之前单键实验和中断控制数码管“静态”显示实验的基础上,把单键判断、数码管显示和中断结合起来编写中断程序实现单键控制一位数码管;2、在实现控制一位数码管显示的基础上用单键控(转载于: 池锝网:单片机数码管显示实验报告)制两位数码管显示。
51单片机数码管显示实验报告实验目的:1.学习51单片机的编程方法和硬件连接方法;2.掌握使用51单片机驱动数码管显示的方法。
实验器材:1.51单片机开发板;2.公共阳极共阳向数码管一个;3.若干杜邦线。
实验原理:数码管是一种数字显示器件,由7个发光二极管和若干个选通器件构成。
每个发光二极管可以发出两种颜色的光,通常使用红色和绿色。
这篇实验报告以共阳数码管为例,共阳数码管的每个发光二极管的阳极都连接到电源VCC上,而七个阴极分别用来选择一些数字进行显示。
当要选择一些数码管显示时,需要对对应的阴极进行低电平使能,而使能其他阴极保持高电平,这样就可以通过控制每个数码管的阴极低电平使能来选择要显示的数字。
实验步骤:1.将51单片机开发板上的数码管连接到51单片机开发板的P1口和P0口上,连接方式如下图所示:```-----------------VCC-P0.0--,a,-----------------P0.1--,b,------P0.2--,c,---,数字2P0.3--,d,------P0.4--,e,------P0.5--,f,---,数字1P0.6--,g,------P0.7--,h,-----------------------P1.0P1.1```2. 在Keil µVision中新建工程,编写程序。
3.利用P0口控制数码管的阴极,利用P1口选择数码管要显示的数字。
4.在主程序中循环选择每个数码管,并通过P0口设置要显示的数字。
实验结果:```---------------------------------P1.0P1.1P0.6P0.7空空数字2数字1abcdefgh---------------------------------```实验结论:通过本次实验,学习了51单片机的编程方法和硬件连接方法,并掌握了使用51单片机驱动数码管显示的方法。
同时,还了解了数码管的工作原理和编程的基本步骤。
宁德师范学院计算机系
实验报告
(2014—2015学年第2学期)
课程名称单片机原理
实验名称数码管动态显示实验
专业计算机科学与技术(非师范)年级2012级
学号B********** 姓名王秋
指导教师杨烈君
实验日期2015.4.17
实验步骤、实验结果及分析:
1 实验步骤:
1、使用Proteus ISIS 7 Professional应用程序,建立一个.DSN文件
2、在“库”下拉菜单中,选中“拾取元件”(快捷键P),分别选择以下元件:AT89C51、CAP、CAP-ELEC、CRYSTAL、RESPACK-8。
3、构建仿真电路:
连接图
显示1-8
显示33355223
显示时间13.23.25 时钟自动计时
连接图
红绿灯效果图1 红绿灯效果图2
2、教师批改学生实验报告应在学生提交实验报告10日内。
一、实验目的1. 理解数码管的工作原理及驱动方式。
2. 掌握51单片机控制数码管显示的基本方法。
3. 学会使用动态扫描显示技术实现多位数码管的显示。
4. 提高编程能力和实践操作能力。
二、实验原理数码管是一种常用的显示器件,它由多个发光二极管(LED)组成,可以显示数字、字母或其他符号。
根据LED的连接方式,数码管可分为共阴极和共阳极两种类型。
本实验使用的是共阳极数码管。
51单片机控制数码管显示的基本原理是:通过单片机的I/O口输出高低电平信号,控制数码管的各个段(a-g)的亮灭,从而显示相应的数字或符号。
动态扫描显示技术是将多个数码管连接到单片机的I/O口,通过快速切换各个数码管的显示状态,实现多位数码管的显示。
三、实验器材1. 51单片机实验板2. 共阳极数码管3. 电阻、电容等元件4. 仿真软件(如Proteus)5. 编译器(如Keil)四、实验步骤1. 搭建电路:按照实验原理图连接51单片机、数码管和电阻等元件。
2. 编写程序:使用Keil软件编写控制数码管显示的程序。
程序主要包括以下部分:a. 初始化:设置单片机的工作状态,配置I/O口等。
b. 显示函数:根据需要显示的数字或符号,控制数码管的各个段亮灭。
c. 动态扫描函数:实现多位数码管的动态显示。
3. 编译程序:将编写好的程序编译成机器码。
4. 仿真测试:使用Proteus软件对程序进行仿真测试,观察数码管的显示效果。
5. 实验验证:将程序烧录到51单片机实验板上,进行实际测试。
五、实验结果与分析1. 实验结果:通过仿真测试和实际测试,数码管能够正确显示0-9的数字。
2. 结果分析:实验结果表明,51单片机可以成功地控制数码管显示数字。
动态扫描显示技术能够有效地实现多位数码管的显示,提高了显示效率。
六、实验总结1. 通过本次实验,我们掌握了51单片机控制数码管显示的基本方法,提高了编程能力和实践操作能力。
2. 动态扫描显示技术能够有效地实现多位数码管的显示,提高了显示效率。
单片机实验报告姓名:林康班级:1120603学号:201120060325实验题目:实验五动态显示一.实验任务及要求(1)使用单片机并行口做动态数码显示,把片内30H~32H单元的内容静态显示来。
二. 编程思路(1)动态显示是一位一位地轮流点亮各位的数码管,因此需要分时送出段选码和位选码,每次控制一个数码管显示,而且是先送段选码锁存后在送位选码点亮相应的数码管。
通过调节延时程序能够控制数码管显示数据的间隔,其余的和静态显示基本相似。
三. 实验电路及连线方法动态显示连线方法:电路由2 片74LS573,1 个六字一体的共阴数码管组成。
由U15 输出段选码,U16做位选码,与单片机的采用I/O 口连接方式,短路片J22 连接P2.0,J23 连接P2.3,做输出信号锁存。
(实际电路连d7-d6-d5-d4-d3-d2-d1-d0→h-c-d-e-g-b-a-f)。
PW12 是电源端。
开始初始化((R0))→A,取A低四位,查其笔型码送入P0口P2.0置1,然后清零通过74LS573输入段选码,把位选码送入P0口P2.1置1,然后清零延时1毫秒((R0))→A,取A高四位,查其笔型码送入P0口P2.0置1,然后清零通过74LS573输入段选码,把位选码送入P0口P2.1置1,然后清零延时1毫秒R0自加1R7自减1R7=0?结束ORG 0000LP3: MOV 32H,#12HMOV 31H,#34HMOV 30H,#56HMOV R0,#30HMOV R6,#0DFHMOV R7,#03MOV DPTR,#TABCLR P2.0CLR P2.1LP0: CLR AMOV A,@R0ANL A,#0FHMOVC A,@A+DPTRMOV P0,ASETB P2.0CLR P2.0MOV P0,#00MOV A,R6MOV P0,ASETB P2.1CLR P2.1RR AMOV R6,ADEL0: MOV R5,#250LP1: NOPNOPDJNZ R5,LP1CLR AMOV A,@R0ANL A,#0F0HSWAP AMOVC A,@A+DPTRMOV P0,ASETB P2.0CLR P2.0 MOV P0,#00MOV A,R6MOV P0,ASETB P2.1CLR P2.1RR AMOV R6,AINC R0DEL1: MOV R5,#250LP2: NOPNOPDJNZ R5,LP2DJNZ R7,LP0SJMP LP3TAB: DB77H,44H,3EH,6EH,4DH,6BH,7BH,46H,7FH,6FH,5FH,79H,33H,7CH,3BH,1BH END六.调试结果30H-32H单元依次输入12,34,56,数码管从左到右依次显示6 5 4 3 2 1 结果与预期符合。
实验七数码管动态扫描显示实验一、实验目的1.掌握keilC51软件protues软件联合仿真调试的方法;2.掌握单片机对数码管的动态显示控制方式;3.掌握定时器的基本应用及编程方法。
二、实验内容1.用Protues设计一8位数码管动态扫描显示电路。
要求利用P0口作数码管的段选线,P1.0~P1.2与74LS138译码器的3个输入端相连,其译码输出Y0~Y7作为数码管的位选线。
2.编写程序,将数字1~8分别显示在8个数码管上,要求显示内容无闪烁。
3.编写程序,利用Protues中的“激励源/DCLOCK/数字类型/时钟”产生频率为1HZ的方波输出,并利用定时/计数器T1统计脉冲的个数,将统计结果动态实时的显示在数码管上。
该脉冲计数电路在以上电路的基础上自行修改。
三、实验仪器与设备1.微机一台2.keil c51 集成开发环境3.proteus 仿真软件四、实验说明1.动态扫描方法:(1)动态扫描法是对各数码管循环扫描、轮流显示的方法。
由于一次只能让一个数码管显示,因此,要显示8位的数据,必须让数码管一个一个轮流显示才可以,同时每个数码管显示的时间大约在1ms到4ms之间,所以为了保证正确显示,每隔1ms,就得刷新一个数码管。
当扫描显示频率较高时,利用人眼的视觉暂留特性,看不出闪烁现象,这种显示需要一个接口完成字形码的输出(段选),另一接口完成各数码管的轮流点亮(位选)。
(2)在进行数码管显示的时候,要对显示单元开辟8个显示缓冲区,每个显示缓冲区装有显示的不同数据即可。
(3)对于显示的字形码数据采用查表方法来完成。
2.P0口P0口作为地址/数据总线使用时是一个真正的双向端口;而作通用I/O口时,只是一个准双向口,由于其内部漏极开路,应外接10KΩ的上拉电阻,否则无法输出高电平。
3.74LS138:3线—8线译码器引脚排列:Vcc Y0 Y1 Y2 Y3 Y4 Y5 Y6A0 A1 A2 S3 S2 S1 Y7 GND真值表:1.用Protues设计数码管动态扫描显示电路;2.在KeilC51中编写键盘识别程序,编译通过后,于Protues联合调试;3.启动仿真,观察数码管显示是否正确;4.用Protues设计脉冲计数电路,仿真调试`运行程序并查看效果。
51单片机动态数码管实验报告
本文介绍了51单片机动态数码管实验的步骤和结果。
动态数码管是一种常用的数字显示器件,它可以显示数字、字母和一
些图形。
在51单片机中,为了控制动态数码管的显示,我们需要使用定
时器和中断。
作为一个经典的单片机实验,动态数码管实验是初学者熟悉51单片机开发的重要步骤之一。
本次实验使用的是常见的4位共阳极动态数码管。
电路图如下:
在电路中使用了四个PNP三极管作为驱动器,共阳极接Vcc(5V),
母线接0V,通过控制每个数码管对应的位选引脚(EN1、EN2、EN3、EN4)来实现选定要显示的数码管,再由程序向选定的数码管的a、b、c、d、e、f、g引脚发送对应的信号,以实现数字显示的功能。
程序上,我们需要使用定时器和中断来驱动动态数码管的显示。
具体
步骤如下:
1.定义计数器和数组,数组定义每位数码管显示的数字,计数器控制
当前轮到哪个数码管显示。
2.初始化定时器和中断,并启动定时器。
3.在中断函数中,将数码管的位选引脚依次拉高并依次向数码管a、
b、c、d、e、f、g中发送数据信号。
4.在每个数码管的对应位选时间内,通过对控制数组的操作,改变数
码管显示的数字。
5.循环执行第3~4步,显示不同的数字。
最后,我们通过改变控制数组的值,实现了动态数码管显示不同数字和字母的功能。
总之,通过动态数码管实验,我们进一步熟悉了51单片机的定时器和中断,了解了动态数码管的驱动原理和程序设计方法,为后续更复杂的单片机实验和应用打下了基础。
C单片机定时器及数码管控制实验报告一、实验目的:1.理解单片机的定时器的工作原理和使用方法;2.掌握单片机控制数码管显示的方法;3.综合运用单片机定时器和数码管控制来实现对时间的计时功能。
二、实验器材:1.STC89C52单片机开发板;2.4位数码管;3.相关电源电缆;4.相关串口连接线;5.PC机。
三、实验原理:1.定时器的工作原理:定时器是单片机中的一个重要模块,它可以用来产生一定时间间隔的定时中断。
在STC89C52单片机中,有两个可编程定时器,分别是Timer0和Timer1、定时器的工作方式有两种:定时器工作模式和计数器工作模式。
通过设定定时器的工作模式、预分频系数以及计数初值,可以实现定时中断。
2.数码管的控制原理:数码管是一种常见的数码显示器材,一般由多个LED组成,通过对LED的开关控制来实现不同数字的显示。
使用单片机控制数码管可以实现数字的动态显示。
通常使用行扫描和列驱动两种方法来控制数码管的显示。
在本实验中,我们使用列驱动的方法来控制数码管的显示。
3.单片机定时器和数码管控制实验的原理流程:(1)初始化定时器设置,包括设定工作模式、预分频系数和计数初值。
(2)初始化数码管连接引脚,并将引脚置为输出状态。
(3)在定时器中断中,通过改变数码管显示的值来实现时间的动态显示。
四、实验步骤:1.硬件连线将STC89C52单片机开发板上的P0口连接到4位数码管的输入口,共7根线。
其中6根线对应4位数码管的6个段输入,另外1根线连接到4位数码管的控制端,用于控制数码管的选通位。
2.软件编程(1)定义头文件和端口变量#include <reg52.h>#define uint unsigned int#define uchar unsigned charsbit DIG1=P0^0; // 数码管第1位sbit DIG2=P0^1; // 数码管第2位sbit DIG3=P0^2; // 数码管第3位sbit DIG4=P0^3; // 数码管第4位sbit DULA=P0^4; // 数码管段选sbit WELA=P0^5; // 数码管位选uchar code ledData[16]={ // 共阳数码管动态显示数值表,共16个字符0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};(2)初始化函数void Init_Timer0(void) // 初始化定时器0TMOD,=0x01;//设定为定时器模式,工作模式1TH0=0xfc; // 给定初值,定时1msTL0=0x18;ET0=1;//打开定时器0中断TR0=1;//启动定时器0void Init_Timer1(void) // 初始化定时器1TMOD,=0x10;//设定为定时器模式,工作模式1TH1=0xf8; // 给定初值,定时10msTL1=0xcc;ET1=1;//打开定时器1中断TR1=1;//启动定时器1(3)定时器中断函数void Timer0Interrupt( interrupt 1 // 计时定时器中断函数static uchar count=0;TH0=0xfc;TL0=0x18;count++;if(count>=1000) // 1秒到count=0;LED_Place=0; // 置位数码管位置Digit_Index++; // 下一个要显示的数字if(Digit_Index>=8)Digit_Index=0;}if(LED_Place==1) // 第2位数码管LEDX=ledData[N%10];DIG2=0;DIG1=1;//第2位数码管显示}else if(LED_Place==2) // 第3位数码管LEDX=ledData[N/10%10];DIG3=0;DIG2=1;//第3位数码管显示}else if(LED_Place==3) // 第4位数码管LEDX=ledData[N/100%10];DIG4=0;DIG3=1;//第4位数码管显示}else // 第1位数码管LEDX=ledData[N/1000%10];DIG1=0;DIG4=1;//第1位数码管显示}}(4)主函数void mainInit_Timer0(; // 初始化定时器0Init_Timer1(; // 初始化定时器1EA=1;//全局中断使能while(1)//主函数其他处理}五、实验效果:经过上述步骤的硬件连接和软件编程,当单片机开始运行后,数码管将开始显示时间。
数码管动态显示实验
一、实验要求
1.在Proteus软件中画好51单片机最小核心电路,包括复位电路和晶振电路
2.在电路中增加四个7段数码管(共阳/共阴自选),将P1口作数据输出口与7段数码
管数据引脚相连,P2.0~P2.3引脚输出选控制信号
3.在Keil软件中编写程序,采用动态显示法,实现数码管显示变量unsigned int
show_value的值(show_value的值范围为0000~9999),即把show_value的千百
十个位的值用数码管显示出来。
二、实验目的
1.巩固Proteus软件和Keil软件的使用方法
2.学习端口输入输出的高级应用
3.掌握7段数码管的连接方式和动态显示法
4.掌握查表程序和延时等子程序的设计
三.实验说明
(条理清晰,含程序的一些功能分析计算)
如下图(五)所示,由P1口将要显示的数字输给七段数码管;再由P2第四位输给数码管的公共端,作为扫描输入信号;用外部中断P3.2和P3.3分别接PB1与PB2,实现数字的增减。
所要实现的功能是,开始运行电路功能图时,四个数码管分别显示0000,按下PB1增1,直到9999回到0000,相反按下PB2减1,直到0000回到9999。
在算相关数据时,由于要显示个十百千的不同数字,要调用disp函数,
disp[0]=show/1000; //显示千位的值 disp[1]=show%1000/100; //显示百位的值
disp[2]=show%100/10; //显示十位的值 disp[3]=show%10; //显示个位的值
本实验需要用到IE寄存器与TCON寄存器。
四、硬件原理图及程序设计
(一)硬件原理图设计
图(五)
开始运行proteus,四个数码管显示0000,按下PB1数码管增1,按下PB2数码管减1。
(二)程序流程图设计
三)程序设源代码
#include<reg51.h> //定义8051寄存器头文件
#define SEG7P P1 // 定义数码管输入信号接P1 #define SCANP P2 //定义数码管扫描信号接P2 char code TAB[10]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, //数字0~4 0x92, 0x83, 0xf8, 0x80, 0x98 };//数字5~~9 char disp[4]={0,0,0,0}; //显示数组
void delay_ms(int x); //声明延迟函数char scan[4]={0xfe,0xfd,0xfb,0xf7}; //声明输入扫描信号char i,j; //声明变量
void display(); //显示数组diso的内容int show=0000; //定义初始值
void get_disp(); //声明返回diap main() //主程序开始
{
IE=0X85; //开IE寄存器,允许INT0和INT1中断
TCON=0X05; //开INT0,INT1
while(1) //无穷循环
{
get_disp();
display();
}
}
void delay_ms(int x) //声明延迟函数
{ int i,j; //定义变量
for (i=0;i<x;i++) //开始计数,计数x次
for (j=0;j<120;j++); //计数120次,延迟1ms }
void display() //声明显示函数
{
for(i=0;i<4;i++) //开始计数,计数4次{ j=disp[3-i]; //diap的值附到变量j SCANP=scan[i]; //显示扫描信号
SEG7P=TAB[j]; //显示数字到数码管
delay_ms(4); //延迟4ms
}
}
void INT0_ISR(void) interrupt 0 //INT0中断子程序开始 {
if(show<9999) //如果显示数值小于9999
show++; //显示数值自增1
else show=0; //否则显示数值0
}
void_INT1_ISR(void) interrupt 2 //INT1中断子程序开始
{
if(show>0) //如果显示数值大于0
show--; //显示数值自减1
else show=9999; //否则显示数值9999
}
void get_disp ()
{
disp[0]=show/1000; //显示千位的值disp[1]=show%1000/100; //显示百位的值
disp[2]=show%100/10; //显示十位的值
disp[3]=show%10; //显示个位的值
}
五.实验总结
实验过程中遇到的问题及解决方法、体会
问题1:运行电路原理图时,数码管都不亮。
解决方法:定义IE寄存器时,没有开启总开关EA,导致数码管不能正常显示数字。
问题2:按下PB1或PB2,数码管乱码。
解决方法:因为使用了两个外部中断,所以INT0和INT1都要开启,在声明INT0和INT1时,起初写成if(show<9999);show--;if(show>0);show++;而应该是if(show<9999);show++;if(show>0);show--;最电路原理图能正常显示0000~9999。
体会:科学的魅力太强大了,从之前的一个数码管亮0~9,现在只要你想要几个数码管亮就可以接几个,写入正确的程序,就能实现你想要的效果。
程序一直在增多,实现的功能也在无穷的变换着,越来越觉得单片机实现的功能,在生活中也随处可见。