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

標題: 52單片機數(shù)碼管仿真正常,實物不亮 [打印本頁]

作者: 海瀾之佳    時間: 2021-12-14 10:51
標題: 52單片機數(shù)碼管仿真正常,實物不亮
要做個仿真圖所顯示的功能的板子,仿真也沒有問題,數(shù)碼管能亮。
根據(jù)原理圖做出PCB完成實物

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

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

PCB.jpg

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

仿真圖.jpg

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

原理圖.jpg

作者: 海瀾之佳    時間: 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};//位選定義一個四位的數(shù)組,循環(huán)掃描顯示相應的內(nèi)容
  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) //延時消抖函數(shù)
  15. {uint t;
  16. while(x--) for(t = 0; t < 120; t++);
  17. }

  18. void display()//模塊化書寫函數(shù),進行相應的調(diào)用,實現(xiàn)模塊化編程
  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口接數(shù)碼管的位選端,選擇哪個數(shù)碼管工作  共陰極數(shù)碼管,位選0時有效  先置FF,使為選段為高電平,數(shù)碼管不工作
  27.         sel=0x01;//定義一個掃描的位選端
  28.         for(i=0;i<4;i++)
  29.                 {
  30.                         j=disbuf[i];  //掃描依次顯示四個數(shù)碼管  上面的賦值已經(jīng)將disbuf數(shù)值更改,也就是1~9
  31.                         P0=table[j]; //將字形碼發(fā)送到P0端口,顯示位的數(shù)據(jù)
  32.                         P2=(sel^0xff); // ^異或相異為1,保證每次都有一個數(shù)碼管點亮
  33.                         delay_ms(1); // 延時后,防止程序運行太快,跑飛
  34.                         P2=0XFF;
  35.                         sel=sel<<1;  //  左移運算  0x01左移,1將依次在四位上循環(huán)
  36.                 }
  37. }

  38. void modify_time()//更改計時器時間的函數(shù),修改初始定時時間
  39. {
  40.         if(Jia == 1)
  41. {
  42.         if(flag==0)//修改秒
  43.                 {
  44.                         second++;
  45.                         if(second==60)//秒的最大為60,然后會發(fā)生進位
  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以后會發(fā)生進位
  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,然后會發(fā)生借位
  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)//主函數(shù)
  80. {
  81.   TMOD=0x01;//定時器T0,工作方式1,為16位定時器
  82.   TH0=(65536-50000)/256;//高8位賦值
  83.   TL0=(65536-50000)%256;//低8位賦值
  84.   TR0=0;//默認情況下,定時器不工作,在外部的觸發(fā)情況下,定時器,工作,開始減1運算
  85.   ET0=1;//打開定時器T0的中斷
  86.   IT0=1;//設置外部中斷0的觸發(fā)方式
  87.   EX0=1;//打開外部中斷的中斷
  88.   IT1=1;//設置外部中斷0觸發(fā)方式
  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();//調(diào)用顯示函數(shù),依次減一
  103.                 if(!P11)//判斷更改時間按鍵是否按鍵  進行相應的消抖
  104.        {
  105.                    while(!P11)  
  106.            delay_ms(10);
  107.                            Jia=1;  
  108.            if(P11)
  109.                                          {
  110.                                        
  111.            modify_time();
  112.                                          }//調(diào)用調(diào)日期時間的函數(shù)
  113.                 }        
  114.                          if(!jianfenkey)//判斷更改時間按鍵是否按鍵  進行相應的消抖
  115.        {
  116.                    while(!jianfenkey)  
  117.            delay_ms(10);  
  118.                    Jian = 1;
  119.            if(jianfenkey)
  120.            {
  121.              modify_time();}//調(diào)用調(diào)時間的函數(shù)
  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)//該處的程序結(jié)構(gòu)應該仔細看下
  135.                                 {
  136.                                         if(minute!=0)//防止minute最后為0的時候,還執(zhí)行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參數(shù)的作用,是修改定時時間的時,確定是分鐘位還是小時位。
  172.         
  173. }

  174. void inter2() interrupt 2//外部中斷1
  175. {
  176.         TR0=~TR0;//按鍵3,奇數(shù)次按下,定時器開始工作,偶數(shù)次關(guān)閉。
  177. }
復制代碼

作者: 海瀾之佳    時間: 2021-12-14 10:59
相關(guān)仿真、PCB放入RAR了,麻煩各位大佬幫忙分析一下問題

作者: 人工置頂員    時間: 2021-12-14 16:22
頂一下
作者: AUG    時間: 2021-12-14 16:33
仿真能行的電路不代表實物是可以的,因為仿真里面對電流這個參數(shù)是沒做處理的,只對電壓做了處理。你實物的COM端直接接單片機,對單片機來說不一定驅(qū)動得了,最好是用三極管去驅(qū)動位選,這樣驅(qū)動能力強很多,同時你要確認數(shù)碼管選型是否正確,共陽共陰是否正確。
還有一點,你說是共陰的數(shù)碼管,而位選IO口的電壓是5V我不理解,5V共陰的數(shù)碼管不就不亮嗎,要亮不應該是0V嗎?
你可以試試直接段選給個0XFF,位選拉低為0,你看一下能否有亮燈不就知道驅(qū)動夠不夠嗎?

作者: 海瀾之佳    時間: 2021-12-14 17:07
AUG 發(fā)表于 2021-12-14 16:33
仿真能行的電路不代表實物是可以的,因為仿真里面對電流這個參數(shù)是沒做處理的,只對電壓做了處理。你實物的 ...

給了0xff測試以后還是不亮的,通過代碼把他的位選給低電平測出來還是高電平不知道是怎么回事。所以現(xiàn)在可能是驅(qū)動不夠的問題是嗎?因為當時做的時候忘記接三極管開關(guān)選通,導致現(xiàn)在這個問題
作者: chlcsf    時間: 2021-12-14 17:16
上拉電阻有沒有問題哦
作者: wc86110    時間: 2021-12-14 17:16
實物上可以去掉 R7,R8 阻值 1K ,否則即使程序沒問題也會讓你摸不著頭腦
作者: 海瀾之佳    時間: 2021-12-14 17:19
wc86110 發(fā)表于 2021-12-14 17:16
實物上可以去掉 R7,R8 阻值 1K ,否則即使程序沒問題也會讓你摸不著頭腦

R7 R8是復位上面的電阻 應該不會影響數(shù)碼管吧
作者: munuc_w    時間: 2021-12-14 17:26
這種共陰極電路,流過數(shù)碼管的段電流由RP1控制,這個電阻值要選的合適。再者,各段電流全部灌入單片機,當各個段都亮時,單片機可能就光榮了。
作者: taotie    時間: 2021-12-14 17:32


作者: 海瀾之佳    時間: 2021-12-14 17:37
munuc_w 發(fā)表于 2021-12-14 17:26
這種共陰極電路,流過數(shù)碼管的段電流由RP1控制,這個電阻值要選的合適。再者,各段電流全部灌入單片機,當 ...

RP1選的是1K 的 排阻,但是其他功能都正常只是數(shù)碼管不亮而已,所以單片機應該沒有問題……吧
作者: 海瀾之佳    時間: 2021-12-14 17:38
taotie 發(fā)表于 2021-12-14 17:32

謝謝,測試過了 但是數(shù)碼管沒有壞,每個段都可以亮
作者: AUG    時間: 2021-12-14 17:47
海瀾之佳 發(fā)表于 2021-12-14 17:38
謝謝,測試過了 但是數(shù)碼管沒有壞,每個段都可以亮

程序簡單化,新建一個工程,兩行代碼,P00置高,位選IO置低,試試
作者: DATOY    時間: 2021-12-15 08:46
可能是電阻大小的問題
作者: jhczy    時間: 2021-12-15 09:39
硬件問題,共陰數(shù)碼管的8(含點)段碼位上加上驅(qū)動三極管或者驅(qū)動芯片,降低位掃描頻率,可以讓數(shù)碼管發(fā)光,但會覺得亮度不足
作者: love_ourlife    時間: 2021-12-15 10:02
seg推挽 你給0xFF, com 你注意設置成開漏,如果你的MCU端口有這些功能的話。如果沒有,在確保SEG 5V的情況下,鑷子將COM對地,看看有沒亮的。
如果是IO口不聽指揮,先不要給對應的bit ,防止宏定義出問題。直接輸出寄存器給值。
還有 不要把com接在IO上,除非你的數(shù)碼管很小。用三極管控制COM也好,共陰用NPN就行。
作者: 海瀾之佳    時間: 2021-12-16 09:06
DATOY 發(fā)表于 2021-12-15 08:46
可能是電阻大小的問題

可是我位選段沒有接電阻耶

作者: 海瀾之佳    時間: 2021-12-16 09:07
AUG 發(fā)表于 2021-12-14 17:47
程序簡單化,新建一個工程,兩行代碼,P00置高,位選IO置低,試試

還是不亮
作者: 海瀾之佳    時間: 2021-12-16 09:09
jhczy 發(fā)表于 2021-12-15 09:39
硬件問題,共陰數(shù)碼管的8(含點)段碼位上加上驅(qū)動三極管或者驅(qū)動芯片,降低位掃描頻率,可以讓數(shù)碼管發(fā)光 ...

現(xiàn)在實物已經(jīng)做出來了 還有挽救的辦法嗎
作者: 海瀾之佳    時間: 2021-12-16 09:10
love_ourlife 發(fā)表于 2021-12-15 10:02
seg推挽 你給0xFF, com 你注意設置成開漏,如果你的MCU端口有這些功能的話。如果沒有,在確保SEG 5V的情況 ...

輸出寄存器給值怎么給呀。我
還是個菜雞
作者: a0931727149    時間: 2021-12-16 09:36
背面加unl2803,配合修改led驅(qū)動部份程式
作者: cphnkj188    時間: 2021-12-16 09:43
實際電路圖有嗎?

作者: wulin    時間: 2021-12-16 10:16
本帖最后由 wulin 于 2021-12-16 13:51 編輯
海瀾之佳 發(fā)表于 2021-12-16 09:09
現(xiàn)在實物已經(jīng)做出來了 還有挽救的辦法嗎

如果PCB圖與實物數(shù)碼管管腳沒錯,數(shù)碼管不亮的主要原因是P0口沒有高電平輸出能力,排阻阻值過大不足以驅(qū)動數(shù)碼管。把RP1改為330~510歐排阻。另外樓主的程序與仿真圖的端口定義不一致,并且程序內(nèi)容也較雜亂,就算把數(shù)碼管搞亮也達不到樓主預想的功能。




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1