c8051f单片机ad采样程序

发布者:数据舞者最新更新时间:2015-05-19 来源: 51hei关键字:c8051f  单片机  ad采样程序 手机看文章 扫描二维码
随时随地手机看文章
//------------------------------------------------------------------------------------
// Main.c
//------------------------------------------------------------------------------------
// Copyright (C) 2013 SINYD.
// BY Wbr
// Tool chain: KEIL Full  'c'
//
//#pragma CD OE DB SB                    // Compilation directives
//------------------------------------------------------------------------------------
// Includes
//------------------------------------------------------------------------------------
#ifndef C8051REG
#include "c8051f020.h"       // SFR declarations
#define C8051REG
#endif
#include "1302.h"
#include "lcd.h"
#include 
#define SYSCLK       22118400          //SYSCLK frequency in Hz
#define BAUDRATE     115200               //Baud rate of UART in bps               
#define SAR_CLK      2500000              //ADC conversion clock = 2.5MHz
#define ADC04V    645      //4毫安电流时AD采样初值  12位AD
#define ADPRE    175      //AD转温度时比值放大1000倍 即:(ADC-ADC04V)*ADPRE /1000
//*************温度标定设置**************
#define HTA    32       //线性方程0=0.4a-b;50=2.0a-b 求解得a = 31.25 b=12.5 分别取32和13
#define HTB    13
#define HRA    63       //线性方程0=0.4a-b;100=2.0a-b 求解得a = 62.5 b=25 分别取63和25
#define HRB    25
#define TEA    313      //线性方程0=0.4a-b;500=2.0a-b 求解得a = 312.5 b=125 分别取313和125
#define TEB    125
#define HPA    63       //线性方程-5=0.4a-b;5=2.0a-b 求解得a = 6.25 b=7.5 分别取63和75 放大10倍
#define HPB    75
//------------------------------------------------------------------------------------
// Global CONSTANTS
//------------------------------------------------------------------------------------
extern void Init_Device(void);
#define N 11
sfr16 TMR2 = 0xCC;        //定义成16位地址
sfr16 ADC0 = 0xBE;     
uint idata ADCbuffer1[N];
uint  sum = 0; 
uchar ADcount = 0;
uchar Page = 1,direction = 1,direction1 = 1;
uchar set = 0,ent = 0,Tset;
uchar TH,TL,TT1,TT2,TT3;        //用来拆分送显示的变量
uchar keybuffer[6];
uchar BGset=0;             //BGset背光关,开控制量,如果没有键按下超过1分钟,关闭背光!有键按下立刻开背光
bit Disptime,sendc;
sbit BLK = P3^6 ;          //LCD背光
uint  SPEEDcount1;          //计数器
uint  SPEEDcount2;          //计数 
uint  SPEEDTP;           //测试距离  V=SPEEDrange/SPEEDtime;
uint  SPEEDNY;
uint  TPrange = 0;
uint  TPcount = 0;
uint  idata TEMP1 = 0;
uint  idata TEMP2 = 0;
uint  idata TEMP3 = 0;
uint  idata TEMP4 = 0;
uint  idata HT = 0;
uint  idata HR = 0;
uint  idata HP = 0;
uint  idata HP1= 0;
uint  idata TPHD= 0;
uint  idata TPHD1= 0;
uint  idata TPHD2= 0;         //8路AD通道变量四路来料温度 环境温度湿度 横坡度 摊铺厚度
uchar idata  HPF,KT1F,KT2F,KT3F,KT4F,HTF,HRF;   //横坡传感器状态位  
long a;
//*******参数设置,传感器标定 变量和数组************************//
uchar xdata SZL0,SZH0,SZL1,SZH1,SZL2,SZH2;
uchar xdata SZL3,SZH3,SZL4,SZH4,SZL5,SZH5,SZL6,SZH6;  //0~2为施工站号,3~4,5~6分别为摊铺,压实输入长度
uchar code  CSSZ_c[7] _at_ 0x8000;             //7k的地址左右站号设置,摊铺碾压计算长度输入
uchar xdata CSSZ_x[7] _at_ 0x8000;
uchar xdata Between[7];          //0~11时间12~19存功率
////////////////////////////////////
//GPS数据存储数组
//uchar xdata A_V[1];       // V无效 A有效
//uchar xdata JD01[4];                //经度
//uchar xdata WD01[4];                //经度
uchar xdata JD[12] = {0x30,0x30,0x30,0x30,
       0x30,0x2e,0x30,0x30,
       0x30,0x30,0x30,0x30};  //经度  初始化送数字“0”
uchar xdata JD_a;                 //经度方向
uchar xdata WD[11] = {0x30,0x30,0x30,0x30,
       0x2e,0x30,0x30,0x30,
       0x30,0x30,0x30};    //纬度  初始化送数字“0”
uchar xdata WD_a;                 //纬度方向
//uchar xdata time[6];             //时间时分秒
//uchar xdata TIMER[6];       //年月日
//uchar xdata speed[5];             //速度
//uchar xdata HIGH[6] = {0x30,0x30,0x30,0x30,
       // 0x30,0x30};         //高度  初始化送数字“0”
