制作单片机驱动数码管电路
把七或八只发光二极管组合在一个模件上组成了个8字和小数点,用以显示数字。为了减少管脚,把各个发光管的其中同一个极接在一起作为共用点,因此就产生了共阳极和共阴极数码之说。共阳管就是把各个发光管的正极接在一起,而共阴管就刚好相反。见下图:
大部分的逻辑IC的吸收电流要强于输出电流。因此,大家都爱使用共阴极的数码管,因为可选的IC多些。很可惜,我的这组数码管是共阳的,因此公共端我打算用三级管来驱动。最常用的S9012,首先我得计划好电路方式,就采用最常用的动态扫描显示。先搭建最简电路,调试出需采用元件的参数。
先不接上图的R2和74HC244,将数码管一个段直接接地。调节R1,测得S9012基极电流为0.21mA时集电极也就是数码管上已有40mA,说明放大倍数足够了。这时接上R2和74HC244,调节R2使数码管电流控制在15mA,这样当8个段一起点亮时三极管上得通过120mA的电流。而基极上需要0.63mA,为了减小三极管的负荷应使三极管过饱和,,调节R1使基极电流为2mA,此时测得集电极和漏极之间的电压约0.1V。好!此时R1为2K。R2为240欧姆。
接下来就是确定电路。电路的接口与AT89S51间有三组接口:段码、位码和电源。为了让AT89S51独立出来这三级接口都采用插针做接口,用排线自由连接到AT89S51的P1-P3口,电源用短路帽连接,完成后的板子见下图:
单片机制作的点焊机电路与程序
#include《reg51.h》
#define u8 unsigned char
#define u16 unsigned int
u8 b1,ss1,ss2,i,js;
bit dd;
sbit out=P3^5; ///输出控制口
sbit s0=P3^0; ///启动键
sbit s1=P3^1; ///设置键
sbit s2=P3^2; ///减
sbit s3=P3^3; ///加
sbit ge=P3^7;
sbit shi=P3^4;
char code shu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //数码管段码
void delay(u16 q) //普通延时函数
{
char d;
while(q--)
for(d=123;d》0;d--);
}
void ZD_Init() //中断初始化子函数
{
EA=1; //打开总中断开关
ET0=1; //打开定是器0开关
TR0=0; //定时器0开始工作
TMOD=0X01; //选择定时器0工作模式1 16位定时器
TH0=(65536-30000)/256; //定时器高8位装初值 定时50MS
TL0=(65536-30000)%256; //定时器低8位装初值
}
void xianshi(u8 ss,u8 gg) //显示函数
{
if(b1==2) //判断各十位数闪烁标志位
{
if(dd)
{
ss=10;
}
}
if(b1==1) //判断各位数闪烁标志位
{
if(dd)
{
gg=10;
}
}
P1=shu[ss]+0x80;
shi=0;
delay(2);
shi=1;
P1=shu[gg];
ge=0;
delay(2);
ge=1;
}
void jianpan() //键盘扫描子程序
{
if(s3==0) ///设置建
{
delay(5);
if(s3==0)
{
while(s3==0)xianshi(ss1,ss2); //松手检测
b1++;
TR0=1;
if(b1》=3)
{
b1=0;
TR0=0;
}
}
}
if(b1!=0) ///判断是否按下设置健
{
if(s2==0) ///加建
{
delay(5);
if(s2==0)
{
while(s2==0)xianshi(ss1,ss2); //松手检测
if(b1==1) ////判断各位数加
{
ss2++;
if(ss2==10)ss2=0;
}
if(b1==2) ///判断十位数加
{
ss1++;
if(ss1==10)ss1=0;
}
}
}
if(s1==0) //减键
{
delay(5);
if(s1==0)
{
while(s1==0)xianshi(ss1,ss2); ///松手检测
if(b1==1) ///判断各位数减
{
ss2--;
if(ss2==255)ss2=9;
}
if(b1==2) ////判断十位数减
{
ss1--;
if(ss1==255)ss1=9;
}
}
}
}
if(b1==0) ///启动电焊键
{
if(s0==0)
{
delay(5);
if(s0==0)
{
while(s0==0);
js=ss1*10+ss2;
if(js!=0)
{
TR0=1;
out=0;
}
}
}
}
}
void main()
{
ZD_Init(); //中断初始化
while(1)
{
xianshi(ss1,ss2); //显示子函数
jianpan(); //键盘子程序
}
}
void Time0() interrupt 1 using 0 //中断函数
{
TH0=(65536-30000)/256; //定时器高8位装初值 重装初值
TL0=(65536-30000)%256; //定时器低8位装初值 重装初值
if(b1!=0)
{
i++;
if(i==10) //数码管的闪烁
{
i=0;
dd=~dd;
}
out=1;
}
else
{
js--;
if(js==0) //点焊延时输出
{
TR0=0;
out=1;
}
}
}
-
单片机
+关注
关注
6032文章
44513浏览量
632697 -
数码管
+关注
关注
32文章
1874浏览量
90922
发布评论请先 登录
相关推荐
评论