⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jizhong.c

📁 完整的远程抄表系统程序.包含电量采集(分峰时
💻 C
📖 第 1 页 / 共 5 页
字号:

#include "reg52.h"
#include "structs.h"
#include "STRING.H"

#define dsclk P15
#define dsda  P16
#define int0  P32				//外部中断0
#define int1  P33				//外部中断1
#define int2  P34				//
#define int3  P35				//
#define int4  P17				//
#define dsscl P15
#define dsda  P16
//#define   P14        		    //

bit bdata h_time,d_time;  		// 进行零抄标志
bit bdata datak_ok;       		// 数据库已存在标志
bit bdata rs232_ok;       		// MODEM初始化标志
bit bdata zb5_i;          		// 已抄标记
bit bdata datrxd;         		// 读16C450 标志

unsigned char data carr_svr_name[2]={0x00,0x00};//集中器编号
unsigned char data carr_svr_ver[7]={'V','E','R','1','.','0','5'};//集中器版本
unsigned char xdata r_old;        		// 跨月度停电标志
unsigned char xdata miyao[5];
unsigned char xdata mima[9];
unsigned char bdata led_data;
unsigned char data ystxd,ysrxd, yszb;	// 延时控制变量
unsigned char data r_day,r_hour,r_int; 	// 零抄日、时、间隔
unsigned char data minx;
unsigned char data loop_l;             	// 启动轮抄类型标志
unsigned char data loop_l_up;          	// 上位机启动标志
unsigned char data loop_z;             	// 中继类型计数
unsigned char data c_zbpo;             	// 中继方式
unsigned char data ipo;                	// 清中继允许标志
unsigned char data time_x,time_y;

unsigned int data c_zb;               	// 电表抄表计数
unsigned int data c_zb1,c_zb2,c_zb3,c_zb4;
unsigned int data meter_num;

sbit P32 = P3^2;
sbit P33 = P3^3;
sbit P34 = P3^4;
sbit P35 = P3^5;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;

typedef struct
{
	unsigned char i,j,c,d,a,x;
   	unsigned int uc6;
   	unsigned int uc7;
   	long lc0;
   	long lc1;
}hhint;
hhint data *p;

/******************************************************************************/
/*函 数 名:initsys															  */
/*功    能:系统定时器设置													  */
/*入口参数:ch																  */
/*出口参数:无																  */
/******************************************************************************/
void initsys(ch)
{ 
	TMOD = 0x21;              	// 设 T/C1 为定时方式2  T/C0 为定时方式 1
  	if(ch==1)
 		{TH1=0xFd;TL1=0xFd;} 	// 设定波特率 11.0592MHz 下波特率为2400 数F4H
//		{TH1=0xF4;TL1=0xF4;} 	// 设定波特率 11.0592MHz 下波特率为2400 数F4H
//		{TH1=0xF3;TL1=0xF3;} 	// 设定波特率 12MHz      下波特率为2400 数F3H
    else if(ch==2)
    	{TH1=0xFd;TL1=0xFd;}  	// 11.0592MHz下波特率为9600 数FdH			
	PCON = 0x00;      			// 波特率倍增
  	SCON = 0x50;      			// 串行口工作在方式1
  	TR1 = 1;      				// 启动 T/C1 定时器

  	TH0=0x3c;TL0=0xb0; 			// 设置 T0 定时 50 ms 的定时中断
  	TR0 = 1;           			// 启动 T0 定时器
  	ET0 = 1;           			// 允许定时器 T0 中断
  	EA = 1;          			// 开中断
}
/******************************************************************************/
/*函 数 名:in8250_2     													  */
/*功    能:			                     								  */
/*入口参数:无																  */
/*出口参数:无																  */
/******************************************************************************/
void in8250_2(void)
{
	unsigned char xdata *ps;
   	// 设置波特率
   	ps=0x1fda;                	// 置FCR寄存器
   	*ps=0x00;
   	ps=0x1fdb;                	// 置通讯线路控制寄存器地址 011
   	*ps=0x80;                 	// 置 第7位 DLSB=1
   	ps=0x1fd8;                	// 设置除数寄存器低位地址
   	*ps=48;                   	// 设置除数低位为 48    除数 = 1843200 / (2400波特率 * 16)
   	ps=0x1fd9;                	// 设置除数寄存器高位地址
   	*ps=0;                    	// 设置除数低位为 0
   	ps=0x1fdb;                	// 设置通讯线路控制寄存器地址
   	*ps=0x07;                 	// 设置通讯数据格式  8位 无奇偶校验 2位停止位
   	ps=0x1fdc;                	// 设置 MODEM 控制寄存器
   	*ps=0x03;
   	ps=0x1fd9;                	// 设置中断允许寄存器地址  001
   	*ps=0x01;                 	// 允许接收数据准备好中断
}

/******************************************************************************/
/*函 数 名:rd_82502     													  */
/*功    能:读8250_2	                     								  */
/*入口参数:无																  */
/*出口参数:i																  */
/******************************************************************************/
unsigned char rd_82502(void)
{
	unsigned char xdata *ps;
  	unsigned char data i;
  	ps=0x1fdd;
  	for(ysrxd=2;ysrxd;)
    {
		i=*ps;
      	if(i&0x01==0x01)
		{ps=0x1fd8; i=*ps; datrxd=1; return(i);}
      	P1=0xf4; P1=0xff;
      	if(ysrxd==0) break;
      	if((RI==1)||(int3==0))
			return(0);
	}
  	datrxd=0;
  	return(0);
}

/******************************************************************************/
/*函 数 名:wr_82502     													  */
/*功    能:写8250_2	                     								  */
/*入口参数:x																  */
/*出口参数:0/1																  */
/******************************************************************************/
bit wr_82502(unsigned char x)
{
	unsigned char xdata *ps;
  	unsigned char bdata q;
  	ps=0x1fdd;q=0;
  	for(ysrxd=5;ysrxd;)
    {
		q=*ps;
      	if((q&0x20)==0x20)
		{ps=0x1fd8; *ps=x; return(1);}
      	P1=0xf4; P1=0xff;
      	if(ysrxd==0) break;
	}
   	return (0);
}

/******************************************************************************/
/*函 数 名:read_dallas    													  */
/*功    能:读时间芯片 DS1302                  								  */
/*入口参数:rtc_add															  */
/*出口参数:																  */
/******************************************************************************/
unsigned char read_dallas(unsigned char rtc_add)
{
	unsigned char data i,j,sp1;
  	sp1=P1;P1=0xf4;P1=sp1;dsclk=0;j=0;
  	P1=P1&0xf0;EA=0;
  	for(i=0;i<8;i++)
  	{
		if(rtc_add & (0x01<<i)) dsda=1;
      	else dsda=0;
    	dsclk=1;dsclk=0;
  	}
  	for(i=0,dsda=1;i<8;i++)
  	{
		if(dsda) j|=0x01<<i;
    	dsclk=1; dsclk=0;
  	}
  	EA=1;P1=sp1;P1=0xf4;P1=sp1;
  	return(j);
}

/******************************************************************************/
/*函 数 名:write_dallas    												  */
/*功    能:写时间芯片 DS1302                  								  */
/*入口参数:rtc_add	 ch														  */
/*出口参数:无																  */
/******************************************************************************/
void write_dallas(unsigned char rtc_add,unsigned char ch)   // 时钟芯片
{
	unsigned char data sp1;
  	unsigned char data i;
  	sp1=P1;P1=0xf4;P1=sp1;dsclk=0;P1=P1&0xf0;
  	EA=0;
  	for(i=0;i<8;i++)
   	{
		if(rtc_add & (0x01<<i)) dsda=1;
		else dsda=0;
      	dsclk=1;dsclk=0;
   	}
  	for(i=0;i<8;i++)
  	{
		if(ch & (0x01<<i)) dsda=1;
       	else dsda=0;
     	dsclk=1;dsclk=0;
	}
  	EA=1;P1=sp1;P1=0xf4;P1=sp1;
}

/******************************************************************************/
/*函 数 名:			    												  */
/*功    能:            				     								  */
/*入口参数:																  */
/*出口参数:																  */
/******************************************************************************/
unsigned char sys_test(void)
{
	unsigned char data  i,j;
   	SYSTEST xdata *ps;
   	ps=(SYSTEST xdata *)TEST_ADD;
   	j=0;P1=0xf1;
   	for(i=0;i<10;i++)
    {
		ps->test[i]=i;j=0;
		j=ps->test[i];
		if(j==i){j=0;continue;}
		ps->test[i]=i;j=ps->test[i];
		if(j==i){j=0;continue;}
		ps->test[i]=i;j=ps->test[i];
		if(j!=i){j=1; break;}
		else j=0;
	}
   	P1=0xff;
   	return(j);
}

/////////////////////////////////////////////
//////        串行发送函数             //////
/////////////////////////////////////////////
void txdbyte(unsigned char dachar)
{
	SBUF=dachar;
  	ystxd=10;                           // 500毫秒钟发送不成功退出
  	while(!TI)
   	{if(ystxd==0) break;}
  	TI=0;
}

/*bit rxdbyte(unsigned char *x, unsigned char t,unsigned char len)
{
	unsigned char data i,j,k;
  	j=0; k=0;
  	for(i=0;i<t;i++)
    	for(ysrxd=12;ysrxd;)
      	{
			if(RI)
	   		{
				RI=0;
	      		if(SBUF==x[j])
		  		{
					j++;
		    		if(len==j) return(1);
		  		}
				else
		 		{
					k++;
		   			if(k==20) return(0);
		 		}
	      		ysrxd=10;
	      		break;
	   		}
	 		if(ysrxd==0) break;
	 		P1=0xf4;P1=0xff;         // 清狗
      	}
	return(0);
}
*/
/******************************************************************************/
/*函 数 名:timeint0		    											  */
/*功    能:定时中断程序 50 ms 发生一次中断    								  */
/*入口参数:																  */
/*出口参数:																  */
/******************************************************************************/
void timeint0(void) interrupt 1 using 1
{
	if(ystxd!=0)                    // 发送计数器
	{ystxd--;}                 		// 加灯闪发送时指示灯
  	if(ysrxd!=0){ysrxd--;}      	// 接收计数器
  	if(yszb !=0) yszb--;
  	TH0=0x3c;TL0=0xb0;             	// 置定时器计数 50ms中断一次(12MHz)
}

void ledstm(unsigned char ledat)
{
	unsigned char xdata *ps;
  	ps=0x1fff; P1 = 0xf6; *ps=ledat; P1=0xff;
}
void ledst(unsigned char ggled)
{
	unsigned char xdata *pm;
  	pm=0x1fff; P1=0xf6; *pm=led_data & ggled; P1=0xff;
}
//延时1
void ys1(unsigned char yx)
{
	unsigned char data i,j;
  	for(j=0;j<yx;j++)
    {
		for (i=0;i<0xff;i++);
       	P1=0xf4;P1=0xff;         // 清狗
    }
}
//延时
void ys(unsigned char yx)
{
	unsigned char data i,j,h;
  	for (h=0;h<yx;h++)
	{
    	for (i=0;i<0xff;i++)
     	{for(j=0;j<0xff;j++);}
   		P1=0xf4;P1=0xff;
	}
}
bit init_rs232(void)   //串口初始化
{
	ledst(0x00);
	ys(2);
	ledst(0xff);
	ys(2);
	ledst(0x00);
	ys(2);
	ledst(0xff);
	return(1);    
}
// 在C1变量中返回SNP中表号所对应的集中器位置记录号
unsigned char get_sno(unsigned char xdata *snp)
{
	DAT_ITEM xdata *dat_ptr1;
  	unsigned int data c1,dat_len;
  	jzq_ptr=(JZQ_HEAD xdata *)JZQ_ADD;
  	dat_ptr1=(DAT_ITEM xdata *)(JZQ_ADD+0x80);
  	P1=0xf1;                              /*  SIO=1; ram_page=0;  */
  	dat_len=jzq_ptr->meter_num;    // 集中器总表数
  	if(dat_len<448)
	{
		for(c1=1;c1<=dat_len;c1++)
		{
			ysrxd=40;
	 		//////////////////////////............. 比较地址(表号)是否相等
	   		if(dat_ptr1->s_no[0]==snp[0]&&dat_ptr1->s_no[1]==snp[1]&&dat_ptr1->s_no[2]==snp[2]) //要加表号时就要增加hqf
	      	{ P1=0xf1;return(c1);}
	   		dat_ptr1++;
		}
	}
  	if((dat_len>447)&&(dat_len<895))
    {
		for (c1=1;c1<=447;c1++)
		{
			ysrxd=40;
	 		//////////////////////////............. 比较地址(表号)是否相等
	   		if(dat_ptr1->s_no[0]==snp[0] && dat_ptr1->s_no[1]==snp[1]&&dat_ptr1->s_no[2]==snp[2]) //=====
	      	{P1=0xf1;return(c1);}
	   		dat_ptr1++;
		}
       	P1=0xf9; dat_ptr1=(DAT_ITEM xdata *)(JZQ_ADD+DAT_ADD);
       	dat_len=dat_len-447;
       	for(c1=1;c1<=dat_len;c1++)
		{
			ysrxd=40;
	 		//////////////////////////............. 比较地址(表号)是否相等
	   		if(dat_ptr1->s_no[0]==snp[0] && dat_ptr1->s_no[1]==snp[1]&&dat_ptr1->s_no[2]==snp[2]) //=====
	      	{P1=0xf9;return(c1+447);}
	   		dat_ptr1++;
		}
	}
  	if((dat_len>894)&&(dat_len<1342))
    {
		for(c1=1;c1<=447;c1++)
		{
			ysrxd=40;
	 		//////////////////////////............. 比较地址(表号)是否相等
	   		if(dat_ptr1->s_no[0]==snp[0] && dat_ptr1->s_no[1]==snp[1]&&dat_ptr1->s_no[2]==snp[2]) //=====
	      	{P1=0xf1;return(c1);}
	   		dat_ptr1++;
		}
		P1=0xf9;dat_ptr1=(DAT_ITEM xdata *)(JZQ_ADD+DAT_ADD);
       	for(c1=1;c1<=447;c1++)
		{
			ysrxd=40;
	 		//////////////////////////............. 比较地址(表号)是否相等
	   		if(dat_ptr1->s_no[0]==snp[0] && dat_ptr1->s_no[1]==snp[1]&&dat_ptr1->s_no[2]==snp[2]) //=====
	     	{P1=0xf9;return(c1+447);}
	   		dat_ptr1++;
		}
       	P1=0xf2;dat_ptr1=(DAT_ITEM xdata *)(JZQ_ADD+DAT_ADD);
       	dat_len=dat_len-894;
       	for(c1=1;c1<=447;c1++)
		{
			ysrxd=40;
	 		//////////////////////////............. 比较地址(表号)是否相等
	   		if(dat_ptr1->s_no[0]==snp[0] && dat_ptr1->s_no[1]==snp[1]&&dat_ptr1->s_no[2]==snp[2]) //=====
	      	{P1=0xf9;return(c1+894);}
	   		dat_ptr1++;
		}
	}
  	P1=0xf1;                              /*  SIO=1; ram_page=1;  */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -