#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define DAdata P2 //DA数据端口
sbit DA_S1= P0^0; // 控制DAC0832的8位输入寄存器,仅当都为0时,可以输出数据(处于直通状态),否则,输出将被锁存
sbit DA_S2= P0^1; // 控制DAC0832的8位DAC寄存器,仅当都为0时,可以输出数据(处于直通状态),否则,输出将被锁存
uchar wavecount; //'抽点'计数
uchar THtemp,TLtemp;//传递频率的中间变量
uchar code triangle_tab[]={ //每隔数字8,采取一次
0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x40,0x48,0x50,0x58,0x60,0x68,0x70,0x78,
0x80,0x88,0x90,0x98,0xa0,0xa8,0xb0,0xb8,0xc0,0xc8,0xd0,0xd8,0xe0,0xe8,0xf0,0xf8,0xff,
0xf8,0xf0,0xe8,0xe0,0xd8,0xd0,0xc8,0xc0,0xb8,0xb0,0xa8,0xa0,0x98,0x90,0x88,0x80,
0x78,0x70,0x68,0x60,0x58,0x50,0x48,0x40,0x38,0x30,0x28,0x20,0x18,0x10,0x08,0x00};
void delay(uchar z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void triangle_out() //三角波输出
{
DAdata=triangle_tab[wavecount++];
if(wavecount>64) wavecount=0;
DA_S2=0; //打开8位输入寄存器
DA_S2=1; //关闭8位输入寄存器
}
void main()
{
uchar i=0;
DA_S2=1; //使DAC寄存器处于直通状态
DAdata=0;
DA_S1=0; //关闭8位输入寄存器
TMOD=0x01; //设置定时器0为16位工作方式
IT0=1; //设置外部中断0为下降沿触发
ET0=1; //开定时器中断
EX0=1;
EA=1;
TH0=0xfd;
TL0=0xac;
TR0 = 1;
while(1)
{
}
}
void timer0() interrupt 1
{
TH0=0xfd;
TL0=0xac;
triangle_out();
}