久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC單片機電平指示制作 附程序

  [復制鏈接]
跳轉到指定樓層
樓主
使用STC12C5A60S2,用推挽模式直接驅動LED顯示,輸入用4558緩沖放大,避免對信號的干擾。
制作出來的實物圖如下:
效果


PCB-A


PCB-B


電路原理圖如下:


單片機源程序如下:
  1. #include "STC12C5A60S2.H"  
  2. #include <intrins.h>                                                               
  3. #define uchar unsigned char//兩個宏定義
  4. #define uint unsigned int

  5. //定義左聲道15個LED所接的IO口
  6. sbit LEDL15=P2^2;
  7. sbit LEDL14=P2^1;
  8. sbit LEDL13=P2^0;            
  9. sbit LEDL12=P3^7;
  10. sbit LEDL11=P3^6;
  11. sbit LEDL10=P3^5;
  12. sbit LEDL9=P3^4;

  13. sbit LEDL8=P3^3;
  14. sbit LEDL7=P3^2;
  15. sbit LEDL6=P1^7;
  16. sbit LEDL5=P1^6;
  17. sbit LEDL4=P1^5;
  18. sbit LEDL3=P1^4;
  19. sbit LEDL2=P1^3;
  20. sbit LEDL1=P1^2;                  



  21. //定義右聲道15個LED所接的IO口
  22. sbit LEDR15=P2^3;
  23. sbit LEDR14=P3^4;
  24. sbit LEDR13=P2^5;           
  25. sbit LEDR12=P2^6;
  26. sbit LEDR11=P2^7;
  27. sbit LEDR10=P4^4;
  28. sbit LEDR9=P4^5;

  29. sbit LEDR8=P4^6;
  30. sbit LEDR7=P0^7;
  31. sbit LEDR6=P0^6;
  32. sbit LEDR5=P0^5;
  33. sbit LEDR4=P0^4;
  34. sbit LEDR3=P0^3;
  35. sbit LEDR2=P0^2;
  36. sbit LEDR1=P0^1;


  37. uint ADC_resultL,ADC_resultR,voL,voR; //定義幾個unsigned int型和unsigned char型變量
  38. uchar numL,numR,tt0,tt1,ttL,ttR,biaozhiL,biaozhiR,xuantingL,xuantingR,xialuoL,xialuoR,pfL,pfR;

  39. void delay(uchar z)       //延時程序
  40. {
  41.   uchar x,y;
  42.   for(x=z;x>0;x--)  
  43.   for(y=100;y>0;y--);
  44. }

  45. void displayL()   //左聲道顯示程序
  46. {                P0M1 = 0x00; P0M0 = 0xFF; //P0(00000000B,11111111B)
  47.             P1M1 = 0x00; P1M0 = 0xFC; //P1(00000000B,11111100B)
  48.         P2M1 = 0x00; P2M0 = 0xFF; //P2(00000000B,11111111B)
  49.                 P3M1 = 0x00; P3M0 = 0xFF; //P3(00000000B,11111111B)
  50.                 P4M1 = 0x00; P4M0 = 0xFF; //P4(00000000B,11111111B)
  51.         if(pfL==1)
  52.         LEDL1=0;
  53.         else
  54.         {
  55.           if(numL>=1)LEDL1=0;
  56.               else LEDL1=1;
  57.         }

  58.           if(pfL==2)
  59.           LEDL2=0;
  60.         else
  61.         {
  62.           if(numL>=2)LEDL2=0;        
  63.                   else LEDL2=1;
  64.         }

  65.         if(pfL==3)
  66.                 LEDL3=0;
  67.         else
  68.         {
  69.                 if(numL>=3)LEDL3=0;        
  70.                                 else LEDL3=1;
  71.         }

  72.         if(pfL==4)
  73.                 LEDL4=0;
  74.         else
  75.         {
  76.                 if(numL>=4)LEDL4=0;        
  77.                                 else LEDL4=1;
  78.         }

  79.         if(pfL==5)
  80.                 LEDL5=0;
  81.         else
  82.         {
  83.                 if(numL>=5)LEDL5=0;        
  84.                                 else LEDL5=1;
  85.         }

  86.         if(pfL==6)
  87.                 LEDL6=0;
  88.         else
  89.         {
  90.                 if(numL>=6)LEDL6=0;        
  91.                                 else LEDL6=1;
  92.         }

  93.         if(pfL==7)
  94.                 LEDL7=0;
  95.         else
  96.         {
  97.                 if(numL>=7)LEDL7=0;        
  98.                                 else LEDL7=1;
  99.         }

  100.         if(pfL==8)
  101.                 LEDL8=0;
  102.         else
  103.         {
  104.                 if(numL>=8)LEDL8=0;        
  105.                                 else LEDL8=1;
  106.         }

  107.         if(pfL==9)
  108.                 LEDL9=0;
  109.         else
  110.         {
  111.                 if(numL>=9)LEDL9=0;        
  112.                                 else LEDL9=1;
  113.         }

  114.         if(pfL==10)
  115.                 LEDL10=0;
  116.         else
  117.         {
  118.                 if(numL>=10)LEDL10=0;        
  119.                                 else LEDL10=1;
  120.         }

  121.         if(pfL==11)
  122.                 LEDL11=0;
  123.         else
  124.         {
  125.                 if(numL>=11)LEDL11=0;        
  126.                                 else LEDL11=1;
  127.         }

  128.         if(pfL==12)
  129.                 LEDL12=0;
  130.         else
  131.         {
  132.                 if(numL>=12)LEDL12=0;        
  133.                                 else LEDL12=1;
  134.         }

  135.         if(pfL==13)
  136.                 LEDL13=0;
  137.         else
  138.         {
  139.                 if(numL>=13)LEDL13=0;        
  140.                                 else LEDL13=1;
  141.         }

  142.         if(pfL==14)
  143.                 LEDL14=0;
  144.         else
  145.         {
  146.                 if(numL>=14)LEDL14=0;        
  147.                                 else LEDL14=1;
  148.         }

  149.         if(pfL==15)
  150.                 LEDL15=0;
  151.         else
  152.         {
  153.                 if(numL>=15)LEDL15=0;        
  154.                                 else LEDL15=1;
  155.         }
  156. }

  157. void displayR()      //右聲道顯示程序
  158. {
  159.         
  160.         if(pfR==1)
  161.         LEDR1=0;
  162.         else
  163.         {
  164.                 if(numR>=1)LEDR1=0;        
  165.                                 else LEDR1=1;
  166.         }

  167.         if(pfR==2)
  168.                 LEDR2=0;
  169.         else
  170.         {
  171.                 if(numR>=2)LEDR2=0;        else LEDR2=1;
  172.         }

  173.         if(pfR==3)
  174.                 LEDR3=0;
  175.         else
  176.         {
  177.                 if(numR>=3)LEDR3=0;        else LEDR3=1;
  178.         }

  179.         if(pfR==4)
  180.                 LEDR4=0;
  181.         else
  182.         {
  183.                 if(numR>=4)LEDR4=0;        else LEDR4=1;
  184.         }

  185.         if(pfR==5)
  186.                 LEDR5=0;
  187.         else
  188.         {
  189.                 if(numR>=5)LEDR5=0;        else LEDR5=1;
  190.         }

  191.         if(pfR==6)
  192.                 LEDR6=0;
  193.         else
  194.         {
  195.                 if(numR>=6)LEDR6=0;        else LEDR6=1;
  196.         }

  197.         if(pfR==7)
  198.                 LEDR7=0;
  199.         else
  200.         {
  201.                 if(numR>=7)LEDR7=0;        else LEDR7=1;
  202.         }

  203.         if(pfR==8)
  204.                 LEDR8=0;
  205.         else
  206.         {
  207.                 if(numR>=8)LEDR8=0;        else LEDR8=1;
  208.         }

  209.         if(pfR==9)
  210.                 LEDR9=0;
  211.         else
  212.         {
  213.                 if(numR>=9)LEDR9=0;        else LEDR9=1;
  214.         }

  215.         if(pfR==10)
  216.                 LEDR10=0;
  217.         else
  218.         {
  219.                 if(numR>=10)LEDR10=0;        else LEDR10=1;
  220.         }

  221.         if(pfR==11)
  222.                 LEDR11=0;
  223.         else
  224.         {
  225.                 if(numR>=11)LEDR11=0;        else LEDR11=1;
  226.         }

  227.         if(pfR==12)
  228.                 LEDR12=0;
  229.         else
  230.         {
  231.                 if(numR>=12)LEDR12=0;        else LEDR12=1;
  232.         }

  233.         if(pfR==13)
  234.                 LEDR13=0;
  235.         else
  236.         {
  237.                 if(numR>=13)LEDR13=0;        else LEDR13=1;
  238.         }

  239.         if(pfR==14)
  240.                 LEDR14=0;
  241.         else
  242.         {
  243.                 if(numR>=14)LEDR14=0;        else LEDR14=1;
  244.         }

  245.         if(pfR==15)
  246.                 LEDR15=0;
  247.         else
  248.         {
  249.                 if(numR>=15)LEDR15=0;        else LEDR15=1;
  250.         }

  251. }

  252. void init()         //初始化程序
  253. {
  254.         TMOD=0x11;  //設定定時器0、1工作方式
  255.         EA=1;       //開總中斷        
  256.         TH0=0xb1;   //高8位裝初值 TH0=(65536-20000)/256;
  257.         TL0=0xe0;   //低8位裝初值 TL0=(65536-20000)%256;
  258.         ET0=1;      //開定時器0
  259.         TR0=1;      //啟動定時器0

  260.         TH1=0xd8;   //高8位裝初值TH1=(65536-10000)/256
  261.         TL1=0xf0;   //低8位裝初值TL1=(65536-10000)%256
  262.         ET1=1;      //開定時器1
  263.         TR1=1;      //啟動定時器1
  264. }

  265. //---------------------------------------------------------------------
  266. //以下選擇 ADC 轉換速率,只能選擇其中一種
  267.                         //            SPEED1 SPEED0  A/D轉換所需時間
  268. #define AD_SPEED   0x60 //  0110,0000   1      1   70 個時鐘周期轉換一次,
  269.                         //  CPU工作頻率21MHz時 A/D轉換速度約 300KHz
  270. //#define AD_SPEED   0x40 //0100,0000   1      0     140 個時鐘周期轉換一次
  271. //#define AD_SPEED   0x20 //0010,0000   0      1     280 個時鐘周期轉換一次
  272. //#define AD_SPEED   0x00 //0000,0000   0      0     420 個時鐘周期轉換一次
  273. //---------------------------------------------------------------------

  274. uint ad_zhuanhuan(uchar channel)
  275. {
  276.     uchar AD_finished=0;            //存儲 A/D 轉換標志

  277.     ADC_RES = 0;                    //高八位清零
  278.     ADC_RESL = 0;                   //低兩位清零

  279.     channel &= 0x07;                //0000,0111 清0高5位
  280.     ADC_CONTR = AD_SPEED;
  281.     _nop_();
  282.     ADC_CONTR |= channel;           //選擇 A/D 當前通道
  283.     _nop_();
  284.     ADC_CONTR |= 0x80;              //啟動 A/D 電源
  285.     delay(1);                       //使輸入電壓達到穩定
  286.     ADC_CONTR |= 0x08;              //0000,1000 令 ADCS = 1, 啟動A/D轉換,
  287.     AD_finished = 0;
  288.     while (AD_finished ==0 )        //等待A/D轉換結束
  289.     {
  290.         AD_finished = (ADC_CONTR & 0x10); //0001,0000 測試A/D轉換結束否
  291.     }
  292.     ADC_CONTR &= 0xE7;              //1111,0111 清 ADC_FLAG 位, 關閉A/D轉換,

  293.     return (ADC_RES*256+ADC_RESL);  //返回 A/D 高 8 位轉換結果
  294. }



  295. void main()                         //主程序
  296. {
  297.         P4SW=0x70;                  //0x70=0111 0000 ,將P4.4 P4.5 P4.6設置成IO口

  298.         init();

  299. //        ADRJ = AUXR1^2:
  300. //        0: 10 位A/D 轉換結果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄存器
  301. //        1: 10 位A/D 轉換結果的最高2 位放在ADC_RES 寄存器的低2 位, 低8 位放在ADC_RESL 寄存器
  302. //        AUXR1 &= ~0x04;               
  303. //0000,0100, 令 ADRJ=0

  304.     AUXR1 |= 0x04;                  //0000,0100, 令 ADRJ=1

  305.     ADC_CONTR |= 0x80;              //1000,0000 打開 A/D 轉換電源,啟動AD轉換        
  306.         P1ASF = 0x03;               //0000,0011, 將 P1.0 P1.1 置成模擬口        

  307.         while(1)
  308.         {

  309.                 voL= ADC_resultL*5.0;   //左聲道電平轉換結果。語句中5.0=5*1.0其中*1.0是必不可少
  310.                                         //的,不然C語言作整數處理,沒有想要的結果產生.        
  311.                 if(voL>2000) numL=14;               
  312.                 else if(voL>1635) numL=13;               
  313.                 else if(voL>1432) numL=12;        
  314.                 else if(voL>1270) numL=11;               
  315.                 else if(voL>1130) numL=10;        
  316.                 else if(voL>1006) numL=9;               
  317.                 else if(voL>895) numL=8;        
  318.                 else if(voL>797) numL=7;                                
  319.                 else if(voL>709) numL=6;        
  320.                 else if(voL>650) numL=5;               
  321.                 else if(voL>400) numL=4;               
  322.                 else if(voL>262) numL=3;               
  323.                 else if(voL>159) numL=2;
  324.                 else if(voL>70) numL=1;                                                                                       
  325.                 else numL=0;

  326.                 if(pfL<=numL)         //檢測如果漂浮物不高于峰值就讓漂浮物置于峰值上面,同時 標志位 置0
  327.                 {
  328.                         pfL=numL+1;
  329.                         biaozhiL=0;   //標志位 置0   
  330.                         xuantingL=10; //變量xuantingL   改變此值可以設定左漂浮物懸停時間
  331.                 }
  332.                 else                  //if(pfL>numL) 如果漂浮物高于峰值就把標志位置1
  333.                 {
  334.                         biaozhiL=1;   //標志位 置1
  335.                 }
  336.                 displayL();           //顯示左聲道具體電平值的段


  337.                 voR= ADC_resultR*5.0; //左聲道電平轉換結果。原理同上邊左聲道
  338.                 if(voR>2000) numR=14;               
  339.                 else if(voR>1635) numR=13;               
  340.                 else if(voR>1432) numR=12;        
  341.                 else if(voR>1270) numR=11;               
  342.                 else if(voR>1130) numR=10;        
  343.                 else if(voR>1006) numR=9;               
  344.                 else if(voR>895) numR=8;        
  345.                 else if(voR>797) numR=7;                                
  346.                 else if(voR>709) numR=6;        
  347.                 else if(voR>650) numR=5;               
  348.                 else if(voR>400) numR=4;               
  349.                 else if(voR>262) numR=3;               
  350.                 else if(voR>159) numR=2;
  351.                 else if(voR>70) numR=1;                                                                                       
  352.                 else numR=0;
  353.                
  354.                 if(pfR<=numR)
  355.                 {
  356.                         pfR=numR+1;
  357.                         biaozhiR=0;
  358.                         xuantingR=10;               
  359.                 }
  360.                 else
  361.                 {
  362.                         biaozhiR=1;
  363.                 }
  364.                 displayR();           //顯示右聲道具體電平值的段
  365.         }
  366. }

  367. void timer0() interrupt 1             //定時器0中斷程序
  368. {
  369.       TH0=0xb1;
  370.       TL0=0xe0;
  371.       tt0++;

  372.       if (tt0>=1)                     //20ms轉換一次.
  373.      {
  374.            tt0=0;
  375.            ADC_resultL = ad_zhuanhuan(0); //P1.0 為 A/D 當前通道, 測量結果存ADC_result0
  376.            ADC_resultR = ad_zhuanhuan(1); //P1.1 為 A/D 當前通道, 測量結果存ADC_result7                          
  377.            
  378.      }
  379. }

  380. void timer1() interrupt 3  //定時器1中斷程序
  381. {
  382.                            //再裝一次初值
  383.         TH1=0xd8;
  384.         TL1=0xf0;
  385.         
  386.         tt1++;
  387.         if(tt1>=1)
  388.         {
  389.                 if(biaozhiL)
  390.                 {
  391.                         ttL++;
  392.                         if(ttL>7)    //改變此值可以設定左漂浮物下降速度
  393.                         {
  394.                                 if(xuantingL==0)
  395.                                         pfL--;
  396.                                 else if(xuantingL>0)
  397.                                         xuantingL--;                                
  398.                                 ttL=0;                        
  399.                         }                        
  400.                 }
  401.                                           
  402.                 if(biaozhiR)
  403.                 {
  404.                         ttR++;
  405.                         if(ttR>7)   //改變此值可以設定右漂浮物下降速度
  406.                         {
  407.                                 if(xuantingR==0)
  408.                                         pfR--;
  409.                                 else if(xuantingR>0)
  410.                                         xuantingR--;                                
  411.                                 ttR=0;                        
  412.                         }                        
  413.                 }                  

  414.                 tt1=0;
  415.         }
  416. }
復制代碼

附件只包含上面代碼的Keil工程(如上圖):
電平指示.rar (94.75 KB, 下載次數: 65)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏12 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:123083 發表于 2023-1-18 11:37 | 只看該作者
非常不錯,仿一個試試!
回復

使用道具 舉報

板凳
ID:1033105 發表于 2023-2-22 09:42 | 只看該作者
是不是可以把所有的IO口組成30段的LED電平表,單片機的IO口同時接左右聲道的燈珠,然后燈組的接地用三極管驅動,單片機分時控制LR聲道。或者干脆用幾個595驅動,同理LR分時控制。再或者用可編程LED組做。
回復

使用道具 舉報

地板
ID:996773 發表于 2023-2-22 10:21 | 只看該作者
51老鷹 發表于 2023-2-22 09:42
是不是可以把所有的IO口組成30段的LED電平表,單片機的IO口同時接左右聲道的燈珠,然后燈組的接地用三極管 ...

12c5a60一共有32個口,可以30全推燈珠,不需要三極管驅動,編程時候處理可以分時點亮,因為30個口不可能同時亮。595也不需要
回復

使用道具 舉報

5#
ID:1033105 發表于 2023-2-22 17:05 | 只看該作者
hi等你 發表于 2023-2-22 10:21
12c5a60一共有32個口,可以30全推燈珠,不需要三極管驅動,編程時候處理可以分時點亮,因為30個口不可能 ...

我的意思是可以組成雙30段的電平表。另外雙30段電平表的pcb不怎么好布線,pcb會很寬,不好看。用595的話是不是可以穿起來使用,配合地線分時控制線路會簡單一點。其實線路最簡單的恐怕就是可編程的LED了,只要串接數據口就可以了。
回復

使用道具 舉報

6#
ID:996773 發表于 2023-2-24 09:28 | 只看該作者
51老鷹 發表于 2023-2-22 17:05
我的意思是可以組成雙30段的電平表。另外雙30段電平表的pcb不怎么好布線,pcb會很寬,不好看。用595的話 ...

30個左右的布線在狹小的板子上還是能做到的,正反兩面,設計原則上能少用元件達到目的情況下不要用595

595本身也會占據大量板子面積,一片595占據的面積上下足夠可以走七八條線了,只有在驅動上百更多個LED才

會動用串行輸出到595
回復

使用道具 舉報

7#
ID:996773 發表于 2023-2-24 09:40 | 只看該作者
51老鷹 發表于 2023-2-22 17:05
我的意思是可以組成雙30段的電平表。另外雙30段縉獎淼膒cb不怎么好布線,pcb會很寬,不好看。用595的話 ...

12c5a的io口配置輸出有講究的,如果采用共陰方案,每個io口配置成弱上拉,再用兩個io口分別做左右聲道

拉低LED共陰,如果30個全亮,每個燈分配到0.8ma,一共也就只有25ma左右電流,足夠的,不需要三極管

驅動拉低,
回復

使用道具 舉報

8#
ID:1093862 發表于 2023-11-10 13:47 | 只看該作者
LIN,  RIN兩個輸入口不用定義嗎
回復

使用道具 舉報

9#
ID:195496 發表于 2023-11-14 13:56 | 只看該作者
LED顯示很直觀
回復

使用道具 舉報

10#
ID:688460 發表于 2023-11-14 18:32 | 只看該作者
邪門,我的怎么編譯不通過呢?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品入口麻豆www | 国产成人精品一区二区三区 | 国产高清精品一区二区三区 | 国产日韩精品一区 | 国产精品视频在线播放 | 亚洲交性 | 欧美成人一级视频 | av色站| 国产精品a级 | 精品国产欧美日韩不卡在线观看 | 国产精品一区二区不卡 | 综合第一页 | 亚洲激情av | 国偷自产av一区二区三区 | 精品国产一区二区三区av片 | 国产精品永久久久久 | av中文字幕在线播放 | www.男人天堂.com | 日韩一级免费电影 | 免费激情网站 | 狠狠做六月爱婷婷综合aⅴ 国产精品视频网 | 亚洲一二三区精品 | av资源中文在线天堂 | 国产在线二区 | 国产高清精品一区二区三区 | 久久日韩精品一区二区三区 | 美女黄18岁以下禁止观看 | 亚洲欧美日韩在线 | 国产日韩欧美在线 | 亚洲午夜网 | 国产精品久久久久久吹潮 | 国产成人影院 | 久久精品中文字幕 | 中文字幕欧美在线观看 | 青青草网站在线观看 | 九九久久这里只有精品 | 成人不卡 | 精品中文字幕久久 | 91在线中文字幕 | 精品一区二区在线视频 | 国产精品色 |