MAX7219驱动数码管显示
MAX7219驱动数码管显示
一:实验目的
1,熟悉程序的编译、下载方法和过程;
2,熟悉利用max7219驱动数码管显示;
二:实验内容
使用MAX7219驱动数码管显示(可参考单片机程序文件夹中数码管显示键盘值文件中的内容);
三:实验步骤
1,设计硬件电路,焊制电路板,连接相关电路;
2,观察给定程序所实现的功能;
3,按照设定的功能修改程序编译程序,下载并调试程序;
四:程序与其相关说明
#include
#define uchar unsigned char
#define uint unsigned int
#include
#include
#include
sbit BUZZ=P1^3;
/********************************************************************
* 名称: Main()
* 功能: 主函数
***********************************************************************/
void Main()
{
init_7219(); //对max7219初始化
init_ds12887(); //对ds12887初始化
//set_time();
set_alarm();
while(1)
{
P2=0xf0;
if((P2&0xf0)!=0xf0)
{
keyscan();
if(key==0)
{
if ((DS_C & 0x10) != 0) //显示时间
{
crt_timenyr();
}
}
}
else{
if ((DS_C & 0x10) != 0) //显示时间
{
crt_timesfm();
}
}
delay1ms(100);
}
}
#define DECODE 0X09 //译码控制寄存器
#define INTENSITY 0X0A //亮度控制寄存器
#define SCANLIMIT 0X0B //扫描界限寄存器
#define FLASHCON 0X0C //关断模式寄存器
#define DISPLAY 0X0F //测试控制寄存器
sbit LOAD=P1^0;
sbit DIN=P1^1;
sbit CLK=P1^2;
/********************************************************************
* 名称: write_7219(uchar add,uchar dat)
* 功能: 地址,数据发送子程序
***********************************************************************/ void write_7219(uchar add,uchar dat)
{
uchar i;
LOAD=0; //拉低片选,选中器件
for(i=0;i<8;i++) //发送地址
{
CLK=0; //清零时钟总线
DIN=(bit)(add&0x80); //每次取高字节
add<<=1; //左移一位
CLK=1; //时钟上升沿,发送地址
}
for(i=0;i<8;i++) //发送数据
{
CLK=0;
DIN=(bit)(dat&0x80);
dat<<=1;
CLK=1; //时钟上升沿,发送数据
}
LOAD=1; //发送结束,上升沿锁住数据
}
/********************************************************************
* 名称: init_7219()
* 功能: max7219的初始化,设置max7219内部的控制寄存器
***********************************************************************/ void init_7219()
{
write_7219(FLASHCON,0x01); //开启正常模式
write_7219(DISPLAY,0x00); //选择工作模式
write_7219(DECODE,0xff); //选用不译码模式
write_7219(SCANLIMIT,0x07); //8只led全用
write_7219(INTENSITY,0x04); //设置初始亮度
}
uchar key;
uchar code disp_code[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};
uchar code key_code[]={
0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,
0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};
/********************************************************************
* 名称: delay1ms(uint i)
* 功能: 延时子程序,经过软件调试,测得延时程序大概为1ms.
***********************************************************************/ void delay1ms(uint i)
{
uchar j;
while(i--)
{
for(j=0;j<115;j++) //1ms基准延时程序
{
;
}
}
}
/********************************************************** 键盘扫描子函数
**********************************************************/ uchar keyscan()
{
uchar scan1,scan2,keycode,j;
P2=0xf0;
scan1=P2;
if((scan1&0xf0)!=0xf0) //判键是否按下
{
delay1ms(20); //延时20ms
scan1=P2;
if((scan1&0xf0)!=0xf0) //二次判键是否按下
{
P2=0x0f; //线反转法的核心
scan2=P2;
keycode=scan1|scan2; //组合成键编码
for(j=0;j<=15;j++)
{
if(keycode== key_code[j]) //查表得键值
{
key=j;
return(key);
}
}
}
}
else
P2=0xff; //P1口写1 输入状态
return (10); //数码管显示"-"
}
#include
/* DS12887口地址*/
#define DS_A XBYTE[0x400A] //寄存器A
#define DS_B XBYTE[0x400B] //寄存器B
#define DS_C XBYTE[0x400C] //寄存器C
#define Years XBYTE[0x4009] //年
#define Month XBYTE[0x4008] //月
#define Day XBYTE[0x4007] //日
#define Week XBYTE[0x4006] //星期
#define Hour_Alarm XBYTE[0x4005] //时闹钟
#define Hour XBYTE[0x4004] //时
#define Minute_Alarm XBYTE[0x4003] //分闹钟
#define Minute XBYTE[0x4002] //分
#define Seconds_Alarm XBYTE[0x4001] //秒闹钟
#define Second XBYTE[0x4000] //秒
/***************************************************
************DS12887初始化程序************************
****************************************************/
void init_ds12887()
{
DS_A=0x20; //打开振荡器,允许RTC计时
DS_B=0x12; //允许寄存器C中的闹钟中断标志(AF)位产生IRQ 信号
}
void set_time()
{
DS_A=0x2f; //寄存器A
DS_B|=0x80; //禁止更新数据
Years=0x12; //年
Month=0x12; //月
Day=0x04; //日
Week=0x02; //星期
Hour=0x14; //时
Minute=0x00; //分
Second=0x00; //秒
DS_B &=0x7f; //寄存器A
}
void set_alarm()
{
DS_A=0x2f; //寄存器A
DS_B|=0x80; //禁止更新数据
Hour_Alarm=0x14; //时
Minute_Alarm=0x00; //分
Seconds_Alarm=0x10; //秒
DS_B &=0x7f; //寄存器A
}
/***************************************************
************ 显示时间*****************************
****************************************************/
void crt_timenyr()
{
uchar dhi,dli;
dli=Years;
dhi=dli & 0xf0;
dhi>>=4;
dhi+=0x30;
dli &=0x0f;
dli +=0x30;
write_7219(1,dhi);
write_7219(2,dli);
write_7219(3,10);
dli=Month;
dhi=dli & 0xf0;
dhi>>=4;
dhi+=0x30;
dli &=0x0f;
dli +=0x30;
write_7219(4,dhi);
write_7219(5,dli);
write_7219(6,10);
dli=Day;
dhi=dli & 0xf0;
dhi>>=4;
dhi+=0x30;
dli &=0x0f;
dli +=0x30;
write_7219(7,dhi);
write_7219(8,dli); }
void crt_timesfm() {
uchar dhi,dli;
dli=Hour;
dhi=dli & 0xf0;
dhi>>=4;
dhi+=0x30;
dli &=0x0f;
dli +=0x30;
write_7219(1,dhi);
write_7219(2,dli);
write_7219(3,10);
dli=Minute;
dhi=dli & 0xf0;
dhi>>=4;
dhi+=0x30;
dli &=0x0f;
dli +=0x30;
write_7219(4,dhi);
write_7219(5,dli);
write_7219(6,10);
dli=Second;
dhi=dli & 0xf0;
dhi>>=4;
dhi+=0x30;
dli &=0x0f;
dli +=0x30;
write_7219(7,dhi);
write_7219(8,dli);
}
}
硬件:
1、使用MAX7219驱动数码管显示;
2、数据由P1.0、P1.1、P1.2串行输入到MAX7219的LOAD、DIN、CLk,用跳线器连接J2和J3的0、1、2;
四、电路板相关部分元器件及部分要求:
1、电阻:
10K: R
12, R
4
.
8.2K: R
1 2K: R
11
1K: R
2, R
3
4.7K: R17
430Ω: R
0, R
t1
, R
13
, R
14
, R
15
, R
16
10Ω: R
5, R
6
.
2、电阻值计算要求
棕红橙黄绿兰紫灰白黑 1 2 3 4 5 6 7 8 9 0 数值幂误差
1 1 1 1
棕黑橙
1 0 3
10*103=104
3、电容
104 C1~C10
20P c18,c19
4、电解
1UF C20-C24
4.7UF C17
100UF C11,C12
5、发光二极管长脚阳极白发绿D
t1
白发红 D
0-D
8
白发蓝 D
t2
6、电阻排
10K: REP3 (103)
470Ω:REP2(471)
长脚为正,板上右侧为正
7、J24 J25不焊
8、交通灯颜色顺序
红黄绿,黄在中间
红绿黄
黄红
绿绿
红黄
黄绿红
9、对焊接点的要求
以上三种焊接点除第一种之外其他的都不符合要求。
五:程序编写中遇到的问题与解决方法
1、程序下载的相关操作
答:查阅相关书本知识与内容,请教老师与同学,将程序下载到单片机中。
2、Output 窗口中出现错误提示信息
答:如果在源文件中存在错误在Output 窗口中会出现错误提示信息,可以在源程序中进行修改,然后存盘后重新Build 观察错误提示信息。
3、注意指令中的“,:;”是西文字符,切不可使用中文符号;数字“0”与字符“o”不可混淆。
4、对程序修改后必须退出硬件连接,进行编译后再重新进行硬件连接才能生效。六:心得体会
通过这次实验让我对单片机有了更深入的了解,了解了单片机在实现功能和具体操作过程方面的可靠性和多样性,提高了自己把理论知识运用于实践的能力,更好地理解这门课程在实践生活中的作用;在焊接电路时加强了操作的技巧,锻炼了动手能力,通过焊接过程对单片机系统有了进一步的了解,在调试程序时,也锻炼了编写程序、认识程序和修改程序的能力,这对自己以后在电子单路方面知识的学习有很大帮助。
max7219资料及电路图
MAX7219是MAXIM公司生产的串行输入/输出共阴极数码管显示驱动芯片,一片MAX7219可驱动8个7段(包括小数点共8段)数字LED、LED条线图形显示器、或64个分立的LED发光二级管。该芯片具有10MHz传输率的三线串行接口可与任何微处理器相连,只需一个外接电阻即可设置所有LED的段电流。。它的操作很简单,MCU只需通过模拟SPI三线接口就可以将相关的指令写入MAX7219的内部指令和数据寄存器,同时它还允许用户选择多种译码方式和译码位。此外它还支持多片7219串联方式,这样MCU就可以通过3根线(即串行数据线、串行时钟线和芯片选通线)控制更多的数码管显示。MAX7219的外部引脚分配如图1所示及内部结构如图2所示。 图1 MAX7219的外部引脚分配
图2 MAX7219的内部引脚分配 各引脚的功能为: DIN:串行数据输入端 DOUT:串行数据输出端,用于级连扩展 LOAD:装载数据输入 CLK:串行时钟输入 DIG0~DIG7:8位LED位选线,从共阴极LED中吸入电流 SEG A~SEG G DP 7段驱动和小数点驱动 ISET:通过一个10k电阻和Vcc相连,设置段电流 MAX7219有下列几组寄存器:(如图3) MAX7219内部的寄存器如图3,主要有:译码控制寄存器、亮度控制寄存器、扫描界限寄存器、关断模式寄存器、测试控制寄存器。编程时只有正确操作这些寄存器,MAX7219才可工作。
图 3 MAX7219内部的相关寄存器 分别介绍如下: (1)译码控制寄存器(X9H) 如图4所示,MAX7219有两种译码方式:B译码方式和不译码方式。当选择不译码时,8个数据为分别一一对应7个段和小数点位;B译码方式是BCD译码,直接送数据就可以显示。实际应用中可以按位设置选择B译码或是不译码方式。 图4 MAX7219的译码控制寄存器 (2)扫描界限寄存器(XBH)
4位7段数码管驱动电路设计要求
4位7段数码管驱动电路 图1 开发板电路原理图 信号说明
1. iRST_N(异步复位) 当iRST_N信号为低时,Seg7_Driver模块中的所有寄存器异步复位为初值。 2. iCLK 模块的输入时钟40MHz。 3. iSeg_Val[15:0] 7段数码管输入二进制值,0x0~0xF iSeg_Val[15:12],左侧第一位7段数码管的值。 iSeg_Val[11: 8],左侧第两位7段数码管的值。 iSeg_Val[ 7: 4],左侧第三位7段数码管的值。 iSeg_Val[ 3: 0],左侧第四位7段数码管的值。 4. iDot_Val[3:0] 各位7段数码管小数点的显示,值为1表示显示小数点,0表示不显示小数点。 iDot_Val[3],左侧第一位7段数码管的小数点。 iDot_Val[2],左侧第两位7段数码管的小数点。 iDot_Val[1],左侧第三位7段数码管的小数点。 iDot_Val[0],左侧第四位7段数码管的小数点。 5. oDisplay[7:0] 7段数码管的数据信号。4位7段数码管共用数据信号。7段数码管为共阳极连接,各段数据线为0时,对应段发光。 6. oDis_En[3:0] 各位7段数码管的使能信号,低有效。
oDis_En[3],左侧第一位7段数码管的使能信号。 oDis_En[2],左侧第两位7段数码管的使能信号。 oDis_En[1],左侧第三位7段数码管的使能信号。 oDis_En[0],左侧第四位7段数码管的使能信号。 建议的分块: 将整个驱动电路分成Seg7_Ctrl模块与Seg7_Hex2seg模块 Seg7_Ctrl模块负责产生数码管动态显示的控制信号oDis_En的时序 Seg7_Hex2Seg模块负责将二进制值转换成数据码管显示的数据值,包括小数点的值。 注意点: 1. 动态显示过程是利用人眼的视觉残留现象来实现的,应选择适当的数码管扫描频率。可先 选择数码管的扫描显示的刷新率为125Hz(8ms),即每位数码管用2ms。 2. 完成基本功能后,可实验改变刷新率,观察数码管显示的效果,并思考原因。 3. 如果要使得数码管能够显示,A,b,C,n,o等其他字符,模块应该作怎样的修改?
单片机驱动数码管显示
单片机驱动数码管显示实验报告 学校:三亚学院 专业名称:测控技术与仪器 班级: 1301班 姓名:刘金坤 日期: 2015/05/08
实验四单片机驱动数码管显示 一实验目的 1 学习单片机驱动数码管动态显示的电路设计和编程方法 二实验原理 1、单片机系统中常用的显示器有:发光二极管LED(Light Emitting Diode)显示器、液晶LCD(Liquid Crystal Display)显示器、CRT显示器等。LED、LCD显示器有两种显示结构:段显示和点阵显示。 七段数码管显示 为了显示数字或字符,必须对数字或字符进行编码。七段数码管加上一个小数点,共计8段。因此为LED显示器提供的编码正好是一个字节。字母一般用米字型。 编码表: 七段数码管对应八位由低到高:a,b,c,d,e,f,g,dp 例:数码管显示2则要点亮a,b,g,e,d段,对应的八位是01011011
数码管动态显示方式是将所有显示位的段选择线并联在一起,有统一的I/O资源来控制。各个数码管公共端也有I/O资源来控制,分时的选通各个数码管进行动态显示。每个瞬间只能选通一个数码管,人眼的暂留时间为0.1s,每个数码管的选通时间必须在0.1s以内,通常选择15ms~20ms。电路图见实验附图。 三实验内容 理解动态显示电路图,参考驱动程序,单片机P0口作段码输出控制,P1口作位码控制,使单片机驱动6个7段数码管输出实验当天年、月、日六位数字。 四、实验步骤 (1)单片机最小应用系统1的P0口接段码口a~h,P1口接位码口S1~S6。 (2)在KEIL软件下编写程序并调试,完成实验内容要求。 (3)下载程序,通过实验箱验证设计电路和编写的程序是否达到实验要求。 下载程序,通过实验箱验证设计电路和编写的程序是否达到实验要求。 五参考程序与电路 数码管动态显示电路图(数码管位选信号为高电平,段选信号为高电平)
点阵屏驱动程序(MAX7219)
//自己做项目写的2*4点阵屏驱动,分享给大家,基于STC15单片机 点阵屏如上图所示 #include "stc15w4k32s4.h" #define uchar unsigned char #define uint unsigned int //定义Max7219端口 sbit Max7219_pinCLK = P1^7; sbit Max7219_pinCS = P1^6; sbit Max7219_pinDIN = P1^5; void Write_Max7219_byte(uchar DATA); //向MAX7219(U3)写入字节void Write_Max7219(uchar address,uchar dat); //向MAX7219写入数据 void Init_MAX7219(void); //初使化函数 void Display_1(uchar dat); //1号屏显示数字 void Display_2(uchar dat); //2号屏显示数字 void Display_3(uchar dat); //3号屏显示数字 void Display_4(uchar dat); //4号屏显示数字 void Display_5(uchar dat); //5号屏显示数字 void Display_6(uchar dat); //6号屏显示数字 void Display_7(uchar dat); //7号屏显示数字
void Display_8(uchar dat); //8号屏显示数字、 /* 8个点阵驱动程序 */ uchar code disp1[38][8] ={ {0x00,0x30,0x48,0x48,0x48,0x48,0x48,0x30}, //0 {0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x38}, //1 {0x00,0x78,0x08,0x08,0x78,0x40,0x40,0x78}, //2 {0x00,0x78,0x08,0x08,0x78,0x08,0x08,0x78}, //3 {0x00,0x10,0x30,0x50,0x78,0x10,0x10,0x10}, //4 {0x00,0x78,0x40,0x40,0x78,0x08,0x08,0x78}, //5 {0x00,0x78,0x40,0x40,0x78,0x48,0x48,0x78}, //6 {0x00,0x7C,0x04,0x08,0x10,0x10,0x10,0x10}, //7 {0x00,0x78,0x48,0x48,0x78,0x48,0x48,0x78}, //8 {0x00,0x78,0x48,0x48,0x78,0x08,0x08,0x78}, //9 {0}, //显示空白10 {0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00}, //显示负数符号11 {0x00,0x7C,0x40,0x40,0x7C,0x40,0x40,0x7C}, //E 12 {0x00,0x78,0x44,0x44,0x7C,0x48,0x48,0x44}, //R 13 {0x10,0x28,0x44,0x44,0x44,0x7C,0x44,0x44}, //A 14 {0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x78}, //L 15 {0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70}, //C 16 }; //-------------------------------------------- //功能:向MAX7219(U3)写入字节 //入口参数:DATA //出口参数:无 //说明: void Write_Max7219_byte(uchar DATA) { uchar i; Max7219_pinCS=0; for(i=8;i>=1;i--) { Max7219_pinCLK=0; Max7219_pinDIN=DATA&0x80; DATA=DATA<<1; Max7219_pinCLK=1; } } //------------------------------------------- //功能:向MAX7219写入数据 //入口参数:address、dat
7段数码管显示电路
4.4 显示模块 4.4.1 7段数码管的结构与工作原理 7段数码管一般由8个发光二极管组成,其中由7个细长的发光二极管组成 数字显示,另外一个圆形的发光二极管显示小数点。 当发光二极管导通时,相应的一个点或一个笔画发光。控制相应的二极管导通,就能显示出各种字符,尽管显示的字符形状有些失真,能显示的数符数量也有限,但其控制简单,使有也方便。发光二极管的阳极连在一起的称为共阳极数码管,阴极连在一起的称为共阴极数码管,如图4.9所示。 4.4.2 7段数码管驱动方法 发光二极管(LED 是一种由磷化镓(GaP )等半导体材料制成的,能直接将电能转变成光能的发光显示器件。当其内部有一一电流通过时,它就会发光。 7段数码管每段的驱动电流和其他单个LED 发光二极管一样,一般为5~10mA ;正向电压随发光材料不同表现为1.8~2.5V 不等。 7段数码管的显示方法可分为静态显示与动态显示,下面分别介绍。 (1) 静太显示 所谓静态显示,就是当显示某一字符时,相应段的发光二极管恒定地寻能可截止。这种显示方法为每一们都需要有一个8位输出口控制。对于51单片机,可以在并行口上扩展多片锁存74LS573作为静态显示器接口。 静态显示器的优点是显示稳定,在发光二极管导通电注一定的情况下显示器的亮度高,控制系统在运行过程中,仅仅在需要更新显示内容时,CPU 才执行一次显示更新子程序,这样大大节省了CPU 的时间,提高了CPU 的工作效率;缺点是位数较多时,所需I/O 口太多,硬件开销太大,因此常采用另外一种显示方式——动态显示。
(2)动态显示 所谓动态显示就是一位一位地轮流点亮各位显示器(扫描),对于显示器的每一位而言,每隔一段时间点亮一次。虽然在同一时刻只有一位显示器在工作(点亮),但利用人眼的视觉暂留效应和发光二极管熄 灭时的余辉效应,看到的却是多个字符“同时”显示。显示器亮度既与点亮时的导通电流有关,也与点亮时间和间隔时间的比例有关。调整电流和时间参烽,可实现亮度较高较稳定的显示。若显示器的位数不大于8位,则控制显示器公共极电位只需一个8位I/O 口(称为扫描口或字位口),控制各位LED 显示器所显示的字形也需要一个8位口(称为数据口或字形口)。 动态显示器的优点是节省硬件资源,成本较低,但在控制系统运行过程中,要保证显示器正常显示,CPU 必须每隔一段时间执行一次显示子程序,这占用了CPU 的大量时间,降低了CPU 工作效率,同时显示亮度较静态显示器低。 综合以上考虑,由于温度显示为精确到小数点后两位,故只需4个数码管,又考虑到CPU 工作效率与电源效率,本毕业设计采用静态显示。为共阳极显示。 4.4.3 硬件编码 动74LS47是一款BCD 码转揣为7段输出的集成电路芯片,利用它可以直接驱动共阳 极的7段数码管。它的引脚分部和真值表分别下图。
51单片机并行口驱动LED数码管显示电路及程序
51单片机并行口驱动LED数码管显示电路及程序 介绍利用51单片机的一个并行口实现多个LED数码管显示的方法,给出了利用此方法设计的多路LED显示系统的硬件电路结构原理图和软件程序流程,同时给出了采用51汇编语言编写程序。 1 硬件电路 多位LED显示时,常将所有位的段选线并联在一起,由一个8位I/O口控制,而共阴极点或共阳极点分别由另一个8位I/O口控制;也可采用并行扩展口构成显示电路,通常,需要扩展器件管脚的较多,价格较高。本文将介绍一种利用单片机的一个并行I/O口实现多个LED显示的简单方法,图1所示是该电路的硬件原理图。其中,74LS138是3线-8线译码器,74LS164是8位并行输出门控串行输入移位寄存器,LED采用L05F型共阴极数码管。 显示时,其显示数据以串行方式从89C52的P12口输出送往移位寄存器74LS164的A、B 端,然后将变成的并行数据从输出端Q0~Q7输出,以控制开关管WT1~WT8的集电极,然后再将输出的LED段选码同时送往数码管LED1~LED8。位选码由89C52的P14~P16口输出并经译码器74LS138送往开关管Y1~Y8的基极,以对数码管LED1~LED8进行位选控制,这样,8个数码管便以100ms的时间间隔轮流显示。由于人眼的残留效应,这8个数码管看上去几乎是同时显示。
<51单片机并行口驱动LED数码管显示电路> 2 软件编程 该系统的软件编程采用MCS-51系列单片机汇编语言完成,并把显示程序作为一个子程序,从而使主程序对其进行方便的调用。图2所示是其流程图。具体的程序代码如下:
<51单片机并行口驱动LED数码管显示程序>
驱动大尺寸数码管的方法与电路
驱动大尺寸数码管的方法与电路 相信大家都见过数码管,数码管上面有abcdefg七个笔画,构成一个“日”字,一般还有一个小数点dp。 数码管的外形有不同的大小,其度量标准是其中“日”字的高度,单位一般都是英寸。 市场上数码管的尺寸范围一般为0.25~8 英寸。 图片链接:https://www.360docs.net/doc/d12631972.html,/%D7%F6%B6%F8%C2%DB%B5%C0/album/驱动大尺寸数码管 在实验室中,常见的数码管是0.5 英寸的,它的高和宽分别为0.7 英寸和0.5 英寸。 这种数码管,每个笔画的内部,仅仅含有一个LED,驱动一个笔画,和驱动一个普通的发光二极管无异。 在大厅或者户外,就要使用大尺寸的数码管。 做而论道用过最大的数码管是8 英寸的。 8 英寸数码管中的每个笔画内部,都含有8 个LED,它们之间是两两并联后再串联;小数点dp的内部,仅仅用了两个LED 进行串联。
8 英寸共阳数码管内部的简图如下: 8 英寸数码管也有多种颜色,一般的工作参数如下: 每个笔段的导通电压约为8~10V;静态电流10~15mA;动态时,1/8动态扫描时,平均电流为8~10mA,峰值电流60~80mA。 小数点的电压、电流酌减,视亮度均衡情况而定。 要想驱动8 英寸数码管,显然不能用单片机本身的+5V电源,通常都是使用+12V。 想要驱动+12V的共阳数码管,电路设计,就是一个典型的电子线路方面的问题。 很多搞单片机的,编编软件还可以,设计电路时,明显暴露出不足。 很多搞电子的,并不明白单片机有高电平的输出能力问题,设计的电路结构,以及限流电阻、上拉电阻都不尽合理,呵呵 下面说说做而论道的设计思路。 对于+12V 到数码管之间的通断控制,显然应该用PNP 型的晶体管,用8550 最好。 为了控制8550 的截止与饱和,在其基极约要有+12V 的电压才行,单片机最大只能输出+5V,这就需要有电平转换电路。 +5V 到+12V 的转换,方法很多了: 可以使用NPN 型的晶体管,用8050 就可以; 可以使用集成电路74LS07,它是六同相OC输出的驱动门电路,输出端最大可以外接+30V;可以使用集成电路ULN2803(或ULN2003),它是八(七)反相OC输出的驱动门电路。这几种电路,做而论道都进行过实验和应用,都是成功的,安全性、可靠性均为100%。 下面看一段网络对话,即可看到大尺寸数码管的驱动电路与应用效果。 ===============================================
单片机控制数码管显示
单片机实训 项目:用单片机控制数码管显示及其应用班级: 应用电子技术二班 姓名:赵林旺 学号: 2008061532 时间:2010. 5. 21
用单片机控制数码管显示及其应用 一、实训目的 1. 通过用单片机控制数码管的静态显示,学会用单片机编程进行控制和8段共阳极数码管的使用方法,学会编写与调更复杂的程序,进一步熟悉单片机串行接口的使用,为以后打下基础。 2.在用可能的情况下制作数码管的使用电路,本次通过密码锁的制作,进一步熟悉单片机键盘接口和显示器接口技术,掌握独立式键盘结构下的程序设计思路和步骤。 3.通过本次实训提高汇编语言编程能力、识别元器件能力、单片机外围电路连接。同时加强理论联系实际的能力,提高学生的动手能力,培养学生之间团结协作能力和刻苦耐劳精神。 4.在日常生活中,可以看到采用八段LED数码管构成的显示屏。这里主要完成利用单片机控制数码管,实现静态显示与动态扫描移动显示。 二、实训器材 1. 面包板一片 2.AT89S52 三片 3. 共阳极8段LED数码管三个 4.40引脚的IC插座三个
5. 74LS164芯片 一片 6..+5V 电源 一个 7.510Ω、220Ω、1K Ω、10K Ω电阻 若干 8.晶体振荡器 若干 9.复位开关 若干 10电解电容22uF 、瓷片电容30pF 若干 11.发光二极管 若干 三 、实训原理图 1. 用单片机控制一个数码管依次显示数字0~9的硬件电路如A 图所示: p 1.01p 1.12p 1.23p 1.34p 1.45p 1.56p 1.67p 1.78R ST/VPD 9R X D/p 3.0 10TX D/p 3.111INT 0/p 3.212INT 1/p 3.313T0/p 3.414T1/p 3.515WR /p3.616R D /p3.717XT AL 218 XT AL 119Vss 20 p 2.0 21 p 2.122p 2.223p 2.324p 2.425p 2.526p 2.627p 2.728PSEN 29AL E/PR OG 30EA /Vp p 31p 0.732p 0.633p 0.534p 0.435p 0.336p 0.237p 0.138p 0.039Vcc 4089C 51 R 1R 2R 3R 4R 5R 6R 7R 8 a b f c g d e DP Y 1234567a b c d e f g 8 dp dp DPY_7-SE G_DP co m 510*8 89C51 +5 C 3 22u f C 230p f C 130p f Y1 12MH Z K1 R 910K + GN D +5+5 因为只控制一个数码管,选择采取一直点亮各段的静态显示方式,这种显示可以在较小的电流驱动下获得较高的显示亮度,且占用CPU 时间少,编程简单,便于显示和控制。 汇编语言的程序如下:
数码管的驱动原理
数码管的驱动原理 所谓共阳共阴,是针对数码管的公共脚而言的。一个1位典型的数码管,一般有10个脚,8个段码(7段加1个小数点),剩下两个脚接在一起。各个段码实际上是一个发光二极管,既然是发光二极管,就有正负极。所谓共阳,也就是说公共脚是正极(阳极),所有的段码实际上是负极,当某一个或某几个段码位接低电平,公共脚接高电平时,对应的段码位就能点亮,进而组合形成我们看到的数字或字母。共阴刚好相反,也就是公共脚是负极(阴极),段码位是阳极,当公共脚接地,段码位接高电平时,对应段码位点亮。 1位数码管是这样,更多位的数码管也基本跟这个原理类似。 共阴共阳与电路接线密切相关,决定了驱动电路的接法,因此在电路设计前要考虑好数码管的类型,否则就不能实现显示的效果了。 驱动共阴数码管一般用PNP,共阳的用NPN 图一低电平有效,图二高电平有效
现在让我们用实验板上的两个数码管来做一个循环显示00~99数字的实验,先来完成必要的硬件部分, 数码管有共阴和共阳的区分,单片机都可以进行驱动,但是驱动的方法却不同,并且相应的0~9的显示代码也正好相反。 首先我们来介绍两位共阳数码管的单片机驱动方法,电路如下图: 网友可以看到:P2.6和P2.7端口分别控制数码管的十位和个位的供电,当相应的端口变成低电平时,驱动相应的三极管会导通,+5V通过IN4148二极管和驱动三极管给数码管相应的位供电,这时只要P0口送出数字的显示代码,数码管就能正常显示数字。 因为要显示两位不同的数字,所以必须用动态扫描的方法来实现,就是先个位显示1 毫秒,再十位显示1毫秒,不断循环,这样只要扫描时间小于1/50秒,就会因为人眼的视觉残留效应,看到两位不同的数字稳定显示。 下面我们再介绍一种共阴数码管的单片机驱动方法,电路如下图: 网友可以看到:+5V通过1K的排阻直接给数码管的8个段位供电,P2.6和P2.7端口分别控制数码管的十位和个位的供电,当相应的端口变成低电平时,相应的位可以吸入电流。单片机的P0口输出的数据相当于将数码管不要显示的数字段对地短路,这样数码管就会显示需要的数字。
51单片机(四位数码管的显示)程序[1]
51单片机(四位数码管的显示)程序 基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管 上显示P ”个字符;2)等待按键,如按了任何一个键,则将这 4个字符清除, 改为显示0000”个字符(为数字的0)。 E3最佳答案 下面这个程序是4x4距阵键盘丄ED 数码管显示,一共可以到0-F 显示,你可以稍微 改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你! #i nclude
void keyscan(void) //键盘初始化 //有键按下? //延时 //确认真的有键按下? //使行线 P2.4 为低电平,其余行为高电平 //a 作为缓存 //开始执行行列扫描 { case 0xee:k=15;break; case 0xde:k=11;break; case 0xbe:k=7;break; case 0x7e:k=3;break; default:P2 = 0xfd; //使行线 P2.5 为低电平,其余行为高电平 a = P2; switch (a)//键盘扫描函数 { unsigned char a; P2 = 0xf0; if(P2!=0xf0) { key_delay(); if(P2!=0xf0) { P2 = 0xfe; key_delay(); a = P2; switch (a)
LED数码管的结构及工作原理
LED数码管的结构及工作原理 LED数码管(LED Segment Displays)是由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。LED数码管常用段数一般为7段有的另加一个小数点,还有一种是类似于3位“+1”型。位数有半位,1,2,3,4,5,6,8,10位等等....,LED数码管根据LED的接法不同分为共阴和共阳两类,了解LED的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。图2是共阴和共阳极数码管的内部电路,它们的发光原理是一样的,只是它们的电源极性不同而已。颜色有红,绿,蓝,黄等几种。LED数码管广泛用于仪表,时钟,车站,家电等场合。选用时要注意产品尺寸颜色,功耗,亮度,波长等。下面将介绍常用LED数码管内部引脚图。 图1 这是一个7段两位带小数点10引脚的LED数码管 图2 引脚定义
每一笔划都是对应一个字母表示 DP 是小数点. 数码管分为共阳极的LED 数码管、共阴极的LED 数码管两种。下图例举的是共阳极的LED 数码管,共阳就是7段的显示字码共用一个电源的正。led 数码管原理图示意: 图3 引脚示意图 从上图可以看出,要是数码管显示数字,有两个条件:1、是要在VT 端(3/8脚)加正电源;2、要使(a,b,c,d,e,f,g,dp)端接低电平或“0”电平。这样才能显示的。 共阳极LED 数码管的内部结构原理图图4: 图4 共阳极LED 数码管的内部结构原理图 a b c d e f g dp
共阴极LED数码管的内部结构原理图: a b c d e f g dp 图5 共阴极LED数码管的内部结构原理图 表1.1 显示数字对应的二进制电平信号 LED数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数位,因此根据LED数码管的驱动方式的不同,可以分为静态式和动态式两类。 A、静态显示驱动:
单片机控制步进电机和数码管显示
一、设计任务书 设计内容:用80C51单片机设计一个步进电机控制器 设计要求: 1.用8015设计一个四相步进电机。 2.可控制步进电机的启动与停止,正转与反转。 3.10档速度调节。 4.点动控制。 5.可显示电机运行参数。 二、设计总体方案 (一)控制方式的选择 控制主要用于电机速度和方向的转换。控制方式有按键控制和开关控制两种。按键较开关而言,操作更加简便,故选按键控制。 方案一:独立按键。独立按键可自由连接,线路简单。 方案二:编码式键盘。编码式键盘的按键接触点接于74LS148芯片。当键盘上没有闭合时,所有按键都断开,当某一键闭合时,该键对应的编码由74LS148输出。 本次设计所需按键不多,不需要采用复杂编码,考虑硬件条件、线路连接和经济性等方面,选择方案一。 (二)电机电路设计方案的选择 由于条件的限制,对于电机的选择只能是实验台上最小步距角18°的电机,其中已包含了驱动电路。 (三)单片机的选择 方案一:AT89C51高性能8位单片机,内部集成CPU、存储器、寄存器、I/O接口,从而构成较为完整的计算机,价格便宜。 方案二:C8051F005单片机,该单片机是完全集成的混合信号系统及芯片,具有8051兼容的微控制器内核,与MCS-51指令集完全兼容。除了具有标准8052的数字外设部件,片内还继承了数据采集和控制系统中常用的模拟部件和其他数字外设及功能部件,执行速度快,但价格较贵。 本次课程设计是在仿真环境下进行,没有太过考虑单片机选择的问题,但就设计本身来讲,从物美价廉的角度考虑,选择方案一较合适。 (四)显示方案的选择 方案一:采用LED数码管。LED数码管是轮流现实的,其利用人烟的视觉暂留特性,使人感觉不到数码管闪动,看到每只数码管都常亮。利用其显示必须不停给数码管数据输入口循环赋值,显示内容较多,编程和接线较为复杂。 方案二:采用LCD1602液晶显示器。LCD1602具有功率小,效果明显,变成容易等优点,且它最多能显示2×16个字符,可以轻松满足设计要求。 由上可知,LCD1602液晶显示器的优点突出,故选择方案二。 (五)软件部分的选择 软件部分的选择主要是指编程语言的选择,编译调试工具根据设计平台选择伟福软件。编程语言主要有以下两种方案。
VHDL数码管扫描显示驱动电路
静态显示 library ieee; use ieee.std_logic_1164.all; entity bcd_seg is port( a,b,c,d:in std_logic; seg:out std_logic_vector(7 downto 0) ); end entity bcd_seg; architecture one of bcd_seg is signal bcd:std_logic_vector(3 downto 0); begin bcd<=a&b&c&d; process(bcd) begin case bcd is when "0000"=>seg<="00111111"; when "0001"=>seg<="00000110"; when "0010"=>seg<="01011011"; when "0011"=>seg<="01001111"; when "0100"=>seg<="01100110"; when "0101"=>seg<="01101101"; when "0110"=>seg<="01111101"; when "0111"=>seg<="00000111"; when "1000"=>seg<="01111111"; when "1001"=>seg<="01101111"; when others=>null; end case; end process; end architecture one; 动态显示 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity bcd_seg is port( clk:in std_logic; a,b,c,d:in std_logic; com:out std_logic_vector(2 downto 0); seg:out std_logic_vector(7 downto 0) ); end entity bcd_seg; architecture one of bcd_seg is signal cnt:std_logic_vector(2 downto 0);
LED数码管结构及工作原理
L E D数码管结构及工作原理-标准化文件发布号:(9556-EUATWK-MWUB-WUNN-INNUL-DDQTY-KII
LED数码管的结构及工作原理 沈红卫 LED数码管(LED Segment Displays)是由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。LED数码管常用段数一般为7段有的另加一个小数点,还有一种是类似于3位“+1”型。位数有半位,1,2,3,4,5,6,8,10位等等....,LED数码管根据LED的接法不同分为共阴和共阳两类,了解LED的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。图2是共阴和共阳极数码管的内部电路,它们的发光原理是一样的,只是它们的电源极性不同而已。颜色有红,绿,蓝,黄等几种。LED数码管广泛用于仪表,时钟,车站,家电等场合。选用时要注意产品尺寸颜色,功耗,亮度,波长等。下面将介绍常用LED数码管内部引脚图。 图1 这是一个7段两位带小数点 10引脚的LED数码管 图2 引脚定义 每一笔划都是对应一个字母表示 DP是小数点. 数码管分为共阳极的LED数码管、共阴极的LED数码管两种。下图例举的是共阳极的LED数码管,共阳就是7段的显示字码共用一个电源的正。led 数码管原理图示意:
图3 引脚示意图 从上图可以看出,要是数码管显示数字,有两个条件:1、是要在VT端(3/8脚)加正电源;2、要使(a,b,c,d,e,f,g,dp)端接低电平或“0”电平。这样才能显示的。 共阳极LED数码管的内部结构原理图图4: 图4 共阳极LED数码管的内部结构原理图共阴极LED数码管的内部结构原理图: 图5 共阴极LED数码管的内部结构原理图
怎样用单片机驱动LED数码管显示
怎样用单片机驱动LED数码管显示 驱动LED数码管有很多方法,按显示方式分,有静态显示和动态(扫描)显示,按译码方式可分硬件译码和软件译码之分。 静态显示就是显示驱动电路具有输出锁存功能,单片机将所要显示的数据,显示数据稳定,占用很少的CPU时间。动态显示需要CPU时刻对显示器件进行数据刷新,显示数据有闪烁感,占用的CPU时间多。 这两种显示方式各有利弊;静态显示虽然数据稳定,占用很少的CPU 时间,但每个显示单元都需要单独的显示驱动电路,使用的硬件较多; 动态显示虽然有闪烁感,占用的CPU时间多,但使用的硬件少,能节 省线路板空间。 硬件译码就是显示的段码完全由硬件完成,CPU只要送出标准的BCD 码即可,硬件接线有一定标准。软件译码是用软件来完成硬件的功能,硬件简单,接线灵活,显示段码完全由软件来处理,是目前常用的显示驱动方式。 比较常用的显示驱动芯片有:74LS164 , CD4094+ULN2003(2803) ,74HC595+ULN2003(2803) , TPIC6B595,AMT9095B, AMT9595等许多。 另外,市场上还有一些专用的LED扫描驱动显示模块如MAX7219等,功能很强,价格稍高一些。下面是一个用74LS164驱动显示的例子和一个用4094扫描驱动显示的例子: ? 上例图中加了一个PNP型的三极管来控制数码管的电源,是因为164没有数据锁存端,数据在传送过程中,对输出端来说是透明的,这样,数据在传送过程中,数码管上有闪动现象,驱动的位数越多,闪动现象越明显。为了消除这种现象,在数据传送过程中,关闭三极管使数码管没电不显示,数据传送
BCD七段数码管显示译码器电路
BCD七段数码管显示译码器电路 7段数码管又分共阴和共阳两种显示方式。如果把7段数码管的每一段都等效成发光二极管的正负两个极,那共阴就是把abcdefg这7个发光二极管的负极连接在一起并接地;它们的7个正极接到7段译码驱动电路74LS48的相对应的驱动端上(也是abcdefg)!此时若显示数字1,那么译码驱动电路输出段bc为高电平,其他段扫描输出端为低电平,以此类推。如果7段数码管是共阳显示电路,那就需要选用74LS47译码驱动集成电路。共阳就是把abcdefg的7个发光二极管的正极连接在一起并接到5V电源上,其余的7个负极接到74LS47相应的abcdefg输出端上。无论共阴共阳7段显示电路,都需要加限流电阻,否则通电后就把7段译码管烧坏了!限流电阻的选取是:5V电源电压减去发光二极管的工作电压除上10ma到15ma得数即为限流电阻的值。发光二极管的工作电压一般在1.8V--2.2V,为计算方便,通常选2V即可!发光二极管的工作电流选取在10-20ma,电流选小了,7段数码管不太亮,选大了工作时间长了发光管易烧坏!对于大功率7段数码管可根据实际情况来选取限流电阻及电阻的瓦数! 发光二极管(LED)由特殊的半导体材料砷化镓、磷砷化镓等制成,可以单独使用,也可以组装成分段式或点阵式LED显示器件(半导体显示器)。分段式显示器(LED数码管)由7条线段围成8型,每一段包含一个发光二极管。外加正向电压时二极管导通,发出清晰的光,有红、黄、绿等色。只要按规律控制各发光段的亮、灭,就可以显示各种字形或符号。图4 - 17(a)是共阴式LED数码管的原理图,图4-17(b)是其表示符号。使用时,公共阴极接地,7个阳极a~g由相应的BCD七段译码器来驱动(控制),如图4 - 17(c)所示。 BCD七段译码器的输入是一位BCD码(以D、C、B、A表示),输出是数码管各段的驱动信号(以F a~F g表示),也称4—7译码器。若用它驱动共阴LED数码管,则输出应为高有效,即输出为高(1)时,相应显示段发光。例如,当输入8421码DCBA=0100时,应显示,即要求同时点亮b、c、f、g段,熄灭a、d、e段,故译码器的输出应为F a~F g=0110011,这也是一组代码,常称为段码。同理,根据组成0~9这10个字形的要求可以列出8421BCD七段译码器的真值表,见表4 - 12(未用码组省略)。
锁存器,数码管
锁存器是一种对脉冲电平敏感的存储单元电路,它们可以在特定输入脉冲电平作用下改变状态。锁存,就是把信号暂存以维持某种电平状态。锁存器的最主要作用是缓存,其次完成高速的控制其与慢速的外设的不同步问题,再其次是解决驱动的问题,最后是解决一个 I/O 口既能输出也能输入的问题。 锁存器就是把当前的状态锁存起来,使CPU送出的数据在接口电路的输出端保持一段时间锁存后状态不再发生变化,直到解除锁定。还有些芯片具有锁存器,比如芯片74LS244就具有锁存的功能,它可以通过把一个引脚置高后,输出就会保持现有的状态,直到把该引脚清0后才能继续变化。 在LED和数码管显示方面,要维持一个数据的显示,往往要持续的快速的刷新。尤其是在四段八位数码管等这些要选通的显示设备上。在人类能够接受的刷新频率之内,大概每三十毫秒就要刷新一次,这就大大占用了处理器的处理时间,消耗了处理器的处理能力,还浪费了处理器的功耗。 锁存器的使用可以大大的缓解处理器在这方面的压力。当处理器把数据传输到锁存器并将其锁存后,锁存器的输出引脚便会一直保持数据状态直到下一次锁存新的数据为止。这样在数码管的显示内容不变之前,处理器的处理时间和IO 引脚便可以释放。可以看出,处理器处理的时间仅限于显示内容发生变化的时候,这在整个显示时间上只是非常少的一个部分。而处理器在处理完后可以有更多的时间来执行其他的任务。这就是锁存器在LED和数码管显示方面的作用:节省了宝贵的MCU时间。 按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。 数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,根据数码管的驱动方式的不同,可以分为静态式和动态式两类。 静态显示驱动 静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多。如驱动5 个数码管静态显示则需要5×8=40根I/O端口来驱动,而一个89S51单片机可用的I/O端口才32个呢,实际应用时可增加译码驱动器进行驱动。 动态显示驱动 数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是哪个
驱动数码管程序
//GPIO define //FUNCTION:用595完成八位数码管显示 -------------------------------------------------------------------------- */ #include