📄 jizhong.c
字号:
#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 + -