/****************************************************************************
** File Name: txprocessorb.c
**
** Copyright 1996 Microtek International Inc.
**波特率:9600
**CPU主频:11.0592M
**应用设备:日期时钟 30/4/2010
****************************************************************************/
#include <reg52.h>
//#include <reg51.h>
#include <stdio.h>
/*函数原型定义*/
//void main(void);
/*初始化函数*/
//void init_89c52(void);
/*串口通信接收函数,中断接收*/
//serial() interrupt 4 using 1;
/*延时函数*/
//void delay(unsigned char delay_counter);
//void delay_ms(unsigned char delay_2);
//void delay_operate(void);
//void led_flash(unsigned char counter);
/*定时器中断函数*/
//timer1() interrupt 3 using 3
/*数据定义*/
/*P1口为线路板ID号读取口*/
/*P2口为地线号读取口,0xff为没有地线-需要对P2口数据取反作为地线号*/
typedef unsigned char uchar;
typedef unsigned int uint;
#define RUN_DELAY_TIME 20
#define true 1
#define false 0
/*****************************************************************/
sfr auxr=0x8e;
sfr isp_data=0xe2;
sfr isp_addrh=0xe3;
sfr isp_addrl=0xe4;
sfr isp_cmd=0xe5;
sfr isp_trig=0xe6;
sfr isp_contr=0xe7;
sfr wdt_contrequ=0xe1;
sfr P4=0xe8;
sbit outh=P3^2;
sbit outl=P3^3;
sbit run=P4^0;
sbit low=P2^0;
sbit high=P2^7;
sbit set=P2^3;
sbit up=P2^2;
sbit down=P2^1;
sbit nowshow3=P1^0;
sbit nowshow2=P1^1;
sbit nowshow1=P1^2;
sbit nowshow0=P1^3;
sbit setshow3=P1^4;
sbit setshow2=P1^5;
sbit setshow1=P1^6;
sbit setshow0=P1^7;
static unsigned char bdata status_byte;/*标志字节25h*/
sbit flage_seth=status_byte^0;/*进入系统设置状态上限设置标志,1有效*/
sbit flage_setl=status_byte^1;/*进入系统设置状态下限设置标志,1有效*/
sbit flage_ray=status_byte^2;/*数码管闪烁标志*/
sbit massage_flage=status_byte^3;/*有未处理报文标志*/
sbit lxover_flage=status_byte^4;/*等待红外传感器回复报文标志,高电平有效*/
sbit ttkz_flage=status_byte^5;/*正在进行压板投切控制的模块忽略轮询的等待时间定时器开启标志*/
sbit com2busy_flage=status_byte^6;/*串口2空闲标志,低电平有效*/
sbit pollxy_flage=status_byte^7;/*I/O模块有轮询响应报文标志,高电平有效*/
static unsigned char bdata statrt_byte;/*标志字节25h*/
sbit uart2_send_flage=statrt_byte^0;
sbit uart0_send_flage=statrt_byte^1;
static unsigned char bdata ban_address;/*锁定状态*/
sbit address1=ban_address^0;
sbit address2=ban_address^1;
sbit address3=ban_address^2;
sbit address4=ban_address^3;
sbit address5=ban_address^4;
sbit address6=ban_address^5;
sbit address7=ban_address^6;
sbit address8=ban_address^7;
static unsigned char data ddata;
static unsigned char data run_delay;
static unsigned char data jishu_right;
static unsigned char data uart1_head_flage;
static unsigned char data data_incept_long1;
static unsigned char data lx_time;/*轮询间隔时间设定*/
static unsigned char data anbh;/*按键短路保护*/
static unsigned int idata wddell_data1;
static unsigned int idata wdsx_data;
static unsigned int idata wdxx_data;
static unsigned int idata aqtszj_data;
/*从时钟芯片读取的时间数据存放地址*/
static unsigned char data clday_data[7];
/*EE中存放的最近一次安全天数记数的日期*/
static unsigned char data eeday_data[3];
/*EE*/
/*EE中上限温度数据存放/读取地址*/
static unsigned char data wdhigh_data[4];
/*EE中下限温度数据存放/读取地址*/
static unsigned char data wdlow_data[4];
/*实时温度数据存放地址*/
static unsigned char data wdnow_data[4];
static unsigned char data data_incept_relax[10];
/*EE数据操作中的中间寄存数组地址:写入/读出数据都经过此数组后与EE操作函数联系*/
static unsigned char data wdmiddle_data[4];
/*中间寄存器*/
static unsigned char data register_middle1;
static unsigned char data register_middle2;
static unsigned char data register_middle3;
static unsigned char data register_middle4;
/***************************************************************************************
**延时函数
***************************************************************************************/
/*1ms延时函数*/
void delay_us(unsigned char time0)/*time0每增加10,定时增加0.087ms*/
{
unsigned char long0;
for(long0=time0;long0>0;--long0)
{
wdt_contrequ=0x36;
}
}
/*ms延时函数*/
void delay_ms(unsigned char time1)
{
unsigned char long1;
for(long1=time1;long1>0;--long1)
{
delay_us(115);/*1ms延时*/
}
}
/*s延时函数*/
void delay_s(unsigned char time2)
{
unsigned char long1;
for(long1=time2;long1>0;--long1)
{
delay_us(200);/*200ms延时*/
delay_us(200);/*200ms延时*/
delay_us(200);/*200ms延时*/
delay_us(200);/*200ms延时*/
delay_us(200);/*200ms延时*/
}
}
/***************************************************************************
ee操作函数区开始
demand4:温度上限/下限数据存放地址高字节,20上限温度存储,21下限温度存储
demand5:温度上限/下限数据存放地址高字节,20上限温度存储,21下限温度存储
***************************************************************************/
/*ee中存放的温度上限/下限数据读取:输入项:无,输出项:wdmiddle_data[i]*/
void eeprom_read(unsigned char demand4)
{
unsigned char i;
for(i=0;i<4;i++)
{
isp_addrh=demand4;
isp_addrl=i;
EA=0;
isp_contr=0x01;
isp_contr=isp_contr|0x80;
isp_cmd=0x01;
isp_trig=0x46;
isp_trig=0xb9;
isp_contr=0x00;
isp_cmd=0x00;
isp_trig=0x00;
isp_addrh=0x00;
isp_addrl=0x00;
EA=1;
if(isp_data>0x09) wdmiddle_data[i]=0x00;/*如果读取的数值大于9,说明ee数据错误,默认数据为0*/
else wdmiddle_data[i]=isp_data;
}
}
/*向ee中写入温度上限/下限数据:输入项:wdmiddle_data[i],输出项:无*/
void eeprom_write(unsigned char demand5)
{
unsigned char i;
for(i=0;i<4;i++)
{
isp_data=wdmiddle_data[i];
isp_addrh=demand5;
isp_addrl=i;
EA=0;
isp_contr=0x01;
isp_contr=isp_contr|0x80;
isp_cmd=0x02;
isp_trig=0x46;
isp_trig=0xb9;
;
isp_contr=0x00;
isp_cmd=0x00;
isp_trig=0x00;
isp_addrh=0x00;
isp_addrl=0x00;
EA=1;
}
}
/*扇区擦除*/
void eeprom_clear(unsigned char demand3)
{
isp_addrh=demand3;
isp_addrl=0x00;
EA=0;
isp_contr=0x01;
isp_contr=isp_contr|0x80;
isp_cmd=0x03;
isp_trig=0x46;
isp_trig=0xb9;
;
isp_contr=0x00;
isp_cmd=0x00;
isp_trig=0x00;
isp_addrh=0x00;
isp_addrl=0x00;
EA=1;
}
/***************************************************************************
ee操作函数区结束
***************************************************************************/
/**************************************************************************
显示处理函数开始
**************************************************************************/
/*数据与数码管显示表转换*/
void change(void)
{
switch(register_middle1)
{
case 0x00:
{
register_middle2=0x40;
break;
}
case 0x01:
{
register_middle2=0x06;
break;
}
case 0x02:
{
register_middle2=0x5b;
break;
}
case 0x03:
{
register_middle2=0x5e;
break;
}
case 0x04:
{
register_middle2=0x66;
break;
}
case 0x05:
{
register_middle2=0x7c;
break;
}
case 0x06:
{
register_middle2=0x5f;
break;
}
case 0x07:
{
register_middle2=0x16;
break;
}
case 0x08:
{
register_middle2=0x7f;
break;
}
case 0x09:
{
register_middle2=0x7e;
break;
}
default:break;
}
}
void wdhigh_show(void)/*上限温度显示处理函数*/
{
register_middle1=wdhigh_data[3];
change();
P1=register_middle2;
setshow3=1;
delay_ms(10);
setshow3=0;/*百位显示*/
register_middle1=wdhigh_data[2];
change();
P1=register_middle2;
setshow2=1;
delay_ms(10);
setshow2=0;/*十位显示*/
register_middle1=wdhigh_data[1];
change();
P1=register_middle2;
setshow1=1;
delay_ms(10);
setshow1=0;/*个位显示*/
register_middle1=wdhigh_data[0];
change();
P1=register_middle2;
setshow0=1;
delay_ms(10);
setshow0=0;/*小数显示*/
}
void wdlow_show(void)