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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

N76E003單片機(jī)控制ph值傳感器的源程序

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

單片機(jī)源程序如下:
  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顯示更新計(jì)時(shí)
  8. unsigned char const num[]={      //數(shù)碼管段碼
  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;                  //用于顯示的數(shù)據(jù)
  16. unsigned int  Time1TimesCnt;     //定時(shí)器1定時(shí)溢出計(jì)數(shù)
  17. unsigned char ShiftDisplay=0;    //切換PH、溫度顯示標(biāo)志位
  18. unsigned int  ShiftCnt=0;        //切換顯示計(jì)數(shù)器
  19. unsigned int  RecData;           //接收到的數(shù)據(jù)
  20. unsigned char Cache9Byte=0;      //連續(xù)緩存9個(gè)字節(jié)標(biāo)志位
  21. unsigned char EnDatadeal=0;      //使能數(shù)據(jù)處理
  22. unsigned char receCount=0;       //接收到的字節(jié)個(gè)數(shù)
  23. unsigned char receBuf[11];       //接收緩存區(qū)
  24. unsigned char i;

  25. void main (void)
  26. {  
  27.           //TIMER1用于動(dòng)態(tài)掃描數(shù)碼管
  28.                 TIMER1_MODE2_ENABLE;
  29.           //未設(shè)置時(shí)鐘控制寄存器CKCON中的T1M(復(fù)位值為0),時(shí)鐘源為系統(tǒng)時(shí)鐘/12,計(jì)數(shù)周期為12/16M=0.75us
  30.           //TH1 = (256-TIMER1_CNTTIMES_VALUE);            
  31.     //TL1 = (256-TIMER1_CNTTIMES_VALUE);
  32.           TH1 = 89;                      //125.25us溢出一次(計(jì)數(shù)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 (有效數(shù)據(jù)是第4、5、6、7字節(jié))
  49.                                                 
  50.                                            if(ShiftDisplay) RecData=        (receBuf[3]<<8)| receBuf[4]; //轉(zhuǎn)換第4、5字節(jié)數(shù)據(jù)(溫度)
  51.                                                  else RecData=        (receBuf[5]<<8)| receBuf[6];             //轉(zhuǎn)換第6、7字節(jié)數(shù)據(jù)(PH值)
  52.                                          
  53.                                                  for(i=0;i<receCount;i++)receBuf[i]=0;                         //清接收緩存
  54.                                                  receCount = 0;                                                                               //清接收數(shù)        
  55.                                                  EnDatadeal=0;                                                                                           //數(shù)據(jù)處理完成
  56.                                                  REN=1;                                                  //允許新一輪接收
  57.                                  }         
  58.                 }        
  59. }

  60. //定時(shí)器1溢出中斷:125.25us溢出一次
  61. void Timer1_ISR (void) interrupt 3              
  62. {  
  63.           if(Time1TimesCnt>=16) //計(jì)數(shù)1次時(shí)間為0.12525ms,16次為2.004ms
  64.     {
  65.                           Time1TimesCnt=1;
  66.                         
  67.                           if(Dispdata>=10.0)
  68.                                 {
  69.                                                 switch(LedUpdateCnt%7)//每隔4ms掃描一個(gè)數(shù)碼管,每輪掃描時(shí)長16ms<40ms(理論上人眼的視覺延遲感應(yīng)速度為>=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掃描一個(gè)數(shù)碼管,每輪掃描時(shí)長16ms<40ms(理論上人眼的視覺延遲感應(yīng)速度為>=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更新一次顯示數(shù)據(jù),掃16輪后切換一個(gè)新數(shù)據(jù)掃描
  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.           // 清除更新中斷標(biāo)記,防止不斷進(jìn)入中斷程序
  109.           clr_TF1;
  110. }

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

  120.                           //接收到f7且之前未接收數(shù)據(jù)則緩存9個(gè)字節(jié)(一幀完整數(shù)據(jù)共9個(gè)字節(jié))
  121.                           //例如:F7 10 04 01 13 00 5C 9E 9F (間隔500ms發(fā)送一次數(shù)據(jù)的前3個(gè)字節(jié)是固定的)
  122.         if(Recev==247 && receCount==0) Cache9Byte=1;//使能緩存9個(gè)字節(jié)
  123.                                 
  124.                           if(Cache9Byte)
  125.                                 {
  126.                                                  receBuf[receCount] = Recev;             //緩存
  127.                                                  receCount++;                            //接收計(jì)數(shù)加1
  128.                                        
  129.                                                  if(receCount==9)
  130.                                                  {
  131.                                                           if(receBuf[1]==16 && receBuf[2]==4)  //前3字節(jié)分別是:F7 10 04
  132.                                                                 {        
  133.                                             REN=0;//禁止接收
  134.                                                                                 Cache9Byte=0;                                                                       //緩存標(biāo)志清理
  135.                                                                                 EnDatadeal=1;                                                                       //使能數(shù)據(jù)處理
  136.                                                                                 
  137.                                                                           //下面指令在程序處理完當(dāng)前接收到的數(shù)據(jù)之后再執(zhí)行
  138.                                                                                 //也就是下一輪接收僅再本輪接收完成的數(shù)據(jù)處理好后才允許再次進(jìn)行
  139.                                                                                 //for(i=0;i<receCount;i++)receBuf[i]=0;          //清接收緩存
  140.                                                                                 //receCount = 0;                                                              //清接收數(shù)        
  141.                                                                           //EnDatadeal=0;                                                                            //數(shù)據(jù)處理完成
  142.                                                                           //REN=1;                                  //允許新一輪接收
  143.                                                     }
  144.                                                                 else
  145.                                                                 {
  146.                                                                                 //未能正常接收,清理已接收的緩存區(qū),清理后重新來過,清理過程中禁止新的接收
  147.                                                                                 REN=0;//禁止接收
  148.                                                                                 for(i=0;i<receCount;i++)receBuf[i]=0;          //清接收緩存
  149.                                                                                 Cache9Byte=0;                                                                            //緩存標(biāo)志清理
  150.                                                                                 receCount = 0;                                                              //清接收計(jì)數(shù)器
  151.                                                                                 REN=1;                                  //允許新一輪接收
  152.                                                                 }        
  153.                                     }
  154.                     }
  155.                 }               
  156.                 if(TI)          //接收中斷過程中禁止發(fā)送
  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. }
復(fù)制代碼
0.png
所有資料51hei提供下載:
PH串口模塊 1米PH溫度電極 試劑采集器溫度傳感器酸堿度水質(zhì)檢測.rar (105.39 KB, 下載次數(shù): 61)


評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 精品一区二区电影 | 91精品国产综合久久久久 | 中文字幕一区二区三区精彩视频 | 免费一区在线观看 | 天天拍天天操 | 又爽又黄axxx片免费观看 | 人人人艹| 国产99热在线 | 大象视频一区二区 | 成人99| 国产91网址 | 涩爱av一区二区三区 | 亚洲一区二区三区 | 久久精品色欧美aⅴ一区二区 | 99精品视频在线 | 亚洲网站观看 | 国产精品99999 | 激情五月激情综合网 | 午夜免费观看体验区 | 中国美女一级黄色片 | 日韩欧美手机在线 | 中文字幕免费观看 | 久久久久午夜 | 99reav| www.99热.com| 欧美成视频 | 亚洲一区二区久久 | 亚洲成人a v| 久久av一区| 欧美一区在线看 | av一区二区三区 | 国产精品视频网 | 国产成人jvid在线播放 | 国产精品免费看 | 怡红院怡春院一级毛片 | 国产真实精品久久二三区 | 国产精品欧美一区喷水 | www.狠狠干 | 91精品国产色综合久久 | 亚洲成人国产 | 日本超碰|