[实验任务]
用两个按键通过单片机控制DAC0832的输出,使OUT端可以输出0—5V的幅值,频率为1KHZ的锯齿波和三角波两种波形。通上电源后;按下INT1则输出三角波,在按下INT0输出锯齿波。
[实验原理]
ADC0804是8位全MOS 中速D/A转换器,采用R—2RT形电阻解码网络,转换结果为一对差动电流输出,转换时间大约为1us。使用单电源+5V―+15V供电。参考电压为-10V-+10V。在此我们直接选择+5V作为参考电压。DAC0832有三种工作方式:直通方式,单缓冲方式,双缓冲方式;在此我们选择直通的工作方式,将XFER WR 1WR2 CS管脚全部接数字地。管脚8接参考电压,在此我们接的参考电压是+5V。那么经过第一级运放后,输出电压将是-5V-0V,在经过第二级运放反相放大1倍以后将可以输出0V—5V了。我们在控制P1口输出数据有规律的变化将可以产生三角波,锯齿波,梯型波等波形了。
[硬件电路图]
[C语言源程序]
- #include <AT89X51.H>
- unsigned char keycnt=0;
- unsigned char tcnt=0; //键值判断
- bit sjz=0; //产生三角波时用到的标志
- void delayl() //延时子程序
- { unsigned char i,j;
- for(i=20;i>0;i--)
- for(j=248;j>0;j--); }
- void KEY() //按键扫描程序
- {
- if(P3_2==0)
- {
- delayl(); //延时跳过按下时的抖动
- if(P3_2==0)
- {
- keycnt=0; //定时器产生锯齿波标志
- TR0=0; //暂时停止波形输出
- TH0=0x256-40; //对TH0 TL0赋值
- TL0=0x256-40;
- TR0=1; //开始定时,产生锯齿波
- while(P3_2==0); //如果一直按着键,则等待松键开
- delayl(); //延时跳过松开后的抖动
- } }
- if(P3_3==0)
- {
- delayl(); //延时跳过按下时的抖动
- if(P3_3==0)
- {
- keycnt=1; //定时器产生三角波标志
- TR0=0; //暂时停止波形输出
- TH0=0x256-40; //对TH0 TL0赋值
- TL0=0x256-40;
- TR0=1; //开始定时 产生三角波
- }
- while(P3_2==0); //如果一直按着键,则等待松键开
- delayl(); //延时跳过松开后的抖动
- }
- } //请注意写程序时的格式规范,此处是为了节省纸张
- void t0(void) interrupt 1 using 0 //定时中断服务函数
- {
- if(keycnt==0) //产生锯齿波
- {
- P0=tcnt;
- tcnt=+0x0a; //步进0.2V/一次中断
- if(tcnt==0xfb)
- {tcnt=0;}
- }
- if(keycnt==1) //产生三角波
- { if(sjz==0)
- {P0=tcnt;
- tcnt=+0x0a;//步进0.2V/一次中断
- if(tcnt==0xfa)
- {sjz=1;}
- }
- if(sjz==1)
- {
- P0=tcnt;
- tcnt=-0x0a;
- if(tcnt==0)
- {sjz=0;}
- }
- }
- }
- void main(void)
- {
- TMOD=0x02; //定时器工作在方式2
- ET0=1;
- EA=1;
- while(1)
- { KEY(); }
- }