📄 max1247.c
字号:
#include <absacc.h> //绝对地址访问函数
#include <intrins.h>
#include <math.h> //各种不同类型的数学函数
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; //一个_nop_()A为1us
#define CH0 0x9e
#define CH1 0xde
#define CH2 0xae
#define CH3 0xee
/***********************************************MAX1247***********************************************/
sbit SCLK=P0^0;
sbit CS=P0^1;
sbit DIN=P0^2;
sbit DOUT=P0^3;
/*****************************************************************************************************/
/*******************************************LCD 显示**************************************************/
#define LINE1 0
#define LINE2 1
#define LINE1_HEAD 0x80
#define LINE2_HEAD 0xC0
#define LCD_DELAY_TIME 40
#define DATA_MODE 0x38
#define OPEN_SCREEN 0x0C
#define DISPLAY_ADDRESS 0x80
#define CLEARSCREEN LCD_en_command(0x01)
//common part
#define HIGH 1
#define LOW 0
#define TRUE 1
#define FALSE 0
#define ZERO 0
#define MSB 0x80
#define LSB 0x01
/*******************************************************************/
#define LCDIO P3
sbit LCD1602_RS=P1^0;
sbit LCD1602_RW=P1^1;
sbit LCD1602_EN=P1^2;
unsigned char code tab[]={'0','1','2','3','4','5','6','7','8','9'};
/***********************************LCD显示********************************************/
/*MAX1247的A/D转换,其中P1_1为片选端,P1_0为时钟输入端,P1_3为数据输入端,P1_2为数据输出*/
//注意:这里用的是2.5V供电
uint adc1247(uchar adcadres)
{ uchar j,i;
uint strdata=0;
CS=0;
SCLK=0;
//送控制命令字节:选择内时钟模式,通道0,单极性转换
for(i=0;i<8;i++)
{
if(adcadres>=0x80)//先送高位
DIN=1; //右移一次,送到P1_3口
else
DIN=0;
adcadres=adcadres<<1;
SCLK=0; //此处为送时钟信号
for(j=0;j<2;j++); //空操作,延时
SCLK=1;
for(j=0;j<2;j++); //空操作,延时
SCLK=0; //时钟信号周期等于执行4条指令的时间
}
CS=1;
for(j=0;j<4;j++); //空操作,延时
CS=0;
strdata=0;
SCLK=1;
for(j=0;j<12;j++)
{
strdata=strdata<<1;
SCLK=0;
SCLK=1;
if(DOUT) strdata=strdata+1; //读出12位串行数据
}
for(j=0;j<4;j++)
{
SCLK=0;
SCLK=1;
}
CS=1;
return(strdata) ;
}
/******************** LCD PART *************************************/
void LCD_delay(void)
{
unsigned char i;
for(i=LCD_DELAY_TIME;i>ZERO;i--)//be sure lcd reset
;
}
/********************************************************************/
void LCD_en_command(unsigned char command)
{
LCDIO=command;
LCD1602_RS=LOW;
LCD1602_RW=LOW;
LCD1602_EN=LOW;
LCD_delay();
LCD1602_EN=HIGH;
}
/********************************************************************/
void LCD_en_dat(unsigned char dat)
{
LCDIO=dat;
LCD1602_RS=HIGH;
LCD1602_RW=LOW;
LCD1602_EN=LOW;
LCD_delay();
LCD1602_EN=HIGH;
}
/********************************************************************/
void LCD_set_xy( unsigned char x, unsigned char y )
{
unsigned char address;
if (y == LINE1)
address = LINE1_HEAD + x;
else
address = LINE2_HEAD + x;
LCD_en_command(address);
}
/********************************************************************/
void LCD_write_char( unsigned x,unsigned char y,unsigned char dat)
{
LCD_set_xy( x, y );
LCD_en_dat(dat);
}
/********************************************************************/
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
{
LCD_set_xy( X, Y ); //set address
while (*s) // write character
{
LCDIO=*s;
LCD_en_dat(*s);
s ++;
}
}
/********************************************************************/
void LCD_init(void)
{
CLEARSCREEN;//clear screen
LCD_en_command(DATA_MODE);//set 8 bit data transmission mode
LCD_en_command(OPEN_SCREEN);//open display (enable lcd display)
LCD_en_command(DISPLAY_ADDRESS);//set lcd first display address
CLEARSCREEN;//clear screen
}
/********************************************************************/
/*********************** OTHER PART *********************************/
void delay_nms(unsigned int n)
{
unsigned int i=0,j=0;
for (i=n;i>0;i--)
for (j=0;j<1140;j++);
}
/********************************************************************/
/**********************************************主程序***************************************************/
main()
{ uint pp;
float adata ;
unsigned long int m;
uchar adchange[3];
LCD_init();
while(1)
{
pp=adc1247(CH3) ;
adata=pp*2.47/4096+0.005;
m=(uint)(adata*1000) ;
adchange[0]=tab[m/1000];
adchange[1]=tab[m/100%10];
adchange[2]=tab[m/10%10];
CLEARSCREEN;
delay_nms(2);
LCD_write_string(0,LINE1,"MAX1247:WORKING SUCCESSFUL");
LCD_write_string(0,LINE2,"VOLTAGE:");
LCD_write_char(8,LINE2,adchange[0]);
LCD_write_char(9,LINE2,'.');
LCD_write_char(10,LINE2,adchange[1]);
LCD_write_char(11,LINE2,adchange[2]);
delay_nms(200);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -