找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3480|回复: 0
打印 上一主题 下一主题
收起左侧

N76E003单片机控制ph值传感器的源程序

[复制链接]
跳转到指定楼层
楼主
本设计是由单片机控制数码管显示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. }
复制代码

所有资料51hei提供下载:
PH串口模块 1米PH温度电极 试剂采集器温度传感器酸碱度水质检测.rar (105.39 KB, 下载次数: 61)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表