久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3902|回復: 5
打印 上一主題 下一主題
收起左側

17年電賽簡易水情檢測系統單片機代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:129825 發表于 2019-3-30 13:58 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
17年電賽P題

單片機源程序如下:
  1. #include <STC15F2K60S2.H>// 包含STC115F2K60S2單片機寄存器定義文件   
  2. #define VCC 5.0   // 存放用萬用表實測的單片機供電電壓
  3. #include <intrins.h>                                           
  4. #define uchar unsigned char
  5. #define uint  unsigned int
  6. unsigned int ADvalue;            // 存放AD轉換返回的結果

  7. sbit ADC_SCK=P2^6 ;//ADC時鐘
  8. sbit ADC_DIN= P2^7;//ADC數據入
  9. sbit ADC_DOUT=P2^4;  //ADC數據出
  10. sbit ADC_DBY=P2^5;//ADC準備
  11. unsigned int channal1;

  12. sbit RS=P0^0;            //片選信號        rs        CS
  13. sbit RW=P0^1;                //數據信號        rw          SID
  14. sbit E=P0^2;                //時鐘信號   e                 SCLK

  15. sbit RST=P0^6;                //復位信號
  16. sbit PSB = P0^7;                //并行、串行選擇信號         psb   CH

  17. sbit c_send   = P3^3;                //超聲波發射          t
  18. sbit c_recive = P3^2;                //超聲波接收         e
  19. uchar flag_hc_value;        //超聲波中間變量

  20. long distance;                //距離
  21. uint set_d;                    //距離
  22. bit flag_csb_juli;      //超聲波超出量程
  23. uint  flag_time0;      //用來保存定時器0的時候的
  24. uint time;

  25. /********************************************************************
  26. * 名稱 : delay()
  27. * 功能 : 延時,延時時間為 100us * t。這是通過軟件延時,有一定誤差。
  28. * 輸入 : t
  29. * 輸出 : 無
  30. ***********************************************************************/
  31. void delay(unsigned int t)
  32. {
  33.         unsigned int i,j;
  34.         for(i=0; i<t;  i++)
  35.     for(j=0; j<10; j++);
  36. }
  37. void Delay_ms(unsigned int n)
  38. {
  39.         unsigned int  i,j;
  40.         for(i=0;i<n;i++)
  41.                 for(j=0;j<123;j++);
  42. }

  43. void UART_init(void)
  44. {                  
  45.         //下面代碼設置定時器1
  46.         TMOD = 0x20;        // 0010 0000 定時器1工作于方式2(8位自動重裝方式)
  47.         TH1  = 0xFD;        // 波特率:9600 /11.0592MHZ
  48.         TL1  = 0xFD;        // 波特率:9600 /11.0592MHZ
  49.         TR1  = 1;
  50.         //下面代碼設置定串口
  51.         AUXR = 0x00;             // 很關鍵,使用定時器1作為波特率發生器,S1ST2=0
  52.         SCON = 0x50;         // 0101 0000 SM0.SM1=01(最普遍的8位通信),REN=1(允許接受)
  53.         TI=1;                        // 很關鍵,使用printf函數時必須有此命令
  54. }

  55. /********************************************************************
  56. * 名稱 : sendbyte()
  57. * 功能 : 按照液晶的串口通信協議,發送數據
  58. * 輸入 : zdata
  59. * 輸出 : 無
  60. ***********************************************************************/
  61. void sendbyte(unsigned char zdata)
  62. {
  63.         unsigned int i;
  64.         for(i=0; i<8; i++)
  65.         {
  66.                 if((zdata << i) & 0x80)
  67.                 {
  68.                         RW = 1;
  69.                 }
  70.                 else
  71.                 {
  72.                         RW = 0;
  73.                 }
  74.                 E = 0;
  75.                 E = 1;
  76.         }
  77. }

  78. /********************************************************************
  79. * 名稱 : write_com()
  80. * 功能 : 寫串口指令
  81. * 輸入 : cmdcode
  82. * 輸出 : 無
  83. ***********************************************************************/
  84. void write_com(unsigned char cmdcode)
  85. {
  86.         RS = 1;
  87.         sendbyte(0xf8);
  88.         sendbyte(cmdcode & 0xf0);
  89.         sendbyte((cmdcode << 4) & 0xf0);
  90.         delay(2);
  91. }

  92. /********************************************************************
  93. * 名稱 : write_data()
  94. * 功能 : 寫串口指令
  95. * 輸入 : cmdcode
  96. * 輸出 : 無
  97. ***********************************************************************/
  98. void write_data(unsigned char Dispdata)
  99. {
  100.         RS = 1;
  101.         sendbyte(0xfa);
  102.         sendbyte(Dispdata & 0xf0);
  103.         sendbyte((Dispdata << 4) & 0xf0);
  104.         delay(2);
  105. }

  106. /********************************************************************
  107. * 名稱 : lcdinit()
  108. * 功能 : 初始化函數
  109. * 輸入 : cmdcode
  110. * 輸出 : 無
  111. ***********************************************************************/
  112. void lcdinit()
  113. {  
  114.     PSB = 0;
  115.         delay(1);
  116.         RST = 0;
  117.         delay(100);
  118.         RST = 1;
  119.         delay(20000);
  120.         write_com(0x30);
  121.         delay(50);
  122.         write_com(0x0c);
  123.         delay(50);
  124. }

  125. /********************************************************************
  126. * 名稱 : hzkdis()
  127. * 功能 : 顯示字符串
  128. * 輸入 : *s
  129. * 輸出 : 無
  130. ***********************************************************************/
  131. void hzkdis(unsigned char code *s)
  132. {  
  133.         while(*s > 0)
  134.     {
  135.                 write_data(*s);
  136.                 s++;
  137.                 delay(50);
  138.     }
  139. }
  140.         void time_init()          
  141. {
  142.         EA  = 1;                   //開總中斷
  143.         TMOD = 0X01;          //定時器0、定時器1工作方式1
  144.         ET0 = 1;                  //開定時器0中斷
  145.         TR0 = 1;                  //允許定時器0定時
  146. }
  147. void send_wave()
  148. {
  149.          c_send=1;     //啟動一次檢測模塊
  150.          delay(20);
  151.          c_send=0; //停止向檢測模塊Trig端發送高電平
  152.          while(!c_recive);      //無回波時等待
  153.          TR0=1;             //計時開始
  154.          while(c_recive);       //有回波是計數并繼續等待
  155.          TR0=0;
  156.          time=TH0*256+TL0;   
  157.          TH0=0;
  158.          TL0=0;
  159.          distance=269.05-time*0.191;//  計算距離,算出來的單位是mm
  160.          if(distance<=0)
  161.           distance=0;
  162.          if(distance>=269.05)
  163.          distance=269.05;
  164.        
  165. }
  166. void  ADC_P11_init()
  167. {
  168.         unsigned int i;                    // 用于軟件延時程序
  169.         ADC_CONTR|=0x80;              // 開AD轉換電源,第一次使用時要打開內部模擬電源
  170.     for (i=0;i<10000;i++);  // 適當延時等待AD轉換供電穩定,一般延時1ms以內即可,為了縮短AD
  171. // 調用時間,可把這2行剪切到主程序中去。
  172.         P1ASF|=0x02;                        // 選擇P1.1作為AD轉換通道,0x02= 0000 0010       
  173.         ADC_CONTR=0xE1;         // 選擇P1.1作為AD轉換通道,最高轉換速度,清轉換完成標志。
  174.         for (i=0;i<200;i++);   // 如果是多通道模擬量進行AD轉換,則更換AD轉換通道后要適當延時,
  175. // 使輸入電壓穩定,延時量取20μs~200μs即可,與輸入電壓源的內阻有關,如果輸入電壓信號源的內
  176. // 阻在10K以下,可不加延時,如果是單通道模擬量轉換,則不需要更換AD轉換通道,也不需要加延時。
  177.         ADC_CONTR|=0x08;        // 啟動 A/D 轉換,ADC_START=1。
  178.         EADC=1;
  179.         EA=1;         
  180. }  
  181. void ADC(void) interrupt 5
  182. {
  183.         unsigned int AD_Dat=0,AD_Dat1=0;    // 10位AD轉換值
  184.         unsigned char Tmp=0,Tmp1=0;          // 臨時變量用于將AD轉換出來的2個字節合成一個字節
  185.         ADC_CONTR&=0xE7;               // 將ADC_FLAG清0, 0xE7=1110 0111B,ADC_FLAG=0,ADC_START=0。       
  186.         AD_Dat = ADC_RES;                  // 默認高字節高8位。
  187.         AD_Dat <<= 2;
  188.         Tmp = ADC_RESL;           // 默認低字節低2位。
  189.         Tmp &= 0x03;              // 屏蔽無關位
  190.         AD_Dat|= Tmp;                  // 高低字節拼接成一個10位數。
  191.         ADvalue=AD_Dat;
  192.         ADC_CONTR|=0x08;          // 重新啟動 A/D 轉換,ADC_START=1。
  193. }

  194. /******向AD7705寫入一個字節******/
  195. void WriteByte7705(unsigned char dat)
  196. {
  197.         unsigned char i;
  198.         for (i=0; i<8; i++)
  199.         {
  200.                  ADC_SCK=0;
  201.                 _nop_();
  202.                 _nop_();
  203.                 _nop_();
  204.                  if(dat & 0x80){ADC_DIN=1;}
  205.                  else
  206.                  ADC_DIN=0;
  207.                 _nop_();
  208.                 _nop_();
  209.                 _nop_();
  210.                  ADC_SCK=1;                        
  211.                 _nop_();
  212.                 _nop_();
  213.                 _nop_();
  214.                  dat=dat<<1;
  215.         }
  216. }

  217. /****** 從AD7705讀一個字節 ******/
  218. unsigned long ReadWord7705()
  219. {
  220.         unsigned long read_dat=0;
  221.         unsigned char i;
  222.         for(i=0;i<16;i++)
  223.         {
  224.                  read_dat=read_dat<<1;
  225.                  ADC_SCK=0;
  226.                 _nop_();
  227.                 _nop_();
  228.                 _nop_();
  229.                  if(ADC_DOUT == 1)
  230.                  {read_dat++; }
  231.                 _nop_();
  232.                 _nop_();
  233.                 _nop_();
  234.                   ADC_SCK=1;
  235.                 _nop_();
  236.                 _nop_();
  237.                 _nop_();                         
  238.          }
  239.          return read_dat;
  240. }

  241. /******ad7705通信端口復位******/
  242. void reset7705()
  243. {
  244.          unsigned char i;
  245.           ADC_DIN=1;
  246.          for(i=0;i<36;i++)
  247.          {
  248.          ADC_SCK=0;
  249.         _nop_();
  250.         _nop_();
  251.         _nop_();
  252.          ADC_SCK=1;
  253.         _nop_();
  254.         _nop_();
  255.         _nop_();
  256.    }
  257. }

  258. /******AD7705通道1初始化******/
  259. void ad7705_init1()
  260. {
  261. reset7705();
  262. WriteByte7705(0x20);//寫通信寄存器,選擇通道1,將下一次操作設為寫時鐘寄存器
  263. WriteByte7705(0x01);//寫時鐘寄存器,不分頻,更新頻率25Hz
  264. WriteByte7705(0x10);//寫通信寄存器,選擇通道1
  265. WriteByte7705(0x44);//寫設置寄存器4,單極性,非緩沖模式,清除濾波器同步,啟動對1通道的自校準
  266. }

  267. /******讀取AD7705通道1轉換數據函數******/
  268. unsigned int ReadData1_7705()
  269. {
  270.           unsigned int value;
  271.           ad7705_init1();
  272.           reset7705();
  273.           while(ADC_DBY);          //等待轉換結束
  274.           WriteByte7705(0x38);    //寫通信寄存器,下一次操作為讀數據寄存器
  275.           value=5000*ReadWord7705()/65535;
  276.           return value;                                   
  277. }

  278. void main(void)
  279. {
  280.         float Vin,N,U;                                   // 存放計算出來的外部輸入電壓
  281.         uint PH;
  282.         ADC_P11_init();
  283.         UART_init();                                   // 串口初始化9600/11.0592MHz
  284.         time_init();
  285.         send_wave();
  286.         lcdinit();
  287.         delay(10);
  288.         write_com(0x03);
  289.           while(1)
  290.         {
  291.          
  292.                 channal1=ReadData1_7705();         //測電池電壓
  293.                 channal1=channal1*1.618;
  294.                 delay(50);     
  295.                 send_wave();                           //測距
  296.                 delay(50);
  297.                 Vin=VCC*ADvalue/1023;      // 注意是1023才正確
  298.                     U=Vin*1010.33;
  299.                 N=(4418.5-U)/177.28;       
  300.                 PH=N*100;                                          //測PH值
  301.                 write_com(0x81);
  302.                 hzkdis("水情檢測系統");
  303.         write_com(0x90);
  304.         hzkdis("液位高度: ");
  305.                 write_data(distance%1000/100 + 0x30);
  306.                 write_data(distance%100/10 + 0x30);
  307.                 write_data(distance%10 + 0x30);
  308.                 hzkdis("mm");
  309.         write_com(0x88);
  310.         hzkdis("當前PH值: ");
  311.                 write_data(PH%10000/1000 + 0x30);
  312.                 write_data(PH%1000/100 + 0x30);
  313.                 hzkdis(".")        ;
  314.                 write_data(PH%100/10 + 0x30);
  315.         write_com(0x98);
  316.         hzkdis("電池電壓: ");
  317.                 write_data(channal1%10000/1000 + 0x30);
  318.                 hzkdis(".");
  319.                 write_data(channal1%1000/100 + 0x30);
  320.                 write_data(channal1%100/10 + 0x30);
  321.                 hzkdis("V");
  322.                 Delay_ms(10);

  323.         }
  324.    }
復制代碼

所有資料51hei提供下載:
17年電賽簡易水情檢測系統代碼.zip (45.21 KB, 下載次數: 40)



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

使用道具 舉報

沙發
ID:1 發表于 2019-3-31 02:10 | 只看該作者
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復

使用道具 舉報

板凳
ID:472844 發表于 2019-7-18 10:30 | 只看該作者
感謝分享學習了
回復

使用道具 舉報

地板
ID:375799 發表于 2019-7-20 11:01 | 只看該作者
ph傳感器用的是什么型號的
回復

使用道具 舉報

5#
ID:593657 發表于 2019-8-1 15:52 | 只看該作者
xxxxxxxxxxxxxxxxxx

datasheet.pdf

1.06 MB, 下載次數: 10, 下載積分: 黑幣 -5

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕日韩欧美一区二区三区 | 国产中文字幕亚洲 | 日韩高清中文字幕 | 一道本视频 | 亚洲精品在线看 | 日韩在线中文字幕 | 欧美精品福利 | 一本色道精品久久一区二区三区 | 午夜国产在线 | 国产精品毛片无码 | 亚洲成人av | 91麻豆产精品久久久久久夏晴子 | japanhdxxxx裸体 | 久久亚洲春色中文字幕久久久 | 黄色网毛片 | avtt国产 | 国产一区二区精品在线观看 | 老头搡老女人毛片视频在线看 | 亚洲午夜视频在线观看 | 欧美一区二区三区在线观看 | 黑人精品欧美一区二区蜜桃 | 国产成人精品免费 | 欧美日韩亚洲在线 | 国产精品成av人在线视午夜片 | 97人人超碰| 欧美一级黄色免费 | 九色网址 | 亚洲三级免费看 | 亚洲欧美一区在线 | 91观看 | 国产精品免费在线 | 国产精品美女久久久久久免费 | 91精品国产乱码久久蜜臀 | 黄色一级视频 | 蜜桃一区二区三区 | 国产一级一级毛片 | 欧美一区免费在线观看 | 91高清在线| 福利视频网址 | 国产精品一区二区久久精品爱微奶 | 一区二区三区网站 |