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

📄 1.c

📁 基于51单片机的ADC0832电压表
💻 C
字号:
	/****************http://bbs.cepark.com/register.php?fromuid=2975 ********
	显示格式(单位V):
				H0:4.03	H1:4.03
				bbs.cepark.com
	    				
	/*Writen by kidcao1987  2009-3-7*/
	/****************http://bbs.cepark.com/register.php?fromuid=2975 *********/
	#include <REG52.H>
	#define uint unsigned int
	#define uchar unsigned char
	sbit lcd_rs=P1^0;
	sbit lcd_rw=P1^1;
	sbit lcd_en=P1^2; //液晶控制端
	
	sbit cs=P2^0;
	sbit clk=P3^6;
	sbit dodi=P3^7;//adc0832控制端
	
	uchar temp;
	float result;
	
	uchar code name[]="SWU-LiJin";
	
	void lcd_delay(uint m)	  //延时函数
	{
		while(m--);
	}
	
	void read1602()		//忙检测
	{
		uchar i;
		i=254;
		P0=0xff;
		lcd_rs=0;
		lcd_rw=1;
		lcd_en=1;
		while((i--)&&(P0&0x80));//若一段时间以后仍低,则认为是不忙
		lcd_en=0;
	}
	
	void write1602(uchar wdata,bit rw)//向LCD1602写数据(rw=1)或者命令(rw=0)
	{
		read1602();
		P0=wdata;
		lcd_rs=rw;
		lcd_rw=0;
		lcd_en=1;
		lcd_delay(1);
		lcd_en=0;
	}
	
	void lcd_init()	   //LCD1602液晶的初始化
	{
		
		lcd_delay(1500);
		write1602(0x38,0);
		
		lcd_delay(500);
		write1602(0x38,0);
		
		lcd_delay(500);
		write1602(0x38,0);
	
		write1602(0x38,0);	 //置功能,8位数据,2行显示,5x7字符
	
		write1602(0x0c,0);	 //只打开屏显
	
		write1602(0x06,0);	//左到右显示,自加1
	
		write1602(0x01,0);	 //清屏
	}
	
	void lcd_printf(uchar *str)//显示字符串
	{
		while(*str!='\0')
		{
			write1602(*str,1);	  //写入数据
			str++;
		}
	}
	
	void lcd_moveto(uchar x,uchar y)//指定显示的行列坐标
	{
		if(x==0)
			write1602(0x80|y,0);
		if(x==1)
			write1602(0xc0|y,0);
	}
	
	uchar readadc0832(bit ch)	 //获取数值
	{
		uchar i,data1=0,data2=0;
		clk=0;
		dodi=1;
		cs=0;//cs=0时ADC0832有效
		clk=1;
		clk=0;//第一个脉冲,开始位
		dodi=1;
		clk=1;
		clk=0;//第二个脉冲,模式选择
		dodi=ch;//通道选择
		clk=1;
		clk=0;	   //第三个脉冲,通道选择
		dodi=1;
	
		for(i=0;i<8;i++)  //第一次读数从高到低 ,时钟下降沿有效
		{
			clk=1;
			clk=0;
			if(dodi)data1|=0x80>>i;	
		}
	
		for(i=0;i<8;i++)	 //第二次从低到高读数,下降沿有效
		{
			if(dodi)data2|=0x01<<i;
			clk=1;
			clk=0;
		}
	
		cs=1;
		dodi=1;
		clk=1;
		if(data1==data2)return(data1);
	}
	void main()//测试用MAIN函数
	{
		lcd_init();
		lcd_moveto(0,0);
		lcd_printf(name);
		while(1)
		{
			lcd_moveto(1,0);//定位在第二行第一列
			lcd_printf("H0:");
			temp=readadc0832(0);//读取通道0的电压值
			result=temp*0.017725490;//得到实际的电压值
			temp=(uchar)(result);//取得电压值的整数部分
			write1602(temp+48,1);//显示电压值的整数部分
			write1602('.',1);//显示小数点
			result=(result-temp)*10;
			temp=(uchar)(result);//获得电压值的小数点后第一位
			write1602(temp+48,1);
			result=(result-temp)*10;
			temp=(uchar)(result); //获得电压值的小数点后第二位
			write1602(temp+48,1);
			
			
			
			lcd_moveto(1,8); //定位在第二行第八列
			lcd_printf("H1:");
			temp=readadc0832(1); //读取通道1的电压值
			result=temp*0.017725490; //得到实际的电压值
			temp=(uchar)(result); //取得电压值的整数部分
			write1602(temp+48,1); //显示电压值的整数部分
			write1602('.',1); //显示小数点
			result=(result-temp)*10;
			temp=(uchar)(result); //获得电压值的小数点后第一位
			write1602(temp+48,1);
			result=(result-temp)*10;
			temp=(uchar)(result); //获得电压值的小数点后第二位
			write1602(temp+48,1);
		}	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -