您当前的位置:首页 >> 健康
ADC应用实例---电压表
发布时间:2020-02-10
 

大家好,前面和大家分享了好多关于ADC的知识,今天来看一个实例,尽管这次用的芯片已经基本上没人用了,但是这不影响我们学习!话不多说了 ,直接上代码。

主函数

#include

#include "ADC0832.h"

#include "LCD1602.h"

unsigned char code tab1[] = "CurrentVoltage:";

unsigned char code tab2[] = " 0.00 V";

void main()

{

unsigned char i;

int v = 0;

init1602();

write1602_com(0x80);

for(i = 0; tab1[i]; ++i)

write1602_dat(tab1[i]);

write1602_com(0x80 + 0x40);

for(i = 0; tab2[i]; ++i)

write1602_dat(tab2[i]);

while(1) {

v = 5.0 * read0832() / 256 * 100;

write1602_com(0x80 + 0x40 + 3);

write1602_dat('0' + v/100 );

write1602_dat('.');

write1602_dat('0' + v/10%10 );

write1602_dat('0' + v%10 );

}

}

ADC0832驱动函数

sbit CS_0832 = P1^0;

sbit CLK_0832 = P1^1;

sbit DO_0832 = P1^2;// DI、DO不同时有效,可共用一个接口

sbit DI_0832 = P1^2;

extern void _nop_ ( void );

#define pulse0832() _nop_();_nop_();CLK_0832=1;_nop_();_nop_();CLK_0832=0

//把模拟电压值转换成8位二进制数并返回

unsigned char read0832()

{

unsigned char i, ch = 0, ch1 = 0;

CS_0832=0;// 片选,DO为高阻态

DI_0832=1;

// 此处暂停T-SetUp: 250ns (由pulse0832完成)

pulse0832();// 第一个脉冲,起始位,DI置高

DI_0832=1;

pulse0832();// 第二个脉冲,DI=1表示双通道单极性输入

DI_0832=1;

pulse0832();// 第三个脉冲,DI=1表示选择通道1(CH2)

// 51单片机为准双向IO口:应先写入1再读取

DI_0832=1;

// MSB FIRST DATA

for(i = 0; i < 8; ++i) {

pulse0832();

ch <<= 1;

if(DO_0832==1)

ch |= 0x01;

}

// MSB FIRST输出的最后一位与LSB FIRST输出的第一位是在

// 同一个时钟下降沿之后,故此处先执行读取,后执行pulse

// LSB FIRST DATA

for(i = 0; i < 8; ++i) {

ch1 >>= 1;

if(DO_0832==1)

ch1 |= 0x80;

pulse0832();

}

CS_0832=1;// 取消片选,一个转换周期结束

return (ch==ch1) ? ch : 0;// 返回转换结果

}

LCD1602液晶驱动函数

#define LCD1602 P0

sbit LCD_RS = P3^5;

sbit LCD_RW = P3^6;

sbit LCD_EN = P3^4;

#define LCD_RS_0 LCD_RS=0

#define LCD_RS_1 LCD_RS=1

#define LCD_RW_0 LCD_RW=0

#define LCD_RW_1 LCD_RW=1

#define LCD_EN_0 LCD_EN=0

#define LCD_EN_1 LCD_EN=1

#include "delay.h"

#define DELAY_1602 delayms(5)

void write1602_com(unsigned char com)

{

LCD_RS_0;

LCD1602 = com;

DELAY_1602;

LCD_EN_1;

DELAY_1602;

LCD_EN_0;

}

void write1602_dat(unsigned char dat)

{

LCD_RS_1;

LCD1602 = dat;

DELAY_1602;

LCD_EN_1;

DELAY_1602;

LCD_EN_0;

}

void init1602( void )

{

LCD_RW_0;

write1602_com(0x38);

write1602_com(0x0C);

write1602_com(0x06);

write1602_com(0x01);

最后再来一张图

ADC应用实例---电压表

有问题欢迎大家一起讨论、一起学习