找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2415|回复: 23
打印 上一主题 下一主题
收起左侧

52单片机数码管仿真正常,实物不亮

  [复制链接]
跳转到指定楼层
楼主
要做个仿真图所显示的功能的板子,仿真也没有问题,数码管能亮。
根据原理图做出PCB完成实物

但是实物做出来以后其他功能都正常,就只有数码管不亮,默数3s后,指示灯和蜂鸣器都能亮能响。
我在思索是不是因为位选的com端口直接连接单片机,因为采用的是共阴极数码管驱动不够导致不亮,测出来的COM端电压有5V左右。

PCB.jpg (661.26 KB, 下载次数: 39)

PCB.jpg

仿真图.jpg (423.98 KB, 下载次数: 32)

仿真图.jpg

原理图.jpg (164.33 KB, 下载次数: 27)

原理图.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:992098 发表于 2021-12-14 10:51 | 只看该作者

代码

  1. #include <REGX52.H>
  2. #include <stdio.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. uchar count=0,minute=0,second=3,flag=0,stop=0;
  6. uchar table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极
  7. uchar disbuf[4]={0};//位选定义一个四位的数组,循环扫描显示相应的内容
  8. sbit buzzer=P2^0;//定义单片机的相应引脚
  9. sbit P11=P1^1;
  10. //sbit P12=P1^2;
  11. sbit light=P1^3;
  12. sbit jianfenkey=P1^4;

  13. uchar Jia=0, Jian=0;


  14. void delay_ms(uint x) //延时消抖函数
  15. {uint t;
  16. while(x--) for(t = 0; t < 120; t++);
  17. }

  18. void display()//模块化书写函数,进行相应的调用,实现模块化编程
  19. {
  20.         uchar i,j;
  21.         uchar sel;
  22.         disbuf[0]=second%10; //disbuf[]每一个元素赋值,对秒赋值
  23.         disbuf[1]=second/10;
  24.         disbuf[2]=minute%10;//对分钟赋值
  25.         disbuf[3]=minute/10;
  26.         P2=0XFF;     //P2口接数码管的位选端,选择哪个数码管工作  共阴极数码管,位选0时有效  先置FF,使为选段为高电平,数码管不工作
  27.         sel=0x01;//定义一个扫描的位选端
  28.         for(i=0;i<4;i++)
  29.                 {
  30.                         j=disbuf[i];  //扫描依次显示四个数码管  上面的赋值已经将disbuf数值更改,也就是1~9
  31.                         P0=table[j]; //将字形码发送到P0端口,显示位的数据
  32.                         P2=(sel^0xff); // ^异或相异为1,保证每次都有一个数码管点亮
  33.                         delay_ms(1); // 延时后,防止程序运行太快,跑飞
  34.                         P2=0XFF;
  35.                         sel=sel<<1;  //  左移运算  0x01左移,1将依次在四位上循环
  36.                 }
  37. }

  38. void modify_time()//更改计时器时间的函数,修改初始定时时间
  39. {
  40.         if(Jia == 1)
  41. {
  42.         if(flag==0)//修改秒
  43.                 {
  44.                         second++;
  45.                         if(second==60)//秒的最大为60,然后会发生进位
  46.                                 {
  47.                                         second=0;
  48.                                         disbuf[0]=0;
  49.                                         disbuf[1]=0;
  50.                                 }
  51.                 }
  52.         else//修改分钟
  53.                 {
  54.                         minute++;
  55.                         if(minute==60)//分钟最大为60,到60以后会发生进位
  56.                                 {
  57.                                         minute=0;
  58.                                         disbuf[2]=0;
  59.                                         disbuf[3]=0;
  60.                                 }
  61.                 }

  62. Jia=0;
  63. }
  64. else if(Jian==1)
  65. {
  66.         if(flag==0)//修改秒
  67.                 {
  68.                         second--;
  69.                         if(second==0)//秒的最小为0,然后会发生借位
  70.                                 {
  71.                                         second=59;
  72.                                         disbuf[0]=9;
  73.                                         disbuf[1]=5;
  74.                                         minute=minute-1;
  75.                                 }
  76.                 }
  77. Jian=0;}
  78. }
  79. void main(void)//主函数
  80. {
  81.   TMOD=0x01;//定时器T0,工作方式1,为16位定时器
  82.   TH0=(65536-50000)/256;//高8位赋值
  83.   TL0=(65536-50000)%256;//低8位赋值
  84.   TR0=0;//默认情况下,定时器不工作,在外部的触发情况下,定时器,工作,开始减1运算
  85.   ET0=1;//打开定时器T0的中断
  86.   IT0=1;//设置外部中断0的触发方式
  87.   EX0=1;//打开外部中断的中断
  88.   IT1=1;//设置外部中断0触发方式
  89.   EX1=1;//打开外部中断1中断
  90.   EA=1;//总中断
  91.   while(1)
  92.         {
  93.                 if(stop==1)//当计时倒计时完成以后,屏幕闪烁显示
  94.                         {
  95.                                 while(1)
  96.                                         {
  97.                                                 P2=~P2;
  98.                                                 delay_ms(150);
  99.                                         }
  100.                         }
  101.                 else
  102.                         display();//调用显示函数,依次减一
  103.                 if(!P11)//判断更改时间按键是否按键  进行相应的消抖
  104.        {
  105.                    while(!P11)  
  106.            delay_ms(10);
  107.                            Jia=1;  
  108.            if(P11)
  109.                                          {
  110.                                        
  111.            modify_time();
  112.                                          }//调用调日期时间的函数
  113.                 }        
  114.                          if(!jianfenkey)//判断更改时间按键是否按键  进行相应的消抖
  115.        {
  116.                    while(!jianfenkey)  
  117.            delay_ms(10);  
  118.                    Jian = 1;
  119.            if(jianfenkey)
  120.            {
  121.              modify_time();}//调用调时间的函数
  122.                 }        
  123.         }
  124. }
  125. void inter1() interrupt 1//定时器T0的中断
  126. {
  127.         count++;
  128.         TH0=(65536-50000)/256;
  129.     TL0=(65536-50000)%256;
  130.         if(count==20)//50ms   20次即为1s
  131.                 {        
  132.                         count=0;
  133.                         second--;
  134.                         if(second==0)//该处的程序结构应该仔细看下
  135.                                 {
  136.                                         if(minute!=0)//防止minute最后为0的时候,还执行minute--,使程序出错。
  137.                                                 {
  138.                                                         minute--;
  139.                                                         second=60;
  140.                                                         second--;
  141.                                                         if(second==0)
  142.                                                                 {        
  143.                                                                         if(minute==0)
  144.                                                                                 {
  145.                                                                                         second=0;
  146.                                                                                         minute=0;
  147.                                                                                         TR0=0;
  148.                                                                                         count=0;
  149.                                                                                         buzzer=0;
  150.                                                                                         light=0;
  151.                                                                                         stop=1;

  152.                                                                                 }
  153.                                                                 }
  154.                                                 }
  155.                                         else
  156.                                                 {
  157.                                                         second=0;
  158.                                                         minute=0;
  159.                                                         TR0=0;
  160.                                                         count=0;
  161.                                                         buzzer=0;
  162.                                                         light=0;
  163.                                                         stop=1;
  164.                                                 }
  165.                                 }
  166.                 }
  167. }
  168.         
  169. void inter0() interrupt 0//外部中断0
  170. {
  171.         flag=~flag;//flag参数的作用,是修改定时时间的时,确定是分钟位还是小时位。
  172.         
  173. }

  174. void inter2() interrupt 2//外部中断1
  175. {
  176.         TR0=~TR0;//按键3,奇数次按下,定时器开始工作,偶数次关闭。
  177. }
复制代码
回复

使用道具 举报

板凳
ID:992098 发表于 2021-12-14 10:59 | 只看该作者
相关仿真、PCB放入RAR了,麻烦各位大佬帮忙分析一下问题
回复

使用道具 举报

地板
ID:301191 发表于 2021-12-14 16:22 | 只看该作者
顶一下
回复

使用道具 举报

5#
ID:313048 发表于 2021-12-14 16:33 | 只看该作者
仿真能行的电路不代表实物是可以的,因为仿真里面对电流这个参数是没做处理的,只对电压做了处理。你实物的COM端直接接单片机,对单片机来说不一定驱动得了,最好是用三极管去驱动位选,这样驱动能力强很多,同时你要确认数码管选型是否正确,共阳共阴是否正确。
还有一点,你说是共阴的数码管,而位选IO口的电压是5V我不理解,5V共阴的数码管不就不亮吗,要亮不应该是0V吗?
你可以试试直接段选给个0XFF,位选拉低为0,你看一下能否有亮灯不就知道驱动够不够吗?
回复

使用道具 举报

6#
ID:992098 发表于 2021-12-14 17:07 | 只看该作者
AUG 发表于 2021-12-14 16:33
仿真能行的电路不代表实物是可以的,因为仿真里面对电流这个参数是没做处理的,只对电压做了处理。你实物的 ...

给了0xff测试以后还是不亮的,通过代码把他的位选给低电平测出来还是高电平不知道是怎么回事。所以现在可能是驱动不够的问题是吗?因为当时做的时候忘记接三极管开关选通,导致现在这个问题
回复

使用道具 举报

7#
ID:992298 发表于 2021-12-14 17:16 | 只看该作者
上拉电阻有没有问题哦
回复

使用道具 举报

8#
ID:96682 发表于 2021-12-14 17:16 来自手机 | 只看该作者
实物上可以去掉 R7,R8 阻值 1K ,否则即使程序没问题也会让你摸不着头脑
回复

使用道具 举报

9#
ID:992098 发表于 2021-12-14 17:19 | 只看该作者
wc86110 发表于 2021-12-14 17:16
实物上可以去掉 R7,R8 阻值 1K ,否则即使程序没问题也会让你摸不着头脑

R7 R8是复位上面的电阻 应该不会影响数码管吧
回复

使用道具 举报

10#
ID:752974 发表于 2021-12-14 17:26 | 只看该作者
这种共阴极电路,流过数码管的段电流由RP1控制,这个电阻值要选的合适。再者,各段电流全部灌入单片机,当各个段都亮时,单片机可能就光荣了。
回复

使用道具 举报

11#
ID:342822 发表于 2021-12-14 17:32 | 只看该作者

回复

使用道具 举报

12#
ID:992098 发表于 2021-12-14 17:37 | 只看该作者
munuc_w 发表于 2021-12-14 17:26
这种共阴极电路,流过数码管的段电流由RP1控制,这个电阻值要选的合适。再者,各段电流全部灌入单片机,当 ...

RP1选的是1K 的 排阻,但是其他功能都正常只是数码管不亮而已,所以单片机应该没有问题……吧
回复

使用道具 举报

13#
ID:992098 发表于 2021-12-14 17:38 | 只看该作者

谢谢,测试过了 但是数码管没有坏,每个段都可以亮
回复

使用道具 举报

14#
ID:313048 发表于 2021-12-14 17:47 | 只看该作者
海澜之佳 发表于 2021-12-14 17:38
谢谢,测试过了 但是数码管没有坏,每个段都可以亮

程序简单化,新建一个工程,两行代码,P00置高,位选IO置低,试试
回复

使用道具 举报

15#
ID:992535 发表于 2021-12-15 08:46 | 只看该作者
可能是电阻大小的问题
回复

使用道具 举报

16#
ID:170318 发表于 2021-12-15 09:39 | 只看该作者
硬件问题,共阴数码管的8(含点)段码位上加上驱动三极管或者驱动芯片,降低位扫描频率,可以让数码管发光,但会觉得亮度不足
回复

使用道具 举报

17#
ID:811729 发表于 2021-12-15 10:02 | 只看该作者
seg推挽 你给0xFF, com 你注意设置成开漏,如果你的MCU端口有这些功能的话。如果没有,在确保SEG 5V的情况下,镊子将COM对地,看看有没亮的。
如果是IO口不听指挥,先不要给对应的bit ,防止宏定义出问题。直接输出寄存器给值。
还有 不要把com接在IO上,除非你的数码管很小。用三极管控制COM也好,共阴用NPN就行。
回复

使用道具 举报

18#
ID:992098 发表于 2021-12-16 09:06 | 只看该作者
DATOY 发表于 2021-12-15 08:46
可能是电阻大小的问题

可是我位选段没有接电阻耶
回复

使用道具 举报

19#
ID:992098 发表于 2021-12-16 09:07 | 只看该作者
AUG 发表于 2021-12-14 17:47
程序简单化,新建一个工程,两行代码,P00置高,位选IO置低,试试

还是不亮
回复

使用道具 举报

20#
ID:992098 发表于 2021-12-16 09:09 | 只看该作者
jhczy 发表于 2021-12-15 09:39
硬件问题,共阴数码管的8(含点)段码位上加上驱动三极管或者驱动芯片,降低位扫描频率,可以让数码管发光 ...

现在实物已经做出来了 还有挽救的办法吗
回复

使用道具 举报

21#
ID:992098 发表于 2021-12-16 09:10 | 只看该作者
love_ourlife 发表于 2021-12-15 10:02
seg推挽 你给0xFF, com 你注意设置成开漏,如果你的MCU端口有这些功能的话。如果没有,在确保SEG 5V的情况 ...

输出寄存器给值怎么给呀。我
还是个菜鸡
回复

使用道具 举报

22#
ID:140371 发表于 2021-12-16 09:36 来自手机 | 只看该作者
背面加unl2803,配合修改led驅動部份程式
回复

使用道具 举报

23#
ID:524818 发表于 2021-12-16 09:43 | 只看该作者
实际电路图有吗?
回复

使用道具 举报

24#
ID:213173 发表于 2021-12-16 10:16 | 只看该作者
本帖最后由 wulin 于 2021-12-16 13:51 编辑
海澜之佳 发表于 2021-12-16 09:09
现在实物已经做出来了 还有挽救的办法吗

如果PCB图与实物数码管管脚没错,数码管不亮的主要原因是P0口没有高电平输出能力,排阻阻值过大不足以驱动数码管。把RP1改为330~510欧排阻。另外楼主的程序与仿真图的端口定义不一致,并且程序内容也较杂乱,就算把数码管搞亮也达不到楼主预想的功能。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表