標(biāo)題: 比較適合初學(xué)者自己動(dòng)手仿制的電壓表 [打印本頁]

作者: dzdiy    時(shí)間: 2015-4-11 19:39
標(biāo)題: 比較適合初學(xué)者自己動(dòng)手仿制的電壓表
    這是一個(gè)用STC12C2052AD單片機(jī)制作的電壓表,由電子樂屋收集整理,來源于網(wǎng)絡(luò)。A/D轉(zhuǎn)換單元用的是單片機(jī)的自己帶的,比較適合初學(xué)者自己動(dòng)手仿制。單片機(jī)采用的是STC12C2052AD,4位共陽極數(shù)碼管,TL431作為電壓基準(zhǔn)。電路板采用的感光藍(lán)油制作,使用環(huán)?涛g劑刻蝕。整個(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;            //個(gè)位位選

  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ù)名:毫秒級(jí)CPU延時(shí)函數(shù)

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

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

  24. 返回值:無

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

  26. 備  注:應(yīng)用于1T單片機(jī)時(shí)i<600,應(yīng)用于12T單片機(jī)時(shí)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; //存儲(chǔ)A/D轉(zhuǎn)換標(biāo)志;若在函數(shù)外定義此變量則不能得到連續(xù)變化的模擬量的顯示

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

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

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

  45.     _nop_();

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

  47.     _nop_();

  48.     ADC_CONTR |= 0x80;      //啟動(dòng)A/D電源

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

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

  51.     ADC_CONTR |= 0x08;      //啟動(dòng)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測(cè)試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]];          //顯示個(gè)位

  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通道時(shí)須同時(shí)將對(duì)應(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ù)制代碼




作者: 1300811688    時(shí)間: 2016-3-24 15:46
很好,我最近想在開關(guān)電源的輸出端添加一個(gè)單片機(jī)顯示電壓電流的功能,學(xué)習(xí)了。
作者: 越快樂越墮落    時(shí)間: 2016-6-18 22:21
為什么我做了好幾次,都是只顯示最后一位0???而且無法測(cè)量,我把75K改成了30K的,75K貌似不合理。
作者: XDDZ1013    時(shí)間: 2017-5-12 22:29
數(shù)碼管用共陰極的,怎么改
作者: 15895149620    時(shí)間: 2017-5-13 10:28
樓主,求發(fā)源文件,仿真
作者: 尹德文    時(shí)間: 2017-11-30 19:54
我做的只能顯示三位數(shù),不知什么原因
作者: bhjyqjs    時(shí)間: 2018-2-7 15:20
準(zhǔn)確度如何?穩(wěn)定性怎樣?總覺得實(shí)用性欠佳
作者: nklug    時(shí)間: 2018-3-5 10:16
無分壓電阻,只能測(cè)到5V以下(單片機(jī)工作電壓以下)。大約百分之二的誤差。
作者: ltp    時(shí)間: 2018-3-16 13:22
謝謝分享!
作者: 干就得了    時(shí)間: 2018-3-19 14:32
樓主能不能測(cè)負(fù)壓
作者: ty417502873    時(shí)間: 2018-11-24 05:01
學(xué)習(xí)一下。
作者: zpz181818    時(shí)間: 2019-2-9 11:27
贊,非常好!
作者: 太陽黑子1    時(shí)間: 2020-2-1 08:18
很好呀!學(xué)習(xí)學(xué)習(xí)!
作者: blackstar    時(shí)間: 2020-2-2 18:50
XDDZ1013 發(fā)表于 2017-5-12 22:29
數(shù)碼管用共陰極的,怎么改

程序里改下就好,段碼前加個(gè)“~”取反就行了
作者: 195470880    時(shí)間: 2020-5-14 19:07
謝謝樓主分享!
作者: 13566101057    時(shí)間: 2020-9-8 22:48
blackstar 發(fā)表于 2020-2-2 18:50
程序里改下就好,段碼前加個(gè)“~”取反就行了

我一直都是慢慢比劃著改......
作者: dj3365191    時(shí)間: 2020-9-10 13:34
樓主你好,這個(gè)程序如果要以百分比的形式顯示電量應(yīng)該怎樣修改?謝謝
作者: bsqpcb    時(shí)間: 2020-9-15 23:37
為什么你可以用INT可以計(jì)算小數(shù),   我得用浮點(diǎn)計(jì)算呢
作者: lhpm641    時(shí)間: 2021-5-15 21:53
請(qǐng)教下9.31是怎么計(jì)算出來的,還有為什么要乘以1000?謝謝
作者: fmdpj    時(shí)間: 2022-6-16 15:14
樓主你好!
Keli編譯出錯(cuò)是什么原因?

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




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