📄 子机.c
字号:
/************************************************************************************************************************
************************************************一号温度测试系统子机程序*************************************************************
************************************************************************************************************************/
#include<reg51.h>
#include<intrins.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
#define Rvr1 100 //校准电阻低端值100欧
#define Rvr2 250 //校准电
//#define rref 196945 //电阻基准
//#define vref 524800 //电压基准
uchar code dm[]={0x42,0xd7,0x1a,0x16,0x87,0x26,0x22,0x57,0x02,0x06};
uchar code xml[]={0,0,2,1,0,3,4,5,6};//写1302命令表
uchar code dml[]={0,1,2,3,4,5,6};//读1302命令表
uchar data jshc[8]={0,0,0,0,0,0,0,0}; //串口接收数据缓冲区
//uchar data fshc[8]={0,0,0,0,0,0,0,0}; //串口发送数据缓冲区
uchar idata huanchong[3]={0,34,12}; //1302读数据缓冲
uint idata wenduzhihc[3]={0,34,12}; //温度显示数据缓冲
uchar idata sendhc[4]; //485发送缓冲
float idata jzrref[5]={0,0,0,0,0}; //校准电阻滤波数组
float idata jzvref[5]={0,0,0,0,0}; //校准电压滤波数组
//float data dqr[10]={0,0,0,0,0,0,0,0,0,0}; //读数据电阻滤波数组
//float data dqv[10]={0,0,0,0,0,0,0,0,0,0}; //读数据温度滤波数组
data union {float word;struct{uchar hhi;uchar hi;uchar lo;uchar llo;}byte;}range_zero;
data union {float word;struct{uchar hhi;uchar hi;uchar lo;uchar llo;}byte;}range_full;
/*系统量程零点和满度误差*/
data union {float word;struct{uchar hhi;uchar hi;uchar lo;uchar llo;}byte;}rref;
data union {float word;struct{uchar hhi;uchar hi;uchar lo;uchar llo;}byte;}vref;
//data unsigned int out_zero,out_full; /*变送输出零点和满度*/
data float v1,v2,rt1,rt2,vrl1,vrl2,v,vrl,r,rl,t; /*校准及计算用数据区?*/
data union {float word;struct{uchar hhi;uchar hi;uchar lo;uchar llo;}byte;}wendu;
idata union {float word;struct{uchar hhi;uchar hi;uchar lo;uchar llo;}byte;}shangx; //检测仪上下限
idata union {float word;struct{uchar hhi;uchar hi;uchar lo;uchar llo;}byte;}xiax;
unsigned char dizhi;
float aa;
int zz;
uchar data jsflag=0,err,jzhun=0,xhflag=0; //接收到数据标志////接收出错标志//校准标志
bit jzh_flag; /*校准期间标志*/
sbit trx=P2^7;
sbit fmq=P2^0; //蜂鸣器引脚
sbit T_CLK= P2^3; /*实时时钟时钟线引脚 */
sbit T_IO= P2^1; /*实时时钟数据线引脚 */
sbit T_RST= P2^2; /*实时时钟复位线引脚 */
sbit dat= P0^2 ; // P2.0 对应 595 SI
sbit rck= P0^1 ; // P2.1 ... 595 RCK
sbit clk= P0^0 ; // P2.2 ... 595 SCK
sbit TA= P0^7 ; //状态按键右向左第一个
sbit ADDE= P0^6; //加按键右向左第二个
sbit SUB= P0^5; //减按键右向左第三个
sbit jdq1=P1^0;
sbit jdq2=P1^1; //继电器驱动口
sbit ad_cs=P1^6; /*AD转换器AD7705硬件I/O定义*/
sbit ad_sclk=P1^7;
sbit ad_dout=P1^3; /*AD输入输出公用I/O*/
sbit ad_din=P1^2;
sbit ad_reset=P1^5;
sbit ad_drdy=P1^4; /*AD工作标志,'0'时才可以操作*/
sbit LIGHT1= P0^4;
sbit LIGHT2= P0^3;
uchar data cnt=0,cnt1=0,cnt2=0,cnt3=4,cnt4=5,cnt7=0,senflag=0;
/*延时函数,可以定义时间*/
void dealy(unsigned int time)
{
while(time!=0)
{
time--;
}
}
/*AD转换器命令写函数,标准移位寄存器方式,高位在前,每次8位*/
void ad_write(unsigned char command)
{
data unsigned char i;
ad_sclk=1;
ad_cs=0;
i=8;
while(i!=0)
{
ad_sclk=0;
ad_din=command&0x80;
ad_sclk=1;
command=command<<1;
i--;
}
ad_din=1; //送完命令置'1',准备输入数据
ad_cs=1;
}
/*===========================================================================================*/
unsigned int ad_pro(unsigned char ch) /*AD转换处理函数,CH=1,2,直接输出结果*/
{
data union {unsigned int word;struct{unsigned char hi;unsigned char lo;}byte;}k;
data unsigned char i;
data unsigned int j;
ad_cs=0;
ad_write(0x0f+ch); /*写通讯寄存器,选择通道1,2,并建立下一个操作为写设置寄存器*/
ad_write(0x5c); /*写设置寄存器,清除FSYNC,建立增益为8,信号为单极性等运行条件,*/
/*初始化被选通道为自校准模式,不加缓冲器*/
while(ad_drdy==0)
{}
while(ad_drdy==1)
{}
ad_write(0x37+ch); /*读通讯寄存器,选择通道1,2,并建立下一个操作位读数据寄存器*/
ad_sclk=1; /*读取结果*/
ad_cs=0;
i=16;
while(i!=0)
{
k.word=k.word<<1;
ad_sclk=0;
j=ad_dout;
ad_sclk=1;
k.word=k.word+j;
i--;
}
ad_cs=1;
return (k.word);
}
/******************************************************************************************
*****************************************串口发送数据程序**********************************
******************************************************************************************/
void send()
{
unsigned char data i;
trx=1; //485发 送允许
TI=0;
for(i=0;i<8;i++)
{
SBUF=jshc[i];
while(TI==0)
{}
TI=0;
}
for(i=0;i<30;i++)
{}
trx=0;
for(i=0;i<250;i++)
{}
}
/******************************************************************************************
*****************************************给595缓冲区送数据*********************************
******************************************************************************************/
void sd595hc ()
{
uchar data a,i,j;
uchar code * data b;
j=0;
for(i=1;i<=2;i++)
{
a=huanchong[i]; //将从1302读出的数据变换成段码
if(a>=10) //数据大于10
{
b=dm+a%10; //找到段码位置
sendhc[j]=*b; //送给595发送缓冲区
j++;
b=dm+a/10;
sendhc[j]=*b;
j++;
}
else
{
b=dm+a; //数据小于10
sendhc[j]=*b;
j++;
sendhc[j]=*dm; //第二位送0
j++;
}
}
}
void sd595hc1()
{
uchar data a,i,j;
uchar code * data b;
j=0;
for(i=1;i<=2;i++)
{
a=wenduzhihc[i]; //将从1302读出的数据变换成段码
if(a>=10) //数据大于10
{
b=dm+a%10; //找到段码位置
sendhc[j]=*b; //送给595发送缓冲区
j++;
b=dm+a/10;
sendhc[j]=*b;
j++;
}
else
{
b=dm+a; //数据小于10
sendhc[j]=*b;
j++;
sendhc[j]=*dm; //第二位送0
j++;
}
}
}
/******************************************************************************************
******************************************给595送数据函数**********************************
******************************************************************************************/
delay()
{
data unsigned char i;
for(i=0;i<10;i++)
{}
}
void sd595()
{ uchar data j,i,k; //将缓冲区数据送给595
for(j=0;j<4;j++)
{
k=sendhc[j]; //找到缓冲区先送低位
for(i=0;i<8;i++)
{
clk=0; //模拟时钟
dat=k&0x01; //送一位数据
delay();
clk=1;
//delay();
k=k>>1; //右移一位
}
}
rck=0;
//delay();
rck=1;
}
/****************************************************************************************
*****************************************BCD码转换到ASC码********************************
****************************************************************************************/
void bcdtoasc(unsigned char *lvalue)
{
*lvalue=((*lvalue)&0x0f)+10*( ((*lvalue)&0xf0)>>4);
}
/****************************************************************************************
*****************************************ASC码转换到BCD码********************************
****************************************************************************************/
void asctobcd(unsigned char *lvalue)
{
*lvalue=(((*lvalue)/10)<<4)|(((*lvalue)%10)&0x0f);
}
/******************************************************************************************
*************************************对于1302的读和写函数**********************************
******************************************************************************************/
void write_byte(unsigned char te) //往ds1302 写入一个字节
{
unsigned char i;
//T_RST=1;
for(i=0;i<8;i++)
{
T_IO=te&0x01; //取最后一位
T_CLK=1; //模拟脉冲
T_CLK=0;
te= te>>1; //右移一位
}
}
unsigned char read_byte() //从ds1302 读出一个字节
{
unsigned char data i,j,k;
T_CLK=0;
for(i=0;i<8;i++)
{
j=j>>1; //左移一位
k=T_IO; //传送数据
k=k<<7; //接受位右移
j=j|k;
T_CLK=1; //模拟脉冲
T_CLK=0;
}
return j;
}
void write_word(unsigned char add,unsigned char word,unsigned char flag) //写1302先写命令再写数据
{
T_CLK=0;
T_RST=0; //时钟初始化
T_RST=1;
add=add<<1; //flag==1 表示RAM FLAG==0表示 时钟
add=add|0x80;
if(flag==1)
{
add=add|0x40;
}
write_byte(add); //写入命令
write_byte(word); //写入数据
T_RST=0; //清时钟
}
unsigned char read_word(unsigned char addr,unsigned char flag) //读1302先写命令再读数据
{
unsigned char data i;
T_CLK=0;
T_RST=0; //时钟初始化
T_RST=1;
addr=addr<<1;
addr=addr|0x81;
if(flag==1)
{
addr=addr|0x40;
}
write_byte(addr); //写入命令
i=read_byte(); //读出数据
T_RST=0;
return i;
}
/******************************************************************************************
*************************************给1302写入时钟数据************************************
******************************************************************************************/
void xsz1302()
{
uchar data a,b,i;
uchar code * data e;
uchar data *c; //反复调用函数将数据写完
for(i=2;i<5;i++)
{
e=xml+i;
a=*e;
c=jshc+i;
asctobcd(c);
jshc[i]=*c;
b=jshc[i];
write_word(a,b,0);
bcdtoasc(c);
jshc[i]=*c;
}
}
/******************************************************************************************
*************************************从1302读出时钟数据************************************
******************************************************************************************/
void dsz1302()
{
uchar data i,a,c; //反复调用函数将数据读完
uchar data *b;
uchar code * data e;
for(i=0;i<3;i++)
{
e=dml+i;
a=*e;
b=huanchong+i;
c=read_word(a,0);
b=&c;
bcdtoasc(b);
huanchong[i]=*b;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -