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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3837|回復: 0
收起左側

N76E003單片機控制ph值傳感器的源程序

[復制鏈接]
ID:142045 發表于 2018-9-18 21:49 | 顯示全部樓層 |閱讀模式
本設計是由單片機控制數碼管顯示ph值及溫度

單片機源程序如下:
  1. #include "N76E003.h"
  2. #include "SFR_Macro.h"
  3. #include "Function_define.h"
  4. #include "LED.h"

  5. #define BAUDRATE 9600            //通訊波特率
  6. void InitialUART0_Timer3(unsigned long u32Baudrate); //use timer3 as Baudrate generator

  7. unsigned char LedUpdateCnt=0;    //LED顯示更新計時
  8. unsigned char const num[]={      //數碼管段碼
  9. 0x3f,0x06,0x5b,0x4f,0x66,//0~4
  10. 0x6d,0x7d,0x07,0x7f,0x6f,//5~9
  11. 0x77,0x7C,0x58,0x5E,0x79,0x71,//A~F
  12. 0x40/*16-*/,0x3e/*17U*/,0x39/*18C*/,
  13. 0x76/*19H*/,0x48/*20=*/,0x00/*21滅*/
  14. };
  15. float Dispdata;                  //用于顯示的數據
  16. unsigned int  Time1TimesCnt;     //定時器1定時溢出計數
  17. unsigned char ShiftDisplay=0;    //切換PH、溫度顯示標志位
  18. unsigned int  ShiftCnt=0;        //切換顯示計數器
  19. unsigned int  RecData;           //接收到的數據
  20. unsigned char Cache9Byte=0;      //連續緩存9個字節標志位
  21. unsigned char EnDatadeal=0;      //使能數據處理
  22. unsigned char receCount=0;       //接收到的字節個數
  23. unsigned char receBuf[11];       //接收緩存區
  24. unsigned char i;

  25. void main (void)
  26. {  
  27.           //TIMER1用于動態掃描數碼管
  28.                 TIMER1_MODE2_ENABLE;
  29.           //未設置時鐘控制寄存器CKCON中的T1M(復位值為0),時鐘源為系統時鐘/12,計數周期為12/16M=0.75us
  30.           //TH1 = (256-TIMER1_CNTTIMES_VALUE);            
  31.     //TL1 = (256-TIMER1_CNTTIMES_VALUE);
  32.           TH1 = 89;                      //125.25us溢出一次(計數167次后溢出中斷)           
  33.     TL1 = 89;  
  34.           set_ET1;                       //enable Timer1 interrupt
  35.           set_TR1;                       //Timer1 run
  36.         
  37.           InitialUART0_Timer3(BAUDRATE); //use timer3 as Baudrate generator
  38.           set_ES;                        //enable UART interrupt
  39.         
  40.           set_EA;                        //enable global interrupt
  41.         
  42.           LED_Init();
  43.                
  44.                  while(1)
  45.                 {                        
  46.                            if(EnDatadeal)
  47.                                  {
  48.                                                  //例如:F7 10 04 01 13 00 5C 9E 9F (有效數據是第4、5、6、7字節)
  49.                                                 
  50.                                            if(ShiftDisplay) RecData=        (receBuf[3]<<8)| receBuf[4]; //轉換第4、5字節數據(溫度)
  51.                                                  else RecData=        (receBuf[5]<<8)| receBuf[6];             //轉換第6、7字節數據(PH值)
  52.                                          
  53.                                                  for(i=0;i<receCount;i++)receBuf[i]=0;                         //清接收緩存
  54.                                                  receCount = 0;                                                                               //清接收數        
  55.                                                  EnDatadeal=0;                                                                                           //數據處理完成
  56.                                                  REN=1;                                                  //允許新一輪接收
  57.                                  }         
  58.                 }        
  59. }

  60. //定時器1溢出中斷:125.25us溢出一次
  61. void Timer1_ISR (void) interrupt 3              
  62. {  
  63.           if(Time1TimesCnt>=16) //計數1次時間為0.12525ms,16次為2.004ms
  64.     {
  65.                           Time1TimesCnt=1;
  66.                         
  67.                           if(Dispdata>=10.0)
  68.                                 {
  69.                                                 switch(LedUpdateCnt%7)//每隔4ms掃描一個數碼管,每輪掃描時長16ms<40ms(理論上人眼的視覺延遲感應速度為>=40ms)
  70.                                                 {
  71.                                                         case 0:  LED_Light(num[(int)(Dispdata/10.0)],1);break;
  72.                                                         case 2:  LED_Light(num[((int)Dispdata)%10]+0x80,2); break;
  73.                                                         case 4:  LED_Light(num[((int)(Dispdata*10.0))%10],3); break;
  74.                                                         case 6:  //LED_Light(num[21],4);break;
  75.                                                         default : break;
  76.                                                 }
  77.                                 }
  78.                                 else
  79.                                 {
  80.                                                 switch(LedUpdateCnt%7)//每隔4ms掃描一個數碼管,每輪掃描時長16ms<40ms(理論上人眼的視覺延遲感應速度為>=40ms)
  81.                                                 {
  82.                                                         case 0:  LED_Light(num[((int)Dispdata)%10]+0x80,1); break;
  83.                                                         case 2:  LED_Light(num[((int)(Dispdata*10.0))%10],2); break;
  84.                                                         case 4:  LED_Light(num[((int)(Dispdata*100.0))%10],3); break;
  85.                                                         case 6:  //LED_Light(num[21],4);break;
  86.                                                         default : break;
  87.                                                 }
  88.                                 
  89.                                 }
  90.                                                         
  91.                                 //112除以7=16
  92.                                 if(LedUpdateCnt<112) LedUpdateCnt++;
  93.                                 else //2.004ms*112=224.448ms更新一次顯示數據,掃16輪后切換一個新數據掃描
  94.                                 {   
  95.                                                 LedUpdateCnt=0;
  96.                                                 Dispdata=RecData/10.0;
  97.                                 }
  98.                                 
  99.                                 if(ShiftCnt<5000) ShiftCnt++;
  100.                                 else//5000*2ms=10S
  101.                                 {
  102.                                           if(ShiftDisplay) ShiftDisplay=0;
  103.                                           else ShiftDisplay=1;
  104.                                           ShiftCnt=0;
  105.                                 }
  106.     }
  107.                 else Time1TimesCnt++;

  108.           // 清除更新中斷標記,防止不斷進入中斷程序
  109.           clr_TF1;
  110. }

  111. //串口0中斷
  112. void SerialPort_ISR(void) interrupt 4
  113. {
  114.                 unsigned char i,Recev=0;                  //定義變量,用來轉存接收數據
  115.                
  116.                 if (RI)                                          /* if reception occur */
  117.                 {
  118.                                 clr_RI;                               /* clear reception flag for next reception */
  119.                                 Recev = SBUF;                         //收到的數值放在變量(暫存)中

  120.                           //接收到f7且之前未接收數據則緩存9個字節(一幀完整數據共9個字節)
  121.                           //例如:F7 10 04 01 13 00 5C 9E 9F (間隔500ms發送一次數據的前3個字節是固定的)
  122.         if(Recev==247 && receCount==0) Cache9Byte=1;//使能緩存9個字節
  123.                                 
  124.                           if(Cache9Byte)
  125.                                 {
  126.                                                  receBuf[receCount] = Recev;             //緩存
  127.                                                  receCount++;                            //接收計數加1
  128.                                        
  129.                                                  if(receCount==9)
  130.                                                  {
  131.                                                           if(receBuf[1]==16 && receBuf[2]==4)  //前3字節分別是:F7 10 04
  132.                                                                 {        
  133.                                             REN=0;//禁止接收
  134.                                                                                 Cache9Byte=0;                                                                       //緩存標志清理
  135.                                                                                 EnDatadeal=1;                                                                       //使能數據處理
  136.                                                                                 
  137.                                                                           //下面指令在程序處理完當前接收到的數據之后再執行
  138.                                                                                 //也就是下一輪接收僅再本輪接收完成的數據處理好后才允許再次進行
  139.                                                                                 //for(i=0;i<receCount;i++)receBuf[i]=0;          //清接收緩存
  140.                                                                                 //receCount = 0;                                                              //清接收數        
  141.                                                                           //EnDatadeal=0;                                                                            //數據處理完成
  142.                                                                           //REN=1;                                  //允許新一輪接收
  143.                                                     }
  144.                                                                 else
  145.                                                                 {
  146.                                                                                 //未能正常接收,清理已接收的緩存區,清理后重新來過,清理過程中禁止新的接收
  147.                                                                                 REN=0;//禁止接收
  148.                                                                                 for(i=0;i<receCount;i++)receBuf[i]=0;          //清接收緩存
  149.                                                                                 Cache9Byte=0;                                                                            //緩存標志清理
  150.                                                                                 receCount = 0;                                                              //清接收計數器
  151.                                                                                 REN=1;                                  //允許新一輪接收
  152.                                                                 }        
  153.                                     }
  154.                     }
  155.                 }               
  156.                 if(TI)          //接收中斷過程中禁止發送
  157.                 {
  158.                                 clr_TI;     /* if emission occur */
  159.                 }
  160. }

  161. void InitialUART0_Timer3(unsigned long u32Baudrate) //use timer3 as Baudrate generator
  162. {
  163.                 P06_Quasi_Mode;                //Setting UART pin as Quasi mode for transmit
  164.                 P07_Quasi_Mode;                //Setting UART pin as Quasi mode for transmit        
  165.         
  166.     SCON = 0x50;     //UART0 Mode1,REN=1,TI=1
  167.     set_SMOD;        //UART0 Double Rate Enable
  168.     T3CON &= 0xF8;   //T3PS2=0,T3PS1=0,T3PS0=0(Prescale=1)
  169.     set_BRCK;        //UART0 baud rate clock source = Timer3
  170.          
  171.           RH3 = ( (unsigned char)( (65536 - (1000000/u32Baudrate)-1) >>8  ) );                  /*16 MHz */
  172.           RL3 = ( (unsigned char)( (65536 - (1000000/u32Baudrate)-1) &0xff) );                        /*16 MHz */
  173.         
  174.     set_TR3;         //Trigger Timer3
  175.                 set_TI;                                         //For printf function must setting TI = 1
  176. }
