📄 max197.c
字号:
/*while(1)
{delay(1000)
temp=_crol_(temp,1); //循环左移函数 ,包含在intrins文件中。
P1=temp;
}*/
#include<reg52.h> //<>表示先找库的,再找工程文件夹的;“”先找工程文件夹的,再找库的;
#include<absacc.h>
#include<1602LCD.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define addata P0
uchar m,t0,t1,flag,flag1,flag2,ADH,ADL,ADH0,ADL0;
int u;
ulong sum;
uchar code wel[]={"-temperature?--"};//液晶显示字符
uchar code pt[]={"----Pt100?----"};
uchar code K[]={"----K?----"};
uchar code LM35[]={"----LM35----"};
uchar code num[]={"0123456789"};
uchar data ad_data[2]={0x00,0x00}; //用于存储AD转换后的数据
ulong data temperature[]={0x00,0x00,0x00};
uint data dis[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //要显示的数
sbit P14=P1^4;
sbit P15=P1^5;
sbit P13=P1^3;
sbit OE=P2^6;
//控制MAX197转换的端口 ,送模拟信号输入端口地址,启动转换
sbit MAX197_CS=P1^6;
sbit HBEN=P1^7;
sbit wr=P3^6;
sbit rd=P3^7;
//控制热电偶数据输入端口
sbit SO=P1^0; //串行数据输出端
sbit CS=P1^1; //片选信号,低电平串行接口有效
sbit SCK=P1^2; //串行时钟输入端
void display(uint m);
//void delay1(uint c);//delay1()函数声明
void delay(uint z); //delay()函数声明
void admax197();
void K_read();
void init();
void display3();
void display2();
void display1();
void main()
{
init();
while(1)
{
if(P14&&P15!=0) //LM35
{
admax197();
display1();
}
if (P14==0) //PT100
{
delay(10);
if(P14==0)
{
while(flag!=1)
{
admax197();
display2();
}
}
}
if (P15==0) //K
{
delay(10);
if(P15==0)
{
K_read();
display3();
}
}
}
}
void init() //初始化
{
P0=0xff;
P1=0xff;
P2=0x00;
P3=0xff;
delay(255); //启动等待,等LCM进入工作状态
LCMInit(); //LCM初始化
delay(5); //延时片刻(可不要)
ReadDataLCM(); //测试用句无意义
DisplayListChar(0,0,wel); //0列0行开始显示
TMOD=0x01;
// TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
// TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET0=1;
// ET1=1;
TR0=1;
// TR1=1;
}
void delay(uint z) //延时子程序,z=1时延时1ms
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void admax197() // AD转换使用通道0 ----LM35;
{
P0=0x50;
MAX197_CS=0;
_nop_();
wr=0;
_nop_();
wr=1;
_nop_();
_nop_();
while(INT0==1);
HBEN=0;
rd=0;
ad_data[0]=addata ;
HBEN=1;
ad_data[1]=addata&0x0f;
sum=ad_data[1]*256+ad_data[0];
rd=1;
}
void timer0() interrupt 1 //定时器0溢出中断50ms定时
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t0++;
if(t0==1000) //定时50s
{
t0=0;
flag=1;
}
}
//void timer1() interrupt 3
//{TH1=(65536-50000)/256;
// TL1=(65536-50000)%256;
// t1++;
// if(t1==2000) //定时100s
// {
// t1=0;
// flag1=1;
// }
//}
void display1()
{
uint i;
uchar x;
temperature[0]=10000*sum/4095;
DisplayListChar(0,0,LM35); //0列0行开始显示
dis[0]=temperature[0]/1000;
dis[4]=temperature[0]%1000;
dis[1]=dis[4]/100;
dis[4]=dis[4]%100;
dis[2]=dis[4]/10;
dis[3]=dis[4]%10;
x=10;
for(i=3,x=10;i>=0;i--)
{
if(x==8)
{
DisplayOneChar(x,1,'.');x--;
}
DisplayOneChar(x, 1, num[dis[i]]);
x--;
}
}
void display2()
{
uint i;
uchar x;
temperature[1]=sum; //要改的
DisplayListChar(0,0,pt); //0列0行开始显示
dis[0]=temperature[1]/51;
dis[4]=temperature[1]%51;
dis[4]=dis[4]*10;
dis[1]=dis[4]/51;
dis[4]=dis[4]%51;
dis[4]=dis[4]*10;
dis[2]=dis[4]/51;
x=10;
for(i=2,x=10;i>=0;i--)
{
if(x==8)
{
DisplayOneChar(x,1,'.');x--;
}
DisplayOneChar(x, 1, num[dis[i]]);
x--;
}
}
void display3()
{
uint i;
uchar x;
temperature[0]=100*1023.75*u/4095; //要改的
dis[0]=temperature[0]/100000;
dis[7]=temperature[0]%100000;
dis[1]=dis[7]/10000;
dis[7]=dis[7]%10000;
dis[2]=dis[7]/1000;
dis[7]=dis[7]%1000;
dis[3]=dis[7]/100;
dis[7]=dis[7]%100;
dis[4]=dis[7]/10;
dis[5]=dis[7]%10;
x=10;
for(i=5,x=10;i>=0;i--)
{
if(x==8)
{
DisplayOneChar(x,1,'.');x--;
}
DisplayOneChar(x, 1, num[dis[i]]);
x--;
}
}
/*…………热电偶信号处理…………*/
void K_read(void)
{
unsigned char i,j;
ADH=ADL=0;
SCK=0;
CS=0;
SCK=1;
CS=0;
SCK=0; /*输出数据D15*/
SCK=1;
for(i=4;i>0;i--) /*读取转换结果高4位*/
{
SCK=0;
ADH0=SO;
if(ADH0==1)
{ADH=ADH<<1;
ADH=ADH||0x01;
}
else
ADH=ADH<<1; /*数据位左移*/
SCK=1;
}
for(j=8;j>0;j++)
/*读取转换结果低8位*/
{
SCK=0;
ADL0=SO;
if(ADL0==1)
{ADL=ADL<<1;
ADL=ADL||0x01;
}
else
ADL=ADL<<1; /*数据左移*/
SCK=1;
}
SCK=0;
flag2=SO; /*读取D2断偶标志*/
SCK=1;
SCK=0; /*输出数据D0*/
CS=1;
delay(10);
u=ADH*256+ADL;
}
// 温度值= 1 023.75 ×转换后的数字量/ 4 095
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -