📄 max1870.c
字号:
/********************************************************************/
//*********************************************************************/
#include<reg52.h>
#include<intrins.h>
//#include<stdio.h>
#include<math.h>
//extern float pow (float x, float y); //用到pow函数
#define uint unsigned int
#define uchar unsigned char
/*******************max187连线图********************/
sbit CS=P2^1; //max187片选
sbit CLK=P2^0; //max187时钟脉冲
sbit SDOUT=P2^2; //max187数据输出口,返回给AT89S51
/*************LCD1602连线图**********************/
sbit RS=P1^2; //数据\命令选择
sbit RW=P1^1; //读\写选择
sbit E=P1^0; //使能端
/*************变量定义********************/
//由于存放时数据范围的不同,要注意各变量的类型
uint num=0,temp,x=0;
uchar i,xx,ge,fen1,fen2,fen3,t0; //用在对数据的处理
uint table[12]={0,0,0,0,0,0,0,0,0,0,0,0}; //暂存max187读回的二进制数
/*****************************/
/*延迟子程序.可运用于整个程序
/*****************************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/********************************/
/*max187子程序
/********************************/
/***************max187begin************/
void read_max187(void)
{
// uint count=0;
CS=1;
CLK=0;
CS=0; // 片选低电平,开始转换
// while(SDOUT==0);
for(i=0;i<8;i++) //延迟,等待转换结束
{
_nop_();
}
CLK=1;
CLK=0;
xx=SDOUT;
// count=count^xx;
table[0]=xx; //将读回的数值存入table数组,便于后面进行的数制转换的处理
for(i=0;i<11;i++)
{
CLK=1;
CLK=0;
// count=count<<1;
xx=SDOUT;
// count=count^xx;
table[i+1]=xx;
} //运用完12次,存入12位二进制数
CLK=1;
CLK=0;
CS=1; //读完数据,片选拉高
// return count;
}
/*********************max187end******************/
/******************************************/
/*将max187返回的二进制转换为十进制,由LCD显示
/******************************************/
uint change_code(void)
{ float j;
read_max187();
for(i=0,j=11;i<12,j>=0;j--,i++)
{
x=table[i]*pow( 2, j);
num+=x;
}
/* x=table[0]*2048; //最高位
num=num+x; //由num进行十进制数值的累加
x=table[1]*1024; //次高位
num=num+x;
x=table[2]*512; //第十位
num=num+x;
x=table[3]*256;
num=num+x;
x=table[4]*128;
num=num+x;
x=table[5]*64;
num=num+x;
x=table[6]*32;
num=num+x;
x=table[7]*16;
num=num+x;
x=table[8]*8;
num=num+x;
x=table[9]*4; //第三位
num=num+x;
x=table[10]*2; //次低位
num=num+x;
x=table[11]*1; //最低位
num=num+x;
*/
return num; //num累加得最后要显示的十进制数值,做为函数的返回值
}
/*******************************/
/*LCD1602子程序
/*******************************/
/*********LCD1602begin*******/
void write_com(uchar com) //写命令子函数
{
RS=0;
P0=com;
RW=0;
delay(5);
E=1;
delay(5);
E=0;
}
void write_data(uchar date) //写数据子函数
{
RS=1;
P0=date;
RW=0;
delay(5);
E=1;
delay(5);
E=0;
}
void write_str(uchar add,uchar *str) //从一个地址开始写字符串
{
write_com(add); //要写数据的地址
while(*str!='\0')
{
write_data(*str++);
}
}
void init(void) //LCD初始化函数
{
E=0;
write_com(0x38); //显示模式设置
write_com(0x0c); //显示ON,显示光标OFF,光标闪烁OFF
write_com(0x06); //写完一个字符,地址指针右移
write_com(0x01); //清屏
write_com(0x80+0x00);
}
/*************LCD1602end****************/
/*******************************/
/*主函数
/*******************************/
void main(void)
{
TMOD=0x01;
TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
EA=1;
ET0=1;
TR0=1;
init();
write_str(0x80+1,"Voltage Value");
write_str(0x80+0x40+6,".");
write_str(0x80+0x40+10,"V");
while(1)
{ if(t0==15){ t0=0;
temp=change_code();
temp=temp-15;
ge=temp/1000%10;
fen1=temp/100%10;
fen2=temp/10%10;
fen3=temp%10;
delay(10);
write_com(0x80+0x40+5);
write_data(0x30+ge);
delay(5);
write_com(0x80+0x40+7);
write_data(0x30+fen1);
delay(5);
write_com(0x80+0x40+8);
write_data(0x30+fen2);
delay(15);
write_com(0x80+0x40+9);
write_data(0x30+fen3);
delay(50);
num=0;
temp=0;
}
}
}
void time0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t0++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -