仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
实验要求
单片机输出的数字量D0~D7加到DAC0832的输入端,用虚拟直流电压表测量DAC0832的电流输出经运放LM358N的IV转换后的电压值,并使用虚拟直流电压表查看输出电压的变化。仿真运行,可看到虚拟直流电压表测量的电压在-2.5V~0V范围内变化。如果由于电压表太小显示的电压值不清楚,可用鼠标滚轮放大电路原理图。
实验目的
掌握单片机与DAC0832的接口设计和软件编程。知识点
DA转换器DAC0832的性能、内部结构以及工作原理。DAC0832是采用先进的CMOS工艺制成的单片机电流输出型8位DA转换器。它采用的是R-2R电阻梯型网络完成DA转换。电平
接口与TTL兼容,具有两级输入数字量缓存。 源程序代码:
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
//--定义使用的IO口--//
sbit PWM=P2^1;
bit DIR;
//--定义一个全局变量--//
u16 count,value,timer1;
/*******************************************************************************
* 函 数 名 : Timer1Init
* 函数功能 : 定时器1初始化
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Timer1Init()
{
TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。
TH1 = 0xFF;
TL1 = 0xff; //1us
ET1=1;//打开定时器1中断允许
EA=1;//打开总中断
TR1=1;//打开定时器
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
Timer1Init(); //定时器1初始化
while(1)
{
if(count>100)
{
count=0;
if(DIR==1) //DIR控制增加或减小
{
value++;
}
if(DIR==0)
{
value--;
}
}
if(value==1000)
{
DIR=0;
}
if(value==0)
{
DIR=1;
}
if(timer1>1000) //PWM周期为1000*1us
{
timer1=0;
}
if(timer1 <value)
{
PWM=1;
}
else
{
PWM=0;
}
}
}
/*******************************************************************************
* 函 数 名 : Time1
* 函数功能 : 定时器1的中断函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Time1(void) interrupt 3 //3 为定时器1的中断号 1 定时器0的中断号 0 外部中断1 2 外部中断2 4 串口中断
{
TH1 = 0xFF;
TL1 = 0xff; //1us
timer1++;
count++;
}
全部资料51hei下载地址:
新建 WinRAR ZIP 压缩文件.zip
(18.34 KB, 下载次数: 73)
|