找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

干簧管式流量傳感器單片機驅(qū)動程序

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:198369 發(fā)表于 2017-5-8 22:20 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
干簧管交叉排列,單片機讀取電壓值,自己實際標定之后轉(zhuǎn)換為流量值


單片機源程序:
  1. #include "stc12c5a60s2.h"
  2. #include "string.h"                   //字符串長度
  3. #include "intrins.h"           //_nop_或者移位操作
  4. #include "stdio.h"

  5. #define ADC_PWR 0x80
  6. #define ADC_FLAG 0x10
  7. #define ADC_START 0x08
  8. #define ADC_SPEEDA 0x60        //不同的值可以改變轉(zhuǎn)換速度

  9. sbit LSA=P2^2;
  10. sbit LSB=P2^3;
  11. sbit LSC=P2^4;
  12. sbit PWM=P2^0;

  13. float AD_Result;//儲存AD轉(zhuǎn)換結(jié)果
  14. #define uchar unsigned char
  15. #define uint unsigned int
  16. uchar DisplayData[8];
  17. uchar code table[]={  //table[]里面無數(shù)字       
  18. //共陽極代碼0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90,
  19.                                         0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  20.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};  //后邊帶分號

  21. void delayms(uint xms)
  22. {
  23.         uint i,j;
  24.         for(i=xms;i>0;i--)          //后無分號,i=xms 即延時約xms毫秒
  25.                 for(j=110;j>0;j--);//有分號
  26. }

  27. void display(void)
  28. {
  29.         unsigned char i;
  30.         for(i=0; i<8; i++)
  31.         {
  32.                 switch(i)         //位選,選擇點亮的數(shù)碼管,
  33.                 {
  34.                         case(0):
  35.                                 LSA=0;LSB=0;LSC=0; break;//顯示第0位
  36.                         case(1):
  37.                                 LSA=1;LSB=0;LSC=0; break;//顯示第1位
  38.                         case(2):
  39.                                 LSA=0;LSB=1;LSC=0; break;//顯示第2位
  40.                         case(3):
  41.                                 LSA=1;LSB=1;LSC=0; break;//顯示第3位
  42.                         case(4):
  43.                                 LSA=0;LSB=0;LSC=1; break;//顯示第4位
  44.                         case(5):
  45.                                 LSA=1;LSB=0;LSC=1; break;//顯示第5位
  46.                         case(6):
  47.                                 LSA=0;LSB=1;LSC=1; break;//顯示第6位
  48.                         case(7):
  49.                                 LSA=1;LSB=1;LSC=1; break;//顯示第7位       
  50.                 }
  51.                 P0 = DisplayData[i];//發(fā)送段碼
  52.                 delayms(10);                 //掃描間隔時間設定
  53.                 LSA=1;LSB=0;LSC=1;        //顯示小數(shù)點
  54.                 P0 = 0x80;
  55.                 delayms(10);                 //掃描間隔時間設定
  56.                 P0 = 0x00;//消隱
  57.         }
  58.                 //P0=table[keya];
  59. }
  60. /*
  61. void send(uchar key_num)
  62. {
  63.         SBUF=key_num;
  64.         while(!TI);
  65.         TI=0;
  66. }
  67. */
  68. void Init_adc()
  69. {
  70.     P1ASF=0xff;                //P1口為使用AD轉(zhuǎn)換做準備,A/D通道選擇,所有的P1口作為轉(zhuǎn)換接口 ,AD使用總開關(guān)
  71.     ADC_RES=0;                //清零AD轉(zhuǎn)換結(jié)果寄存器高位
  72.     ADC_RESL=0;                //清零AD轉(zhuǎn)換結(jié)果寄存器低位
  73.     ADC_CONTR=ADC_PWR|ADC_START|ADC_SPEEDA;
  74.     delayms(1);
  75. }

  76. unsigned int AD_get(uchar channel)
  77. {
  78.         ADC_CONTR=ADC_PWR|ADC_START|ADC_SPEEDA|channel; //初始化ADC控制寄存器,(轉(zhuǎn)換速度為90個時鐘周期轉(zhuǎn)換一次,模擬輸入通道為通道1)
  79.     _nop_();           //穩(wěn)定ADC控制寄存器的值                變channel 值變模擬信號輸入口
  80.     _nop_();
  81.     _nop_();
  82.     _nop_();
  83.     while((ADC_FLAG&0x10)==0);         //查詢轉(zhuǎn)換是否結(jié)束
  84.     ADC_CONTR &= 0xef;                         //清零ADC_FLAG位
  85.         //ADC_CONTR = ADC_CONTR & 0xef;
  86.         return (ADC_RES*4+ADC_RESL);         //返回轉(zhuǎn)換結(jié)果        十位八位寄存器轉(zhuǎn)換        ,去掉 ADC_RES*4則為八位
  87. }

  88. float AD_work(uchar channel)  //計算結(jié)果
  89. {
  90.     float AD_val;
  91.     AD_val=(float)AD_get(channel);
  92.     AD_val=(AD_val*5)/1023;        //1023對應5
  93.     return AD_val;
  94. }

  95. main()
  96. {
  97.         TMOD=0x01;//定時器0工作方式1?
  98.         TH0=(65536-1000)/256;//賦初值定時
  99.         TL0=(65536-1000)%256;//1ms
  100. //        EA=1;//開總中斷
  101.         ET0=1;//開定時器0中斷
  102.         TR0=1;//啟動定時器0
  103.         TMOD=0X20;          //定時器1工作方式2
  104.         TH1 = 0Xfd;          //設定初值
  105.         TL1=0xfd;
  106.         TR1=1;           //啟動T1
  107.         SM0=0;
  108.         SM1=1;
  109.         EA=1;
  110.         ES=1;
  111.         P0=0xff;
  112.         Init_adc();
  113.         //display();
  114.                    
  115.         while(1)
  116.         {         
  117.          AD_Result=AD_work(0);       
  118.          AD_Result = AD_Result*100;

  119.         //DisplayData[4]=DIG_CODE[AD_Result%10000/1000];
  120.         DisplayData[5]=table[(int)AD_Result%1000/100];
  121.         DisplayData[6]=table[(int)AD_Result%100/10];
  122.         DisplayData[7]=table[(int)AD_Result%10/1];
  123.         display();
  124. //        send(k);       
  125.         }


  126. }

  127. void tim0() interrupt 1
  128. {
  129.         uchar time;
  130.         TR0=0;//賦初值時,關(guān)閉定時器
  131.         TH0=(65536-922)/256;//賦初值定時
  132.         TL0=(65536-922)%256;//定時1ms
  133.         TR0=1;//打開定時器
  134.         time++;
  135.        
  136.         if(time<=10)
  137.                 PWM=0;//占空比0.1
  138.         else
  139.                 PWM=1;
  140.         if(time>=100)
  141.         {
  142.                 PWM = 0;

  143. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

完整資料下載:
數(shù)據(jù)讀取顯示.zip (33.29 KB, 下載次數(shù): 28)




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

相關(guān)帖子

回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表