使用TLC2543来读取电压
程序员文章站
2022-03-15 13:48:48
这个星期,我使用TLC2543这款芯片来读取输入的电压值,显示模块则是使用的LCD1602,程序不难,很适合初学者。#include#include #include #include #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