资源描述
//date:2010/09/04
//VERSION: U2.0
//#include <stdio.h>
#include <reg52.h>
#include <intrins.h> //nop
//#include <absacc.h> //扩展外部
//#include <math.h>
//***********EEPROM 地址************
//16位处理
//00H 零点
//01H 放大倍数
//02H 报警点
//03H 解报点
//04H 断电点
//05H 复电点
//06H 0度补偿
//07H 40度补偿
//08H 自检点
//09H
//0AH
//0BH
//0CH
//0DH
//**********************************
//-------------------------------------------
//以下管脚定义
#define EECS P3_5 //EEPROM选通
#define ADCS P3_4 //EEPROM,A/D选通
#define SCLK P2_4 //EEPROM,A/D时钟
#define SDAT P2_5 //EEPROM,A/D数据输入
#define DOG P3_2 //看门狗
#define FMQ P0_4 //报警输出
#define BJ P0_5 //报警输出
#define POFF P2_7 //断电输出
#define FOUT P3_7 //频率输出
#define PDT P0_7 //温度
//-------------------------------------------
sfr T2MOD = 0xC9;
//P0
sbit P0_0=P0^0;
sbit P0_1=P0^1;
sbit P0_2=P0^2;
sbit P0_3=P0^3;
sbit P0_4=P0^4;
sbit P0_5=P0^5;
sbit P0_6=P0^6;
sbit P0_7=P0^7;
//P1
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
//P2
sbit P2_0=P2^0;
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
sbit P2_7=P2^7;
//P3
sbit P3_0=P3^0;
sbit P3_1=P3^1;
sbit P3_2=P3^2;
sbit P3_3=P3^3;
sbit P3_4=P3^4;
sbit P3_5=P3^5;
sbit P3_6=P3^6;
sbit P3_7=P3^7;
//-----------------------------------------------
//位变量
bit led1c;//从右往左第一位数码管显示标志 =0显示 =1不显示
bit led2c;//从右往左第二位数码管显示标志 =0显示 =1不显示
bit led3c;//从右往左第三位数码管显示标志 =0显示 =1不显示
bit led4c;//从右往左第四位数码管显示标志 =0显示 =1不显示
bit led1p;//从右往左第一位数码管小数点显示标志 =1显示 =0不显示
bit led2p;//从右往左第二位数码管小数点显示标志 =1显示 =0不显示
bit led3p;//从右往左第三位数码管小数点显示标志 =1显示 =0不显示
bit led4p;//从右往左第四位数码管小数点显示标志 =1显示 =0不显示
// bit led1f//从右往左第一位数码管显示标志 =1显示结束 =0没有显示结束
// bit led2f//从右往左第二位数码管显示标志 =1显示结束 =0没有显示结束
// bit led3f//从右往左第三位数码管显示标志 =1显示结束 =0没有显示结束
// bit led4f//从右往左第四位数码管显示标志 =1显示结束 =0没有显示结束
bit led1sc;//从右往左第一位数码管允许闪烁显示标志 =1允许闪烁显示 =0不允许闪烁
bit led2sc;//从右往左第二位数码管允许闪烁显示标志 =1允许闪烁显示 =0不允许闪烁
bit led3sc;//从右往左第三位数码管允许闪烁显示标志 =1允许闪烁显示 =0不允许闪烁
bit led4sc;//从右往左第四位数码管允许闪烁显示标志 =1允许闪烁显示 =0不允许闪烁
bit led1s;//从右往左第一位数码管闪烁显示 =1显示 =0不显示
bit led2s;//从右往左第二位数码管闪烁显示 =1显示 =0不显示
bit led3s;//从右往左第三位数码管闪烁显示 =1显示 =0不显示
bit led4s;//从右往左第四位数码管闪烁显示 =1显示 =0不显示
bit flag;//遥控器逻辑标志
bit flag1;//flag1 接收到的not "1" and "0"
bit enyk;//enyk=0没有有效遥控,enyk=1有有效遥控按键
bit ykgoon;//遥控继续显示标志
bit gnflag;
bit zxflag;//执行码标志
bit alarmflag;//报警有效标志 =1报警 =0不报警
bit second1;//1s到标志 =1到 =0没到
bit second2;//1s到标志 =1到 =0没到
bit second3;//1s到标志 =1到 =0没到
bit second4;//1s到标志 =1到 =0没到
bit minute;//1m到标志 =1到 =0没到
bit flag1820;//读写1820时防止读错标志
bit crcflag;//CRC检验用标志位
bit np;//浓度正负标志 =1负
bit lbflag;//滤波标志
bit zjflag;//自检标志
bit zj;//增加键 =1有效
bit jx;//减小键 =1有效
bit zflag;//零点遥控处理好标志
bit fdflag;//放大遥控处理好标志
bit fd1flag;//复电遥控处理好标志
bit bjflag;//报警遥控处理好标志
bit ddflag;//断电遥控处理好标志
bit jbflag;//解报遥控处理好标志
bit zjflag1;//遥控自检处理好标志
bit temflag1;//发温度转换命令=1发过命令
bit wdflag0;//0度遥控处理好标志
bit wdflag40;//40度遥控处理好标志
//-----------------------------------------------
//-----------------------------------------------
//全局变量
unsigned long int YK;//遥控处理单元
unsigned char YKCODE;//遥控接收码
unsigned char T0H;//频率输出定时单元高
unsigned char T0L;//频率输出定时单元低
unsigned int alarmsec;//0.5s报警
unsigned int sec;//1秒
unsigned int min;//1分
unsigned char zero;//零点
unsigned char lined;//放大倍数
unsigned int alarm;//报警点
unsigned int jalarm;//解报点
unsigned int pout;//断电点
unsigned int fout;//复电点
unsigned char wd0;//0度补偿
unsigned char wd40;//0度补偿
unsigned int zjd;//自检点
unsigned char temcount;//读温度主程序执行次数
unsigned char dispcount;//=0显示从左往又第一位数码管
//=1显示从左往又第二位数码管
//=2显示从左往又第三位数码管
//=3显示从左往又第四位数码管
unsigned char tbuffer1;//从右往左第一位数码管显示特殊字符缓冲
unsigned char tbuffer2;//从右往左第二位数码管显示特殊字符缓冲
unsigned char tbuffer3;//从右往左第三位数码管显示特殊字符缓冲
unsigned char tbuffer4;//从右往左第四位数码管显示特殊字符缓冲
idata float yl;//本次压力值
idata float yl1;//上次压力值
unsigned int temp;//温度
idata unsigned char a[9];//读温度数组
idata float c[4];
//-----------------------------------------------
//-----------------------------------------------
//显示字符表
code unsigned char table[]={ 0xC0, // 0
0xF9, // 1
0xA4, // 2
0xB0, // 3
0x99, // 4
0x92, // 5
0x82, // 6
0xF8, // 7
0x80, // 8
0x90, // 9
0x88, // A 10
0x83, // b 11
0xC6, // C 12
0xA1, // d 13
0x86, // E 14
0x8E, // F 15
0x8C, // P 16
0xC1, // U 17
0xF1, // J 18
0xFF, // 全熄灭 19
0xBF, // - 20
0x47, // L 21
0x89, // H 22
0xFE, // - 23
0xF7, // - 24
0xAF, // r 25
0xA3, // o 26
0x9C, // O 27
};
//-----------------------------------------------
//-----------------------------------------------
//看门狗
void dog(void)
{
DOG=!DOG;
_nop_();
DOG=!DOG;
}
//-----------------------------------------------
//-----------------------------------------------
//不显示
void dirb(void)
{
led2c=1;led3c=1;led4c=1;//显示' '
}
//-----------------------------------------------
//-----------------------------------------------
//延时程序 入口i
void delay(unsigned int i)
{
// unsigned int j;
for(;i>1;i--)
{
_nop_();
}
// _nop_();
}
//-----------------------------------------------
//-----------------------------------------------
//显示版本号
void dirver(void)
{
tbuffer4=17;tbuffer3=2;tbuffer2=0;//'U2.0' 零点处理
led3p=1;//第三位数码管小数点显示
}
//-----------------------------------------------
//-----------------------------------------------
//初始化特殊功能寄存器
void rest(void)
{
IE=0;
IP=0x02;
TMOD=0x11;
TH0=0;
TL0=0;
TH1=0;
TL1=0;
SCON=0;
PCON=0;
TCON=0x55;
RCAP2H=0xf8;
RCAP2L=0xcc;
TH2=RCAP2H;
TL2=RCAP2L;
T2MOD=0xfc;
T2CON=0x4;
ET2=1;
BJ=0;
FMQ=0;
IE=0xa6;
T0H=0xf7;
T0L=0x05;
POFF=1;
}
//-----------------------------------------------
//-----------------------------------------------
//定时器0频率输出中断
void TIM0(void) interrupt 1 //TIME0频率输出
{
TH0=T0H;
TL0=T0L;
FOUT=!FOUT;
// flag1820 =1;
}
//-----------------------------------------------
//-----------------------------------------------
//遥控器输入中断+定时器1
void INTT1(void) interrupt 2 //外部中断处理遥控器输入
{
unsigned char countx; //累加记数
union x //公用体处理遥控器
{
unsigned long int d;
unsigned char a[4];
unsigned int k;
}z;
z.a[0]=TH1;
z.a[1]=TL1;
TL1=0;TH1=0; //去定时时间,清定时器
if((z.k>=768)&&(1200>=z.k))
{
flag=0;
flag1=0;
}//"0"
else if((z.k>=1536)&&(2400>=z.k))
{
flag=1;
flag1=0;
}//"1"
else flag1=1;
if(flag1)
{
TL1=0;
TH1=0;
}//flag=1 not "1" and "0"
else
{
YK<<=1;
if(flag)YK++;
flag=0;
z.d=YK;
for(countx=0;countx<=16;countx++)
{
z.d<<=1;
if(z.a[0]==0xE2)
{
YKCODE=z.a[1];
enyk=1;
}//找到功能码退出
if(enyk)
{
YK=0;
TL1=0;
TH1=0;
break;
}
}
}
flag1820=1;
}
//-----------------------------------------------
//-----------------------------------------------
//显示和定时中断
void TIM2(void) interrupt 5
{
unsigned char i;
if(alarmflag&&(alarmsec++>=500))
{
alarmsec=0;
BJ=!BJ;
FMQ=!FMQ;
}
if(sec++>=400)
{
second1=1;//second2=1;second3=1;second4=1;
sec=0;
}//0.4秒
if(min++>=60000)
{
minute=1;
led1c=0;
led1sc=0;
tbuffer1=0;
}//1分到不允许功能码显示不闪烁
P1=0xFF;//清空显示
switch(dispcount)
{
case 0:
{
dispcount++;
if(!led1c)i=0xFF; //不显示功能码
else //显示功能码
{
if(led1sc) //功能码允许闪烁显示
{
if(second1)//0.5s到
{
second1=0;//清标志
led1s=!led1s;
}
else
{
if(led1s) {i=table[tbuffer1];if(led1p)i&=0x7F;}//第一位小数点显示 //闪烁不显示
else i=0xFF; //功能码单元
P1=i;
}
}
else
{
P1=table[tbuffer1];//功能码不允许闪烁显示
//P1=i;
if(led1p)P1_7=0;//P1&=0x7F;//第一位小数点显示
}
}
P2_0=0;P2_1=1;P2_2=1;P2_3=1;
break;
}
case 1:
{
dispcount++;
if(led2c)i=0xFF; //不显示功能码
else //显示功能码
{
if(led2sc) //功能码允许闪烁显示
{
if(second2)//0.5s到
{
//second2=0;//清标志
//led2s=!led2s;
}
else
{
if(led2s) {i=table[tbuffer2];if(led2p)i&=0x7F;}//第二位小数点显示//闪烁不显示
else i=0xFF; //功能码单元
P1=i;
}
}
else
{
P1=table[tbuffer2];//功能码不允许闪烁显示
//P1=i;
if(led2p)P1_7=0;//P1&=0x7F;//第二位小数点显示
}
}
P2_0=1;P2_1=0;P2_2=1;P2_3=1;
break;
}
case 2:
{
dispcount++;
if(led3c)P1=0xFF; //不显示功能码
else //显示功能码
{
if(led3sc) //功能码允许闪烁显示
{
if(second3)//0.5s到
{
//second3=0;//清标志
///led3s=!led3s;
}
else
{
if(led3s) {i=table[tbuffer3];if(led3p)i&=0x7F;}//第三位小数点显示 //闪烁不显示
else i=0xFF; //功能码单元
P1=i;
}
}
else
{
P1=table[tbuffer3];//功能码不允许闪烁显示
//P1=i;
if(led3p)P1_7=0;//P1&=0x7F;//第三位小数点显示
}
}
P2_0=1;P2_1=1;P2_3=1;P2_2=0;
break;
}
case 3:
{
dispcount=0;
if(led4c)i=0xFF; //不显示功能码
else //显示功能码
{
if(led4sc) //功能码允许闪烁显示
{
if(second4)//0.5s到
{
//second4=0;//清标志
//led4s=!led4s;
}
else
{
if(led4s) {i=table[tbuffer4];if(led4p)i&=0x7F;}//第四位小数点显示 //
展开阅读全文