wwwxxx国产_337p日本欧洲亚洲大胆张筱雨_免费在线看成人av_日本黄色不卡视频_国产精品成熟老女人_99视频一区_亚洲精品97久久中文字幕_免费精品视频在线_亚洲色图欧美视频_欧美一区二三区

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 13085|回復(fù): 14
收起左側(cè)

第14章-精密電壓表_電流表_顯示器_計(jì)數(shù)器

  [復(fù)制鏈接]
ID:111078 發(fā)表于 2016-3-28 22:14 | 顯示全部樓層 |閱讀模式
51單片機(jī)輕松入門(mén)—基于STC15W4K系列(C語(yǔ)言版)
李友全
編著 詳見(jiàn):http://www.izizhuan.cn/bbs/dpj-37954-1.html

14章 電壓表\電流表\顯示器\計(jì)數(shù)器
通過(guò)本模塊的學(xué)習(xí)制作,可以進(jìn)一步熟悉高精度ADC的運(yùn)用,單片機(jī) 內(nèi)部DataFlash的讀寫(xiě)、動(dòng)態(tài)顯示程序的編寫(xiě)(包括小數(shù)的顯示)以及自 定義的SPI主從機(jī)數(shù)據(jù)通信原理,測(cè)試中,本模塊可以直接插接到第一章

介紹的單片機(jī)實(shí)驗(yàn)板“通用計(jì)數(shù)器/顯示器接口”上使用。

0.png
1 功能說(shuō)明與電路原理分析

同一個(gè)模塊,通過(guò)硬件上的簡(jiǎn)單設(shè)置可實(shí)現(xiàn)4種不同的功能

0.png

K3(P4.2)
K4(P4.3)
模塊功能

K1(P3.6)
K2(P3.7)
電壓表檔位
輸入阻抗
0
0
電流表

0
0
2.0480V
2MΩ
0
1
計(jì)數(shù)器

0
1
20.480V

1
0
顯示器

1
0
204.80V
1MΩ

1

1

電壓表(默認(rèn))

1

1

20.480V(默 認(rèn))

① 電壓表說(shuō)明:

使用18位MCP3421A0T-E/CH芯片作ADC,通過(guò)軟件校準(zhǔn)的方式可使整個(gè)模塊電壓測(cè)量誤差 最大值不大于量程的±0.05%,在電路上,2V檔由外部信號(hào)直接輸入ADC,其它檔位使用
1MΩ電阻降壓,然后使用MCP6V01T-E/SN 軌到軌自動(dòng)調(diào)零運(yùn)放作ADC輸入電壓跟隨器,由
于精度要求高,普通運(yùn)放無(wú)法滿足要求。

② 電流表說(shuō)明: 使用0.1Ω/0.5W的電流取樣電阻,可測(cè)量0~2A范圍內(nèi)的電流,取樣出來(lái)的電壓信號(hào)不經(jīng)過(guò)電

壓跟隨器,直接送入ADC芯片。
③ 通用顯示器說(shuō)明:
外部單片機(jī)通過(guò)CLK與DAT兩條信號(hào)線向模塊送入數(shù)據(jù),模塊能顯示0~99999范圍內(nèi)整數(shù)或小 數(shù)值,外部單片機(jī)需要一次向模塊發(fā)送5個(gè)字節(jié)的數(shù)據(jù),第1字節(jié)表示模塊地址,默認(rèn)值為0
,在多個(gè)模塊CLK與DAT并接在一起的情況下,只有與發(fā)送地址相符的模塊才接收與處理總線
上的數(shù)據(jù),第2、3、4字節(jié)是需要顯示的數(shù)據(jù),第2字節(jié)是數(shù)據(jù)高字節(jié),第3字節(jié)是數(shù)據(jù)中間 字節(jié),4字節(jié)是數(shù)據(jù)低字節(jié),第5字節(jié)確定需要顯示的小數(shù)位數(shù),所有字節(jié)都是按高位在前, 低位在后的順序發(fā)送,每一位的發(fā)送是外部單片機(jī)先把數(shù)據(jù)位放到DAT線上,然后拉低CLK線
,模塊內(nèi)部是在CLK下降沿后讀取DAT線上的狀態(tài),經(jīng)測(cè)試,模塊在22.1184MHz工作頻率下外

部單片機(jī)數(shù)據(jù)發(fā)送時(shí)鐘脈沖高電平1uS、低電平5uS條件下工作正常,也就是說(shuō)發(fā)送一組數(shù)據(jù) 的最短時(shí)間需要大約(1 + 5)×8×5 = 240uS,為了提高穩(wěn)定性,可以適當(dāng)降低通信時(shí)鐘頻 率(主要是延長(zhǎng)脈沖低電平時(shí)間),但也不能過(guò)低,要求一組數(shù)據(jù)必須在0.2秒內(nèi)傳送完成

,超過(guò)0.2秒,模塊自動(dòng)清除前面已收到的不完整的數(shù)據(jù),這樣保證了數(shù)據(jù)傳送的可靠性。
④ 計(jì)數(shù)器說(shuō)明: 外部脈沖信號(hào)通過(guò)DAT線送入模塊,每產(chǎn)生一個(gè)脈沖下降沿,計(jì)數(shù)器數(shù)值加1,超過(guò)最大值
99999后從0開(kāi)始循環(huán),要求外部脈沖信號(hào)低電平不能大于0.6V,高電平不能小于2V,高電平 最大值也不能超過(guò)40V,模塊具有斷電自動(dòng)存儲(chǔ)數(shù)據(jù)的功能,可通過(guò)開(kāi)關(guān)將CLK線接GND,上
電瞬間即可將顯示的計(jì)數(shù)值清零。
0.png

部分程序預(yù)覽(完整代碼請(qǐng)下載附件): 第14章(電壓_電流表_計(jì)數(shù)器_顯示器).rar (821.41 KB, 下載次數(shù): 277)

  1. /*顯示程序,用STC15F2K60S2做顯示芯片
  2. // 硬件說(shuō)明:P42   P43                                    P36      P37
  3.                          0            0            電流表               0            0            1.9999V
  4.                          0            1            計(jì)數(shù)器                   0            1            19.999V
  5.                          1            0            顯示器                   1            0            199.99V
  6.                          1            1            電壓表                   1            1            999.99V
  7.                        
  8. // 待顯示數(shù)據(jù)由主機(jī)傳來(lái),定義5個(gè)字節(jié)的顯示代碼
  9. // 第一字節(jié)是本機(jī)的地址碼,對(duì)本機(jī)而言,必須是“0”
  10. // 接下來(lái)三字節(jié)是要顯示的數(shù)據(jù)(高字節(jié)在前,低字節(jié)在后)
  11. // 第五個(gè)字節(jié)是要顯示的小數(shù)點(diǎn)位置,可能值是0-4,表示顯示幾位小數(shù)
  12. //分別代表:0——不顯示 1——十位,2——百位,3——千位        ,4——萬(wàn)位 ,個(gè)位后小數(shù)點(diǎn)固定不顯示
  13.             99999     9999.9   999.99   99.999    9.9999
  14. //接線:P07 P06 P05 P04 P03 P02 P01 P00
  15. //          e    d   h   c   g   a   f   b
  16. //0           0    0   1   0   1   0   0   0   0x28
  17. //1     1    1   1   0   1   1   1   0   0xee
  18. //2     0    0   1   1   0   0   1   0   0x32
  19. //3     1    0   1   0   0   0   1   0   0xa2
  20. //4     1    1   1   0   0   1   0   0   0xe4
  21. //5     1    0   1   0   0   0   0   1   0xa1
  22. //6     0    0   1   0   0   0   0   1   0x21
  23. //7     1    1   1   0   1   0   1   0   0xea
  24. //8     0    0   1   0   0   0   0   0   0x20
  25. //9     1    0   1   0   0   0   0   0   0xa0
  26. //A     0    1   1   0   0   0   0   0         0x60
  27. //b     0    0   1   0   0   1   0   1         0x25
  28. //C     0    0   1   1   1   0   0   1          0x39
  29. //d     0    0   1   0   0   1   1   0          0x26
  30. //E     0    0   1   1   0   0   0   1         0x31
  31. //F     0    1   1   1   0   0   0   1         0x71
  32. //H     1    1   1   1   1   1   1   1         0xff

  33. //顯示位接線                P15  P14  P13  P16  P12
  34. //            (高位)1    2    3    4          5(低位)

  35. //P32(INT0)接時(shí)鐘線,P33(INT1)接數(shù)據(jù)線*/

  36. #include "STC15F2K60S2.H "                   // 包含STC15F2K60S2單片機(jī)寄存器定義文件
  37. #include "UART.H"            
  38. #include <intrins.h>
  39. #include "mcp3421.H"
  40. #include "myfun.h"
  41. #include "PowerDown_save.H"
  42. #define         Hidden         16
  43. #define     Address  0                // 本機(jī)地址,不同顯示模塊修改此數(shù)值即可
  44. #define TimeOver 500             // 定義一個(gè)超時(shí)值(5字節(jié)通信),500*2ms=1S,允許最慢2秒傳送完一幀數(shù)據(jù)

  45. sbit         CLK=P3^2;                // 外部輸入的時(shí)鐘端
  46. sbit         DAT=P3^3;                    // 外部輸入的數(shù)據(jù)端

  47. unsigned char code DispCode[]={0x28,0xee,0x32,0xa2,0xe4,0xa1,0x21,0xea,0x20,0xa0,0x60,0x25,0x39,0x26,0x31,0x71,0xff};/*/顯示代碼*/
  48. unsigned char code DispBit[]={0xdf,0xef,0xf7,0xbf,0xfb};         //位碼表 (左邊最高位)11011111(P1)  11101111(P1)  11110111(P1)  10111111(P1) 11111011(P1)(右邊最低位)
  49. unsigned long        DispData=0;                            // 用來(lái)顯示的值
  50. unsigned char   DispBuf[5]={0,0,0,0,0};        // 顯示緩沖區(qū) DispBuf[0]是左邊最高位 DispBuf[4]是右邊最低位
  51. unsigned char temp0,temp1,temp2,temp3,temp4;    // 最高位 temp0        ,最低位 temp4,5位最大顯示99 999,只接收3字節(jié),顯示緩沖5字節(jié)。   

  52. unsigned char   RecDatCount;                // 接收的數(shù)據(jù)位數(shù)計(jì)數(shù)器
  53. unsigned char        bdata         RecDat;                // 接收到的數(shù)據(jù)
  54. sbit        RecDat0=RecDat^0;                // 定義接收數(shù)據(jù)的末位為RecDat0,這要求RecDat位于bdata空間中       
  55. bit                ReciveOK ;                                // 接收完成標(biāo)志,為1,說(shuō)明已接收到完整的5個(gè)字節(jié),可進(jìn)行數(shù)據(jù)處理了
  56. unsigned char        DotCnt=1;                        // 顯示小數(shù)位數(shù)。
  57. unsigned char   InAddress=0;                // 外部輸入地址,確定是否與本機(jī)地址相同
  58. bit                StartOverCount;                        // 一旦有接收中斷,則置位該位,如果收到40位,則清該位
  59. unsigned int           OverCount;                        // 超時(shí)計(jì)數(shù)器,當(dāng)有接收中斷發(fā)生,就讓這個(gè)計(jì)數(shù)器開(kāi)始計(jì)數(shù)(每個(gè)T0中
  60. // 斷計(jì)數(shù)一次,如果這個(gè)計(jì)數(shù)器計(jì)到了500(即1秒)仍沒(méi)有被清除,說(shuō)明接收有誤,由主程序清 RecDatCount       

  61. extern struct POWER_UP Power_up;                 // 計(jì)數(shù)器變量

  62. // 中斷程序用于完成5字節(jié)數(shù)據(jù)接收(1字節(jié)地址、3字節(jié)長(zhǎng)整數(shù)、1字節(jié)小數(shù)位數(shù)說(shuō)明)
  63. void ReciveDate() interrupt 0        // 外部中斷0(int0)中斷處理程序
  64. {       
  65.         if(StartOverCount==0)  StartOverCount=1;        // 開(kāi)啟溢出計(jì)時(shí)器
  66.         RecDatCount++;                        // 中斷次數(shù)(0-40)

  67.         RecDat=RecDat<<1;                    // 主機(jī)是先發(fā)送高位,后發(fā)送低位
  68.         if(DAT)
  69.                 RecDat0=1;
  70.         else       
  71.                 RecDat0=0;
  72.         if(RecDatCount==8)                    // 接收完第一個(gè)字節(jié)
  73.         {
  74.                 InAddress=RecDat;                // 保存外部輸入的地址
  75.         }
  76.         else if(RecDatCount==16)        // 第2個(gè)數(shù)據(jù),長(zhǎng)整數(shù)最高字節(jié)
  77.         {       
  78.                 if(InAddress==Address)             // 地址相符才處理數(shù)據(jù),方便多模塊并聯(lián)使用
  79.                         DispData=RecDat*65536;                
  80.         }
  81.         else if(RecDatCount==24)        //  第3個(gè)數(shù)據(jù),長(zhǎng)整數(shù)中間字節(jié)
  82.         {       
  83.                 if(InAddress==Address)        // 地址相符才處理數(shù)據(jù),方便多模塊并聯(lián)使用
  84.                         DispData=DispData+RecDat*256;
  85.         }        
  86.         else if(RecDatCount==32)        //  第4個(gè)數(shù)據(jù),長(zhǎng)整數(shù)最低字節(jié)
  87.         {       
  88.                 if(InAddress==Address)        // 地址相符才處理數(shù)據(jù),方便多模塊并聯(lián)使用
  89.                         DispData+=RecDat;
  90.         }
  91.         else if(RecDatCount==40)         // 否則就是第5個(gè)數(shù)據(jù),即小數(shù)點(diǎn)顯示位數(shù)
  92.         {       
  93.                 if(InAddress==Address)        // 地址相符才處理數(shù)據(jù),方便多模塊并聯(lián)使用
  94.                         DotCnt=RecDat;       
  95.                 ReciveOK=1;                                // 要求刷新顯示器
  96.                 RecDatCount=0;                        // 中斷次數(shù)(0-40)
  97.                 StartOverCount=0;                // 接收到40個(gè)字符,清標(biāo)志
  98.                 OverCount=0;                        // 清超時(shí)計(jì)數(shù)器
  99.                 RecDat=0;
  100.         }
  101. }

  102. void EX0_Init()     // 外中斷0用于數(shù)據(jù)接收 CLK 輸入端口
  103. {
  104.         IT0=1;                        // 外部引腳下降沿觸發(fā)(CLK時(shí)鐘信號(hào))
  105.         EX0=1;                        // 外中斷int0中斷允許
  106.         PX0=1;                        // 將外中斷置為高級(jí)中斷,定時(shí)器T0低級(jí)中斷
  107.         EA=1;                        // 比較器斷0電存儲(chǔ)只能使用低級(jí)中斷,無(wú)法更改。
  108. }

  109. void EX1_Init()     // 外中斷1用于數(shù)據(jù)接收 DAT 輸入端口與計(jì)數(shù)器脈沖輸入口
  110. {
  111.         IT1=1;                // 設(shè)置為下降沿觸發(fā),用于計(jì)數(shù)器脈沖輸入
  112.         EX1=1;          // 開(kāi)外部中斷1
  113.         PX1=1;                        // 將外中斷1置為高級(jí)中斷,定時(shí)器T0低級(jí)中斷
  114.         EA=1;                    // 開(kāi)總中斷
  115. }

  116. void Timer0_Init()       // 初始化定時(shí)器0用于動(dòng)態(tài)顯示程序
  117. {
  118.         TMOD &= 0xF0;                       // 設(shè)置定時(shí)器模式
  119.         TMOD |= 0x01;                       // 設(shè)置定時(shí)器模式                                                     
  120.         TH0=(65536-4000)/256 ;           // 計(jì)數(shù)脈沖周期 T=1/F= 1/(22.1184/12)= 0.5425uS
  121.         TL0=(65536-4000)%256 ;           // 4000*0.5425=2.17mS
  122.         TR0=1;                                   // T0開(kāi)始運(yùn)行
  123.         ET0=1;                                   // 定時(shí)器T0中斷允許
  124.     PT0=0;                                   // 將定時(shí)器置為低級(jí)中斷
  125.         EA=1;
  126. }  

  127. // 定時(shí)器 T0 用于完成5位數(shù)碼管論流點(diǎn)亮
  128. void Timer0() interrupt 1        // 定時(shí)器T0的中斷處理代碼
  129. {
  130.         unsigned char temp;                         // 動(dòng)態(tài)顯示中間變量
  131.         static unsigned char Count;                // 用于統(tǒng)計(jì)當(dāng)前正顯示哪一位(先顯示左邊最高位)
  132.         //********* 數(shù)據(jù)接收過(guò)程的時(shí)間限制 ************
  133.         if(StartOverCount)                        // 如果要求計(jì)數(shù)的標(biāo)志是1
  134.                 OverCount++;                        // 計(jì)數(shù)器加1
  135.         //********* 正式動(dòng)態(tài)顯示程序 ******************
  136.         P1|=0x7c;                                // 關(guān)斷前次顯示0111 1100       
  137.         temp=DispBit[Count];         
  138.     P1&=temp;                   // 開(kāi)啟P1位控制
  139.                        
  140.         temp=DispBuf[Count];    // 5位顯示緩沖器BCD碼               
  141.         P0=DispCode[temp];            // 查字形碼表格(0-16)
  142.        
  143.         if(Count<4)                        // 顯示小數(shù)點(diǎn)(最右端小數(shù)點(diǎn)不顯示)
  144.         {
  145.                 if(DotCnt==(4-Count))
  146.                 {
  147.                         P0&=0xDF;            // 點(diǎn)亮小數(shù)點(diǎn)h位置 1101 1111
  148.                 }       
  149.         }
  150.         Count++;
  151.         if(Count==5) Count=0;
  152.         TH0=(65536-4000)/256 ;          // 計(jì)數(shù)脈沖周期 T=1/F= 1/(22.1184/12)= 0.5425uS
  153.         TL0=(65536-4000)%256 ;    // 4000*0.5425=2.17mS
  154. }

  155. void long_to_bcd(unsigned long temp)
  156. {
  157.         unsigned char temp0,temp1,temp2,temp3,temp4;    // 最高位 temp0        ,最低位 temp4,5位最大顯示99 999,只接收3字節(jié),顯示緩沖5字節(jié)。
  158.        
  159.         temp%=100000;                // 如果收到的數(shù)超過(guò)10 0000則僅取小于10 0000的值
  160.         temp4 = temp % 10;                // 獲得個(gè)位
  161.         temp3 = temp / 10 % 10;           // 獲得十位
  162.         temp2 = temp / 100 % 10;          // 獲得百位
  163.         temp1 = temp / 1000 % 10;         // 獲得千位
  164.         temp0 = temp / 10000 % 10;        // 獲得萬(wàn)位                       

  165.         if((temp0==0)&&(DotCnt<4))        // 如果最高位等于0,而顯示的小數(shù)位數(shù)小于4位
  166.                 DispBuf[0]=Hidden;                // 那么最高位應(yīng)該消隱
  167.         else
  168.                 DispBuf[0]=temp0;                // 否則將這個(gè)數(shù)送入最高位

  169.         if((temp0==0)&&(temp1==0)&&(DotCnt<3))        // 最高位、次高位同時(shí)為0,且小數(shù)位數(shù)小于3位
  170.                 DispBuf[1]=Hidden;
  171.         else
  172.                 DispBuf[1]=temp1;

  173.         if((temp0==0)&&(temp1==0)&&(temp2==0)&&(DotCnt<2))       
  174.                                 // 最高位、次高位、第三位均為0,且小數(shù)位數(shù)小于2位時(shí)消隱
  175.                 DispBuf[2]=Hidden;
  176.         else
  177.                 DispBuf[2]=temp2;
  178.                                        
  179.         if((temp0==0)&&(temp1==0)&&(temp2==0)&&(temp3==0)&&(DotCnt<1))       
  180.                                 // 最高位、次高位、第三位、第四位均為0,且小數(shù)位數(shù)小于1位(無(wú))時(shí)消隱
  181.                 DispBuf[3]=Hidden;
  182.         else
  183.                 DispBuf[3]=temp3;

  184.         DispBuf[4]=temp4;                      // 最低位直接顯示                       
  185. }

  186. void main(void)
  187. {   
  188.         //////////////////////// 電壓電流表變量 ///////////////////
  189.         unsigned char        test_data[3]={0x00,0x00,0x00};           // 存放 MCP3421 AD轉(zhuǎn)換結(jié)果
  190.         long aa;                                   // 計(jì)算 MCP3421電壓值的中間變量
  191.         float VIN3421;                           // 計(jì)算出來(lái)的MCP3421原始電壓
  192.         long  V3421;               // 顯示時(shí)用于將數(shù)據(jù)擴(kuò)大1000或10000倍                  
  193.         ///////////////////////////////////////////////////////////
  194.         UART_init();                           // 串口初始化(占用定時(shí)器1)9600/22.1184MHz
  195.         printf("串口初始化完畢");
  196.         Timer0_Init();                           // 初始化定時(shí)器0用于動(dòng)態(tài)顯示程序
  197.        
  198.         ReciveOK=1;                           // 要求刷新顯示器
  199.         CLK=1;                                       // 數(shù)據(jù)接收端口初始化
  200.         DAT=1;

  201.         DispData=0X00;                       // 上電顯示0.0000
  202.         DotCnt=4;                  // 上電顯示0.0000

  203.         /*************************************************************************
  204.         // 2A電流表,電流取樣電阻:0.1Ω/0.5W,
  205.         *************************************************************************/
  206.         if ((P42==0)&&(P43==0))                // 電流表
  207.         {        
  208.                 DotCnt=4;                                // 2V檔,保留4位小數(shù),2.0480A        
  209.                 WrToMCP3421(SlaveADDR, 0x9C);           // 1001 1100           18位分辨率
  210.                 delay300ms();        
  211.                 while(1)
  212.                 {
  213.                         aa=test_data[0]<<8;
  214.                         aa=aa+test_data[1];
  215.                         aa=aa<<8;
  216.                         aa=aa+        test_data[2];
  217.                         VIN3421=2.048*aa/131071;                // 得到取樣電阻上的電壓值
  218.                
  219.                         VIN3421=VIN3421/0.1;                  // I=U/R
  220.                         VIN3421=VIN3421-0.000;                    // 要求零輸入零輸出
  221.                         if  (VIN3421<0 ) VIN3421=0;                // 數(shù)碼管沒(méi)編寫(xiě)顯示負(fù)數(shù)的功能,電腦能直接顯示負(fù)數(shù)
  222.                
  223.                         printf("I= :%.5f     ",VIN3421);
  224.                         // 浮點(diǎn)數(shù)轉(zhuǎn)長(zhǎng)整數(shù)
  225.                         V3421=VIN3421*10000;                 // 2V檔,保留4位小數(shù)        ,2.0480
  226.                         long_to_bcd(V3421);                                                  
  227.                
  228.                         delay300ms();                            //  延時(shí)避免硬接頻繁操作
  229.                         delay300ms();
  230.                 }
  231.         }
  232.         /*************************************************************************
  233.         //  計(jì)數(shù)器,        DAT為計(jì)數(shù)脈沖輸入端,上電瞬間如果CLK=0則清除計(jì)數(shù)值
  234.         *************************************************************************/
  235.         if ((P42==0)&&(P43==1))                  
  236.         {               
  237.                 DotCnt=0;                         // 計(jì)數(shù)器不顯示小數(shù)
  238.                 ReadFLASH();                                  // 讀取單片機(jī)內(nèi)部FLASH中保存的重要數(shù)據(jù),只需2個(gè)時(shí)鐘。
  239.                 comparator_init();                        // 比較器掉電中斷初始化
  240.                 EraseFLASH();                      // 扇區(qū)擦除需要21mS
  241.                 EX1_Init();                 // 外部計(jì)數(shù)端口初始化
  242.                 while(1);                 
  243.         }
  244.         /*************************************************************************
  245.         // 5位通用顯示器
  246.         *************************************************************************/
  247.         if ((P42==1)&&(P43==0))                         
  248.         {                         
  249.                 DotCnt =4;              // 上電時(shí)顯示0.0000  
  250.                 EX0_Init();                            // 外中斷0用于數(shù)據(jù)接收時(shí)鐘輸入端口  
  251.                 while(1)
  252.                 {
  253.                         if(ReciveOK)                // 如果收到了40位數(shù)據(jù),將數(shù)值轉(zhuǎn)BCD碼放入顯示緩沖器。
  254.                         {
  255.                                 long_to_bcd(DispData);                               
  256.                                 ReciveOK=0;       
  257.                         }
  258.                         if(OverCount>=TimeOver)                    // 出現(xiàn)了超時(shí)錯(cuò)誤
  259.                         {
  260.                                 RecDatCount=0;                            // 將接收計(jì)數(shù)器清零
  261.                                 StartOverCount=0;                    // 接收到40個(gè)字符,清除計(jì)數(shù)標(biāo)志
  262.                                 OverCount=0;                            // 清超時(shí)計(jì)數(shù)器
  263.                         }
  264.                 }
  265.         }

  266.         /*************************************************************************
  267.         // 18位分辨率電壓表
  268.         *************************************************************************/
  269.         if ((P42==1)&&(P43==1))       
  270.         {
  271.                 if ((P36==0)&&(P37==0))    DotCnt=4;            // 2V檔,保留4位小數(shù)        ,2.0480
  272.                 if ((P36==0)&&(P37==1))    DotCnt=3;            // 20V檔,保留3位小數(shù), 20.048
  273.                 if ((P36==1)&&(P37==0))    DotCnt=2;            // 200V檔,保留2位小數(shù), 200.48
  274.                 if ((P36==1)&&(P37==1))    DotCnt=2;            // 1000V檔,保留2位小數(shù), 999.99
  275.                
  276.                 WrToMCP3421(SlaveADDR, 0x9C);           // 1001 1100           18位分辨率
  277.                 delay300ms();
  278.        
  279.                 while(1)
  280.                 {
  281.                         RdFromMCP3421(SlaveADDR, test_data,3);  //連續(xù)讀取3個(gè)字節(jié)數(shù)據(jù)
  282.                         aa=test_data[0]<<8;
  283.                         aa=aa+test_data[1];
  284.                         aa=aa<<8;
  285.                         aa=aa+        test_data[2];
  286.                         VIN3421=2.048*aa/131071;
  287.                         if ((P36==0)&&(P37==0))                   // 2V檔
  288.                         {
  289.                                 VIN3421=VIN3421*1.00;                // 2V檔,無(wú)衰減,精密校準(zhǔn)
  290.                                 printf("2V :%.5f     ",VIN3421);
  291.                                 V3421=VIN3421*10000;               // 2V檔,保留4位小數(shù)        ,2.0480
  292.                         }
  293.                         if ((P36==0)&&(P37==1))                   // 20V檔
  294.                         {
  295.                                 VIN3421=VIN3421*10.00;                // 20V檔,10倍衰減+衰減電阻誤差補(bǔ)償
  296.                                 printf("20V :%.4f     ",VIN3421);
  297.                                 V3421=VIN3421*1000;               // 20V檔,保留3位小數(shù)        ,20.480
  298.                         }
  299.                         if ((P36==1)&&(P37==0))                   // 200V檔
  300.                         {
  301.                                 VIN3421=VIN3421*100.00;                // 200V檔,100倍衰減+衰減電阻誤差補(bǔ)償
  302.                                 printf("200V :%.3f     ",VIN3421);
  303.                                 V3421=VIN3421*100;                   // 200V檔,保留2位小數(shù),204.80
  304.                         }
  305.                         if ((P36==1)&&(P37==1))                   // 1000V檔
  306.                         {
  307.                                 VIN3421=VIN3421*1.00;                // 2V檔,無(wú)衰減,精密校準(zhǔn)
  308.                                 printf("2V :%.5f     ",VIN3421);
  309.                                 V3421=VIN3421*10000;               // 2V檔,保留4位小數(shù)        ,2.0480
  310.                         }
  311.                
  312.                         VIN3421=VIN3421*10.00;          // 20V檔,10倍衰減+衰減電阻誤差補(bǔ)償
  313.                                                 //
  314.                         VIN3421=VIN3421-0.000;                // 要求零輸入零輸出
  315.                         if  (VIN3421<0 ) VIN3421=0;                // 數(shù)碼管沒(méi)編寫(xiě)顯示負(fù)數(shù)的功能,電腦能直接顯示負(fù)數(shù)
  316.                
  317.                         printf("20V :%.5f     ",VIN3421);
  318.                         // 浮點(diǎn)數(shù)轉(zhuǎn)長(zhǎng)整數(shù)
  319.                         if ((P36==0)&&(P37==0))   V3421=VIN3421*10000;            // 2V檔,保留4位小數(shù)        ,2.0480
  320.                         if ((P36==0)&&(P37==1))   V3421=VIN3421*1000;             // 20V檔,保留3位小數(shù), 20.048
  321.                         if ((P36==1)&&(P37==0))   V3421=VIN3421*100;            // 200V檔,保留2位小數(shù), 200.48
  322.                         if ((P36==1)&&(P37==1))   V3421=VIN3421*100;            // 1000V檔,保留2位小數(shù), 999.99

  323.                         long_to_bcd(V3421);                                                  
  324.                
  325.                         delay300ms();                   //  延時(shí)避免硬接頻繁操作
  326.                         delay300ms();
  327.                 }               
  328.         }                
  329. }

  330. void X1_ISR(void) interrupt 2           // 外部中斷1中斷函數(shù)實(shí)現(xiàn)計(jì)數(shù)功能
  331. {
  332.     Power_up.times++;
  333.         long_to_bcd(Power_up.times);
  334. }  
復(fù)制代碼


相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:140358 發(fā)表于 2016-10-4 07:19 來(lái)自觸屏版 | 顯示全部樓層
很好!很實(shí)用的
回復(fù)

使用道具 舉報(bào)

ID:84250 發(fā)表于 2016-12-30 16:56 | 顯示全部樓層
樓主編程風(fēng)格嚴(yán)謹(jǐn),值得我們學(xué)習(xí),贊
回復(fù)

使用道具 舉報(bào)

ID:200118 發(fā)表于 2017-5-24 23:22 | 顯示全部樓層
下載學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

ID:216902 發(fā)表于 2017-7-3 20:22 | 顯示全部樓層
學(xué)習(xí) MCP3421 ADC
回復(fù)

使用道具 舉報(bào)

ID:421232 發(fā)表于 2018-12-12 19:42 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:288930 發(fā)表于 2019-1-18 13:57 | 顯示全部樓層
謝謝分享!
回復(fù)

使用道具 舉報(bào)

ID:384252 發(fā)表于 2019-4-30 12:00 | 顯示全部樓層
沒(méi)有用過(guò)18位的ADC,不知道這么高精度的ADC讀出來(lái)的值是否會(huì)穩(wěn)定呢?另外,使用18位ADC采樣的電壓值,在數(shù)碼管上顯示會(huì)跳動(dòng)嗎?
回復(fù)

使用道具 舉報(bào)

ID:717268 發(fā)表于 2020-3-27 23:38 | 顯示全部樓層
本人覺(jué)得此處使用18位的ADC時(shí),輸出顯示位數(shù)可以擴(kuò)充到十萬(wàn)為甚至百萬(wàn)位。
回復(fù)

使用道具 舉報(bào)

10#
無(wú)效樓層,該帖已經(jīng)被刪除
ID:800180 發(fā)表于 2020-7-14 09:02 | 顯示全部樓層
STC15F2K60S2芯片引腳功能有沒(méi)有
回復(fù)

使用道具 舉報(bào)

ID:501595 發(fā)表于 2020-7-26 08:53 來(lái)自觸屏版 | 顯示全部樓層
正好需要,下載下來(lái)做一個(gè)看看
回復(fù)

使用道具 舉報(bào)

ID:895892 發(fā)表于 2021-3-24 20:19 | 顯示全部樓層
好教材值得收藏
回復(fù)

使用道具 舉報(bào)

ID:1007039 發(fā)表于 2022-3-8 21:32 | 顯示全部樓層
已下載收藏,慢慢學(xué)習(xí)。
回復(fù)

使用道具 舉報(bào)

ID:968906 發(fā)表于 2023-4-6 16:24 | 顯示全部樓層
沒(méi)有用過(guò)18位的ADC,不知道這么高精度的ADC讀出來(lái)的值是否會(huì)穩(wěn)定呢?另外,使用18位ADC采樣的電壓值,在數(shù)碼管上顯示會(huì)跳動(dòng)嗎?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
亚洲色图日韩精品| 新婚的少妇hd中文字幕| 极品美女扒开粉嫩小泬| 日本精品性网站在线观看| 欧美性极品xxxx娇小| 国产一区二区三区四区在线观看| 精品三级av| 国产高清一区二区三区视频| 天天操夜夜爽| 亚洲色图21p| 久久久久噜噜噜亚洲熟女综合| www.这里只有精品| 亚洲成人网上| 国产免费久久av| 日日狠狠久久偷偷四色综合免费| 欧美视频精品在线| 亚洲色图视频免费播放| 精品影院一区二区久久久| 水蜜桃精品av一区二区| 午夜av成人| 日韩精品成人av| 91xxxxx| 精品一区二区三区高清免费不卡| 11024精品一区二区三区日韩| 99热这里只有精品4| 樱花草www在线| www.好吊操| 欧美欧美一区二区| 91精品啪aⅴ在线观看国产| 欧美国产精品va在线观看| 欧美成人乱码一区二区三区| 欧美日韩在线一区| 亚洲欧洲一区二区在线播放| 成人午夜激情影院| 日韩av一级片| 亚洲综合婷婷| 无码少妇一区二区三区| 亚洲精品成人一区| 成人免费影院| 午夜激情在线| 在线看的av网站| 天堂中文在线8| 激情丁香婷婷| jizz在线视频| 性猛交富婆╳xxx乱大交一| 中文字幕的av| 日韩一级免费视频| 国产欧美日韩成人| 中文字幕乱码人妻无码久久| 在线天堂中文字幕| 日本在线观看视频网站| av激情在线观看| 国产又粗又长又硬| 波多野结衣一二三四区| 51调教丨国产调教视频| 欧洲成人午夜精品无码区久久| 污污的网站18| 免费看污黄网站| 欧美视频在线播放一区| 五月丁香综合缴情六月小说| 欧美一级中文字幕| 天天在线免费视频| dy888午夜| 大桥未久一区二区| 天天操天天干天天玩| 熟女视频一区二区三区| 日韩精品一区二区在线视频| 狠狠干视频网站| 日本aa在线观看| 美女扒开大腿让男人桶| 波多野结衣家庭教师在线| 国产av国片精品| 男人天堂a在线| 国产原创中文在线观看 | 久久久av免费| 久久亚洲精品成人| 欧美二区在线播放| 2021国产精品视频| 国产精品久久77777| 成人免费自拍视频| 官网99热精品| 看欧美日韩国产| 亚洲电影网站| 青青草综合在线| 欧美精品自拍视频| 自拍偷拍21p| 丰满少妇xbxb毛片日本| 亚洲精品成人无码熟妇在线| 999精品视频在线观看播放| 一区二区三区免费高清视频| 特黄视频免费看| 国产又粗又大又爽| 69av影院| 免费福利电影| 日韩黄色动漫| yw视频在线观看| www中文字幕在线观看| 美女网站视频一区| 国产精品一线| 伊人久久大香线蕉综合四虎小说| 久久久久中文| 不卡免费追剧大全电视剧网站| 欧美经典一区二区三区| 亚洲超碰97人人做人人爱| 欧美三级中文字| 国产视频在线一区二区| 久久人人看视频| 91亚洲精品一区二区| 午夜一区二区三区| 国产精品秘入口18禁麻豆免会员 | 久久精品最新免费国产成人| 黄视频在线免费| 中文天堂在线观看| 羞羞网站在线看| 成人精品在线| 99久久亚洲精品蜜臀| 日韩精品视频网| 久久噜噜亚洲综合| 色香色香欲天天天影视综合网| 亚洲二区在线播放视频| 国模精品视频一区二区| 国产日韩欧美二区| 波多野结衣乳巨码无在线| 中文字幕 日本| 91视频免费网址| 欧亚成年男女午夜| 久久精品无码一区二区日韩av| 日本电影在线观看网站| 国产精品亚洲欧美日韩一区在线| 希岛爱理av一区二区三区| 国产一区二区在线观看免费| 亚洲三级在线免费观看| 精品国产不卡一区二区三区| 欧美高跟鞋交xxxxhd| a级国产乱理论片在线观看99| 精品人妻人人做人人爽| 熟女丰满老熟女熟妇| 国产99久久久久久免费看| 国产91久久久久| 色吊丝在线永久观看最新版本| 精品3atv在线视频| 亚洲h色精品| 99久久国产综合色|国产精品| 日韩欧美在线一区| 欧美精品中文字幕一区| 欧美精品一区二区三区在线看午夜| 欧美婷婷精品激情| 激情综合网五月婷婷| 欧美一级淫片免费视频| 天堂v视频永久在线播放 | 中文字幕成人av| 日韩免费高清视频| 国产精品美女主播在线观看纯欲| 成人短视频在线看| 美国黄色a级片| 99精品免费观看| jlzzjlzz欧美大全| av久久网站| 国产精品普通话对白| 亚洲欧美日韩国产综合在线| 亚洲香蕉成人av网站在线观看| 成人欧美一区二区三区视频| 小泽玛利亚视频在线观看| 四虎永久在线精品| 色视频在线观看在线播放| 在线欧美三级| 这里只有精品在线| 国产精品国产精品国产专区不蜜| 亚洲免费av网址| 狠狠干一区二区| 精品国产免费久久久久久婷婷| 在线观看亚洲国产| 蜜桃视频免费网站| 免费视频观看成人| 久久精品99国产国产精| 欧美三区在线观看| 国产精品一区二区三区免费视频| 北条麻妃在线观看| 91国产丝袜播放在线| 成年免费视频| 2019年精品视频自拍| 日韩在线a电影| 色婷婷综合激情| 国产精品久久视频| 最新天堂中文在线| av无码精品一区二区三区宅噜噜| 三上悠亚在线免费观看| 欧美性生活一级片| 2024国产精品| 日韩中文字幕在线看| 成年在线观看视频| 日本少妇吞精囗交| 男女免费网站| 哺乳挤奶一区二区三区免费看 | 亚洲福利天堂| 欧美国产精品v| 久久久av免费| 国产视频九色蝌蚪| 欧美一级黄视频| 亚洲女人天堂| 久久精品av| 一级特黄大欧美久久久| 欧美与黑人午夜性猛交久久久| 国产成人精品视频ⅴa片软件竹菊| 久久久999久久久| 欧美日韩伦理片| 亚洲xxx拳头交| 亚洲成人一区在线| 国产精品自在线| 欧美在线a视频| 成人影院久久久久久影院| 看黄在线观看| 美腿丝袜在线亚洲一区 | 国产福利91精品一区| 欧美日韩dvd在线观看| 国产一区二区三区四区hd| 精品人妻无码一区二区三区换脸| 一个人看的www片免费高清视频 | 一区二区三区产品免费精品久久75| 91av免费观看91av精品在线| 狠狠躁狠狠躁视频专区| 欧美在线 | 亚洲| 蜜桃av在线播放| 国产精品自拍av| 一本一本久久a久久精品牛牛影视 一本色道久久综合亚洲精品小说 一本色道久久综合狠狠躁篇怎么玩 | 国产在线免费看| jizz视频播放器| 国产精品一区2区3区| 亚洲老妇xxxxxx| 91av福利视频| 黑森林av导航| 国产美女高潮一区二区三区| 美女国产精品久久久| 国产精品乱人伦| 欧美第一页在线| 成年网站免费在线观看| 欧美jizzhd欧美精品巨大| 欧州一区二区三区| 亚洲欧美偷拍三级| 51国偷自产一区二区三区 | 97国产在线| 亚洲一级电影| 亚洲精品999| 激情深爱综合网| 国产精品国产高清国产| 亚洲资源在线| 亚洲一区二区三区四区的| 成人欧美视频在线| 久久久黄色大片| 欧美日韩经典丝袜| 91久色porny| 国产精品视频999| 日韩精品一区二区亚洲av性色| 在线观看av网站永久| 国产视频久久| 在线观看久久久久久| 亚洲高清在线不卡| 天天干天天骑| 日韩香蕉视频| 精品国产一区二区三区久久狼5月 精品国产一区二区三区久久久狼 精品国产一区二区三区久久久 | 日韩一级片播放| 一个人看的www视频免费观看 | 欧美一区中文字幕| av免费观看国产| 精品国产福利一区二区在线 | 欧美性生交片4| 无码人妻精品一区二区三区99v| 黑人乱码一区二区三区av| **欧美日韩在线| 欧美日韩国产一区中文午夜| 亚洲欧美日韩精品久久久 | 亚洲三级av| 日本高清成人免费播放| 欧美 日韩 国产精品| 欧美性猛交xx乱大交| 欧美在线电影| 亚洲精品日韩欧美| av电影中文字幕| 神马亚洲视频| www.亚洲人| 国产精品免费一区二区三区在线观看| 久久久久亚洲视频| 日韩色性视频| 欧美在线观看禁18| 黑森林福利视频导航| 缴情综合网五月天| 日韩国产一区二| 欧美主播福利视频| 依依成人综合网| 小黄鸭精品aⅴ导航网站入口| 亚洲va韩国va欧美va| 五月天激情图片| 九九视频精品在线| 国产在线日韩| 欧美激情综合色综合啪啪五月| 欧美激情图片小说| 久草在线中文最新视频| 亚洲视频每日更新| 五月天综合婷婷| 色橹橹高清视频在线播放| 日韩一级欧洲| 欧美亚洲另类在线| 黄色网址中文字幕| 成人看片黄a免费看视频| 精品国产三级a在线观看| 男人添女人荫蒂国产| 黄色在线网站| 国产精品国产自产拍高清av王其| 亚洲欧洲日韩精品| 91蝌蚪九色| 免费人成在线不卡| 亚洲一区二区三| 欧美在线 | 亚洲| 欧美.www| 欧洲日本亚洲国产区| 国产又黄又粗又猛又爽| 欧美老女人另类| 日韩亚洲在线观看| 日韩黄色精品视频| 清纯唯美激情亚洲| 亚洲精品视频免费| 亚洲一级生活片| 91精品国产一区二区在线观看 | 日韩精品视频免费在线观看| a级片在线观看视频| 麻豆网站在线| 岛国av一区二区在线在线观看| 日本三级黄色网址| 国产视频精品久久| 亚洲国产成人av网| 天天干天天干天天干天天干天天干| 天堂在线一二区| 一区二区日韩电影| 国产色视频在线播放| 97视频在线观看网站| 欧美性猛xxx| 亚洲乱妇老熟女爽到高潮的片| caoporn97在线视频| 色综合色综合色综合色综合色综合 | 欧美日韩国产高清| 国产精品一区=区| 天天色棕合合合合合合合| 亚洲日产国产精品| 99电影在线观看| 国产精品天美传媒入口| 国产一区二区三区久久悠悠色av| 天天综合狠狠精品| 超清福利视频| 中文字幕一区三区| 噼里啪啦国语在线观看免费版高清版| 国产女人在线观看| 欧美性xxxxxxx| 亚洲精品理论片| www999久久| 最近中文字幕2019免费| 艳妇乳肉豪妇荡乳av无码福利| 99久久www免费| 91久久精品美女| 青青色青青操| 国产亚洲欧美日韩在线一区| 国产精品igao| 激情在线视频播放| 亚洲国产精品一区二区久| 51国产偷自视频区视频| 外国成人免费视频| 国产成人免费电影| h在线观看网站| 椎名由奈av一区二区三区| 日本一本在线视频| 日韩欧美2区| 久久天天躁狠狠躁老女人| 亚洲av色香蕉一区二区三区| 久久亚洲精品伦理| 正在播放一区二区三区| 四虎在线视频| 欧美电影在线免费观看| 青娱乐国产在线| 91亚洲国产成人久久精品| 国产91一区二区三区| av一级在线| 欧美午夜视频在线观看| 国产一区在线观看免费| 久久男人av| 国产精品久久婷婷六月丁香| 美女高潮网站| 一区二区三区精密机械公司| 国产123在线| jiujiure精品视频播放| 产国精品偷在线| 天堂影视av| 欧美三级一区二区| 国产在线观看黄色| 夜夜嗨一区二区| 2021国产视频| 在线观看小视频| 在线日韩av观看| 日本男人天堂网| 久久九九久久九九| 中文字幕影片免费在线观看| 成人三级av在线|