c8051f单片机ad采样程序(附详细注释)

c8051f系列单片机由silicon labs公司推出,是业内最小封装的微控制器 (mcu)(小至 2 mm x 2 mm),不会牺牲性能或集成性。完整的小型封装产品线包括高达 100 mips 的 cpu、12-位 adc、12-位 dac 以及其他重要的模拟外围设备,如集成精密振荡器 (±2%) 和精密温度传感器 (±2 °c)。还提供成本敏感、引脚兼容的一次性可编程 (otp) 选项。
c8051f系列单片机已有6种产品选型,高度集成的小封装c8051f系列单片机经过优化,专门应用于消费、汽车和通讯市场中的空间有限、低功耗、低成本的应用中。借助于经济高效且专业的开发工具和系统内调试功能,开发变得快速简单。
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 《intrins.h》
#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;count《n;count++)
{
value_buf[count] = adcbuffer1[count];
}
for (j=0;j《n-1;j++)
{
for (i=0;i《n-j;i++)
{
if ( value_buf[i]》value_buf[i+1] )
{
temp = value_buf[i];
value_buf[i] = value_buf[i+1];
value_buf[i+1] = temp;
}
}
}
for(count=1;count《n-1;count++)
sum += value_buf[count];
}
//===================================
//按键处理程序 按键为p6口
//===================================
void key_scan()
{
static uchar i;
//static uchar k;
uchar mkey=p6;
if(bgset《2)
{
if((mkey&0xff)!= 0xff) //有键按下先开启背光
{
delayms(200);
if((mkey&0xff)!= 0xff)
{
bgset++;
if(bgset》1)
{
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画面
}
}
}
}
//***********************************************
//修改时间
//***********************************************
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);
}
}
}
/*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;
}
}
}
}

一文了解无线网络系统入门基础知识(什么是AC?什么是AP?什么是POE供电?)
2021年芯片行业面临严峻考验 灵动产品第一季度价格不作调整
华为:终端业务将以手机为中心转向周边辐射
MAX6646,MAX6647,MAX6649精密的、2通道数字温度传感器
陶瓷4D打印的首次实现,有望应用于电子产品与航空发动机领域
c8051f单片机ad采样程序(附详细注释)
可视化彩色腕带,轻松区分手机通知
美国政府再度要求封杀微信的最新消息汇总
变频器的作用和原理用途
深南电路正开发下一代5G无线通信基站PCB用产品
全球芯片短缺不会导致5G手机大幅涨价
对拼小米?国产骁龙835旗舰新机即将发售,乐视双曲面旗舰新机发布时间曝光,搭载骁龙835+双摄
提高天线增益改善RFID读写距离
探讨碳化硅材料在制备晶圆过程中的关键技术和优势
能源互联网将催化新需求
锤子两款新机获3C认证 设计图正面像iPhone 4月发布
以猫头鹰为例,科学家有望研发低噪音机翼
NI:中国已成为5G全球“战场”的重要一环
详细介绍高频变压器的两种基本绕线方法
介绍基于RISC-V的芯片