欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
可改變波形和頻率的單片機信號發生器程序與Proteus仿真圖 LCD12864+DAC0832
[打印本頁]
作者:
zhuyanxv
時間:
2023-5-5 17:05
標題:
可改變波形和頻率的單片機信號發生器程序與Proteus仿真圖 LCD12864+DAC0832
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif
(180.06 KB, 下載次數: 35)
下載附件
2023-5-5 18:08 上傳
單片機源程序如下:
#include <reg52.h>
#include <math.h>
#include <intrins.h>
#include <lcd12864.h>
#define DAC_OUT P2
sbit change_wave=P3^2; //改變波形按鍵
sbit change_rate=P3^3; //改變頻率按鍵
uchar mode=0,rate=0,delay_time=0,k,p; //為波形發生模塊提供中間變量
uchar *which_wave,*which_wave2;
uint rate_num;
uchar code Sine_wave[64]= //DA輸出對應電壓值對應的數字量,正弦波
{
128,114,102,90,78,66,55,45,36,28,20,14,9,5,2,1,1,1,
3,7,11,17,24,32,41,50,61,72,84,96,108,121,133,146,
158,170,182,193,204,213,222,230,237,243,247,251,253,
254,254,252,249,245,240,234,226,218,209,199,188,176,
167,158,145,135
};
uchar code Sawtooth_Wave[64]= //鋸齒波
{
255,251,247,243,239,235,231,227,223,219,215,210,206,202,
198,194,190,186,182,178,174,170,166,162,158,154,150,146,
142,138,134,130,125,121,117,113,109,105,101,97,93,89,85,
81,77,73,69,61,57,53,49,45,40,36,32,28,24,20,16,12,8,4,0
};
uchar code Square_wave[64]= //方波
{
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,
};
uchar code Triangular_Wave[64]= //三角波
{
0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,
144,152,160,168,176,184,192,200,208,216,224,232,240,248,
248,240,232,224,216,208,200,192,184,176,168,160,152,144,
136,128,120,112,104,96,88,80,72,64,56,48,40,32,24,16,8,0
};
void wave_delay() //波形延時函數
{
int a,b;
for(a=1; a>0; a--)
for(b=122; b>0; b--);
}
void wave_init() //波形發生模塊的初始化(外部中斷0、1)
{
EA=1;
IT0=1; //下降沿觸發
EX0=1;
IT1=1;
EX1=1;
}
void disp_wave(uchar *wave) //顯示波形函數
{
uchar page,i;
uint date;
select(1); //選擇左屏
for(i=32; i<64; i++)
{
page=7-(wave[i]/4)/8;
date=7-(wave[i]/4)%8;
date=pow(2,date);
setpos(page,i); //選擇行列
lcd_wdat(date);
}
select(2); //選擇右屏
for(i=0; i<64; i++)
{
page=7-(wave[i]/4)/8;
date=7-(wave[i]/4)%8;
date=pow(2,date);
setpos(page,i); //選擇行列
lcd_wdat(date);
}
}
void main()
{
lcd_init();
clr_screen();
which_wave=&Sine_wave[0];
disp_chinese();
disp_function(chinese_sine);
disp_rate(400);
disp_xy();
disp_wave(which_wave);
wave_init();
while(1)
{
delay_time=rate; //rate=0時,12mhz下,為400hz的波形。循環一次的時間為0.00025ms
DAC_OUT=*(which_wave+k);
k++;
if(k==64)
k=0;
while(delay_time)
delay_time--;
}
}
void int0() interrupt 0 //波形選擇中斷服務程序
{
EX0=0;
wave_delay();
mode++;
if(mode==4)
mode=0;
switch(mode)
{
case 0 : //顯示正弦波
which_wave=&Sine_wave[0];
which_wave2=&chinese_sine[0];
break;
case 1 : //顯示三角波
which_wave=&Triangular_Wave[0];
which_wave2=&chinese_triangular[0];
break;
case 2 : //顯示方波
which_wave=&Square_wave[0];
which_wave2=&chinese_square[0];
break;
case 3 : //顯示鋸齒波
which_wave=&Sawtooth_Wave[0];
which_wave2=&chinese_sawtooth[0];
break;
}
wave_delay();
clr_screen();
disp_chinese();
disp_rate(400/rate);
disp_function(which_wave2);
disp_xy();
disp_wave(which_wave);
while(!change_wave);
EX0=1;
}
void int1() interrupt 2 //頻率選擇
{
EX1=0;
wave_delay();
p++;
if(p==50)
p=0;
rate=p;
wave_delay();
rate_num=1/((0.000036+0.000006*rate)*64);
clc_rate();
disp_rate(rate_num);
while(!change_rate);
EX1=1;
}
復制代碼
Keil代碼與Proteus仿真下載:
Proteus仿真和51單片機C源碼.zip
(108.81 KB, 下載次數: 40)
2023-5-5 17:05 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1