当前位置: 移动技术网 > 科技>人工智能>嵌入式 > 使用TLC2543来读取电压

使用TLC2543来读取电压

2020年10月24日  | 移动技术网科技  | 我要评论
这个星期,我使用TLC2543这款芯片来读取输入的电压值,显示模块则是使用的LCD1602,程序不难,很适合初学者。#include<reg51.h>#include <stdio.h>#include <math.h>#include <string.h>#define uint8_t unsigned char //0-255#define uint16_t unsigned int//0-65535#define uint32_t un

这个星期,我使用TLC2543这款芯片来读取输入的电压值,显示模块则是使用的LCD1602,程序不难,很适合初学者。

#include<reg51.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#define uint8_t unsigned char	 //0-255
#define uint16_t unsigned int	//0-65535
#define uint32_t unsigned long 	   //0-4294967295
#define uchar unsigned char
#define u8 unsigned char
#define u16 uint16_t	
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
ulong volt;//测量的电压值 
/*AD转换芯片*/
sbit DOUT=P1^5; //数据输出   
sbit DIN=P1^6;  //数据输入
sbit CS=P1^7;
sbit CLK=P3^6;
sbit EOC=P3^7;





sbit rs = P2^0; //LCD1602 RS接口
sbit rw = P2^1;	//LCD1602 RW接口
sbit en = P2^2;	//LCD1602 EN接口		



/*******************************************************************************
* 函 数 名         : delay
* 函数功能		   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(uint8_t i)	  //延时函数   i=1时 延时10us
{
    while(i--);
}

void delay_1s(uint8_t s)
{
	unsigned int i;

	unsigned char j; //定义两个循环变量i、j

	while(s--)
		for (i = 1000; i > 0; i--) //外层循环1000次

			for (j = 124; j > 0; j--) ; //内层循环124次
}


/*******************************************************************************
* 函数功能		   : 向TLC2543写命令及读转换后的数据,ad转换
*******************************************************************************/

u16 read2543(u8 con_word)
{
   u16 ad=0,i;
   CLK=0;    //时钟首先置低
   CS=0;    //片选为0,芯片工作
   for(i=0;i<12;i++)
   {
     if(DOUT) //首先读取TLC2543的1位数据
     ad=ad|0x01;
  DIN=(bit)(con_word&0x80); // 向TLC2543写1位数据
     CLK=1;   //时钟上升沿,TLC2543输出使能
  delay(3);
  CLK=0;   //时钟下降沿,TLC2543输入使能
  delay(3);
  con_word<<=1;
  ad<<=1;
   }
  CS=1;
  ad>>=1;
	volt=ad;//取走转换结果
	volt=volt*1.221;
	return(volt); 
}


/*******************************************************************************
* 函数功能		   : LCD的显示
*******************************************************************************/

void lcd_wcom(uint8_t com)  //LCD1602 写命令
{
	rs = 0;
	rw = 0;
	en = 0;
	P0 = com;
	delay(100);
	en = 1;
	delay(100);
	en = 0;
}

void lcd_wdat(uint8_t dat)	//LCD1602 写数据
{
	rs = 1;
	rw = 0;
	en = 0;
	P0 = dat;
	delay(100);
	en = 1;
	delay(100);
	en = 0;
}

void lcd_init(void)    //LCD初始化
{
	lcd_wcom(0x38);
	lcd_wcom(0x0c);
	lcd_wcom(0x06);
	lcd_wcom(0x01);
	
}
 /***********************************************************************
* 函数功能		 :AD显示数值 
*******************************************************************************/
void LCD_Display_AD(void)
{
//	uint16_t ad_temp;
//	ad_temp=datapros();
	lcd_wcom(0x80+0x40);

	lcd_wdat('A');
	lcd_wdat('D');
	lcd_wdat(':');

	
	
	lcd_wdat((volt%10000000/1000000) +'0');//百万
	lcd_wdat((volt%1000000/100000) +'0');//十万
	lcd_wdat((volt%100000/10000) +'0');//万
	lcd_wdat((volt%10000/1000) +'0');//千
	lcd_wdat((volt%1000/100) +'0');//百
	lcd_wdat((volt%100/10) +'0');//十
	lcd_wdat((volt%10) +'0');//个
	
}


/**********************************************************/
//主程序
/**********************************************************/
void main()
{
	lcd_init(); //LCD初始化
	while(1)
	{
		read2543(addr);//调用2543驱动程序测量地址为0
		LCD_Display_AD();//调用显示程序	
	}
}

假如只取小数点后面两位数的话,那么这个测量精度还是可以的
written by 亦舒斋
QQ:1464475872

本文地址:https://blog.csdn.net/m0_46340227/article/details/109254657

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网