//uchar xdata angle[5];             //方位角
//uchar xdata use_sat[2];            //使用的卫星数
//uchar xdata total_sat[2];         //天空中总卫星数
//uchar lock;                  //定位状态
//串口中断需要的变量
uchar xdata seg_count;             //逗号计数器
uchar xdata dot_count;             //小数点计数器
uchar xdata byte_count;             //位数计数器
uchar xdata cmd_number;             //命令类型
uchar xdata mode;                    //0:结束模式,1:命令模式,2:数据模式
uchar xdata buf_full;                //1:整句接收完成,相应数据有效。0:缓存数据无效。
uchar xdata cmd[5];                 //命令类型存储数组
extern  uchar  time_buf1[8] ;
uchar  code tab0[]={"料温:"};
uchar  code tab1[]={"料温1:"};
uchar  code tab2[]={"料温2:"};
uchar  code tab3[]={"料温3:"};
uchar  code tab4[]={"料温4:"};
uchar  code tab5[]={"环境温度:"};
uchar  code tab6[]={"环境湿度:"};
uchar  code tab7[]={"横坡度:"};
uchar  code tab8[]={"℃"};
//uchar  code tab9[]={"沥青摊铺厚度:"};
uchar  code tab10[]={"纬度:"};
uchar  code tab11[]={"经度:"};
uchar  code tab12[]={"高度:"};
uchar  code tab13[]={"设备ID:"};
uchar  code tab14[]={"摊铺S(mm):"};
uchar  code tab15[]={"碾压S(mm):"};
uchar  code page0[]={"参数设置:"};
uchar  code page1[]={"摊铺压实监测装置"};
uchar  code page2[]={"实时显示"};
uchar  code page41[]={"摊铺速度:"};
uchar  code page42[]={"碾压速度:"};
//uchar  code page5[]={"传感器标定:"};
uchar  code page5[]={"沥青摊铺厚度:"};
uchar  code page51[]={"前探头:"};
uchar  code page52[]={"后探头:"};
uchar  code page6[]={"实时定位信息:"};
uchar  code page7[]={"修改时间:"};
uchar  code run1[]={"先按:SET再按:ENT"};
uchar  code run2[]={"未连接"};
uchar  code run3[]={"%"};
uchar  code run4[]={"M/MIN"};
uchar  code run5[]={"KM/H"};
uchar  code run6[]={"线路故障"};
uchar  xdata TAB[11]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x20};//数字0~9及显示空白0x20*/
uchar code tab32[] ={
/*--  宽度x高度=128x64  --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xE0,0x1F,0xC0,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x00,0x00,0x00,0x01,0xC0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x0F,0xC0,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x0F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x1F,0x00,0x1F,0xFE,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x7E,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x01,0xF8,0x00,0xFC,0x00,0x1E,0x3E,0x01,0xFE,0x01,0xFF,0xFF,0x80,0x00,
0x00,0x00,0x03,0xF0,0x01,0xF8,0x00,0x1E,0x3E,0x01,0xEF,0x03,0xFF,0xFF,0xC0,0x00,
0x00,0x00,0x0F,0xC0,0x01,0xF0,0x00,0x3C,0x7F,0x03,0xCF,0x07,0x9F,0xFF,0xC0,0x00,
0x00,0x00,0x1F,0x80,0x01,0xF0,0x00,0x3C,0x7F,0x03,0xC7,0x8F,0x1C,0x07,0xC0,0x00,
0x00,0x00,0x3F,0x00,0x01,0xE0,0x00,0x7C,0x7F,0x83,0xC7,0x9E,0x38,0x07,0x80,0x00,
0x00,0x00,0x3F,0x00,0x01,0xE1,0xE0,0x78,0xFF,0x87,0x83,0xFC,0x38,0x07,0x80,0x00,
0x00,0x00,0x7E,0x00,0x00,0xF0,0xF8,0x78,0xF3,0xC7,0x83,0xF8,0x78,0x07,0x80,0x00,
0x00,0x00,0xFC,0x00,0x00,0x00,0xF8,0xF8,0xF3,0xC7,0x81,0xF0,0x70,0x0F,0x00,0x00,
0x00,0x00,0xFC,0x00,0x00,0x00,0xFC,0xF1,0xE1,0xEF,0x01,0xE0,0x70,0x0F,0x00,0x00,
0x00,0x00,0xFC,0x00,0x00,0x01,0xF8,0xF1,0xE1,0xFF,0x03,0xE0,0x70,0x0F,0x00,0x00,
0x00,0x01,0xFC,0x00,0x00,0x03,0xF9,0xF1,0xE0,0xFF,0x03,0xC0,0xE0,0x1E,0x00,0x00,
0x00,0x01,0xFC,0x00,0x00,0x07,0xF1,0xE3,0xC0,0xFE,0x03,0xC0,0xFF,0xFE,0x00,0x00,
0x00,0x01,0xFC,0x00,0x00,0x3F,0xE1,0xE3,0xC0,0x7E,0x07,0xC0,0xFF,0xFE,0x00,0x00,
0x00,0x00,0xFE,0x00,0x1F,0xFF,0x83,0xE7,0xC0,0x7E,0x07,0x81,0xFF,0xFC,0x00,0x00,
0x00,0x00,0xFC,0x00,0x03,0xF8,0x00,0x80,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x1C,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x06,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x22,0x10,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x02,0x19,0x81,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x22,0x18,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x02,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x7F,0x67,0xF0,0x00,0x0F,0xE3,0x8E,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x73,0xCE,0x00,0x00,0x07,0x83,0x8E,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x71,0x8C,0x00,0x00,0x07,0x83,0x86,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x63,0x1E,0x00,0x00,0x07,0x1F,0xCE,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x01,0xFF,0xDF,0xC0,0x00,0x07,0x3F,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x18,0x18,0xC0,0x00,0x0F,0x03,0x80,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x18,0x38,0xCF,0xFF,0xCE,0x03,0x80,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x01,0xFF,0xB9,0xCF,0xFF,0xCE,0x03,0xC0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x78,0x39,0x80,0x00,0x0E,0x03,0xC0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x01,0xFE,0x31,0x80,0x00,0x1E,0x03,0xC0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x03,0xFE,0x73,0x80,0x00,0x1C,0x03,0xC0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x03,0x76,0x73,0x00,0x00,0x1C,0x01,0xC0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x06,0x76,0x63,0x00,0x00,0x3C,0x01,0xC0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x04,0xE6,0xE7,0x00,0x00,0x38,0x01,0xC0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x0D,0xE6,0xE6,0x00,0x00,0x38,0x01,0xF0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
//---------------------------------------- 
// Function PROTOTYPES
//----------------------------------------
void delayms(uint ms)
{
 uint Temp;
 while(ms--)
  {
   Temp=2000;
   while(Temp--);
   {
     //PCA0CPH2 = 1;
   }
  }
}
//===========================================
//写FLASH函数
//===========================================
void Flash_Erase_CSSZ()                //flash擦除充电时间和功率
{
 EA =0;
    FLSCL |= 0x01;                          // 
 PSCTL |= 0x03;                       //允许擦,允许写
  CSSZ_x[0] = 0;
 PSCTL &= 0xfc;                       //禁止写,禁止擦
 FLSCL &= 0xfe; 
}
void Flash_Program_CSSZ()              //flash写入充电时间时间和功率
{
 uchar j;
 EA =0;                  
    FLSCL |= 0x01;                          //使能FLASH单稳态定时器,FLASH读时间SYSCLK<=25MHz
  PSCTL |= 0x01;                    //write enable
  for(j =0;j<7;j++)
  {
    CSSZ_x[j] = Between[j];
   }
   PSCTL &= 0xfc;                       //禁止写
 FLSCL &= 0xfe;
   EA = 1;
}
//================================
//中值滤波程序
//================================
void filter()
{
   static uchar count,i,j;
   uint xdata value_buf[N];
   uint temp;
   sum=0;
   for(count=0;countvalue_buf[i+1] )
            {
              temp = value_buf[i];
              value_buf[i] = value_buf[i+1]; 
              value_buf[i+1] = temp;
            }
        }
    }
  for(count=1;count1)
        {
         BGset = 2;
        }
      }
    }   
  }
 if(BGset ==2 )
 {
 if(!(Mkey&0x08))           //ESC按下吗?  P63
  {
   delayms(200);        //消抖
   if(!(Mkey&0x08))        //再判断
    {
     BGset =2;       //开背光
     //if(k<1) {Page = 0;}     //页面0:显示版本信息状态  
     //k++;
     //if(k>1) {k =0;Page = 1; }   //再按后退出
     Page = 1;
     set = 0;
    } 
  }
 if(!(Mkey&0x10))           //DATA按下吗?  P64
  {
   delayms(200);        //消抖
   if(!(Mkey&0x10))        //再判断
    {
     BGset =2;       //开背光
     //if(k<1) {Page = 0;}     //页面0:显示版本信息状态  
     //k++;
     //if(k>1) {k =0;Page = 1; }   //再按后退出
     Page = 0;
     set = 0;
    } 
  }
 if(!set)
  {
   if(!(Mkey&0x80))        //--->按下吗?下翻
    {
     delayms(200);
     if(!(Mkey&0x80))
      {
       if(Page !=0)
        {
         Page++;
         BGset =2;
         if(Page>7)     //如果超过7界面回到1画面
          {
           Page = 1;
          }
        }
      } 
    }
   if(!(Mkey&0x20))        //<---按下吗?上翻
    {
     delayms(200);
     if(!(Mkey&0x20))
      {
       if(Page !=0)
        {
         Page--;
         BGset =2;
         if(Page<1)     //小于1画面后不显示0画面,显示7画面
          {
           Page = 7;
          }
        }
      } 
    }
  }
//************************************************
//设置参数
//************************************************
 if(Page ==0)
  {
   if(!(Mkey&0x02))          //SET按下吗?设定SET在0画面设置参数
    {
     delayms(200);
     if(!(Mkey&0x02))
      {
       BGset =2;
       set = 1;       //如果按下SET键表示开始设置时间,置设置标志位;
      }
    }
   if(set == 1)
    {
     if(!(Mkey&0x20))        //<- 按下吗?左移<- 在0画面修改参数
      {
       delayms(200);
       if(!(Mkey&0x20))
        {
         BGset =2;
         direction1++;
         if(direction1 > 14)
          {
           direction1 = 1;  //本界面14个数字要修改
          }
        }
      }
     if(!(Mkey&0x80))        //->按下吗?右移->只在0画面修改时间
      {
       delayms(200);
       if(!(Mkey&0x80))
        {
         BGset =2;
         direction1--;
         if(direction1 < 1)
          { 
           direction1 = 14;
          }   
        } 
      }
     switch(direction1)
      {
       case 1:              //第一位修改
        {
         //number_disp (0x97,1,TAB[SZH0],TAB[SZL0]);    //把前面的显示了
         number_disp (0x96,1,TAB[SZH1],TAB[SZL1]);
         number_disp (0x95,1,TAB[SZH2],TAB[SZL2]);
         number_disp (0x8f,1,TAB[SZH3],TAB[SZL3]); 
         number_disp (0x8e,1,TAB[SZH4],TAB[SZL4]);
         number_disp (0x9f,1,TAB[SZH5],TAB[SZL5]);
         number_disp (0x9e,1,TAB[SZH6],TAB[SZL6]);
         if(!(Mkey&0x01))          //+按下吗?
          {
           delayms(200);
           if(!(Mkey&0x01))
            {
             BGset =2;
             SZL0++;
             if(SZL0>9)       //设置,不超过9
              {
               SZL0 = 0;
              }
            } 
          }
         /*if(!(Mkey&0x10))          //-按下吗?
          {
           delayms(200);
           if(!(Mkey&0x10))
            {
             BGset =2;
             if(SZL0<=0)       //小于1画面后不显示0画面
              {
               SZL0 = 9;
              }
             SZL0--;
            } 
          }*/
         if(Tset < 2)
          {
           number_disp (0x97,1,TAB[SZH0],TAB[SZL0]);
          }
         if(Tset>2)
          {
           number_disp (0x97,1,TAB[SZH0],0x20);        //定时送灭状态,实现闪烁
          }
        }break;
       case 2://第二位修改
        {
         number_disp (0x97,1,TAB[SZH0],TAB[SZL0]);     //把前面的显示了
         if(!(Mkey&0x01))          //+按下吗?
          {
           delayms(200);
           if(!(Mkey&0x01))
            {
             BGset =2;
             SZH0++;
             if(SZH0>9)       //设置,不超过9
              {
               SZH0 = 0;
              }
            } 
          }
        
         if(Tset < 2)
          {
           number_disp (0x97,1,TAB[SZH0],TAB[SZL0]);
          }
         if(Tset>2)
          {
           number_disp (0x97,1,0x20,TAB[SZL0]);        //定时送灭状态,实现闪烁
          }
        }break;
       case 3://第三位修改
        {
         number_disp (0x97,1,TAB[SZH0],TAB[SZL0]);     //把前面的显示了
         if(!(Mkey&0x01))          //+按下吗?
          {
           delayms(200);
           if(!(Mkey&0x01))
            {
             BGset =2;
             SZL1++;
             if(SZL1>9)       //设置,不超过9
              {
               SZL1 = 0;
              }
            } 
          }
        
         if(Tset < 2)
          {
           number_disp (0x96,1,TAB[SZH1],TAB[SZL1]);
          }
         if(Tset>2)
          {
           number_disp (0x96,1,TAB[SZH1],0x20);        //定时送灭状态,实现闪烁
          }
        }break;
       case 4://第4位修改
        {
         number_disp (0x97,1,TAB[SZH0],TAB[SZL0]);     //把前面的显示了
         number_disp (0x96,1,TAB[SZH1],TAB[SZL1]);
         if(!(Mkey&0x01))          //+按下吗?
          {
           delayms(200);
           if(!(Mkey&0x01))
            {
             BGset =2;
             SZH1++;
             if(SZH1>9)       //设置,不超过9
              {
               SZH1 = 0;
              }
            } 
          }
        
         if(Tset < 2)
          {
           number_disp (0x96,1,TAB[SZH1],TAB[SZL1]);
          }
         if(Tset>2)
          {
           number_disp (0x96,1,0x20,TAB[SZL1]);            //定时送灭状态,实现闪烁
          }
        }break;
       case 5://第5位修改
        {
         number_disp (0x97,1,TAB[SZH0],TAB[SZL0]);      //把前面的显示了
         number_disp (0x96,1,TAB[SZH1],TAB[SZL1]); 
         if(!(Mkey&0x01))           //+按下吗?
          {
           delayms(200);
           if(!(Mkey&0x01))
            {
             BGset =2;
             SZL2++;
             if(SZL2>9)        //设置,不超过9
              {
               SZL2 = 0;
              }
            } 
          }
        
         if(Tset < 2)
          {
           number_disp (0x95,1,TAB[SZH2],TAB[SZL2]);
          }
         if(Tset>2)
          {
           number_disp (0x95,1,TAB[SZH2],0x20);            //定时送灭状态,实现闪烁
          }
        }break;
       case 6://第6位修改
        {
         number_disp (0x97,1,TAB[SZH0],TAB[SZL0]);      //把前面的显示了
         number_disp (0x96,1,TAB[SZH1],TAB[SZL1]);
         if(!(Mkey&0x01))           //+按下吗?
          {
           delayms(200);
           if(!(Mkey&0x01))
            {
             BGset =2;
             SZH2++;
             if(SZH2>9)        //设置,不超过9
              {
               SZH2 = 0;
              }
            } 
          }
        
         if(Tset < 2)
          {
           number_disp (0x95,1,TAB[SZH2],TAB[SZL2]);
          }
         if(Tset>2)
          {
           number_disp (0x95,1,0x20,TAB[SZL2]);            //定时送灭状态,实现闪烁
          }
        }break;
       case 7://第7位修改
        {
         number_disp (0x97,1,TAB[SZH0],TAB[SZL0]);      //把前面的显示了
         number_disp (0x96,1,TAB[SZH1],TAB[SZL1]);
         number_disp (0x95,1,TAB[SZH2],TAB[SZL2]); 
         if(!(Mkey&0x01))           //+按下吗?
          {
           delayms(200);
           if(!(Mkey&0x01))
            {
             BGset =2;
             SZL3++;
             if(SZL3>9)        //设置,不超过9
              {
               SZL3 = 0;
              }
            } 
          }
        
         if(Tset < 2)
          {
           number_disp (0x8f,1,TAB[SZH3],TAB[SZL3]);
          }
         if(Tset>2)
          {
           number_disp (0x8f,1,TAB[SZH3],0x20);            //定时送灭状态,实现闪烁
          }
        }break;
       case 8://第8位修改
        {
         number_disp (0x97,1,TAB[SZH0],TAB[SZL0]);      //把前面的显示了
         number_disp (0x96,1,TAB[SZH1],TAB[SZL1]);
         number_disp (0x95,1,TAB[SZH2],TAB[SZL2]);
         if(!(Mkey&0x01))           //+按下吗?
          {
           delayms(200);
           if(!(Mkey&0x01))
            {
             BGset =2;
             SZH3++;
             if(SZH3>9)        //设置,不超过9
              {
               SZH3 = 0;
              }
            } 
          }
        
         if(Tset < 2)
          {
           number_disp (0x8f,1,TAB[SZH3],TAB[SZL3]);
          }
         if(Tset>2)
          {
           number_disp (0x8f,1,0x20,TAB[SZL3]);            //定时送灭状态,实现闪烁
          }
        }break;
       case 9://第9位修改
        {
         number_disp (0x97,1,TAB[SZH0],TAB[SZL0]);      //把前面的显示了
         number_disp (0x96,1,TAB[SZH1],TAB[SZL1]);
         number_disp (0x95,1,TAB[SZH2],TAB[SZL2]);
         number_disp (0x8f,1,TAB[SZH3],TAB[SZL3]); 
         if(!(Mkey&0x01))           //+按下吗?
          {
           delayms(200);
           if(!(Mkey&0x01))
            {
             BGset =2;
             SZL4++;
             if(SZL4>9)        //设置,不超过9
              {
               SZL4 = 0;
              }
            } 
          }
        
         if(Tset < 2)
          {
           number_disp (0x8e,1,TAB[SZH4],TAB[SZL4]);
          }
         if(Tset>2)
          {
           number_disp (0x8e,1,TAB[SZH4],0x20);            //定时送灭状态,实现闪烁
          }
        }break;
       case 10://第10位修改
        {
         number_disp (0x97,1,TAB[SZH0],TAB[SZL0]);      //把前面的显示了
         number_disp (0x96,1,TAB[SZH1],TAB[SZL1]);
         number_disp (0x95,1,TAB[SZH2],TAB[SZL2]);
         number_disp (0x8f,1,TAB[SZH3],TAB[SZL3]); 
         if(!(Mkey&0x01))           //+按下吗?
          {
           delayms(200);
           if(!(Mkey&0x01))
            {
             BGset =2;
             SZH4++;
             if(SZH4>9)        //设置,不超过9
              {
               SZH4 = 0;
              }
            } 
          }
        
         if(Tset < 2)
          {
           number_disp (0x8e,1,TAB[SZH4],TAB[SZL4]);
          }
         if(Tset>2)
          {
           number_disp (0x8e,1,0x20,TAB[SZL4]);            //定时送灭状态,实现闪烁
          }
        }break;
       case 11://第11位修改
        {
         number_disp (0x97,1,TAB[SZH0],TAB[SZL0]);      //把前面的显示了
         number_disp (0x96,1,TAB[SZH1],TAB[SZL1]);
         number_disp (0x95,1,TAB[SZH2],TAB[SZL2]);
         number_disp (0x8f,1,TAB[SZH3],TAB[SZL3]);
         number_disp (0x8e,1,TAB[SZH4],TAB[SZL4]);
         if(!(Mkey&0x01))           //+按下吗?
          {
           delayms(200);
           if(!(Mkey&0x01))
            {
             BGset =2;
             SZL5++;
             if(SZL5>9)        //设置,不超过9
              {
               SZL5 = 0;
              }
            } 
          }
        
         if(Tset < 2)
          {
           number_disp (0x9f,1,TAB[SZH5],TAB[SZL5]);
          }
         if(Tset>2)
          {
           number_disp (0x9f,1,TAB[SZH5],0x20);            //定时送灭状态,实现闪烁
          }
        }break;
       case 12://第12位修改
        {
         number_disp (0x97,1,TAB[SZH0],TAB[SZL0]);      //把前面的显示了
         number_disp (0x96,1,TAB[SZH1],TAB[SZL1]);
         number_disp (0x95,1,TAB[SZH2],TAB[SZL2]);
         number_disp (0x8f,1,TAB[SZH3],TAB[SZL3]); 
         number_disp (0x8e,1,TAB[SZH4],TAB[SZL4]);
         if(!(Mkey&0x01))           //+按下吗?
          {
           delayms(200);
           if(!(Mkey&0x01))
            {
             BGset =2;
             SZH5++;
             if(SZH5>9)        //设置,不超过9
              {
               SZH5 = 0;
              }
            } 
          }
        
         if(Tset < 2)
          {
           number_disp (0x9f,1,TAB[SZH5],TAB[SZL5]);
          }
         if(Tset>2)
          {
           number_disp (0x9f,1,0x20,TAB[SZL5]);            //定时送灭状态,实现闪烁
          }
        }break;
       case 13://第11位修改
        {
         number_disp (0x97,1,TAB[SZH0],TAB[SZL0]);      //把前面的显示了
         number_disp (0x96,1,TAB[SZH1],TAB[SZL1]);
         number_disp (0x95,1,TAB[SZH2],TAB[SZL2]);
         number_disp (0x8f,1,TAB[SZH3],TAB[SZL3]);
         number_disp (0x8e,1,TAB[SZH4],TAB[SZL4]);
         number_disp (0x9f,1,TAB[SZH5],TAB[SZL5]);
         if(!(Mkey&0x01))           //+按下吗?
          {
           delayms(200);
           if(!(Mkey&0x01))
            {
             BGset =2;
             SZL6++;
             if(SZL6>9)        //设置,不超过9
              {
               SZL6 = 0;
              }
            } 
          }
        
         if(Tset < 2)
          {
           number_disp (0x9e,1,TAB[SZH6],TAB[SZL6]);
          }
         if(Tset>2)
          {
           number_disp (0x9e,1,TAB[SZH6],0x20);            //定时送灭状态,实现闪烁
          }
        }break;
       case 14://第12位修改
        {
         number_disp (0x97,1,TAB[SZH0],TAB[SZL0]);      //把前面的显示了
         number_disp (0x96,1,TAB[SZH1],TAB[SZL1]);
         number_disp (0x95,1,TAB[SZH2],TAB[SZL2]);
         number_disp (0x8f,1,TAB[SZH3],TAB[SZL3]); 
         number_disp (0x8e,1,TAB[SZH4],TAB[SZL4]);
         number_disp (0x9f,1,TAB[SZH5],TAB[SZL5]);
         if(!(Mkey&0x01))           //+按下吗?
          {
           delayms(200);
           if(!(Mkey&0x01))
            {
             BGset =2;
             SZH6++;
             if(SZH6>9)        //设置,不超过9
              {
               SZH6 = 0;
              }
            } 
          }
        
         if(Tset < 2)
          {
           number_disp (0x9e,1,TAB[SZH6],TAB[SZL6]);
          }
         if(Tset>2)
          {
           number_disp (0x9e,1,0x20,TAB[SZL6]);            //定时送灭状态,实现闪烁
          }
        }break;
       default:break;
      }
     if(!(Mkey&0x04))          //ENT按下吗?确认ENT 在0画面设定参数
      {
       delayms(200);
       if(!(Mkey&0x04))
        {
         BGset =2;
         Between[0] = SZH0*10 + SZL0;
         Between[1] = SZH1*10 + SZL1;
         Between[2] = SZH2*10 + SZL2;
         Between[3] = SZH3*10 + SZL3;
         Between[4] = SZH4*10 + SZL4;
         Between[5] = SZH5*10 + SZL5;
         Between[6] = SZH6*10 + SZL6;                                            
         Flash_Erase_CSSZ(); 
         Flash_Program_CSSZ();                   //写入FLASH
         set = 0;
         Page = 1;       //退出到1画面
        } 
      }
    }    
  }[page]
//***********************************************
//修改时间
//***********************************************
 if(Page ==7)            //修改时间界面
  { 
   if(!(Mkey&0x02))          //SET按下吗?设定SET只在7画面设置时间
    {
     delayms(200);
     if(!(Mkey&0x02))
      {
       BGset =2;
       set = 2;       //如果按下SET键表示开始设置时间,置设置标志位;
      } 
    }
   if(set == 2)
    {
     if(!(Mkey&0x20))        //<- 按下吗?左移<- 只在7画面修改时间
      {
       delayms(200);
       if(!(Mkey&0x20))
        {
         BGset =2;
         direction--;
         if(direction < 1)
          {
           direction = 6;
          }
        }
      }
     if(!(Mkey&0x80))        //->按下吗?右移->只在7画面修改时间
      {
       delayms(200);
       if(!(Mkey&0x80))
        {
         BGset =2;
         direction++;
         if(direction > 6)
          { 
           direction = 1;
          }   
        } 
      }
     switch(direction)
      {
       case 1:
        {
         if(!(Mkey&0x01))        //+按下吗?
          {
           delayms(200);
           if(!(Mkey&0x01))
            {
             BGset =2;
             keybuffer[0]++;
             if(keybuffer[0]>99)   //年设置,不超过100年
              {
               keybuffer[0] = 13;
              }
            } 
          }
         if(!(Mkey&0x40))        //-按下吗?
          {
           delayms(200);
           if(!(Mkey&0x40))
            {
             BGset =2;
             keybuffer[0]--;
             if(keybuffer[0]<13)     //小于1画面后不显示0画面,显示6画面
              {
               keybuffer[0] = 13;
              }
            } 
          }
         if(Tset < 2)
          {
           TH = keybuffer[0]/10;
           TL = keybuffer[0]%10;
           number_disp (0x8a,1,TAB[TH],TAB[TL]);
          }
         if(Tset>2)
          {
           number_disp (0x8a,1,0x20,0x20);            //定时送灭状态,实现闪烁
          }
        }break;
       case 2:
        {
         TH = keybuffer[0]/10;
         TL = keybuffer[0]%10;
         number_disp (0x8a,1,TAB[TH],TAB[TL]);
         if(!(Mkey&0x01))        //+按下吗?
          {
           delayms(200);
           if(!(Mkey&0x01))
            {
             BGset =2;
             keybuffer[1]++;
             if(keybuffer[1]>12)   //月设置,不超过12月
              {
               keybuffer[1] = 1;
              }
            } 
          }
         if(!(Mkey&0x40))        //-按下吗?
          {
           delayms(200);
           if(!(Mkey&0x40))
            {
             BGset =2;
             keybuffer[1]--;
             if(keybuffer[1]<1)     //小于1 显示12月
              {
               keybuffer[1] = 12;
              }
            } 
          }
         if(Tset < 2)
          {
           TH = keybuffer[1]/10;
           TL = keybuffer[1]%10;
           number_disp (0x8c,1,TAB[TH],TAB[TL]);
          }
         if(Tset>2)
          {
           number_disp (0x8c,1,0x20,0x20);   //定时送灭状态,实现闪烁
          }
         
        }break;
       case 3:
        {
         TH = keybuffer[1]/10;
         TL = keybuffer[1]%10;
         number_disp (0x8c,1,TAB[TH],TAB[TL]);
         if(!(Mkey&0x01))           //+按下吗?
          {
           delayms(200);
           if(!(Mkey&0x01))
            {
             BGset =2;
             keybuffer[2]++;
             if(keybuffer[2]>31)     //日设置,不超过31日
              {
               keybuffer[2] = 1;
              }
            } 
          }
         if(!(Mkey&0x40))           //-按下吗?
          {
           delayms(200);
           if(!(Mkey&0x40))
            {
             BGset =2;
             keybuffer[2]--;
             if(keybuffer[2]<1)     //小于1,显示31日
              {
               keybuffer[2] = 31;
              }
            } 
          }
         if(Tset<2)
          {
           TH = keybuffer[2]/10;
           TL = keybuffer[2]%10;
           number_disp (0x8e,1,TAB[TH],TAB[TL]);
          }
         if(Tset>2)
          {
           number_disp (0x8e,1,0x20,0x20);       //定时送灭状态,实现闪烁
          }
        }break;
       case 4:
        {
         TH = keybuffer[2]/10;
         TL = keybuffer[2]%10;
         number_disp (0x8e,1,TAB[TH],TAB[TL]);
         if(!(Mkey&0x01))           //+按下吗?
          {
           delayms(200);
           if(!(Mkey&0x01))
            {
             BGset =2;
             keybuffer[3]++;
             if(keybuffer[3]>23)     //时设置,不超过24
              {
               keybuffer[3] = 0;
              }
            } 
          }
         if(!(Mkey&0x40))           //-按下吗?
          {
           delayms(200);
           if(!(Mkey&0x40))
            {
             BGset =2;
             keybuffer[3]--;
             if(keybuffer[3]<=0)     //小于1,显示23
              {
               keybuffer[3] = 23;
              }
            } 
          }
         if(Tset < 2)
          {
           TH = keybuffer[3]/10;
           TL = keybuffer[3]%10;
           number_disp (0x9A,1,TAB[TH],TAB[TL]);
          }
         if(Tset>2)
          {
           number_disp (0x9A,1,0x20,0x20);
          }
         
        }break;
       case 5:
        {
         TH = keybuffer[3]/10;
         TL = keybuffer[3]%10;
         number_disp (0x9A,1,TAB[TH],TAB[TL]);
         if(!(Mkey&0x01))           //+按下吗?
          {
           delayms(200);
           if(!(Mkey&0x01))
            {
             BGset =2;
             keybuffer[4]++;
             if(keybuffer[4]>59)     //分设置,不超过59
              {
               keybuffer[4] = 0;
              }
            } 
          }
         if(!(Mkey&0x40))           //-按下吗?
          {
           delayms(200);
           if(!(Mkey&0x40))
            {
             BGset =2;
             keybuffer[4]--;
             if(keybuffer[4]<=0)     //小于1,显示59
              {
               keybuffer[4] = 59;
              }
            } 
          }
         if(Tset < 2)
          {
           TH = keybuffer[4]/10;
           TL = keybuffer[4]%10;
           number_disp (0x9C,1,TAB[TH],TAB[TL]);
          }
         if(Tset>2)
          {
           number_disp (0x9C,1,0x20,0x20);
          }
         
        }break;
       case 6:
        {
         TH = keybuffer[4]/10;
         TL = keybuffer[4]%10;
         number_disp (0x9C,1,TAB[TH],TAB[TL]);
         if(!(Mkey&0x01))           //+按下吗?
          {
           delayms(200);
           if(!(Mkey&0x01))
            {
             BGset = 2;
             keybuffer[5]++;
             if(keybuffer[5]>59)     //秒设置,不超过59
              {
               keybuffer[5] = 0;
              }
            } 
          }
         if(!(Mkey&0x40))           //-按下吗?
          {
           delayms(200);
           if(!(Mkey&0x40))
            {
             BGset = 2;
             keybuffer[5]--;
             if(keybuffer[5]<=0)     //小于1,显示59
              {
               keybuffer[5] = 59;
              }
            } 
          }
         if(Tset < 2)
          {
           TH = keybuffer[5]/10;
           TL = keybuffer[5]%10;
           number_disp (0x9E,1,TAB[TH],TAB[TL]);
          }
         if(Tset>2)
          {
           number_disp (0x9E,1,0x20,0x20);
          }
        }break;
       default:break;
      }
   if(!(Mkey&0x04))          //ENT按下吗?确认ENT 只在6画面设定时间
    {
     delayms(200);
     if(!(Mkey&0x04))
      {
       BGset =2;                                              
       for(i=0;i<6;i++)
        {
         time_buf1[i+1] = keybuffer[i]; 
        }
       Ds1302_Write_Time();     //写DS1302
       set = 0;
       Page = 1;       //退出到1画面
      } 
    }
   }    
  }
 }
} 
//===================================
//串口0 串口1发送函数
//===================================
void Uart0_SendData(uchar dat0)
{
   SBUF0=dat0;              //写SBUF0,开始发送
   while(!TI0);           //等待发送
   TI0=0;                   //清发送标志位
}
void Uart1_SendData(uchar dat1)
{
 SBUF1=dat1;              //写SBUF1,开始发送
   while(!(SCON1&0x02));
   SCON1 = (SCON1&0xfd);  
}
void Timer2_Init(int ct2s)
{
  RCAP2H = -ct2s/0xff;
 RCAP2L = -ct2s;
 }
//-----------------------------------------------------------------------------
// Main  年:0xC4EA 月:0xD4C2 日:0xC8D5 时:0xCAB1: 分0xB7D6: 秒:0xC3EB 的汉字内码
//-----------------------------------------------------------------------------
void main(void)
{
  
 //uint TEMP1,TEMP2,TEMP3,TEMP4,HT,HR,HP;        //8路AD通道变量四路来料温度 环境温度湿度 横坡度
 uchar i,j,Page1,BEW1,BEW2,BEW3,BEW4;         //BEW1,BEW2,BEW3,BEW4; 拆分显示的百,十,个位,小数点位中间变量
 Init_Device();
 P5 = 0xff;
 delayms(200);
 Ds1302_Init();
 init_lcd ();
 clrram ();                          
 ADC0CF = ((SYSCLK/SAR_CLK)-1)<<3;            // set SAR clock to 3MHz
 ADC1CF = ((SYSCLK/SAR_CLK)-1)<<3;            // set SAR clock to 3MHz
 ADC1CF    |= 0x01;              //ADC1增益设为1
 AD0EN = 1;                  //使能AC0启动转换
 ADC1CN &=~(0x80);               //使能AC1启动转换
 TMR3CN = 0x04;               //启动TM3
 EA = 1;
 Timer2_Init(SYSCLK/12/100);                     //10ms
 //Ds1302_Write_Time() ;
// Ds1302_Read_Time();
 for(j=0;j<7;j++)
  {
   Between[j] = CSSZ_c[j];           //读取FLASH 
  }
 SZH0 = Between[0]/10;
 SZL0 = Between[0]%10;
 SZH1 = Between[1]/10;
 SZL1 = Between[1]%10;
 SZH2 = Between[2]/10;
 SZL2 = Between[2]%10;
 SZH3 = Between[3]/10;
 SZL3 = Between[3]%10;
 SZH4 = Between[4]/10;
 SZL4 = Between[4]%10;
 SZH5 = Between[5]/10;
 SZL5 = Between[5]%10;
 SZH6 = Between[6]/10;
 SZL6 = Between[6]%10;
 if(SZL0>9) SZL0 = 0;
 if(SZH0>9) SZH0 = 0;
 if(SZL1>9) SZL1 = 0;
 if(SZH1>9) SZH1 = 0;
 if(SZL2>9) SZL2 = 0;
 if(SZH2>9) SZH2 = 0;
 if(SZL3>9) SZL3 = 0;
 if(SZH3>9) SZH3 = 0;
 if(SZL4>9) SZL4 = 0;
 if(SZH4>9) SZH4 = 0;
 if(SZL5>9) SZL5 = 0;
 if(SZH5>9) SZH5 = 0;
 if(SZL6>9) SZL6 = 0;
 if(SZH6>9) SZH6 = 0;
 img_disp (tab32);
 delayms(5000);
 ET2 = 1;
  TR2 = 1;
 BLK = 0;
 //Ds1302_Write_Time() ;
 while(1)
  {  
   key_scan();
   Ds1302_Read_Time();
   if(Page!=Page1)
    {
     clrram ();            //如果页面变化,需要清屏;
    }
   switch(Page)
    {
     case 1: //画面1:显示当前
      {
       string_disp (0x80,16,page1);
       number_disp (0x89,1,0x32,0x30);     //数字20
       number_disp (0x8b,1,0xc4,0xea);     //年
       number_disp (0x8d,1,0xd4,0xc2);     //月
       number_disp (0x8f,1,0xc8,0xd5);     //日
       number_disp (0x9b,1,0xca,0xb1);     //时
       number_disp (0x9d,1,0xb7,0xd6);     //分
       number_disp (0x9f,1,0xc3,0xeb);     //秒
       TH = time_buf1[1]/10;       //年
       TL = time_buf1[1]%10;
       number_disp (0x8a,1,TAB[TH],TAB[TL]); 
       TH = time_buf1[2]/10;       //月
       TL = time_buf1[2]%10;
       number_disp (0x8C,1,TAB[TH],TAB[TL]);
       TH = time_buf1[3]/10;       //日
       TL = time_buf1[3]%10;
       number_disp (0x8E,1,TAB[TH],TAB[TL]);
       TH = time_buf1[4]/10;       //时
       TL = time_buf1[4]%10;
       number_disp (0x9A,1,TAB[TH],TAB[TL]);
       TH = time_buf1[5]/10;       //分
       TL = time_buf1[5]%10;
       number_disp (0x9C,1,TAB[TH],TAB[TL]);
       TH = time_buf1[6]/10;       //秒
       TL = time_buf1[6]%10;
       number_disp (0x9E,1,TAB[TH],TAB[TL]);
       Page1=Page;          //保存当前页面值
      }break;
      case 2:
       {
        string_disp (0x82,8,page2);     //显示实时采集量
        string_disp (0x90,10,tab5);
        if(HTF)
         {
          string_disp (0x97,2,tab8);       //显示℃
          BEW2 = HT/100;          //环境温度十位
          BEW3 = (HT%100)/10;         //环境温度个位
          BEW4 = (HT%100)%10;         //环境温度小数位
          if(!BEW2)           //灭零处理
           {
            BEW2 = 10; 
           }
          number_disp (0x95,1,TAB[BEW2],TAB[BEW3]);
          number_disp (0x96,1,0x2E,TAB[BEW4]);
         }
        else
         {
          string_disp (0x95,6,run2); 
         }
        string_disp (0x88,10,tab6);
        if(HRF)
         {
          string_disp (0x8f,2,run3);       //显示%      //显示%
          BEW2 = HR/100;          //环境湿度十位
          BEW3 = (HR%100)/10;         //环境湿度个位
          BEW4 = (HR%100)%10;         //环境湿度小数位
          if(!BEW2)           //灭零处理
           {
            BEW2 = 10; 
           }
          number_disp (0x8D,1,TAB[BEW2],TAB[BEW3]);
          number_disp (0x8E,1,0x2E,TAB[BEW4]);
         }
        else
         {
          string_disp (0x8D,6,run2); 
         }
        string_disp (0x98,8,tab7);
        BEW2 = HP/100;        //横坡度十位
        BEW3 = (HP%100)/10;       //横坡度个位
        BEW4 = (HP%100)%10;       //横坡度小数位
        if(HPF == 0)          //负度数标志位
         {
          number_disp (0x9C,1,0x2d,0x20);
          number_disp (0x9D,1,TAB[BEW2],0x2E);
          number_disp (0x9E,1,TAB[BEW3],TAB[BEW4]);
          number_disp (0x9f,1,0x20,0x20);
         }
        if(HPF == 1)          //正度数标志位        
         {
          number_disp (0x9C,1,0x2b,0x20);
          number_disp (0x9D,1,TAB[BEW2],0x2E);
          number_disp (0x9E,1,TAB[BEW3],TAB[BEW4]);
          number_disp (0x9f,1,0x20,0x20);
         }
        if(HPF == 2)          //0度数标志位        
         {
          number_disp (0x9C,1,0x20,0x20);
          number_disp (0x9D,1,TAB[BEW2],0x2E);
          number_disp (0x9E,1,TAB[BEW3],TAB[BEW4]);
          number_disp (0x9f,1,0x20,0x20);
         }
        if(HPF == 3)          //未连接标志位        
         {
          string_disp (0x9d,6,run2);
          number_disp (0x9C,1,0x20,0x20);
         }
        Page1=Page;       
       }break;
      case 3: //显示来料温度 ADC04V 645   
       {
        string_disp (0x80,6,tab1);
        if(KT1F)
         {
          string_disp (0x86,2,tab8);       //显示℃
          BEW1 = TEMP1/1000;         //温度百位
          BEW2 = (TEMP1%1000)/100;       //温度十位
          BEW3 = ((TEMP1%1000)%100)/10;      //温度个位
          BEW4 = ((TEMP1%1000)%100)%10;      //温度小数位
          if(!BEW1)           //灭零处理
           {
            BEW1 = 10;
            if(!BEW2)
             {
              BEW2 = 10; 
             } 
           }
          number_disp (0x85,1,0x2E,TAB[BEW4]);
          number_disp (0x84,1,TAB[BEW2],TAB[BEW3]);
          number_disp (0x83,1,0x20,TAB[BEW1]);
         }
        else
         {
          string_disp (0x84,6,run2);     //显示“未连接”
          number_disp (0x83,1,0x20,0x20);   
         }
        string_disp (0x90,6,tab2);
        if(KT2F)
         {
          string_disp (0x96,2,tab8);       //显示℃
          BEW1 = TEMP2/1000;         //温度百位
          BEW2 = (TEMP2%1000)/100;       //温度十位
          BEW3 = ((TEMP2%1000)%100)/10;      //温度个位
          BEW4 = ((TEMP2%1000)%100)%10;      //温度小数位
          if(!BEW1)           //灭零处理
           {
            BEW1 = 10;
            if(!BEW2)
             {
              BEW2 = 10; 
             }
           } 
          number_disp (0x95,1,0x2E,TAB[BEW4]);
          number_disp (0x94,1,TAB[BEW2],TAB[BEW3]);
          number_disp (0x93,1,0x20,TAB[BEW1]);
         }
        else
         {
          number_disp (0x93,1,0x20,0x20);
          string_disp (0x94,6,run2); 
         } 
        string_disp (0x88,6,tab3);
        if(KT3F)
         {
          string_disp (0x8E,2,tab8);       //显示℃
          BEW1 = TEMP3/1000;         //温度百位
          BEW2 = (TEMP3%1000)/100;       //温度十位
          BEW3 = ((TEMP3%1000)%100)/10;      //温度个位
          BEW4 = ((TEMP3%1000)%100)%10;      //温度小数位
          if(!BEW1)           //灭零处理
           {
            BEW1 = 10;
            if(!BEW2)
             {
              BEW2 = 10; 
             } 
           }
          number_disp (0x8D,1,0x2E,TAB[BEW4]);
          number_disp (0x8C,1,TAB[BEW2],TAB[BEW3]);
          number_disp (0x8B,1,0x20,TAB[BEW1]);
         }
        else
         {
          number_disp (0x8B,1,0x20,0x20);
          string_disp (0x8C,6,run2);
         }
        string_disp (0x98,6,tab4);
        if(KT4F)
         {
          string_disp (0x9E,2,tab8);       //显示℃
          BEW1 = TEMP4/1000;         //温度百位
          BEW2 = (TEMP4%1000)/100;       //温度十位
          BEW3 = ((TEMP4%1000)%100)/10;      //温度个位
          BEW4 = ((TEMP4%1000)%100)%10;      //温度小数位
          if(!BEW1)           //灭零处理
           {
            BEW1 = 10;
            if(!BEW2)
             {
              BEW2 = 10; 
             } 
           }
          number_disp (0x9D,1,0x2E,TAB[BEW4]);
          number_disp (0x9C,1,TAB[BEW2],TAB[BEW3]);
          number_disp (0x9B,1,0x20,TAB[BEW1]);
         }
        else
         {
          number_disp (0x9B,1,0x20,0x20);
          string_disp (0x9C,6,run2);
         }
        Page1=Page;       
       }break;
      case 4: //
       {
        string_disp (0x80,10,page41);
        string_disp (0x88,10,page42); 
        if(SPEEDTP<9999)
         {
          BEW1 = SPEEDTP/1000;
          BEW2 = (SPEEDTP%1000)/100;       //温度十位
          BEW3 = ((SPEEDTP%1000)%100)/10;      //温度个位
          BEW4 = ((SPEEDTP%1000)%100)%10;
          if(!BEW1)           //灭零处理
           {
            BEW1 = 10; 
           }
          string_disp (0x95,6,run4);
          number_disp (0x94,1,TAB[BEW3],TAB[BEW4]);
          number_disp (0x93,1,TAB[BEW2],0x2E);
          number_disp (0x92,1,0x20,TAB[BEW1]);
         }
        else
         {
          string_disp (0x92,8,run6);
         }
        if(SPEEDNY<9999)
         {
          BEW1 = SPEEDNY/1000;
          BEW2 = (SPEEDNY%1000)/100;       //温度十位
          BEW3 = ((SPEEDNY%1000)%100)/10;      //温度个位
          BEW4 = ((SPEEDNY%1000)%100)%10;
          if(!BEW1)           //灭零处理
           {
            BEW1 = 10; 
           }
          string_disp (0x9d,4,run5);
          number_disp (0x9C,1,TAB[BEW3],TAB[BEW4]);
          number_disp (0x9B,1,TAB[BEW2],0x2E);
          number_disp (0x9A,1,0x20,TAB[BEW1]);
         }
        else
         {
          string_disp (0x9a,8,run6);
         }
        Page1=Page;       
       }break;
      case 5: //显示定位信息
       {  
        string_disp (0x80,14,page6);
        string_disp (0x98,6,tab10);
        number_disp (0x9b,1,WD[0],WD[1]);
        number_disp (0x9c,1,WD[2],WD[3]);
        number_disp (0x9d,1,WD[4],WD[5]);
        number_disp (0x9e,1,WD[6],WD[7]);
        number_disp (0x9f,1,WD[8],WD[9]);  
        string_disp (0x88,6,tab11);
        number_disp (0x8B,1,JD[0],JD[1]);
        number_disp (0x8C,1,JD[2],JD[3]);
        number_disp (0x8D,1,JD[4],JD[5]);
        number_disp (0x8E,1,JD[6],JD[7]);
        number_disp (0x8F,1,JD[8],JD[9]);
        //string_disp (0x98,6,tab12);
        //number_disp (0x9B,1,HIGH[0],HIGH[1]);
        //number_disp (0x9C,1,HIGH[2],HIGH[3]);
        //number_disp (0x9D,1,HIGH[4],HIGH[5]);
        Page1=Page;   
       }break;
      case 6: //传感器标定    厚度显示
       {  
        string_disp (0x80,8,page51);
        BEW1 = TPHD1/100;
        if(!BEW1)           //灭零处理
         {
          BEW1 = 10; 
         }
        BEW2 = (TPHD1%100)/10;
        BEW3 = (TPHD1%100)%10;
        number_disp (0x85,1,TAB[BEW1],TAB[BEW2]);
        number_disp (0x86,1,0x2E,TAB[BEW3]);
        number_disp (0x87,1,0x43,0x4d);
        
        string_disp (0x90,9,page52);
        BEW1 = TPHD2/100;
        if(!BEW1)           //灭零处理
         {
          BEW1 = 10; 
         }
        BEW2 = (TPHD2%100)/10;
        BEW3 = (TPHD2%100)%10;
        number_disp (0x95,1,TAB[BEW1],TAB[BEW2]);
        number_disp (0x96,1,0x2E,TAB[BEW3]);
        number_disp (0x97,1,0x43,0x4d);
        string_disp (0x88,13,page5);
        if (TPHD1>TPHD2)
         {
          TPHD = TPHD1 - TPHD2; 
         }
        else
         {
          TPHD = 0;
         }
        BEW1 = TPHD/100;
        if(!BEW1)           //灭零处理
         {
          BEW1 = 10; 
         }
        //if(BEW1>3)           //超过3,异常数,则清零
         //{
         // BEW1 = 10; 
        // }
        BEW2 = (TPHD%100)/10;
        BEW3 = (TPHD%100)%10;
        number_disp (0x9d,1,TAB[BEW1],TAB[BEW2]);
        number_disp (0x9e,1,0x2E,TAB[BEW3]);
        number_disp (0x9f,1,0x43,0x4d);
        Page1=Page;  
       }break;
      case 7: //修改时间
       {
        if(!(set==2))           //没有按SET键
         {
          string_disp (0x80,10,page7); 
          number_disp (0x89,1,0x32,0x30);     //数字20
          number_disp (0x8b,1,0xc4,0xea);     //年
          number_disp (0x8d,1,0xd4,0xc2);     //月
          number_disp (0x8f,1,0xc8,0xd5);     //日
          number_disp (0x9b,1,0xca,0xb1);     //时
          number_disp (0x9d,1,0xb7,0xd6);     //分
          number_disp (0x9f,1,0xc3,0xeb);     //秒
          TH = time_buf1[1]/10;       //年
          TL = time_buf1[1]%10;
          number_disp (0x8a,1,TAB[TH],TAB[TL]); 
          TH = time_buf1[2]/10;       //月
          TL = time_buf1[2]%10;
          number_disp (0x8C,1,TAB[TH],TAB[TL]);
          TH = time_buf1[3]/10;       //日
          TL = time_buf1[3]%10;
          number_disp (0x8E,1,TAB[TH],TAB[TL]);
          TH = time_buf1[4]/10;       //时
          TL = time_buf1[4]%10;
          number_disp (0x9A,1,TAB[TH],TAB[TL]);
          TH = time_buf1[5]/10;       //分
          TL = time_buf1[5]%10;
          number_disp (0x9C,1,TAB[TH],TAB[TL]);
          TH = time_buf1[6]/10;       //秒
          TL = time_buf1[6]%10;
          number_disp (0x9E,1,TAB[TH],TAB[TL]);
          for (j = 0;j<6;j++)
           {
            keybuffer[j] = time_buf1[j+1];
           }
         }
        Page1=Page;            //保存当前页面值 
       }break;
      case 0:               //显示故障状态
       {
        if(!(set==1))           //没有按SET键
         {
          number_disp (0x82,1,0xb2,0xce);     //参
          number_disp (0x83,1,0xca,0xfd);     //数
          number_disp (0x84,1,0xc9,0xe8);     //设
          number_disp (0x85,1,0xd6,0xc3);     //置
          string_disp (0x90,8,tab13);
          string_disp (0x88,10,tab14); 
          string_disp (0x98,10,tab15);
          number_disp (0x95,1,TAB[SZH2],TAB[SZL2]);
          number_disp (0x96,1,TAB[SZH1],TAB[SZL1]);
          number_disp (0x97,1,TAB[SZH0],TAB[SZL0]);    //把前面的显示了
          
          number_disp (0x8f,1,TAB[SZH3],TAB[SZL3]); 
          number_disp (0x8e,1,TAB[SZH4],TAB[SZL4]);
          number_disp (0x9f,1,TAB[SZH5],TAB[SZL5]);
          number_disp (0x9e,1,TAB[SZH6],TAB[SZL6]);  
         } 
        Page1=Page;            //保存当前页面值
       }break;
      default:break;
     }   
  if(sendc)
   { 
    sendc = 0;
    Uart0_SendData(0x7f);    //首字符串
    
    Uart0_SendData(0x00);    //数据包长度
    Uart0_SendData(0x38);    //56个字节 
    
    switch(Between[2])     //协议类型,0X0a摊铺 0X14碾压
     {
      case 0x0a:
      Uart0_SendData(0x0a);  //摊铺
      break;
      case 0x14:
      Uart0_SendData(0x14);  //压实
      break;
      default:
      Uart0_SendData(0x0a);  //默认0X0a   
      break;
     }   
    Uart0_SendData(0x00);    //预留字节  
    Uart0_SendData(0x00);
    Uart0_SendData(Between[2]);   //ID
    Uart0_SendData(Between[1]);
    Uart0_SendData(Between[0]);
    Uart0_SendData(0x14);
    Uart0_SendData(time_buf1[1]);  //时间年月日时分秒
    Uart0_SendData(time_buf1[2]);
    Uart0_SendData(time_buf1[3]);
    Uart0_SendData(time_buf1[4]);
    Uart0_SendData(time_buf1[5]);
    Uart0_SendData(time_buf1[6]);
    for(i=0;i<12;i++)     //经度
     {
      Uart0_SendData(JD[i]);
     }
    for(i=0;i<11;i++)     //纬度
     {
      Uart0_SendData(WD[i]);
     }
    
    Uart0_SendData(TPHD/100);   //摊铺厚度
    Uart0_SendData(TPHD%100);
    
    switch(Between[2])
     {
      case 0x10:
      Uart0_SendData(SPEEDTP/100);  //摊铺速度
      Uart0_SendData(SPEEDTP%100);
      break;
      case 0x20:
      Uart0_SendData(SPEEDNY/100);  //压实速度
      Uart0_SendData(SPEEDNY%100);
      break;
      default:
      Uart0_SendData(0x00);    //压实速度
      Uart0_SendData(0x00);
      break;
     }
    Uart0_SendData(TEMP1/100);   //料温
    Uart0_SendData(TEMP1%100);
    Uart0_SendData(TEMP2/100);
    Uart0_SendData(TEMP2%100);
    Uart0_SendData(TEMP3/100);
    Uart0_SendData(TEMP3%100);
    Uart0_SendData(TEMP4/100);
    Uart0_SendData(TEMP4%100);
    Uart0_SendData(HT/100);    //环境温度湿度横坡度
    Uart0_SendData(HT%100);
    Uart0_SendData(HR/100);
    Uart0_SendData(HR%100);
    Uart0_SendData(HP/100);
    Uart0_SendData(HP%100);
    
    Uart0_SendData(TPrange/100);
    Uart0_SendData(TPrange%100);
    
    Uart0_SendData(0xa3);    //结束符
    //Uart0_SendData(0xa5);
    //Uart0_SendData(0xa6);
   }
     }
}[page]
/*void UART0_ISR(void) interrupt 4
{
 static uchar Rcv;
    if(RI0)
  {
   Rcv = SBUF0;
   RI0 =0; 
  }
 if(Rcv == 0x7E)                          //
  {
   i = 1;
   buffer[0] = Rcv;
  }
 else
  {
   if(i < 13)                         //12个字节
    { 
     buffer[i] = Rcv;
     i++;
    }
  }    
}*/
void UART1_ISR(void) interrupt 20
{
 static uchar tmp;
 if ((SCON1 & 0x01) == 0x01)
  {
   tmp = SBUF1;
   SCON1 = (SCON1 & 0xFE);            //RI1 = 0;
   switch(tmp)
          {
              case '$':      //首字符
      {
                   cmd_number=0;        //命令类型清空
                   mode=1;              //接收命令模式
                   byte_count=0;        //接收位数清空
      }
                 break;
              case ',':
      {
                   seg_count++;        //逗号计数加1
                   byte_count=0;
      }
                 break;
              case '*':     //数据帧结束标志
      {
                   switch(cmd_number)
                    {
                        case 1:
                            buf_full|=0x01;
                           break;
                        case 2:
                            buf_full|=0x02;
                           break;
                        case 3:
                            buf_full|=0x04;
                           break;
                    }
                   mode=0;
      }
                 break;
              default:
                  if(mode==1)
                   {                    //命令种类判断
                       cmd[byte_count]=tmp;            //接收字符放入类型缓存
                       if(byte_count>=4)
                        {                   //如果类型数据接收完毕,判断类型
                            if(cmd[0]=='G')
                             {
                                 if(cmd[1]=='P')
                                  {
                                      if(cmd[2]=='G')
                                       {
                                           if(cmd[3]=='G')
                                            {
                                                if(cmd[4]=='A')
                                                 {
                                                     cmd_number=1;
                                                     mode=2;
                                                     seg_count=0;
                                                     byte_count=0;
                                                 }
                                            }
                                          
                                       }
                                      
                                  }
                              }
                         }
                   }
                  else if(mode==2)
                   {               //接收数据处理
                                                  //类型1数据接收。GPGGA
                             switch(seg_count)
                              {
                                  case 2:                                 //纬度处理
                                     if(byte_count<10)
                                      {
                                          WD[byte_count]=tmp;
                                      }
                                     break;
                                  case 3:                                 //纬度方向处理
                                     if(byte_count<1)
                                      {
                                          WD_a=tmp;
                                      }
                                     break;
                                  case 4:                                 //经度处理
                                     if(byte_count<11)
                                      {
                                          JD[byte_count]=tmp;
                                      }
                                     break;
                                  case 5:                                 //经度方向处理
                                     if(byte_count<1)
                                      {
                                          JD_a=tmp;
                                      }
                                     break;
                                  /*case 6:                                //定位判断
                                     if(byte_count<1)
                                      {
                                          lock=tmp;
                                      }
                                     break;
                                  case 7:                                //定位使用的卫星数
                                     if(byte_count<2)
                                      {
                                          use_sat[byte_count]=tmp;
                                      }
                                     break;*/
                                  //case 9:                                //高度处理
                                     //if(byte_count<6)
                                      //{
                                         // HIGH[byte_count]=tmp;
                                     // }
                                     //break;
                               default:break;
         }
                   }
                byte_count++;                  //接收数位加1
       break;
          }
        //temp=0;
  //byte_count++;        //接收数位加1
  } 
}
//=======================================================
//TIMER2 10毫秒自动重装
//=======================================================
void TIME2_ISR (void) interrupt 5    //20毫秒自动重装
{
 static uchar i,j1,j2,j3,j4,j5,j6,k,k1,m,m1,LTP1,LNY1;
 static uint c1,c2,c3,c4;
 TF2 = 0;                              //清标志位
 i++;
 if(i==50)
  {
   P5=~(P5);
   i = 0;  
  } 
   LTP1 = P7;         //接近开关不遮挡输出高电平,
 LNY1 = P7;
 if((LTP1&0xFF) ==0xFF)      //P70=1;遮挡上了,接近开关无输出,此时P70=1;
  {
   j1++;
   if(j1>2)       //2次以上还是原来状态证明不是干扰脉冲
    {
     j1 = 0;
     k = 1;      //检测到P70为0,置位K     
    }
   c3++;
   if(c3>9000)     //超过1分半钟没变化认为停止了
    {
     c3 = 0;
     SPEEDcount1 = 0;
     SPEEDTP = 0;
    }
  }
  if(k)          //在置位情况下等待下降沿   
   {
   if((LTP1&0xFF) ==0xFE)    //P70=0;检测到无遮挡,接近开关输出24V,开始一个周期此时P70 = 0;
    {
     j2++;
     if(j2>2)     //过滤脉冲干扰
      {
       j2 = 0;
       k1 = 1;
      }
     c1++;
     if(c1>9000)     //超过1分半钟没变化认为停止了
      {
       c1 = 0;
       SPEEDcount1 = 0;
       SPEEDTP = 0;
       k1 = 0; 
       k = 0;
      }
     if(k1)
      {
       SPEEDcount1++;  //发生了正跳变,开始计时
      }
    } 
   if(k1)
    {
     if((LTP1&0xFF) ==0xFF)  //再一次检测到有遮挡表示一次检测周期结束,计时结束,开始计算速度
      {
       j3++;
       if(j3>2)
        {
         j3 = 0;
         k1 = 0;
         k = 0;
         //SPEEDTP = SPEEDcount1/100; //(秒)
         SPEEDTP = (long)600*(Between[4]*100 + Between[3])/SPEEDcount1; //米/分;显示部分已经后移了两位
         SPEEDcount1 = 0;
         c1 = 0; 
         c3 = 0; 
         TPcount++;
         TPrange = (long)TPcount*(Between[6]*100 + Between[5])/1000; 
        }
      }
    }
  }
 if((LNY1&0xFF) ==0xFF)      //P71=1;
  {
   j4++;
   if(j4>2)       //2次以上还是原来状态证明不是干扰脉冲
    {
     j4 = 0;
     m = 1;      //检测到P71为0,置位M     
    }
   c4++;
   if(c4>9000)     //超过1分半钟没变化认为停止了
    {
     c4 = 0;
     SPEEDcount2 = 0;
     SPEEDNY = 0;
    }
  }
 if(m)          //在置位情况下等待下降沿
  {
   if((LNY1&0xFF) ==0xFD)    //P71=0;
    {
     j5++;
     if(j5>2)     //过滤脉冲干扰
      {
       j5 = 0;
       m1 = 1;
      }
     c2++;
     if(c2>9000)     //等待了1分半钟没变化,认为停止了
      {
       c2 = 0;
       SPEEDcount2 = 0;
       SPEEDNY = 0;
       m1 = 0; 
       m = 0;
      }
     if(m1)
      {
       SPEEDcount2++;  //发生了正跳变,开始计时
      }
    } 
   if(m1)
    {
     if((LNY1&0xFF) ==0xFF)  //发生了负跳变,计时结束,开始计算速度
      {
       j6++;
       if(j6>2)
        {
         j6 = 0;
         m1 = 0;
         m = 0;
         SPEEDNY = (long)36*(Between[6]*100 + Between[5])/SPEEDcount2; //km/h;显示部分已经后移了两位
         SPEEDcount2 = 0;
         c2 = 0; 
         c4 = 0;
          
        }
      }
    }
  }                    
}
void ADC0_ISR (void) interrupt 15
{
   static uchar count0;                       // Loop counter
   AD0INT = 0;                              //清中断标志位
   switch( AMX0SL )             //通道转换
   {
  
  case 0x00:          //AIN0.0
  ADCbuffer1[count0]=ADC0;
     count0++;
     if (count0 > N-1)
   {
         count0 = 0;
         AD0EN = 0;
         ADcount = 1;
    filter();
    TPHD1= (sum/(N-2));
    if(TPHD1>ADC04V)
     {
      TPHD1 = TPHD1 - 5;    //去掉偏移量
      a = (long)TPHD1*2500/4095;  //放大1000倍,采集到1毫伏
      a = (a*469-37500)/1000;   //超声传感器公式150=a*0.4+b 900=a*2.0+b a=468.75 b=37.5
      TPHD1 = a;
     }
    else {TPHD1 = 0;}        
      }
  break; 
  case 0x01:        //AIN0.1
  ADCbuffer1[count0]=ADC0;
     count0++;
     if (count0 > N-1)
   {
         count0 = 0;
         AD0EN = 0;
         ADcount = 2;
    filter();
    TPHD2= (sum/(N-2));
    if(TPHD2>ADC04V)
     {
      TPHD2 = TPHD2 - 5;
      a = (long)TPHD2*2500/4095;  //放大1000倍,采集到1毫伏
      a = (a*469-37500)/1000;   //超声传感器公式150=a*0.4+b 900=a*2.0+b a=468.75 b=37.5
      TPHD2 = a;
     }
    else {TPHD2 = 0;}               
      }
  break; 
  case 0x04:        //AIN0.4
  ADCbuffer1[count0]=ADC0;
     count0++;
     if (count0 > N-1)
   {
         count0 = 0;
         AD0EN = 0;
         ADcount = 3;
    filter();
    TEMP1= (sum/(N-2));
    if(TEMP1>ADC04V)
     {
      KT1F = 1;
      TEMP1 = TEMP1 - 5;    //去掉偏移量
      a = (long)TEMP1*2500/4095;  //放大1000倍,采集到1毫伏
      a = (long)(a*331-129000)/100;    //线性方程0=0.4a-b;500=2.0a-b 求解得a = 312.5 b=125 分别取313和125 
      TEMP1 = a;       //两点标定法标定后取a = 368  b = 157
     }
    else {TEMP1 = 0;KT1F = 0;}        
      }
  break; 
  case 0x05:        //AIN0.5
  ADCbuffer1[count0]=ADC0;
     count0++;
     if (count0 > N-1)
   {
         count0 = 0;
         AD0EN = 0;
         ADcount = 4;
    filter();
    TEMP2= (sum/(N-2));
    if(TEMP2>ADC04V)
     {
      KT2F = 1;
      TEMP2 = TEMP2 - 5;     //去掉偏移量
      a = (long)TEMP2*2500/4095;   //放大1000倍,采集到1毫伏
      a = (long)(a*331-129000)/100;    //线性方程0=0.4a-b;500=2.0a-b 求解得a = 312.5 b=125 分别取313和125 
      TEMP2 = a;
     }
    else {TEMP2 = 0;KT2F = 0;}               
      }
  break; 
  case 0x06:         //AIN0.6
  ADCbuffer1[count0]=ADC0;
     count0++;
     if (count0 > N-1)
   {
         count0 = 0;
         AD0EN = 0;
         ADcount = 5;
    filter();
    TEMP3= (sum/(N-2));
    if(TEMP3>ADC04V)
     {
      KT3F = 1;
      TEMP3 = TEMP3 - 5;    //去掉偏移量
      a = (long)TEMP3*2500/4095;  //放大1000倍,采集到1毫伏
      a = (long)(a*331-129000)/100;   //线性方程0=0.4a-b;500=2.0a-b 求解得a = 312.5 b=125 分别取313和125 
      TEMP3 = a;
     }
    else {TEMP3 = 0;KT3F = 0;}
      }
  break; 
  case 0x07:         //AIN0.7
  ADCbuffer1[count0]=ADC0;
     count0++;
     if (count0 > N-1)
   {
       count0 = 0;
       AD0EN = 0;
       ADcount = 6;
    filter();
    TEMP4= (sum/(N-2));
    if(TEMP4>ADC04V)
     {
      KT4F = 1;
      TEMP4 = TEMP4 - 5;    //去掉偏移量
      a = (long)TEMP4*2500/4095;  //放大1000倍,采集到1毫伏
      a = (long)(a*331-129000)/100;   //线性方程0=0.4a-b;500=2.0a-b 求解得a = 312.5 b=125 分别取313和125 
      TEMP4 = a;
     }
    else {TEMP4 = 0;KT4F = 0;}
      }
  break;
  default:break;
   }
}
void ADC1_ISR (void) interrupt 17
{
   static uchar count1;                      // Loop counter
   ADC1CN &=~(0x20);                           //清中断标志位
   switch( AMX1SL )            //通道转换
   {
  case 0x03:         //AIN1.3
  ADCbuffer1[count1]=ADC1;
     count1++;
     if (count1 > N-1)
   {
         count1 = 0;
         ADC1CN &=~(0x80);
         ADcount = 7;
    filter();
    HT= (sum/(N-2));
    if(HT>40)
     {
      HTF = 1;
      HT = HT -4;
      HT = (long)(HT*HTA-HTB*100)/10;
     }
    else {HT = 0;HTF = 0;}
      }
  break;
  case 0x02:          //AIN1.2
  ADCbuffer1[count1]=ADC1;
     count1++;
     if (count1 > N-1)
   {
         count1 = 0;
         ADC1CN &=~(0x80);
         ADcount = 8;
    filter();
    HR= (sum/(N-2));
    if(HR>40)
     {
      HRF = 1;
      HR = HR-4;
      HR = (long)(HR*HRA-HRB*100)/10;
     }
    else {HR = 0;HRF = 0;}
      }
  break;
  case 0x01:          //AIN1.1
  ADCbuffer1[count1]=ADC1;
     count1++;
     if (count1 > N-1)
   {
         count1 = 0;
         ADC1CN &=~(0x80);
         ADcount = 9;
    filter();
    HP1= (sum/(N-2));
    if((HP1>40)&&(HP1<123))     //负向倾角
     {
      HPF = 0;
      HP = HP1-4;
      HP = (long)(HPB*100-HP*HPA)/10;
     }
    if((HP1>127)&&(HP1<=255))    //正向倾角
        {
      HPF = 1;
      HP = HP1-4;
      HP = (long)(HP*HPA-HPB*100)/10;
     }
    if((HP1>=123)&&(HP1<=127))
     {
      HPF = 2;      //只显示0
      HP = 0;
     }
    if(HP1<40)
     {
      HPF = 3;      //未连接
     }
   }
  break; 
 /* case 0x00:          //AIN1.0
  ADCbuffer1[count1]=ADC1;
     count1++;
  //ADC0CN |=0x10;         //写ADC1BUSY位启动转换
     if (count1 > N-1){
       count1 = 0;
       ADC1CN &=~(0x80);
       ADcount = 8;
     }
  break;*/
  default:break;
   }
}
//-----------------------------------------
//TIMER3中断  25毫秒定时
//-----------------------------------------
void Timer3_ISR(void) interrupt 14
{
    static uchar j,k,count2,count3;
 static uint count1;
 TMR3CN &=~(0x80);                  //清标志位
    count1++;
 count2++;
 count3++;
 j++;
    if(count1>2000)              //两分钟串口发送一次数据
  {
   count1 = 0;
   sendc = 1;
  }
 if(count2 == 6)                     //200ms
     {
   count2 = 0;
   Tset++;
   if(Tset>4)
    {
     Tset = 0;
    } 
  }
 if(count3 == 4)                     //100ms
     {
    count3 = 0;
   switch(ADcount)
    {
     case 1:
      AMX0SL = 0x01;         //指向下一个转换通道
      AD0EN = 1;
     break;
     case 2:
      AMX0SL = 0x04;         //指向下一个转换通道
      AD0EN = 1;
     break; 
     case 3:
       AMX0SL = 0x05;         //指向下一个转换通道
      AD0EN = 1;
     break;
     case 4:
      AMX0SL = 0x06;         //下一个转换通道
      AD0EN = 1;
     break;
     case 5:
      AMX0SL = 0x07;         //下一个转换通道
      AD0EN = 1;
     break;
     case 6:
      AMX1SL = 0x03;         //下一个转换通道
      AD0EN = 0;
      ADC1CN |= 0x80;
     break;
     case 7:
      AMX1SL = 0x02;         //下一个转换通道
      ADC1CN |= 0x80;
     break; 
     case 8:
      AMX1SL = 0x01;         //下一个转换通道
      ADC1CN |= 0x80;
     break;
     case 9:
      AMX0SL = 0x00;         //下一个转换通道
      AD0EN = 1;
      ADC1CN &=~(0x80);
     break;
     default:break;
    }
  }
 if(j==40)               //1秒误差累积;正常是40
  {
   j = 0;
   if(BGset)
    {
     k++;
     BLK = 1;
     if(k>120)           //4分钟关背光
      {
       k=0;
       BGset = 0;
       BLK = 0;
      } 
    }   
  } 
}
关键字:c8051f  单片机  ad采样程序 引用地址:c8051f单片机ad采样程序

