电子说
目录
一、前言
二、芯片介绍
1、ADC0832
2、74HC245
三、硬件连接
四、软件代码
五、效果展示
六、代码链接
通过ADC0832对电位器进行检测根据电压的不同主控芯片计算出不同的数值,将所得数值进行数模转换显示在数码管上。电位器种类有很多,摇杆式电位器在可在遥控小车、遥控飞机等电子制作时进行使用,电位器数值显示是电位器使用的基础,后期可进行多电路的添加与应用。
引脚功能:
引脚编号 | 引脚功能 | 描述 |
---|---|---|
1 | CS- | 低电平芯片使能端 |
2 | CH0 | 模拟信号输入通道0 |
3 | CH1 | 模拟信号输入通道1 |
4 | GND | 低电平(地) |
5 | D1 | 数据信号输入,选择通道控制 |
6 | D0 | 数据信号输入,转换数据输出 |
7 | CLK | 时钟输入 |
8 | VCC | 高电平 |
74HC245是方向可控的八路缓冲器,主要用于实现数据总线的双向异步通信。 74HC245是兼容TTL器件引脚的高速CMOS总线收发器,典型的CMOS型三态缓冲门电路,八路信号收发器,。由于单片机或CPU的数据/地址/控制总线端口都有一定的负载能力,如果负载超过其负载能力,一般应加驱动器。74HC245通常在主控芯片的并行接口与外部受控设备的并行接口间添加。主要应用于大屏显示,以及其它的消费类电子产品中增加驱动。
引脚功能:
引脚编号 | 引脚编号 | 描述 |
---|---|---|
1 | DIR | 方向控制 |
2 | A0 | 数据输入/输出 |
3 | A1 | 数据输入/输出 |
4 | A2 | 数据输入/输出 |
5 | A3 | 数据输入/输出 |
6 | A4 | 数据输入/输出 |
7 | A5 | 数据输入/输出 |
8 | A6 | 数据输入/输出 |
9 | A7 | 数据输入/输出 |
10 | GND | 逻辑地 |
11 | B7 | 数据输入/输出 |
12 | B6 | 数据输入/输出 |
13 | B5 | 数据输入/输出 |
14 | B4 | 数据输入/输出 |
15 | B3 | 数据输入/输出 |
16 | B2 | 数据输入/输出 |
17 | B1 | 数据输入/输出 |
18 | B0 | 数据输入/输出 |
19 | OE- | 输出使能 |
20 | VCC | 逻辑电源 |
DIR=1,A-B;DIR=0,B-A;
OE=0导通,OE=1关闭;
仿真图
P3口连接共阴极数码管的段码位;P20、P21、P22、P23为数码管的位选;
P10连接CS-;P11连接CLK;P12连接DIDO;
main主函数
进行定时器的初始化,ADC0832的初始化,以及数码管段显示的使用。
void main()
{
uchar AD1;
uint vt1;
uint while_times = 0;
delayms(300);
ET0 = 1;
TR0 = 1;
ET1 = 1;
TR1 = 1;
EA = 1; //打开总中断
CLK = 0; //ADC0832初始化
CS = 1;
while(1)
{
DigDisplay();
AD1 = Get_AD_Result1();
vt1= (500.0/256.0)*AD1;
date[0] =smgduan[vt1/100];//千分位
date[1] =smgduan[vt1/10%10]; //百分位
date[2] =smgduan[vt1%10];//十分位
date[3] =smgduan[vt1];//个分位
}
}
数码管位选函数。
通过switch语句进行位选,P3口为数码管段显示口;数码管显示使用的是数码管动态扫描。
void DigDisplay()
{
int i;
for(i=0;i<8;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
qian=0;bai=1;shi=1; ge=1;break;//显示第0位
case(1):
qian=1;bai=0;shi=1; ge=1;break;//显示第1位
case(2):
qian=1;bai=1;shi=0; ge=1;break;//显示第2位
case(3):
qian=1;bai=1;shi=1; ge=0;break;//显示第3位
}
P3=date[i];//发送段码
delayms(1); //间隔一段时间扫描
P3=0x00;//消隐
}
}
ADC0832通道选择函数。
该芯片在上篇文章中有进行解释,这里不进行解释了。
uchar Get_AD_Result1() //包含11个CLK下降沿
{
uchar i, dat;
CS = 1; //ADC0832未工作时,CS端为高电平,此时芯片禁用
CLK =1;
CS = 0;
DIDO = 1; CLK = 0; CLK = 1; //SCLK第一个下降沿来到时,DI = 1启动ADC0832
DIDO = 1; CLK = 0; CLK = 1; //SCLK第二个下降沿
DIDO = 0; CLK = 0; CLK = 1; //SCLK第三个下降沿,发送1,0选择通道cho
DIDO = 1; //释放总线
for(i = 0; i < 8; i++) //第4个下降沿到第11个下降沿
{
CLK = 0; //clk处于下降沿,每一个下降沿DO端输入下一个
if(DIDO) dat |= 0x01; // dat = dat | 0x01,dat和0x01做“或”的运算,意思是最低位置1,其它位保持不变。
CLK = 1; //clk处于上升沿
dat <<= 1; //数据左移
}
return (dat);
CS = 1; //ADC0832停止工作
}
delay.c
根据需要进行调用。
/*------------------------------------------------
uS延时函数
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延时函数
------------------------------------------------*/
void delayms(unsigned char t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
实物展示 https://live.csdn.net/v/217316
欢迎留言评论分享自己的看法;关注公众号“小小创客者”回复“数码管显示电位器值”获得代码,如有错误欢迎指正。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !