如何制作单片机简单电路

电子说

1.2w人已加入

描述

  制作单片机驱动数码管电路

  把七或八只发光二极管组合在一个模件上组成了个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;

  }

  }

  }

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分