復制代碼
0.png
所有資料51hei提供下載:
PH串口模塊 1米PH溫度電極 試劑采集器溫度傳感器酸堿度水質檢測.rar (105.39 KB, 下載次數: 61)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美成人免费在线视频 | 久久久久亚洲精品国产 | 羞羞视频免费观 | 日韩一二区 | 欧洲亚洲一区二区三区 | 成人三级视频在线观看 | 可以免费看的毛片 | 国产在线精品一区二区三区 | 国产一区2区 | 久久精品| 国产一区 日韩 | 成人亚洲网 | 国产一区二区免费 | 福利视频网址 | 青青草中文字幕 | 免费二区| 亚洲欧美日韩一区 | 国产超碰人人爽人人做人人爱 | 久久久免费电影 | 韩国精品在线观看 | 中文字幕日韩欧美 | 亚洲 欧美 日韩 精品 | 国产一区二区三区在线 | 一级黄色网页 | 亚洲瑟瑟 | 亚洲国产一区在线 | 成人在线免费网站 | 国产精品欧美一区二区三区不卡 | 一区欧美 | 日韩欧美一区二区三区四区 | 美日韩免费| 国产一级免费视频 | 午夜精品一区二区三区在线视频 | 亚洲欧美一区二区三区视频 | 草草影院ccyy | 秋霞av国产精品一区 | 一区二区在线 | 日韩精品一区二区在线 | 欧美日韩黄 | 精品欧美一区二区精品久久久 | 精品免费 |