51单片机ADC0832电压测量液晶1602显示的C程序

在这里插入图片描述

#include <reg52.h>
#include <intrins.H>
#include <math.H>
#include <stdio.h>	
#define     u8  			unsigned char
#define     uchar  		unsigned char
#define     uint   		unsigned int
#define     u16   		unsigned int
#define  uchar unsigned char
#define  uint unsigned int
float dianliu1,dianliu2,dianya;

uchar dianji=0;
sbit LCD_RS = P2^4;   //液晶1602  RS端口    
sbit LCD_RW = P2^5;   //液晶1602  RS端口         
sbit LCD_EP = P2^6;   //液晶1602  EN端口

sbit key1 = P3^0; 
sbit key2 = P3^1; 

sbit key3 = P1^0; 
sbit key4 = P1^1; 
sbit led = P1^2;
sbit fmq = P1^4;   //
int dianliumax = 90,dianyamax =30;
uchar code table[] =  {" A1=100A V=13  V"};	  //设定速度初始化
uchar code table1[] = {" A0=100A V=22  V"}; //  动态显示初始化
uchar n , i,x,table2[5],table3[5],ge,shi,bai,flag1,key1n,temp;

unsigned char  x=1	  ;					
void  init();
void display_val(unsigned int zhuan);
 unsigned int flag_aa;

/***********延时1MS程序***/
void  delay(uint z)
{  uint x,y;
   for(x=z;x>0;x--)
   for(y=80;y>0;y--);

}



 /******液晶写命令************/
 void  write_com(uchar com)
 {	 LCD_RS=0;
  
	P0=com	;
//	delay(1);
	LCD_EP=1;
	delay(1);
	LCD_EP=0;
 }
/*****************/
/********液晶写数据***********/
void  write_data(uchar  date)
{	  LCD_RS=1;
 
	P0=date	;
//delay(1);
	LCD_EP=1;
	delay(1);
	LCD_EP=0;

}
/*****************************/
  void dis1(int z,unsigned int zhua,int x,int y)
{
 	
  table2[0]=zhua/10000+0x30;           //取万位   
  table2[1]=(zhua%10000)/1000+0x30;   //取千位
  table2[2]=(zhua%1000)/100+0x30;     //取百位 
  table2[3]=(zhua%100)/10+0x30;       //取十位    
  table2[4]=zhua%10+0x30;	          //取个位 
	if(z==1)
  write_com(0x80+x);
	if(z==2)
  write_com(0x80+0x40+x);
 //  write_data(table2[0]);
  //  write_data(table2[1]);
   write_data(table2[3]);
	 if(y==1)
		write_data('.');
   write_data(table2[4]);
	 	if(y==2)
		write_data('.');
   write_data(table2[5]);
   write_com(0x80+16);	
     	  
	 
 } 
  void dis(int z,unsigned int zhua,int x,int y)
{
 	
  table2[0]=zhua/10000+0x30;           //取万位   
  table2[1]=(zhua%10000)/1000+0x30;   //取千位
  table2[2]=(zhua%1000)/100+0x30;     //取百位 
  table2[3]=(zhua%100)/10+0x30;       //取十位    
  table2[4]=zhua%10+0x30;	          //取个位 
	if(z==1)
  write_com(0x80+x);
	if(z==2)
  write_com(0x80+0x40+x);
 //  write_data(table2[0]);
  //  write_data(table2[1]);
   write_data(table2[2]);
	 if(y==1)
		write_data('.');
   write_data(table2[3]);
	 	if(y==2)
		write_data('.');
   write_data(table2[4]);
   write_com(0x80+16);	
     	  
	 
 } 


/*--------------------------液晶初始化-----------------------------*/
void  init_lcd()
{	 
		LCD_EP=0;
       write_com(0x38);
	   write_com(0x08);
	   write_com(0x06);  
       write_com(0x0c);
	   write_com(0x01);
//初始化显示 
	write_com(0x80);                      
	for(i=0;i<16;i++)
	{
		write_data(table[i]);                      
		delay(3);
	}
	write_com(0x80+0x40);                       
	for(i=0;i<16;i++)
	{
		write_data(table1[i]);                      
		delay(3);
	}  

}
void uart(void)                 //串口通信初始化  
{  
    SCON=0x50;                  //串口通信工作方式1  
    REN=1;                      //允许接收  
    TMOD=0x20;                  //定时器1的工作方式2  
    TH1=0xfd,TL1=0xfd;        
    TI=1;                       //这里一定要注意  
    TR1=1;   	//打开定时器  

}
void init()
{
		TMOD=0X10;  //定时器工作方式1
    TH1=0XFF;   //100us定时,装入初值
    TL1=0XA4;
    TR1=1;		//启动T1工作
    ET1=1;		//允许T1中断
	  EA =1;	    //开总中断
}
  int max(int a,int b,int c)
	{
    return (a>b?a:b)>c?(a>b?a:b):c;
  }
	
	
/***********************************************************************************************************
ADC0832相关函数
***********************************************************************************************************/
sbit ADCS 	=P1^5; //ADC0832 片选
sbit ADCLK  =P1^7; //ADC0832 时钟
sbit ADDI 	=P1^6; //ADC0832 数据输入		/*因为单片机的管脚是双向的,且ADC0832的数据输入输出不同时进行,
sbit ADDO 	=P1^6; //ADC0832 数据输出		/*为节省单片机引脚,简化电路所以输入输出连接在同一个引脚上


//========================================================================
unsigned int Adc0832(unsigned char channel)
{
	uchar i=0;
	uchar j;
	uint dat=0;
	uchar ndat=0;
	uchar  Vot=0;

	if(channel==0)channel=2;
	if(channel==1)channel=3;
	ADDI=1;
	_nop_();
	_nop_();
	ADCS=0;//拉低CS端
	_nop_();
	_nop_();
	ADCLK=1;//拉高CLK端
	_nop_();
	_nop_();
	ADCLK=0;//拉低CLK端,形成下降沿1
	_nop_();
	_nop_();
	ADCLK=1;//拉高CLK端
	ADDI=channel&0x1;
	_nop_();
	_nop_();
	ADCLK=0;//拉低CLK端,形成下降沿2
	_nop_();
	_nop_();
	ADCLK=1;//拉高CLK端
	ADDI=(channel>>1)&0x1;
	_nop_();
	_nop_();
	ADCLK=0;//拉低CLK端,形成下降沿3
	ADDI=1;//控制命令结束
	_nop_();
	_nop_();
	dat=0;
	for(i=0;i<8;i++)
	{
		dat|=ADDO;//收数据
		ADCLK=1;
		_nop_();
		_nop_();
		ADCLK=0;//形成一次时钟脉冲
		_nop_();
		_nop_();
		dat<<=1;
		if(i==7)dat|=ADDO;
	}
	for(i=0;i<8;i++)
	{
		j=0;
		j=j|ADDO;//收数据
		ADCLK=1;
		_nop_();
		_nop_();
		ADCLK=0;//形成一次时钟脉冲
		_nop_();
		_nop_();
		j=j<<7;
		ndat=ndat|j;
		if(i<7)ndat>>=1;
	}
	ADCS=1;//拉低CS端
	ADCLK=0;//拉低CLK端
	ADDO=1;//拉高数据端,回到初始状态
	dat<<=8;
	dat|=ndat;

	return(dat);            //return ad data
}
/***********************************************************************************************************
ADC0832相关函数
***********************************************************************************************************/
sbit ADCS2 	=P3^7; //ADC0832 片选
sbit ADCLK2  =P3^6; //ADC0832 时钟
sbit ADDI2 	=P3^5; //ADC0832 数据输入		/*因为单片机的管脚是双向的,且ADC0832的数据输入输出不同时进行,
sbit ADDO2 	=P3^5; //ADC0832 数据输出		/*为节省单片机引脚,简化电路所以输入输出连接在同一个引脚上


//========================================================================
unsigned int Adc08322(unsigned char channel)
{
	uchar i=0;
	uchar j;
	uint dat=0;
	uchar ndat=0;
	uchar  Vot=0;

	if(channel==0)channel=2;
	if(channel==1)channel=3;
	ADDI2=1;
	_nop_();
	_nop_();
	ADCS2=0;//拉低CS端
	_nop_();
	_nop_();
	ADCLK2=1;//拉高CLK端
	_nop_();
	_nop_();
	ADCLK2=0;//拉低CLK端,形成下降沿1
	_nop_();
	_nop_();
	ADCLK2=1;//拉高CLK端
	ADDI2=channel&0x1;
	_nop_();
	_nop_();
	ADCLK2=0;//拉低CLK端,形成下降沿2
	_nop_();
	_nop_();
	ADCLK2=1;//拉高CLK端
	ADDI2=(channel>>1)&0x1;
	_nop_();
	_nop_();
	ADCLK2=0;//拉低CLK端,形成下降沿3
	ADDI2=1;//控制命令结束
	_nop_();
	_nop_();
	dat=0;
	for(i=0;i<8;i++)
	{
		dat|=ADDO2;//收数据
		ADCLK2=1;
		_nop_();
		_nop_();
		ADCLK2=0;//形成一次时钟脉冲
		_nop_();
		_nop_();
		dat<<=1;
		if(i==7)dat|=ADDO2;
	}
	for(i=0;i<8;i++)
	{
		j=0;
		j=j|ADDO2;//收数据
		ADCLK2=1;
		_nop_();
		_nop_();
		ADCLK2=0;//形成一次时钟脉冲
		_nop_();
		_nop_();
		j=j<<7;
		ndat=ndat|j;
		if(i<7)ndat>>=1;
	}
	ADCS2=1;//拉低CS端
	ADCLK2=0;//拉低CLK端
	ADDO2=1;//拉高数据端,回到初始状态
	dat<<=8;
	dat|=ndat;

	return(dat);            //return ad data
}

void key()
{
	if(key1 == 0)
	{
		delay(50);
		dianliumax ++;
		if( dianliumax >999)
			dianliumax = 999;
	}
		if(key2 == 0)
	{
		delay(50);
		dianliumax --;
		if( dianliumax < 1)
			dianliumax = 1;
	}
	
		if(key3 == 0)
	{
		delay(50);
		dianyamax ++;
		if( dianyamax >999)
			dianyamax = 999;
	}
		if(key4 == 0)
	{
		delay(50);
		dianyamax --;
		if( dianyamax < 1)
			dianyamax = 1;
	}
}
void main()
{	
	int time,time1,time2;
	LCD_RW=0;
	init_lcd();						// 初始化液晶显示  
fmq=0;
	while(1)	
	{	 
	  	dianliu1=Adc0832(0)*5.0/65535*100.0;
			dianliu2=Adc0832(1)*5.0/65535*100.0;
			dianya=Adc08322(0)*5.0/65535*8;
		
			dis(1,dianliu1,4,0);
			dis(1,dianya,11,0);
			dis(2,dianliumax,4,0);
			key();
			dis(2,dianyamax,11,0);

			if((int)dianliu1 > dianliumax || (int)dianya > dianyamax)
			{
				fmq=1;
			}
			else
				fmq=0;

	}
 }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全职编程-叶逆天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值