欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6694|回復: 23
打印 上一主題 下一主題
收起左側

52單片機數碼管仿真正常,實物不亮

  [復制鏈接]
跳轉到指定樓層
樓主
要做個仿真圖所顯示的功能的板子,仿真也沒有問題,數碼管能亮。
根據原理圖做出PCB完成實物

但是實物做出來以后其他功能都正常,就只有數碼管不亮,默數3s后,指示燈和蜂鳴器都能亮能響。
我在思索是不是因為位選的com端口直接連接單片機,因為采用的是共陰極數碼管驅動不夠導致不亮,測出來的COM端電壓有5V左右。

PCB.jpg (661.26 KB, 下載次數: 48)

PCB.jpg

仿真圖.jpg (423.98 KB, 下載次數: 41)

仿真圖.jpg

原理圖.jpg (164.33 KB, 下載次數: 38)

原理圖.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 單片機教程網

快速回復 返回頂部 返回列表