仿真电路:
单片机源程序如下:
- #include <reg52.h>
- #include <math.h>
- #define DAC_PORT P2 //如图,DAC0832连接端口
- //两种波
- #define W_TRI 0
- #define W_SAW 1
- #define PI 3.1415926f //圆周率
- //简化类型符写法
- typedef unsigned char u8;
- typedef unsigned int u16;
- typedef unsigned long u32;
- sbit DAC_WR=P3^6; //DAC0832使能口
- sbit DAC_CS=P1^7;
- //全局变量
- u8 mode;//模式:锯齿波,三角波
- u16 freq;//频率
- u8 time;//计次参数
- u8 AM;//调幅
- void Timer0Init(void);
- void sys_init(void);
- void tri_wave(u8 location);//三……
- void saw_wave(u8 location);//锯……
- void Timer0Init(void) //100微秒@12.000MHz
- {
- TMOD &= 0xF0; //设置定时器模式
- TMOD |= 0x02; //设置定时器模式
- TL0 = 0x9C; //设置定时初值
- TH0 = 0x9C; //设置定时重载值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- EA = 1; //开总中断
- ET0 = 1; //开定时器0中断
- }
- void sys_init(void)//系统初始化
- {
- time=0;
- DAC_WR=0;
- DAC_CS=0;
- DAC_PORT=0;
- mode=0;//默认输出三角波,mode=1;输出锯齿波
- freq=100;//默认频率100Hz
- AM=255;//最大幅度
- }
- void tri_wave(u8 location)//三……
- {
- //为了简化,在单周期输出V字形
- u8 y;
- if(location<50)
- y=(50-location)*AM/50;
- else
- y=(location-50)*AM/50;
- DAC_PORT=y;
-
- }
- void saw_wave(u8 location)//锯……
- {
- DAC_PORT=location*AM/100;
- //用(100-location)也以变成反向锯齿
- }
- void Timer0Work() interrupt 1 //中断服务函数
- {
- switch(mode)
- {
-
- case W_TRI:tri_wave((u8)((time*freq/100)%100));break;
- case W_SAW:saw_wave((u8)((time*freq/100)%100));break;
- }
- time++;
- if(time>=100)//计数100次
- time=0;
- }
- int main(void)
- {
- sys_init();
- Timer0Init();
- while(1)
- {
- ;
- }
- }
复制代码 仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
所有资料51hei提供下载:
DAC0832.rar
(52.33 KB, 下载次数: 19)
|