AT89C51单片机电压表制作

  • 格式:docx
  • 大小:151.45 KB
  • 文档页数:8

1.实验任务

利用单片机AT89S51与ADC0809设计一个数字电压表,能够测量0-5V之间的直流电压值,四位数码显示,但要求使用的元器件数目最少。

2.电路原理图

图1.28.1

3.系统板上硬件连线

a) 把“单片机系统”区域中的P1.0-P1.7与“动态数码显示”区域中的ABCDEFGH端口用8芯排线连接。 b) 把“单片机系统”区域中的P2.0-P2.7与“动态数码显示”区域中的S1S2S3S4S5S6S7S8端口用8芯排线连接。

c) 把“单片机系统”区域中的P3.0与“模数转换模块”区域中的ST端子用导线相连接。

d) 把“单片机系统”区域中的P3.1与“模数转换模块”区域中的OE端子用导线相连接。

e) 把“单片机系统”区域中的P3.2与“模数转换模块”区域中的EOC端子用导线相连接。

f) 把“单片机系统”区域中的P3.3与“模数转换模块”区域中的CLK端子用导线相连接。

g) 把“模数转换模块”区域中的A2A1A0端子用导线连接到“电源模块”区域中的GND端子上。

h) 把“模数转换模块”区域中的IN0端子用导线连接到“三路可调电压模块”区域中的VR1端子上。

i) 把“单片机系统”区域中的P0.0-P0.7用8芯排线连接到“模数转换模块”区域中的D0D1D2D3D4D5D6D7端子上。

4.程序设计内容

i. 由于ADC0809在进行A/D转换时需要有CLK信号,而此时的ADC0809的CLK是接在AT89S51单片机的P3.3端口上,也就是要求从P3.3输出CLK信号供ADC0809使用。因此产生CLK信号的方法就得用软件来产生了。

ii. 由于ADC0809的参考电压VREF=VCC,所以转换之后的数据要经过数据处理,在数码管上显示出电压值。实际显示的电压值 (D/256*VREF)

5.汇编源程序

(略)

6. C语言源程序 #include

unsigned char code dispbitcode[]={0xfe,0xfd,0xfb,0xf7,

0xef,0xdf,0xbf,0x7f};

unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,

0x6d,0x7d,0x07,0x7f,0x6f,0x00};

unsigned char dispbuf[8]={10,10,10,10,0,0,0,0};

unsigned char dispcount;

unsigned char getdata;

unsigned int temp;

unsigned char i;

sbit ST=P3^0;

sbit OE=P3^1;

sbit EOC=P3^2;

sbit CLK=P3^3;

void main(void)

{

ST=0;

OE=0;

ET0=1;

ET1=1;

EA=1;

TMOD=0x12; TH0=216;

TL0=216;

TH1=(65536-4000)/256;

TL1=(65536-4000)%256;

TR1=1;

TR0=1;

ST=1;

ST=0;

while(1)

{

if(EOC==1)

{

OE=1;

getdata=P0;

OE=0;

temp=getdata*235;

temp=temp/128;

i=5;

dispbuf[0]=10;

dispbuf[1]=10;

dispbuf[2]=10;

dispbuf[3]=10; dispbuf[4]=10;

dispbuf[5]=0;

dispbuf[6]=0;

dispbuf[7]=0;

while(temp/10)

{

dispbuf[i]=temp%10;

temp=temp/10;

i++;

}

dispbuf[i]=temp;

ST=1;

ST=0;

}

}

}

void t0(void) interrupt 1 using 0

{

CLK=~CLK;

}

void t1(void) interrupt 3 using 0

{ TH1=(65536-4000)/256;

TL1=(65536-4000)%256;

P1=dispcode[dispbuf[dispcount]];

P2=dispbitcode[dispcount];

if(dispcount==7)

{

P1=P1

|

0x80;

}

dispcount++;

if(dispcount==8)

{

dispcount=0;

}

}

基于单片机的数字多用表的设计

2011-01-18 21:24:18 来源:仪表技术河南科技学院李国厚杨青杰陈艳锋

关键字:单片机数字多用表

1DS1629的结构特性与工作原理

DS1629是专为温度的数字化测量而设计的一种芯片,同时还兼有实时时钟/日历的功能。DS1629的宽电源范围和极小的功耗非常适合于电池供电的应用环境。其时钟功能可以是12小时或者24小时的模式,且在12小时的模式下带有AM/PM指示。当温度达到或超过程序设定的上限TH或者时间到达程序设定的时刻时,芯片就产生漏极开路的报警输出。 DS1629由数字温度传感器、实时时钟、两线串行接口、数据寄存器、温度和时钟报警比较器及时钟分频器和缓冲器6个部分组成。

由制造商标定的温度传感器无需外部器件。芯片一上电就开始进行温度转换,并随后连续进行转换。主机(通常为单片机)可以周期性地读取温度寄存器中最新转换的温度值,并且由于转换是在“后台”进行的,读数据并不影响转换的过程。主机可以修改芯片的配置,如上电后并不立即开始转换和连续转换模式,这样对于要求省电的场合很有益处。实时时钟/日历提供秒、分、时、星期、日期、月、年的BCD数值,这需要内部的振荡器/分频器和外部的32.768kHz的晶振。不足31天的月份则在月底自动调整,闰年的补偿直到2100年。实时时钟可以通过清除时钟寄存器中的控制位而关闭。通过读/写时钟寄存器或者时钟报警寄存器可以关闭时钟报警输出。

二进制数据的读/写通过两线总线进行,高位在前,每个寄存器的访问都采用8位的命令协议。芯片各个引脚的功能如表1所示。

2 硬件设计

从前面的讨论可以看出,DS1629兼有数字温度传感器和实时时钟/日历的功能,工作电压为2.2~5.5V,因而可将其与单片机结合起来设计出带有数字钟功能的数字温度表。单片机采用AT89C2051,封装为20DIP,工作电压范围是2.7~5.5V。显示部分采用6位数码管来显示时间、日期或温度等数据。为了简化电路,减少芯片,降低功耗,显示部分采用动态循环扫描的方式,由一片4~7段译码器CD4543驱动。CD4543的工作电压为 3~18V,整个电路采用两节干电池供电,系统的硬件构成如图1所示。图中,DS1629的SCL与SDA端分别接单片机的P3.0和P3.1,R1和 C1构成上电自动复位电路,P3.2~P3.4接 3个按键,C2、C3及6MHz晶振构成振荡电路,P3.5、P3.7、P1.0~P1.3分别接6位数码管的公共端(图中3个数码管LED2~LED4 没有画出)作为位选信号,P1.4~P1.7接CD4543的BCD码输入端,6个数码管的数据输入端a~g都并接到CD4543的数据输出端a~g。

数字表的功能包括温度的测量显示和时钟两个方面,因而在软件设计中应同时考虑。温度表和时钟功能由按键S3选择,上电后的默认状态为自动显示测量的温度,按一下S3则切换到时间显示,再按一下又返回到温度显示。默认状态下按键S2为秒表功能键,按1次开始计时,按两次停止计时,按3次则清 0,再按则返回到初始状态。默认状态下按键S1为调整时间的功能键,按1次S1设定小时,此时S2为加1键,按1次小时加1,S3为减1键,按1次小时减 1;按2次S1设定分钟,此时S2、S3的作用同前;按3次S1则返回到初始状态。根据这些功能,软件设计由初始化、功能键处理、时间显示、温度测量及显示等几个部分组成。初始化部分完成单片机中断、定时器、片内存储单元和DS1629的初始配置;功能键处理部分则进行键盘的扫描及相应的处理;时间及温度显示则是读取DS1629的时间和温度参数,进行转换后送出显示。下面给出单片机对DS1629操作的程序段,假定单片机的P3.1接SDA,P3.0接 SCL,设定DS1629的工作模式为单次转换模式,禁止时钟输出,对温度及时钟均为高电平报警,则相应的程序段如下:

从前面的讨论可以看出,DS1629给基于单片机的数字化温度的测量与控制带来了极大的方便,使得系统的设计大为简化,具有很高的实用价值。