单片机-ADDA


#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
	
sbit dula=P2^6;   //定义锁存器的锁存端
sbit wela=P2^7;   //定义锁存器的锁存端
sbit adwr=P3^6;   //定义AD转换器的WR端口
sbit adrd=P3^7;   //定义AD转换器的RD端口

//共阴数码管
unsigned char code table[]={
     0x3f,0x06,0x5b,0x4f,
     0x66,0x6d,0x7d,0x07,
     0x7f,0x6f,0x77,0x7c,
     0x39,0x5e,0x79,0x71,
};

void delayms(uint xms)  //延时函数
{
	 uint i,j;
	 for(i=xms;i>0;i--)
	 {
	 	for(j=110;j>0;j--);
	 }
}

void display(uchar bai,uchar shi,uchar ge)  //显示函数
{
	wela=1;
	P0=0x7d;  //0111 1101 显示第2位和选中AD转换器
	wela=0;
	P0=0xff;  //送位选数据时关闭所有显示;防止打开位选锁存;
	dula=1;  //数码管显示
	P0=table[bai];
	dula=0;
	delayms(5);
	
	wela=1;
	P0=0x7b;   //0111 1011 显示第3位数码管并选中AD转换器
	wela=0;
	P0=0xff;
	dula=1;
	P0=table[shi];
	dula=0;
	delayms(5);
	
	wela=1;
	P0=0x77;   //0111 0111 显示第4位数码管并选中AD转换器
	wela=0;
	P0=0xff;
	dula=1;
	P0=table[ge];
	dula=0;
	delayms(5);
	
}

void main()
{
	
	uchar a,A1,A2,A3,adval;
	A1=1;
	A2=2;
	A3=3;
	wela=1;
	P0=0x7f;  //0111 1111 选通CSAD
	wela=0;
	while(1)
	{
		adwr=1;
		_nop_();
		adwr=0;  //启动AD转换;
		_nop_();  //延时一个机器周期
		adwr=1;
		for(a=10;a>0;a--)
		{
			display(A1,A2,A3);
		}
		P1=0xff;  //1111 1111 读取P1之前先全给1
		adrd=1;  //选通ADCS
		_nop_();
		adrd=0;  //AD读使能;
		_nop_();
		adval=P1;  //AD数据读取赋值给P1
		A1=adval/100;
		A2=adval%100/10;
		A3=adval%10;
	}
}


DAC0832引脚:

  • CS:片选信号输入端,低电平有效。
  • WR1:输入寄存器的写选通输入端,负脉冲有效。当CS为0,ILE为1,WR1有效时,DI0-DI7状态被锁存到输入寄存器。
  • DI0-DI7:数据输入端,TTL电平。
  • Vref:基准电压输入端,电压范围为-10V-+10V。
  • Rfb:反馈电阻端,芯片内部此端与IOUT1接有一个15K的电阻。
  • IOUT1:电流输出端,当输入全为1,电流最大。
  • IOUT2:电流输出端,其值与IOUT1电流之和为一常数。
  • XFER:数据传输控制信号输入端,低电平有效。
  • WR2:DAC寄存器的写选通输入端,负脉冲有效。当XFER为0且WR2有效时,输入寄存器的状态被传到DAC寄存器中。
  • ILE:数据锁存允许信号输入端,高电平有效。

DAC0832工作方式:

  • 双缓冲
  • 单缓冲
  • 直通:片选、写信号、传送控制都接地。
#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int
	
sbit dula=P2^6;  //段选
sbit wela=P2^7;  //位选
sbit dawr=P3^6;  //DA的WR端口
sbit dacs=P3^2;  //DA的CS端口
sbit beep=P2^3;  //蜂鸣器端口

void delayms(uint xms)  //延时xms
{
	uint i,j;
	for(i=xms;i>0;i--)
	{
		for(j=110;j>0;j--);
	}
}

void main()
{
	uchar val,flag;
	dula=0;  //关闭段选
	wela=0;  //关闭位选
	dacs=0;  //片选信号,选中DAC
	dawr=0;  //输入寄存器的写信号选通端
	P0=0;
	while(1)
	{
		if(flag==0)
		{
			val+=5;
			P0=val;
			if(val==255)
			{
				flag=1;
				beep=1;
				delayms(100);
				beep=0;
			}
			delayms(50);
		}
		else
		{
			val-=5;
			P0=val;
			if(val==0)
			{
				flag=0;
				beep=1;
				delayms(100);
				beep=0;
			}
			delayms(50);
		}
	}
}
赞赏