📄 zldlb.c
字号:
/************Copyright (c)**************************
程 序:
创建时间:
***************************************************/
//库函数声明//
#include <stdio.h>//I/O库函数原型声明P368
#include <math.h>//数学函数库
#include <intrins.h>//内部函数库
#include <reg51.h>
//管脚定义//
sbit rxd=P3^0;
sbit txd=P3^1;
sbit c4051a=P3^5; //量程片选信号
sbit c4051b=P3^6;
sbit c4051c=P3^7;
sbit scl=P2^6; //CAT1161接口时钟
sbit sda=P2^7; //CAT1161接口数据/看门狗
//sbit dat=P2^4; //显示数据端口
//sbit clke=P2^5; //显示时钟端口
sbit key1=P2^0;
sbit key2=P2^1;
sbit key3=P2^2;
sbit key4=P2^3;
sbit d5=P1^0; //7135位信号高位
sbit busy=P1^1;
sbit pol=P1^2;
sbit run=P1^3;//手动自动选择
sbit unr=P1^4;
sbit rt485=P1^5;
sbit bell=P1^6; //蜂鸣器输出
sbit overk=P1^7; //保护控制高电平有效
sbit stb=P3^2;
sbit ovr=P3^3; //超量程
sbit over=P3^4; //继电器输出低电平有效
sbit b1=P0^0; //8421码数据
sbit b2=P0^1;
sbit b4=P0^2;
sbit b8=P0^3;
sbit d4=P0^4; //7135位信号
sbit d3=P0^5;
sbit d2=P0^6;
sbit d1=P0^7;
bit timeout=0;
sbit CH452_SCL=P2^4;
sbit CH452_SDA=P2^5;
//全局变量声明//
#define ok 1;
#define err 0;
#define DELAY_1US {_nop_();_nop_();}
/* 2线接口的位操作,与单片机有关 */
#define CH452_SCL_SET {CH452_SCL=1;}
#define CH452_SCL_CLR {CH452_SCL=0;}
#define CH452_SDA_SET {CH452_SDA=1;}
#define CH452_SDA_CLR {CH452_SDA=0;}
#define CH452_SDA_IN (CH452_SDA)
/* 与单片机有关,与中断连接方式有关 */
#define DISABLE_INTERRUPT {EX1=0;}
#define ENABLE_INTERRUPT {EX1=1;}
#define CLEAR_INTER_FLAG {IE1=0;}
unsigned char led[6];
unsigned char lcbz;
unsigned char txbz;
unsigned char rdata;
unsigned char keydig;
unsigned char cbz;
unsigned char xbz;
unsigned char idata memory[16][5];
unsigned char rdat[6];
unsigned char dz;
unsigned char key0;
unsigned char fff=0;
unsigned char led2[6];
void rst_wdog(void)
{
sda=0;
_nop_();
_nop_();
sda=1;
}
/******************************************************
*名称:delay()
*功能:延时程序。
******************************************************/
void delay(unsigned char j)
{
unsigned char k,l;
rst_wdog();
for(l=0;l<=j;l++)
for(k=0;k<=250;k++);
}
/******************************************************
*名称:init_special_interrupts()
*功能:设置外部中断1的触发方式,并开放中断。
******************************************************/
void init_special_interrupts(void)
{
IT1 = 0;//电平触发
EX1 = 1;//开中断
//PX1 = 1;//高级优先
}
/*******************************************************
*名称:int_t0()
*功能:定时中断程序
*******************************************************/
void int_t0() interrupt 1
{
fff=fff+1;
if(fff==0x06)
{
txbz=0;
rdata=0;
bell=1;
TH0=0x80;
TL0=0x00;
ET0=0;
TR0=0;
fff=0;
}
else
{
TH0=0x00;
TL0=0x00;
}
}
/***************************************************************************
*名称:inter_isr()
*功能:外部中断1服务程序,提升档位。
***************************************************************************/
void inter_isr() interrupt 2
{
c4051a=0;
c4051b=1;
c4051c=1;
lcbz=4;
led[0]=0;
led[1]=1;
led[2]=2;
led[3]=3;
led[4]=4;
led[5]=5;
}
/***************************************************************************
*名称:init_port()
*功能: 各类输出控制
***************************************************************************/
void init_port()
{
//over=0;
over=1;
bell=1;
overk=1;//导通
rt485=0;//串口处于检测状态
c4051a=0;
c4051b=1;
c4051c=1;
run=1;
lcbz=4;//最大量程档位
c4051a=1;
c4051b=0;
c4051c=1;
overk=1;
}
/***************************************************************************
*名称:init_series()
*功能:串口0初始化
***************************************************************************/
void init_series()
{
//IP=0X10;//高级优先
IE=0x90;
TMOD=0x21;
SCON=0x50;
TH1=0xfd;
TL1=0xfd;
PCON=0;//SMOD=0不加倍
rt485=0;//串口处于检测状态
TR1=1;
EA=1;
ES=1;
}
/***************************************************************************
*名称:series_isr()
*功能:串口0中断接收
***************************************************************************/
void series_isr()interrupt 4
{
unsigned char rec_temp;
if(TI)
{
TI=0;
}
else
{
RI=0;
/*********************完成数据接收********************************/
rec_temp=SBUF;
if(rec_temp==0x01)
{
txbz=1;
//bell=0;
TH0=0x80;
TL0=0x00;
ET0=1;
TR0=1;
}
if(txbz==1)
{
rdat[rdata]=rec_temp;
rdata=rdata+1;
if(rdata>5)
{
txbz=0;
}
}
}
}
/***************************************************************************
*名称:send_series()
*功能:串口0发送子程序
***************************************************************************/
void send_series()
{
}
/***************************************************************************
*名称:read_dat()
*功能:读AD程序
***************************************************************************/
void read_dat(void)
{
if(key0==0x0)
{
//手动
if(keydig==0x0b)//4档
{
lcbz=4;
c4051a=1;
c4051b=0;
c4051c=1;
overk=1;//2v档
// d5=0;
rst_wdog();
delay(100);
}
/* if(keydig==0x0b)//3档
{
lcbz=3;
c4051a=0;
c4051b=1;
c4051c=1;
overk=1;//200v档
// d5=0;
rst_wdog();
delay(100);
}
*/
if(keydig==0x0d)//2档
{
lcbz=2;
c4051a=1;
c4051b=1;
c4051c=0;
overk=1;//20v档
// d5=0;
rst_wdog();
delay(100);
}
if(keydig==0x0e)//1挡
{
lcbz=1;
c4051a=1;
c4051b=1;
c4051c=1;
overk=0;//2v档
// d5=1;
rst_wdog();
delay(100);
}
}
else//自动量程
{
/* if(unr==1)
{
if(lcbz==2)
{
lcbz=1;
c4051a=0;
c4051b=0;
c4051c=0;
overk=1;//2v档
rst_wdog();
delay(100);
}
if(lcbz==3)
{
lcbz=2;
c4051a=0;
c4051b=0;
c4051c=1;
overk=0;//20v档
rst_wdog();
delay(100);
}
if(lcbz==4)
{
lcbz=3;
c4051a=1;
c4051b=0;
c4051c=0;
overk=0;//200v档
rst_wdog();
delay(100);
}
}*/
if(ovr==1)
{
if(lcbz==3)
{
lcbz=4;
c4051a=1;
c4051b=0;
c4051c=1;
overk=1;//2v档
rst_wdog();
delay(100);
}
if(lcbz==2)
{
lcbz=3;
c4051a=0;
c4051b=1;
c4051c=1;
overk=1;//200v档
rst_wdog();
delay(100);
}
if(lcbz==1)
{
lcbz=2;
c4051a=1;
c4051b=1;
c4051c=0;
overk=1;//20v档
rst_wdog();
delay(100);
}
}
}
while(busy==1)
{
rst_wdog();
}
while(d5==0)
{
}
while(stb==0)
{
}
led2[4]=P0&0x0f;
while(d4==0)
{
}
while(stb==0)
{
}
led2[3]=P0&0x0f;
while(d3==0)
{
}
while(stb==0)
{
}
led2[2]=P0&0x0f;
while(d2==0)
{
}
while(stb==0)
{
}
led2[1]=P0&0x0f;//3
while(d1==0)
{
}
while(stb==0)
{
}
led2[0]=P0&0x0f;//4
/*************判断是否欠量程**********************************************/
if(key0==0x08)
{//量程处理
if(unr==1)
{
if(lcbz==2)
{
lcbz=1;
c4051a=1;
c4051b=1;
c4051c=1;
overk=0;//2v档
rst_wdog();
delay(100);
}
if(lcbz==3)
{
lcbz=2;
c4051a=1;
c4051b=1;
c4051c=0;
overk=1;//20v档
rst_wdog();
delay(100);
}
if(lcbz==4)
{
lcbz=3;
c4051a=0;
c4051b=1;
c4051c=1;
overk=1;//200v档
rst_wdog();
delay(100);
}
}
}
/*************判断正负号**************************************************/
if(pol==1)
{
led[5]=16;//负号
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -