亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

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

QQ登錄

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

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

基于IAP15F2K61S2單片機(jī)水質(zhì)檢測(cè)系統(tǒng)程序設(shè)計(jì)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
本系統(tǒng)由前級(jí)采集電路和運(yùn)算放大電路等信號(hào)處理模塊,A/D轉(zhuǎn)換模塊和數(shù)據(jù)顯示模塊三部分組成。單片機(jī)模塊以STC15F60S2為核心,利用PH傳感器檢測(cè)液體PH值,超聲波傳感器檢測(cè)水位。本系統(tǒng)主要實(shí)現(xiàn)PH值測(cè)量,液位情況測(cè)量和電壓測(cè)量三個(gè)功能,經(jīng)過(guò)最終級(jí)聯(lián)、調(diào)試,結(jié)果表明,PH值測(cè)量誤差低于0.3,液位測(cè)量誤差低于1mm,因此達(dá)到很高的準(zhǔn)確度,各項(xiàng)指標(biāo)均優(yōu)于題目要求。

系統(tǒng)方案1.1  PH傳感器選擇
【方案一】采用無(wú)溫度檢測(cè)的PH傳感器
該方案電路簡(jiǎn)單,易于實(shí)現(xiàn),但是在溫度變化大的情況下,易受溫度影響,測(cè)量值波動(dòng)較大,誤差較大不易修正。
【方案二】采用自帶溫度監(jiān)測(cè)的PH傳感器
該方案克服了環(huán)境溫度與液體溫度相差較小時(shí),PH檢測(cè)誤差較小,易于檢測(cè),穩(wěn)定性好,誤差易于修正。
【方案三】采用液體溫度檢測(cè)與PH傳感器相結(jié)合
該方案電路相對(duì)來(lái)說(shuō)比較復(fù)雜,可實(shí)現(xiàn)性不大,穩(wěn)定性不高。
考慮到電路的穩(wěn)定性及可實(shí)現(xiàn)性,我們選擇方案二。
1.2  液位測(cè)量選擇
【方案一】光電監(jiān)測(cè)
該方法對(duì)于定位測(cè)量效果好、精度高。但不適合對(duì)水位高度的測(cè)量,無(wú)法實(shí)時(shí)檢測(cè)液面高度。
【方案二】超聲波監(jiān)測(cè)
此方法測(cè)量時(shí)間短,對(duì)實(shí)時(shí)測(cè)量液面精度高。測(cè)量范圍取決于高頻脈沖的頻率及聲波的大小,對(duì)于近距離測(cè)量精確都高,價(jià)格實(shí)惠。
【方案三】平行導(dǎo)線(xiàn)線(xiàn)跡測(cè)量
此方法測(cè)量精度高,但測(cè)量范圍小、易沾被測(cè)物,不適合強(qiáng)酸性或強(qiáng)堿性液體測(cè)量。
考慮到測(cè)量精度和系統(tǒng)的可行性,我們選擇方案二。
系統(tǒng)理論分析與計(jì)算
2.1
水情信號(hào)處理的分析
2.1.1 PH值處理的分析
本系統(tǒng)利用PH傳感器檢測(cè)液體酸堿度。PH檢測(cè)電路由前置120dB緩沖放大部分與后級(jí)高增益部分構(gòu)成。本模塊的PH檢測(cè)采取TLC4502進(jìn)行放大。最終系統(tǒng)將輸出信號(hào)與標(biāo)準(zhǔn)信號(hào)源的輸出值進(jìn)行比較,得出PH值,并計(jì)算出相對(duì)精度。
2.1.2 液位處理的分析
采用超聲波傳感器對(duì)水和白醋、純凈水進(jìn)行液位檢測(cè),運(yùn)用TI公司的高速比較器TL047對(duì)前級(jí)放大電路輸出信號(hào)進(jìn)行處理。通過(guò)超聲波發(fā)射裝置發(fā)出超聲波,根據(jù)接收器接到超聲波時(shí)的時(shí)間差就可以知道距離。超聲波發(fā)射器向某一方向發(fā)射超聲波,在發(fā)射時(shí)刻的同時(shí)開(kāi)始計(jì)時(shí),超聲波在空氣中傳播,途中碰到障礙物就立即返回來(lái),超聲波接收器收到反射波就立即停止計(jì)時(shí)。返回信號(hào)通過(guò)IO口ECHO輸出一個(gè)高電平,高電平持續(xù)的時(shí)間就是超聲波發(fā)射到返回的時(shí)間,測(cè)試距離=(高電平持續(xù)時(shí)間*聲速(340M/S))/2,最后將測(cè)量值與系統(tǒng)所得值進(jìn)行對(duì)比,并計(jì)算得到相對(duì)誤差。
2.2 電壓檢測(cè)方法的分析
利用STC15F60S2單片機(jī)采用A/D轉(zhuǎn)換電路將輸入電壓轉(zhuǎn)換成時(shí)間(脈沖寬度信號(hào))或頻率(脈沖頻率),然后由定時(shí)器/計(jì)數(shù)器獲得數(shù)字值。與萬(wàn)用表所測(cè)結(jié)果進(jìn)行對(duì)比,并計(jì)算精度。


電路與程序設(shè)計(jì)
3.1
總體方案設(shè)計(jì)
該水情檢測(cè)系統(tǒng)由PH傳感器和超聲波傳感器組成。PH傳感器用于液體酸堿度測(cè)量,超聲波傳感器用于液體高度測(cè)量。信號(hào)經(jīng)過(guò)前級(jí)的放大整形后進(jìn)入A/D轉(zhuǎn)換,A/D轉(zhuǎn)換后將數(shù)據(jù)傳輸給單片機(jī),單片機(jī)對(duì)數(shù)據(jù)進(jìn)行整理和計(jì)算,并將結(jié)果顯示出來(lái)。系統(tǒng)總體實(shí)現(xiàn)框圖如圖1.1所示。

3.2 電路設(shè)計(jì)
3.2.1PH檢測(cè)電路設(shè)計(jì)
PH檢測(cè)電路由前置120dB緩沖放大部分與后級(jí)高增益部分構(gòu)成。本模塊的PH檢測(cè)采取TLC4502進(jìn)行放大,可有效抑制噪聲。本模塊采用的溫度傳感器為熱敏電阻,其阻值隨溫度變化而變化。采用惠斯登電橋保證后續(xù)的差分放大時(shí),運(yùn)算放大器的正反向輸入電壓值為正值,則在此極限溫度下,電橋處于平衡狀態(tài),差分放大輸入電壓差為0。如圖3.2所示。


3.2.2液位檢測(cè)電路
運(yùn)用TI公司的高速比較器TL047對(duì)前級(jí)放大電路輸出信號(hào)進(jìn)行處理。同時(shí)采用了EM78小型微處理器進(jìn)行信號(hào)轉(zhuǎn)換使其更加準(zhǔn)確,并且很好的抑制了噪聲干擾。如圖3.3所示。


3.3 軟件設(shè)計(jì)
STC15F60S2單片機(jī)在該系統(tǒng)主要完成數(shù)據(jù)計(jì)算,功能切換和顯示功能。主程序流程圖如圖3.4所示。  


測(cè)試方案與測(cè)試結(jié)果
4.1 測(cè)試方法與儀器
4.1.1測(cè)試方法
1)PH值的測(cè)量方法:通過(guò)對(duì)水和白醋、純凈水進(jìn)行多次測(cè)量,采取TLC4502進(jìn)行放大,最終將系統(tǒng)的輸出信號(hào)與標(biāo)準(zhǔn)信號(hào)源的輸出值進(jìn)行比較,得出PH值,并計(jì)算出相對(duì)精度。
2) 液位的測(cè)量方法:采用超聲波傳感器對(duì)水和白醋、純凈水進(jìn)行液位檢測(cè),運(yùn)用TI公司的高速比較器TL047對(duì)前級(jí)放大電路輸出信號(hào)進(jìn)行處理。如有信號(hào)返回,通過(guò)IO口ECHO輸出一個(gè)高電平,高電平持續(xù)的時(shí)間就是超聲波發(fā)射到返回的時(shí)間,測(cè)試距離=(高電平持續(xù)時(shí)間*聲速(340M/S)) /2,最后將測(cè)量值與系統(tǒng)所得值進(jìn)行對(duì)比,并計(jì)算得到相對(duì)誤差。
3) 電壓的測(cè)量方法:將萬(wàn)用表測(cè)量值與單片機(jī)所測(cè)值進(jìn)行對(duì)比,得到相對(duì)精度。
4.1.2 測(cè)試儀器
表4.1   測(cè)試儀器
  
序號(hào)
  
名稱(chēng)型號(hào)規(guī)格
數(shù)量
1
SIGLENT-SDS3053(500M示波器)
1
2
Agileat 33600A(DDS函數(shù)信號(hào)發(fā)生器)
1
3
SUIN-SS3323  (直流穩(wěn)壓源)
1
4
NFC-C1000-1型多功能計(jì)數(shù)器
1
4.2  測(cè)試結(jié)果4.2.1 PH值的測(cè)量
測(cè)量結(jié)果:使用信號(hào)源輸出不同幅度的直流電壓信號(hào),記錄實(shí)際測(cè)量值。測(cè)試結(jié)果如表4.2所示
表4.2   PH測(cè)量
  
待測(cè)物
  
標(biāo)準(zhǔn)PH值
實(shí)際PH值
相對(duì)誤差

  
水和白醋
2.45
2.90
18.36*10-2
3.42
3.56
4.66*10-2
3.60
3.70
2.77*10-2

  
純凈水和白醋
3.50
3.40
2.86*10-2
3.90
3.93
0.76*10-2
3.70
3.55
4.05*10-2
結(jié)論:向塑料容器中注入若干毫升的水和白醋,可以在規(guī)定時(shí)間內(nèi)完成PH值測(cè)量并顯示,測(cè)量偏差遠(yuǎn)小于0.5;多次向純凈水中注入若干白醋,能在2分鐘內(nèi)穩(wěn)定顯示每次的PH值,同時(shí)測(cè)量偏差不大于0.1。
4.2.2 液位的測(cè)量
不同待測(cè)物液位測(cè)試結(jié)果如表4.3所示。
表4.3  液位測(cè)量
  
待測(cè)物
  
測(cè)量距離/mm
實(shí)際距離/mm
相對(duì)誤差
水和白醋
158
153
3.1*10-2
純凈水
120
122
1.6*10-2
結(jié)論:向塑料容器中注入若干毫升的水和白醋,在1分鐘內(nèi)完成水位測(cè)量并顯示,測(cè)量偏差不大于5mm;將塑料容器清空,多次向塑料容器注入若干純凈水,在1分鐘內(nèi)穩(wěn)定顯示,每次的水位值偏差不大于2mm。
4.2.3 電壓的測(cè)量
供電電池的電壓測(cè)試結(jié)果如表4.4所示。
表4.4   電壓測(cè)量
  
輸入幅度/V
  
測(cè)量值/V
相對(duì)誤差
3.25
3.24
3.0*10-3
4.98
4.96
4.0*10-3
結(jié)論:可以完成供電電池的輸出電壓測(cè)量并顯示,測(cè)量偏差小于0.01V。
綜上所述,本設(shè)計(jì)已達(dá)到要求。
總結(jié)
該系統(tǒng)以STC15F60S2為核心測(cè)量器件,配合放大電路設(shè)計(jì)了高精度水情檢測(cè)系統(tǒng)。經(jīng)過(guò)最終的調(diào)試,實(shí)現(xiàn)了不同情況下水位、PH值及電壓的測(cè)量。本系統(tǒng)性能優(yōu)良,工作可靠,操作簡(jiǎn)單,使用方便,完全滿(mǎn)足題目中所有的指標(biāo)要求。在設(shè)計(jì)過(guò)程中要注意以下問(wèn)題:電壓小于5V時(shí),采用光耦元器件誤差較大,當(dāng)電壓高于5V時(shí),應(yīng)采用A/D轉(zhuǎn)換電路減小誤差。

