发布网友 发布时间:2022-04-23 13:46
共2个回答
热心网友 时间:2023-10-16 10:22
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define DAC0832 P2 //将DAC0832定义为P2口;
#define ALL 65536 //将ALL定义为65536;
#define Fosc 12000000 //频率为12M
uchar TH_0,TL_0,flag1,flag=0;
uint FREQ=100,num; //起始频率设定为100HZ
float temp;
uchar code sin_num[]={
0,0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,2,2,2,
2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7,7,8,8,9,9,
10, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21,
22, 23, 24, 25, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36,37,
38, 39, 40, 41, 42, 44, 45, 46, 47, 49, 50, 51, 52, 54, 55, 56,
57, 59, 60, 61, 63, , 66, 67, 68, 70, 71, 73, 74, 75, 77, 78,
80, 81, 83, 84, 86, 87, , 90, 92, 93, 95, 96, 98, 99, 101,102,
104, 106, 107, 109, 110, 112, 113, 115, 116, 118, 120,121,123,124,126,128,
129, 131, 132, 134, 135, 137, 139, 140, 142, 143, 145, 146,148, 149,151,153,
154, 156, 157, 159, 160, 162, 163, 165, 166, 168, 169,171,172,174,175,177,
178, 180, 181, 182, 184, 185, 187, 188, 1, 191, 192,194,195,196,198,199,
200, 201, 203, 204, 205, 206, 208, 209, 210, 211, 213,214,215,216,217,218,
219, 220, 221, 223, 224, 225, 226, 227, 228, 229, 230,230,231,232,233,234,
235, 236, 237, 237, 238, 239, 240, 240, 241, 242, 243,243,244,245,245,246,
246, 247, 247, 248, 248, 249, 249, 250, 250, 251, 251, 251,252,252,253,253,
253, 253, 254, 254, 254, 254, 254, 255, 255, 255, 255, 255,255,255,255,255
};
/***********端口设置***************/
sbit cs=P3^6;
sbit change=P3^2;
/***********延时函数:延时1ms*********/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/***********初始化函数***********/
void init()
{
TMOD=0X01; //设定工作模式 1
temp=ALL-Fosc/12.0/256/FREQ; //定时器初值计算?
TH_0=(uint)temp/256;
TL_0=(uint)temp%256;
EA=1; //开总中断
EX0=1; //开外部中断
IT0=1; //设定下降沿有效工作方式
ET0=1; //设定定时器工作在定时方式
TR0=1; //开定时器中断
}
/************切换波形函数********************/
void changefreq(void)
{
if(change==0)
{flag++; if(flag==4) {flag=0;num=0;}}
TH_0=(uint)temp/256;
TL_0=(uint)temp%256;
}
/***********三角波发生函数**********************/
void sanjiaobo(void)
{
for(num=0;num<255;num++)
{cs=0;DAC0832=num;cs=1;}
for(num=255;num>0;--num)
{cs=0;DAC0832=num;cs=1;}
}
/************方波发生函数*********************/
void fangbo(void)
{
cs=0;DAC0832=0XFF;cs=1;
for(num=0;num<255;num++);
cs=0;DAC0832=0X00;cs=1;
for(num=255;num>0;num--);
}
/************锯齿波发生函数**********************/
void juchibo(void)
{
cs=0;DAC0832=++num;cs=1;
}
/*************正弦波发生函数********************/
void zhengxianbo(void)
{
for(num=0;num<255;num++)
{cs=0;DAC0832=sin_num[num];cs=1;}
for(num=255;num>0;num--)
{cs=0;DAC0832=sin_num[num];cs=1;}
}
/*************外部中断服务函数***********************/
void ext0() interrupt 0
{
changefreq(); //引用频率改变函数
}
/**************定时器中断函数****************/
void timer0() interrupt 1
{
TH0=TH_0;TL0=TL_0; //重新装初值
TR0=0;
switch(flag)
{
case 0: {sanjiaobo();TR0=1;break;}
case 1: {fangbo();TR0=1;break;}
case 2: {juchibo();TR0=1;break;}
case 3: {zhengxianbo();TR0=1;break;}
default: ;
}
}
/**************主函数********************/
void main()
{
init();
while(1);
}
热心网友 时间:2023-10-16 10:22
朋友,我这儿有一个输出三角波的,有程序和仿真,其他波形的,自己仿照着写吧。。希望对您有帮助。