⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 max1247.c

📁 MAX1247子程序,实现12位高精度串行AD转换
💻 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 + -