找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 30296|回復(fù): 19
打印 上一主題 下一主題
收起左側(cè)

比較適合初學(xué)者自己動手仿制的電壓表

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:76686 發(fā)表于 2015-4-11 19:39 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
    這是一個用STC12C2052AD單片機(jī)制作的電壓表,由電子樂屋收集整理,來源于網(wǎng)絡(luò)。A/D轉(zhuǎn)換單元用的是單片機(jī)的自己帶的,比較適合初學(xué)者自己動手仿制。單片機(jī)采用的是STC12C2052AD,4位共陽極數(shù)碼管,TL431作為電壓基準(zhǔn)。電路板采用的感光藍(lán)油制作,使用環(huán)?涛g劑刻蝕。整個電壓表制作容易,非常容易成功。






程序源碼:
  1. /**********************************************************************

  2. 基于STC12C4052AD單片機(jī)的0-99V數(shù)字電壓表程序

  3. P1.6口為0-5V模擬量輸入端,P1.5口連接TL431l輸出的2.5V基準(zhǔn)電源,4位串行LED數(shù)碼管顯示

  4. **********************************************************************/

  5. #include <STC/STC12C2052AD.H> //單片機(jī)頭文件

  6. #include <intrins.h> //51基本運(yùn)算(包括_nop_空函數(shù))

  7. #define uchar unsigned char

  8. #define uint unsigned int

  9. #define LEDBus P3

  10. //a3.0-b3.1-c3.2-d3.3-e3.4-f3.5-g3.7-dp1.0

  11. sbit ge=P1^4;            //個位位選

  12. sbit shi=P1^3;            //十位位選

  13. sbit bai=P1^2;            //百位位選

  14. sbit qian=P1^1;            //千位位選

  15. sbit db=P1^0;

  16. char d[5];

  17. uint R,M,N;//若定義成uchar型就只能顯示2.5V以下的數(shù)值

  18. uchar code LEDTab[]={0xc0,0xf9,0x64,0x70,0x59,0x52,0x42,0xf8,0x40,0x50};//應(yīng)為沒有P3.6,所以這里管腳定義和普通的有點(diǎn)區(qū)別

  19. unsigned char port[4]={0xfe,0xfd,0xfb,0xf7};

  20. /*****************************************************************

  21. 函數(shù)名:毫秒級CPU延時函數(shù)

  22. 調(diào)  用:delay (?);

  23. 參  數(shù):1~65535(參數(shù)不可為0)

  24. 返回值:無

  25. 結(jié)  果:占用CPU方式延時與參數(shù)數(shù)值相同的毫秒時間

  26. 備  注:應(yīng)用于1T單片機(jī)時i<600,應(yīng)用于12T單片機(jī)時i<125

  27. /******************************************************************/

  28. void delay(uint t)

  29. {

  30. uint i;               //定義變量

  31. for(;t>0;t--)             //如果t大于0,t減1(外層循環(huán))

  32.   for(i=600;i>0;i--);         //i等于124,如果i大于0,i減1

  33. }

  34. /*******************************************************************

  35. 函數(shù)名:ADC初始化及8位A/D轉(zhuǎn)換函數(shù)

  36. 返回值:8位的ADC數(shù)據(jù)

  37. 結(jié)  果:讀出指定ADC接口的A/D轉(zhuǎn)換值,并返回?cái)?shù)值

  38. 備  注:適用于STC12C2052AD系列單片機(jī)(必須使用STC12C2052AD.h頭文件)

  39. *******************************************************************/

  40. uchar Read (uchar CHA){

  41. uchar AD_FIN=0; //存儲A/D轉(zhuǎn)換標(biāo)志;若在函數(shù)外定義此變量則不能得到連續(xù)變化的模擬量的顯示

  42. /******以下為ADC初始化程序****************************/

  43.     CHA &= 0x07;            //選擇ADC的8個接口中的一個(0000 0111 清0高5位)

  44.     ADC_CONTR = 0x60;  //ADC轉(zhuǎn)換的速度(0XX0 0000 其中XX控制速度,請根據(jù)數(shù)據(jù)手冊設(shè)置)

  45.     _nop_();

  46.     ADC_CONTR |= CHA;       //選擇A/D當(dāng)前通道

  47.     _nop_();

  48.     ADC_CONTR |= 0x80;      //啟動A/D電源

  49.     delay(1);            //使輸入電壓達(dá)到穩(wěn)定(1ms即可?

  50. /******以下為ADC執(zhí)行程序****************************/

  51.     ADC_CONTR |= 0x08;      //啟動A/D轉(zhuǎn)換(0000 1000 令A(yù)DCS = 1)

  52.     _nop_();

  53.     _nop_();

  54.     _nop_();

  55.     _nop_();

  56.     while (AD_FIN ==0){     //等待A/D轉(zhuǎn)換結(jié)束

  57.     AD_FIN = (ADC_CONTR & 0x10); //0001 0000測試A/D轉(zhuǎn)換結(jié)束否

  58.     }

  59.     ADC_CONTR &= 0xE7;      //1111 0111 清ADC_FLAG位, 關(guān)閉A/D轉(zhuǎn)換,

  60. return (ADC_DATA);          //返回A/D轉(zhuǎn)換結(jié)果(8位)

  61. }

  62. /******************************************************************

  63. 顯示函數(shù)轉(zhuǎn)換函數(shù):

  64. M=模擬量采樣值,N=基準(zhǔn)電壓源采樣值(本例為2.5V),R=模擬量輸入值(待顯示值)

  65. N=256*2.5/Vcc;變形后得Vcc=256*2.5/N; 代入M=256*R/Vcc;得到M=R*N/2.5;變形后得R=M*2.5/N

  66. 1為輸入端分壓比。

  67. ******************************************************************/

  68. void transfer(void){

  69. M=Read(6);//P1.6口模擬量轉(zhuǎn)換

  70. N=Read(5);//P1.5口2.5V基準(zhǔn)電壓源采樣(轉(zhuǎn)換)

  71. R=((M*2.5)/N)*9.31*1000;//輸入模擬量換算并放大1000倍;

  72. /***以下為3位顯示轉(zhuǎn)換***/

  73. d[3]=R/1000;

  74. R=R%1000;

  75. d[2]=R/100;

  76. R=R%100;

  77. d[1]=R/10;

  78. d[0]=R%10;

  79. }

  80. /******************************************************************

  81. 函數(shù)功能:顯示子程序

  82. ********************************************************************/

  83. void xian_shi (void)

  84. {

  85.    P1=0xfe;        //P1.3引腳輸出低電平

  86.    P3=LEDTab[d[0]];          //顯示個位

  87.    delay(1);

  88.    P1=0xfd;       //P1.2引腳輸出低電平

  89.    P3=LEDTab[d[1]];         //顯示十位

  90.     delay(1);

  91.     db=0;

  92.    P1=0xfb;       //P1.1引腳輸出低電平

  93.    P3=LEDTab[d[2]];         //顯示百位

  94.    

  95.     delay(1);

  96.    if (LEDTab[3]!=0)

  97.    P1=0xf7;       //P1.0引腳輸出低電平

  98.    P3=LEDTab[d[3]];         //顯示千位

  99.    db=0;

  100.     delay(1);

  101.     P1=0xff;     //關(guān)閉所有數(shù)碼管

  102.   

  103. }

  104. /******************************************************************

  105. 函數(shù)名:主函數(shù)

  106. 調(diào)  用:無

  107. 參  數(shù):無

  108. 返回值:無

  109. 結(jié)  果:程序開始處,無限循環(huán)

  110. 備  注:

  111. ******************************************************************/

  112. void main (void)

  113. {

  114. P1M0 = 0x60; //P1.0/P1.1:0000 0011(高阻)//注意:更改ADC通道時須同時將對應(yīng)的IO接口修改為高阻輸入。

  115. P1M1 = 0x00; //P1.0/P1.1:0000 0000

  116. while(1){

  117. uchar i;

  118. delay(1);

  119. i++;

  120. if (i==30)

  121. {

  122. transfer();

  123. i=0;

  124. }

  125. xian_shi();

  126. //delay(10);

  127. }

  128. }
復(fù)制代碼



評分

參與人數(shù) 2黑幣 +8 收起 理由
vvv64 + 5
XDDZ1013 + 3 贊一個!

查看全部評分

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

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:110548 發(fā)表于 2016-3-24 15:46 | 只看該作者
很好,我最近想在開關(guān)電源的輸出端添加一個單片機(jī)顯示電壓電流的功能,學(xué)習(xí)了。
回復(fù)

使用道具 舉報(bào)

板凳
ID:99130 發(fā)表于 2016-6-18 22:21 | 只看該作者
為什么我做了好幾次,都是只顯示最后一位0???而且無法測量,我把75K改成了30K的,75K貌似不合理。
回復(fù)

使用道具 舉報(bào)

地板
ID:200118 發(fā)表于 2017-5-12 22:29 | 只看該作者
數(shù)碼管用共陰極的,怎么改
回復(fù)

使用道具 舉報(bào)

5#
ID:187777 發(fā)表于 2017-5-13 10:28 | 只看該作者
樓主,求發(fā)源文件,仿真
回復(fù)

使用道具 舉報(bào)

6#
ID:239273 發(fā)表于 2017-11-30 19:54 | 只看該作者
我做的只能顯示三位數(shù),不知什么原因
回復(fù)

使用道具 舉報(bào)

7#
ID:66287 發(fā)表于 2018-2-7 15:20 | 只看該作者
準(zhǔn)確度如何?穩(wěn)定性怎樣?總覺得實(shí)用性欠佳
回復(fù)

使用道具 舉報(bào)

8#
ID:286600 發(fā)表于 2018-3-5 10:16 | 只看該作者
無分壓電阻,只能測到5V以下(單片機(jī)工作電壓以下)。大約百分之二的誤差。
回復(fù)

使用道具 舉報(bào)

9#
ID:120014 發(fā)表于 2018-3-16 13:22 | 只看該作者
謝謝分享!
回復(fù)

使用道具 舉報(bào)

10#
ID:270157 發(fā)表于 2018-3-19 14:32 | 只看該作者
樓主能不能測負(fù)壓
回復(fù)

使用道具 舉報(bào)

11#
ID:378732 發(fā)表于 2018-11-24 05:01 | 只看該作者
學(xué)習(xí)一下。
回復(fù)

使用道具 舉報(bào)

12#
ID:472506 發(fā)表于 2019-2-9 11:27 | 只看該作者
贊,非常好!
回復(fù)

使用道具 舉報(bào)

13#
ID:305511 發(fā)表于 2020-2-1 08:18 | 只看該作者
很好呀!學(xué)習(xí)學(xué)習(xí)!
回復(fù)

使用道具 舉報(bào)

14#
ID:232956 發(fā)表于 2020-2-2 18:50 | 只看該作者
XDDZ1013 發(fā)表于 2017-5-12 22:29
數(shù)碼管用共陰極的,怎么改

程序里改下就好,段碼前加個“~”取反就行了
回復(fù)

使用道具 舉報(bào)

15#
ID:159857 發(fā)表于 2020-5-14 19:07 | 只看該作者
謝謝樓主分享!
回復(fù)

使用道具 舉報(bào)

16#
ID:461382 發(fā)表于 2020-9-8 22:48 | 只看該作者
blackstar 發(fā)表于 2020-2-2 18:50
程序里改下就好,段碼前加個“~”取反就行了

我一直都是慢慢比劃著改......
回復(fù)

使用道具 舉報(bào)

17#
ID:143767 發(fā)表于 2020-9-10 13:34 | 只看該作者
樓主你好,這個程序如果要以百分比的形式顯示電量應(yīng)該怎樣修改?謝謝
回復(fù)

使用道具 舉報(bào)

18#
ID:436758 發(fā)表于 2020-9-15 23:37 | 只看該作者
為什么你可以用INT可以計(jì)算小數(shù),   我得用浮點(diǎn)計(jì)算呢
回復(fù)

使用道具 舉報(bào)

19#
ID:104797 發(fā)表于 2021-5-15 21:53 來自手機(jī) | 只看該作者
請教下9.31是怎么計(jì)算出來的,還有為什么要乘以1000?謝謝
回復(fù)

使用道具 舉報(bào)

20#
ID:598951 發(fā)表于 2022-6-16 15:14 | 只看該作者
樓主你好!
Keli編譯出錯是什么原因?

Build target 'Target 1'
compiling 單片機(jī)電壓表.c...
單片機(jī)電壓表.c(10): warning C318: can't open file 'STC12C2052AD.H'
單片機(jī)電壓表.C(21): error C202: 'P3': undefined identifier
單片機(jī)電壓表.C(23): error C202: 'P3': undefined identifier
單片機(jī)電壓表.C(25): error C202: 'P3': undefined identifier
單片機(jī)電壓表.C(27): error C202: 'P3': undefined identifier
單片機(jī)電壓表.C(29): error C202: 'P3': undefined identifier
單片機(jī)電壓表.C(87): error C202: 'ADC_CONTR': undefined identifier
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表