單片機(jī)源程序如下:
  1. #include <stc15f2k60s2.h>
  2. #include <intrins.h>
  3. #include <lcd12864.h>

  4. //引腳定義
  5. sbit     RX    =  P4^2;
  6. sbit     TX    =  P4^4;

  7. #define FOSC    11059200L
  8. #define BAUD    9600

  9. #define uchar unsigned char
  10. #define uint unsigned int
  11. #define ulong unsigned long

  12. #define     URMD    0           //0:使用定時(shí)器2作為波特率發(fā)生器
  13.                                 //1:使用定時(shí)器1的模式0(16位自動(dòng)重載模式)作為波特率發(fā)生器
  14.                                 //2:使用定時(shí)器1的模式2(8位自動(dòng)重載模式)作為波特率發(fā)生器
  15.                              
  16. #define ADC_POWER   0x80            //ADC電源控制位
  17. #define ADC_FLAG    0x10            //ADC完成標(biāo)志
  18. #define ADC_START   0x08            //ADC起始控制位
  19. #define ADC_SPEEDLL 0x00            //540個(gè)時(shí)鐘
  20. #define ADC_SPEEDL  0x20            //360個(gè)時(shí)鐘
  21. #define ADC_SPEEDH  0x40            //180個(gè)時(shí)鐘
  22. #define ADC_SPEEDHH 0x60            //90個(gè)時(shí)鐘
  23. /*---全局變量聲明---*/
  24. uchar code CharCode1[]="**水情監(jiān)測(cè)系統(tǒng)**";
  25. uchar code CharCode2[]="液位值:";
  26. uchar code CharCode3[]="PH值:";
  27. uchar code CharCode4[]="電壓值:";
  28. uchar number0[5];                        //水位值儲(chǔ)存
  29. uchar number1[5];                        //PH值儲(chǔ)存
  30. uchar number2[7];                        //電壓值儲(chǔ)存
  31. uchar Test0;                                //標(biāo)志
  32. uint ad_data1;                                //十位AD值
  33. unsigned int  time=0;
  34.          long S=0;
  35.          bit  flag =0;
  36. ulong distance;                   //距離顯示
  37. /*---函數(shù)聲明---*/
  38. void InitUart();
  39. void InitADC();
  40. void Timer0Init(void);                                                                        //10毫秒@11.0592MHz
  41. void Timer2Init(void);                                                                        //10毫秒@11.0592MHz
  42. ulong GetADCResult(uchar ch);
  43. void Delay(uint n);
  44. void IO_Init();                                                                                        //I/O口初始
  45. void LCD12864();                                                                                //LCD初始化顯示
  46. void PH_Value();                                                                                //PH監(jiān)測(cè)化
  47. ulong PH_read(long PH);                                                                        //PH值轉(zhuǎn)換
  48. void Voltag_read();                                                                                //電壓監(jiān)測(cè)
  49. /*---液位---*/
  50. void Conut(void);
  51. void Distance_Value();                                                                        //液位監(jiān)測(cè)
  52. void delayms(unsigned int ms);
  53. void Timer_Count(void);
  54. void  StartModule();                                                                  //T1中斷用來(lái)掃描數(shù)碼管和計(jì)800MS啟動(dòng)模塊
  55. ulong datas_Value(long datas);                                                        //數(shù)據(jù)修正
  56. /*---主函數(shù)---*/
  57. void main()
  58. {
  59.           IO_Init();                                                //I/O口初始化
  60.         LCD12864_Init();                                //LCD初始化
  61.         InitUart();                     //初始化串口
  62.     InitADC();                      //初始化ADC
  63.         Timer0Init();                                        //定時(shí)器0初始化
  64.         Timer2Init();                                        //定時(shí)器2初始化
  65.     while (1)
  66.     {
  67.                         LCD12864();
  68.                         if(Test0==1)
  69.                         {
  70.                                 Test0=0;
  71.                                 PH_Value();
  72.                                 Voltag_read();
  73.                                 Distance_Value();        
  74.                         }                                
  75.     }
  76. }
  77. void IO_Init()                //I/O口模式選擇
  78. {
  79.         P0M0 = 0x00;P0M1 = 0x00;P1M0 = 0x00;P1M1 = 0x00;
  80.         P2M0 = 0x00;P2M1 = 0x00;P3M0 = 0x00;P3M1 = 0x00;
  81.         P4M0 = 0x00;P4M1 = 0x00;P5M0 = 0x00;P5M1 = 0x00;
  82.           P6M0 = 0x00;P6M1 = 0x00;P7M0 = 0x00;P7M1 = 0x00;
  83. }
  84. void LCD12864()                //LCD初始化顯示
  85. {
  86.         uchar i=0;
  87.         uchar j=0;
  88.         uchar k=0;
  89.         uchar t=0;
  90.         LCD12864_SetWindow(0,        0);                        //系統(tǒng)名稱(chēng)顯示
  91.         while(CharCode1[i]!='\0')
  92.         {
  93.                 LCD12864_WriteData(CharCode1[i]);
  94.                 i++;
  95.                 if(i==16)
  96.                 {
  97.                         i=0;
  98.                         break;
  99.                 }
  100.         }
  101.         LCD12864_SetWindow(1, 0);                        //液位顯示
  102.         while(CharCode2[j]!='\0')
  103.         {
  104.                 LCD12864_WriteData(CharCode2[j]);
  105.                 j++;
  106.                 if(j==15)
  107.                 {
  108.                         j=0;
  109.                         break;
  110.                 }
  111.         }
  112.         LCD12864_SetWindow(2, 0);                        //PH值顯示
  113.         while(CharCode3[k]!='\0')                                
  114.         {
  115.                 LCD12864_WriteData(CharCode3[k]);
  116.                 k++;
  117.                 if(k==8)
  118.                 {
  119.                         k=0;
  120.                         break;
  121.                 }
  122.         }
  123.         LCD12864_SetWindow(3, 0);                 //電壓值顯示
  124.         while(CharCode4[t]!='\0')
  125.         {
  126.                 LCD12864_WriteData(CharCode4[t]);
  127.                 t++;
  128.                 if(t==13)
  129.                 {
  130.                         t=0;
  131.                         break;
  132.                 }
  133.         }
  134. }
  135. void PH_Value()                                                                //PH監(jiān)測(cè)
  136. {
  137.         long PH;
  138.         long datas;
  139.         long num;
  140.         uint i;
  141.         datas=GetADCResult(0);
  142. //        num=datas*(4.5/1.0240);
  143.         num=datas_Value(datas*(4.5/1.024));
  144.         PH=PH_read(num);                                                //PH-Value對(duì)比
  145.         number0[0]=PH/1000;                                                 //求十位
  146.         number0[1]=PH%1000/100;                                           //求個(gè)位
  147.         number0[2]='.';
  148.         number0[3]=PH%100/10;                                        //求十分位
  149.         number0[4]=PH%10;                                                //求百分位
  150.         LCD12864_SetWindow(2,3);
  151.         for(i=0;i<5;i++)
  152.         {
  153.                 if(i==2)
  154.                         LCD12864_WriteData(number0[i]);
  155.                 else
  156.                         LCD12864_WriteData(number0[i]+48);
  157.         }
  158. }
  159. ulong PH_read(long PH)                                                //PH值轉(zhuǎn)換
  160. {
  161.                 long datas;
  162.                 if(PH>4242)
  163.                 {
  164.                         datas=0;
  165.                 }else if(PH>4065)
  166.                 {
  167.                         datas=0+(PH-4065)/177.00;
  168.                 }else if(PH>3885)
  169.                 {
  170.                         datas=1+(PH-3885)/180.00;
  171.                 }else if(PH>3709.8)
  172.                 {
  173.                         datas=2+(PH-3709.8)/175.20;
  174.                 }else if(PH>3532.5)
  175.                 {
  176.                         datas=3+(PH-3532.5)/177.30;
  177.                 }else if(PH>3354)
  178.                 {
  179.                         datas=4+(PH-3354)/178.50;
  180.                 }else if(PH>3177.5)
  181.                 {
  182.                         datas=5+(PH-3177.5)/176.50;
  183.                 }else if(PH>3000)
  184.                 {
  185.                         datas=6+(PH-3000)/177.50;
  186.                 }else if(PH>2822.5)
  187.                 {
  188.                         datas=7+(PH-2822.5)/177.50;
  189.                 }else if(PH>2646)
  190.                 {
  191.                         datas=8+(PH-2646)/176.50;
  192.                 }else if(PH>2467.5)
  193.                 {
  194.                         datas=9+(PH-2467.5)/178.50;
  195.                 }else if(PH>2292)
  196.                 {
  197.                         datas=10+(PH-2292)/175.50;
  198.                 }else if(PH>2115)
  199.                 {
  200.                         datas=11+(PH-2115)/177.00;
  201.                 }else if(PH>1938)
  202.                 {
  203.                         datas=12+(PH-1938)/177.00;
  204.                 }else if(PH>1758)
  205.                 {
  206.                         datas=13+(PH-1758)/180.00;
  207.                 }
  208.                 else
  209.                 {
  210.                         datas=14;
  211.                 }
  212.                 datas=datas*100;
  213.                 return datas;
  214. }
  215. void Voltag_read()                                                        //電壓監(jiān)測(cè)
  216. {
  217.         long voltag;
  218.         long datas;
  219.         uint i;
  220.         datas=GetADCResult(1);
  221. //        voltag=datas*(4.5/1.024);
  222.         voltag=datas_Value(datas*(4.5/1.024));
  223.         number1[0]=voltag/1000;                                           //求個(gè)位
  224.         number1[1]='.';
  225.         number1[2]=voltag%1000/100;                                //求十分位
  226.         number1[3]=voltag%100/10;                                //求百分位
  227.         number1[4]='V';
  228.         LCD12864_SetWindow(3, 4);
  229.         for(i=0;i<5;i++)
  230.         {
  231.                 if(i==1|i==4)
  232.                         LCD12864_WriteData(number1[i]);
  233.                 else
  234.                         LCD12864_WriteData(number1[i]+48);
  235.         }
  236. }
  237. /*---液位---*/
  238. void Conut(void)
  239. {
  240.         int i;
  241.         time=TH0*256+TL0;
  242.         TH0=0;
  243.         TL0=0;
  244.         S=(time*1.8)/10;                             //算出來(lái)是mm
  245.         S=280-S;
  246.         if((S>=7000)||flag==1)                 //超出測(cè)量范圍顯示“-”         
  247.                 flag=0;
  248.         else
  249.         {
  250.                 number2[0]=S/1000;
  251.                   number2[1]=S/100%10;
  252.                   number2[2]=S/10%10;
  253.                   number2[3]=S%10;
  254.                   number2[4]='m';
  255.                   number2[5]='m';
  256.                   LCD12864_SetWindow(1,4);
  257.                 for(i=0;i<6;i++)
  258.                 {
  259.                         if(i==4|i==5)
  260.                                 LCD12864_WriteData(number2[i]);        
  261.                         else
  262.                                 LCD12864_WriteData(number2[i]+48);
  263.                 }
  264.          }
  265. }
  266. void delayms(unsigned int ms)
  267. {
  268.         unsigned char i=100,j;
  269.         for(;ms;ms--)
  270.         {
  271.                 while(--i)
  272.                 {
  273.                         j=10;
  274.                         while(--j);
  275.                 }
  276.         }
  277. }
  278. void Timer_Count(void)
  279. {
  280.         TR0=1;                            //開(kāi)啟計(jì)數(shù)
  281.         while(RX);                        //當(dāng)RX為1計(jì)數(shù)并等待
  282.         TR0=0;                                //關(guān)閉計(jì)數(shù)
  283.     Conut();                        //計(jì)算

  284. }
  285. void  StartModule()                          //T1中斷用來(lái)掃描數(shù)碼管和計(jì)800MS啟動(dòng)模塊
  286. {
  287.           TX=1;                                         //800MS  啟動(dòng)一次模塊
  288.           _nop_();
  289.           _nop_();
  290.           _nop_();
  291.           _nop_();
  292.           _nop_();
  293.           _nop_();
  294.           _nop_();
  295.           _nop_();
  296.           _nop_();
  297.           _nop_();
  298.           _nop_();
  299.           _nop_();
  300.           _nop_();
  301.           _nop_();
  302.           _nop_();
  303.           _nop_();
  304.           _nop_();
  305.           _nop_();
  306.           _nop_();
  307.           _nop_();
  308.           _nop_();
  309.           TX=0;
  310. }
  311. void Distance_Value()
  312. {
  313.         unsigned int valA;
  314.         delayms(60);
  315.         RX=1;
  316.         StartModule();
  317.     for(valA=7510;valA>0;valA--)
  318.         {   
  319.                 if(RX==1)
  320.                 {
  321.                         Timer_Count();
  322.                 }
  323.         }
  324. }
  325. ulong datas_Value(long datas)                                //數(shù)據(jù)修正
  326. {
  327.         int i;
  328.         long v,sum,value[20];
  329.         for(i=0;i<20;i++)
  330.         {
  331.                 value[i]=datas;
  332.                 sum+=value[i];
  333.         }
  334.         v=sum/50.00;
  335.         return v;
  336. }
  337. /*---發(fā)送ADC結(jié)果到PC---*/
  338. /*
  339. void ShowResult(char ch)
  340. {
  341. // SendData(ch);                   //顯示通道號(hào)
  342. //        SendData(GetADCResult(ch));     //顯示ADC高8位結(jié)果

  343. //   SendData(ADC_RESL);                    //顯示低2位結(jié)果
  344. }
  345. */
  346. /*---讀取ADC結(jié)果---*/
  347. unsigned long GetADCResult(uchar ch)
  348. {
  349.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
  350.     _nop_();                        //等待4個(gè)NOP
  351.     _nop_();
  352.     _nop_();
  353.     _nop_();
  354.     while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉(zhuǎn)換完成
  355.     ADC_CONTR &= ~ADC_FLAG;                                 //Close ADC
  356.         ad_data1=ADC_RES<<2;                                                //因?yàn)槭?0位的AD,因此需要把AD轉(zhuǎn)換后的低8位向高位移動(dòng)2位
  357.     ad_data1=ad_data1|ADC_RESL&0x03;                        //再把高8位和低2位相加。
  358.         ad_data1=ad_data1/1.024;
  359.     return ad_data1;                                        //返回ADC結(jié)果
  360. }
  361. /*---初始化ADC---*/
  362. void InitADC()
  363. {
  364.     P1ASF = 0xff;                   //設(shè)置P1口為AD口
  365.         CLK_DIV &=0xdf;
  366.     ADC_RES = 0;                    //清除結(jié)果寄存器
  367.         ADC_RESL= 0;
  368.     ADC_CONTR = ADC_POWER | ADC_SPEEDH;
  369.     Delay(2);                       //ADC上電并延時(shí)
  370. }
  371. /*---初始化串口---*/
  372. void InitUart()
  373. {
  374.     SCON = 0x5a;                //設(shè)置串口為8位可變波特率
  375. #if URMD == 0
  376.     T2L = 0xd8;                 //設(shè)置波特率重裝值
  377.     T2H = 0xff;                 //115200 bps(65536-18432000/4/115200)
  378.     AUXR = 0x14;                //T2為1T模式, 并啟動(dòng)定時(shí)器2
  379.     AUXR |= 0x01;               //選擇定時(shí)器2為串口1的波特率發(fā)生器
  380. #elif URMD == 1
  381.     AUXR = 0x40;                //定時(shí)器1為1T模式
  382.     TMOD = 0x00;                //定時(shí)器1為模式0(16位自動(dòng)重載)
  383.     TL1 = 0xd8;                 //設(shè)置波特率重裝值
  384.     TH1 = 0xff;                 //115200 bps(65536-18432000/4/115200)
  385.     TR1 = 1;                    //定時(shí)器1開(kāi)始啟動(dòng)
  386. #else
  387.     TMOD = 0x20;                //設(shè)置定時(shí)器1為8位自動(dòng)重裝載模式
  388.     AUXR = 0x40;                //定時(shí)器1為1T模式
  389.     TH1 = TL1 = 0xfb;           //115200 bps(256 - 18432000/32/115200)
  390.     TR1 = 1;
  391. #endif
  392. }
  393. /*---發(fā)送串口數(shù)據(jù)---*/
  394. /*
  395. void SendData(uchar dat)
  396. {
  397.     while (!TI);                    //等待前一個(gè)數(shù)據(jù)發(fā)送完成
  398. ……………………

  399. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼


所有資料51hei提供下載(代碼):
簡(jiǎn)易水情監(jiān)測(cè).zip (90.36 KB, 下載次數(shù): 44)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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