上一篇:基于C8051F的金鹏LCD19264(带字库)程序
下一篇:基于LabVIEW和RS485通信的光伏发电实时监测系统设计

推荐阅读最新更新时间:2024-03-16 14:02

自己动手用Cortex-M3与ADXL345做个重力感应遥控器
 已经是很久没有写文章了,因为没有时间,人家都说大四不考研,天天像过年,可我依旧没能有那份闲暇的时间。 现在几乎人人的手里都是一款安卓智能机这是我非常羡慕的,而我手里只有上学期用380元买的一台二手诺基亚N96,虽然也称得上智能机但是远远没有如今安卓智能的优秀,其中一个功能就是通过重力感应玩赛车游戏,我想这个大家都不陌生,只要把手机歪一歪斜一斜就可以控制赛车方向了,这个功能令桥哥好生羡慕嫉妒恨,可惜自己的手机不能玩,上周突来灵感何不自己做一个玩玩。正好上学期开始着手给侄子做的四轴飞行器的基板基本调试完成,核心的芯片就是一块M3微控器,一块三轴加速度传感器ADXL345,一块三轴数字陀螺仪。而要做一个简单的重力感应遥控器用M3结合A
[电源管理]
自己动手用Cortex-M3与ADXL345做个重力感应遥控器
基于嵌入式WinCE与MSP430单片机多串口通信设计
目前WinCE嵌入式与MSP430单片机在仪器仪表、工业控制、移动设备等有着广泛的应用。在很多复杂的应用场合比如多点温度采集、多点转速采集,一个单片机不能满足要求,需要多台单片机协同工作,此时,多台单片机通信是实现的关键。以基于WinCE嵌入式设备为核心,取代传统意义上的PC机,采用TCP/IP通信机制搭建的串口通信系统,结合嵌入式设备和网络技术的优点,将各独立系统复杂的通信协议、数据格式进行统一的转化,特别适用于远程、多机串口通信,具有重要的使用价值和应用前景。 1 硬件平台 1)WinCE嵌入式采用友善之臂mini2440开发板作为硬件平台,mini2440开发板主要的硬件资源包括:SamsungS3C2440A,主频4
[单片机]
基于嵌入式WinCE与MSP430<font color='red'>单片机</font>多串口通信设计
51单片机UART 串口通信[ 方式1 ]实现
1 51串行口结构 51单片机的UART串行通信是基于其串行口的可编程硬件结构,只要用正确的程序代码通过初始化串行口对应寄存器的形式将其串行硬件结构初始化,再编写符合此串行口通信的程序代码便能够实现串行通信,其硬件结构决定了编程机制( 当然还要靠51芯片内CPU等机制 )。此结构具有UART( 通用异步收发器 )的全部功能,能同时进行数据的发送和接收,也可作为同步移位寄存器使用。此结构集成于单片机内部。 Figure1:51串行口结构 2 51串行口通信编程机制 决定编程机制的先决条件是51单片机的硬件结构及51芯片内部CPU的执行机制。根据串行通信口硬件结构,实现UART通信可以分为两步: (1)初始化串行通信口(
[单片机]
51<font color='red'>单片机</font>UART 串口通信[ 方式1 ]实现
TI MSP-EXP430FR5969 LaunchPad评估套件登陆Mouser
贸泽电子 (Mouser Electronics) 即日起开始供应Texas Instruments (TI) 的 MSP-EXP430FR5969 LaunchPad评估套件。此全新TI LaunchPad是适用于MSP430FR5969微控制器的简单易用型快速原型套件。MSP430FR5969 微控制器采用64 KB FRAM(铁电随机存取存储器),这是一种以超低功耗、高擦写次数和高速写入访问而闻名的非易失性存储器。板载MSP430FR5969 16位微控制器支持高达16 MHz的时钟速度,并具有用于通信、ADC、定时器和AES加密的集成外设。 Mouser分销的TI MSP-EXP430FR5969 LaunchPa
[单片机]
PIC单片机C语言程序设计(6)
  4.可预置起始时刻的倒计时程序   在2010 年第2 期《PIC 单片机C 语言程序(5)》一文中,我们介绍了可预置起始时刻的时钟的硬件电路并给出了C 语言程序。下面要介绍的可预置起始时刻的倒计时程序,是作为日常生活中对某事件的定时之用:只要某事件由人工设置的计时时间到,倒计时电路便会发出报警声。倒计时的特点是,计时一旦达到预定值,其值就归零。利用归零条件,即可实现任意倒计时达到时的报警功能,提示人们定时已到。   本倒计时器可在0~99 分钟内任意设置计时值。   例如在厨房中,蒸大米饭(8 两米),定时33 分钟,烧开水(一壶)为20 分钟,煮胡罗卜(红色)为30 分钟等,只要设定时间一到,倒计时器即报警,使用十分
[单片机]
PIC<font color='red'>单片机</font>C语言<font color='red'>程序</font>设计(6)
基于ATmega16单片机的DDS信号源设计制作
一、DDS基本工作原理 DDS的基本原理是利用奈奎斯特采样定理,通过查表法产生波形。DDS的结构有很多种,其基本的电路原理可用下图来表示。它主要包括相位寄存器、相位全加器、相位/幅度变换、D/A转换器,相位寄存器和相位全加器构成相位累加器。 二、电路设计 电路原理如下图所示,可分为四个部分:以IC1为核心的DDS;以IC2为核心的键盘、显示及控制电路;以IC3为核心的AGC电路;以IC4为核心的检波电路。 三、软件设计 编译环境选用CodeVesionAVR,它有丰富的库函数可以调用,使源代码简化。软件主要包含控制AD9851、AGC控制、键盘与LCD控制、模拟FM调制等几个方面的程序段。 四、安装与调试
[单片机]
基于ATmega16<font color='red'>单片机</font>的DDS信号源设计制作
51单片机-隐形漏洞
1.漏洞代码 假如就按上一讲说的书写方式,实现定时50ms间隔的流水灯。 #include reg52.h #include function.h //详见第六章第8讲 void main() { LED_Init(); //初始化LED硬件模块 EA = 1; //闭合总中断开关 TMOD = 0x01; //设置定时器0为工作模式1 TH0=( 65536-( (50000*110592)/120000 ) )/256;//设置定时时间为50ms TL0=( 65536-( (50000*110592)/120000 ) )%256; ET0 = 1; //闭合定时器
[单片机]
51<font color='red'>单片机</font>-隐形漏洞
8051单片机供水系统水位控制的硬件电路设计
供水系统水位控制原理 下图是水塔水位控制原理图。图中虚线表示允许水位变化的上下限。在正常情况下,应保持水位在虚线范围之内,为此,在水塔的不同高度安装固定不动的三根金属棒,以感知水位变化情况。其中A棒处于下限水位以下,C棒处于上限水位,B棒在下限水位处。A棒接+5V电源,B棒、C棒各通过一个电阻与模拟地相连。 水塔由电机带动水泵供水,单片机控制电机转动以达到对水位控制的目的。供水时,水位上升,当达到上限时,由于水的导电作用,B棒、C棒连通+5V电源,因此,b、c两端均为高电平“1”状态。这时,应停止电机和水泵的工作,不再给水塔供水。 当水位降到下限时,B棒、C棒都不能与A棒导通,因此,b、c两端均为“0”状态。这时,应启动电机,
[单片机]
8051<font color='red'>单片机</font>供水系统水位控制的硬件电路设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved