仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
33.png (140.11 KB, 下載次數: 53)
下載附件
2018-4-24 17:31 上傳
22.png (15.39 KB, 下載次數: 41)
下載附件
2018-4-24 17:31 上傳
11.png (5.41 KB, 下載次數: 47)
下載附件
2018-4-24 17:31 上傳
單片機源程序如下:
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit csda=P2^2;
- sbit wr=P2^1;
- sbit s1=P3^2;
- sbit s2=P3^3;
- uchar k=0,p=0,delay=0;
- uchar bxxz=0;pinglv=0;
- uchar a=1,b=0,c=0,d=0;
- //正弦波數據
- uchar code sin[64]={
- 135,145,158,167,176,188,199,209,218,226,234,240,245,249,252,254,254,253,251,247,243,237,230,222,213,204,193,182,170,158,
- 146,133,121,108,96,84,72,61,50,41,32,24,17,11,7,3,1,0,0,2,5,9,14,20,28,36,45,55,66,78,90,102,114,128
- };
- //方波數據報表
- uchar code juxing[64]={
- 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,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
- };
- //鋸齒波數據
- uchar code juchi[64]={
- 0,4,8,12,16,20,24,28,32,36,40,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121,125,130,134,138,142,
- 146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,215,219,223,227,231,235,239,243,247,251,255
- };
- //三角波數據
- uchar code sanjiao[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 delay1() //延時
- {
- int a,b;
- for(a=1;a>0;a--)
- for(b=122;b>0;b--);
- }
- void int0() interrupt 0 //中斷處理,用于波型切換
- {
- EX0=0;
- delay1();
- if(s1==0)
- {
- bxxz++;
- if(bxxz==4)
- bxxz=0;
- switch(bxxz)
- {
- case 0 :
- {a=1,b=0,c=0,d=0;} // 正弦波
- break;
- case 1 :
- {a=0,b=1,c=0,d=0;} //方波
- break;
- case 2 :
- {a=0,b=0,c=1,d=0;} // 鋸齒波
- break;
- case 3 :
- {a=0,b=0,c=0,d=1;} // 三角波
- break;
- }
- delay1();
- while(!s1);
- }
- while(!s1);
- EX0=1;
- }
- void int1() interrupt 2
- {
- EX1=0;
- delay1();
- if(s2==0){
- p++;
- if(p==8)
- p=0;
- switch(p)
- {
- case 1 :
- pinglv=4; //400Hz
- break;
- case 2 :
- pinglv=8; //250Hz
- break;
- case 3 :
- pinglv=16; //140Hz
- break;
- case 4 :
- pinglv=32; //75Hz
- break;
- case 5 :
- pinglv=64; //40Hz
- break;
- case 6 :
- pinglv=125; //20Hz
- break;
- case 7 :
- pinglv=255; //10Hz
- break;
- default :
- pinglv=0; //1000Hz
- break;
- }
- delay1();
- while(!s2);
- }
- while(!s2);
- EX1=1;
- }
- void main()
- {
- csda=0;
- wr=0;
- EA=1;
- IT0=1;
- EX0=1;
- IT1=1;
- EX1=1;
- pinglv=15;
- while(1)
- {
-
- while(a) //產生正弦波
- {
- delay=pinglv; //獲取周期數據
- P0=sin[k]; //數據數P0口進行波形轉換
- k++;
- if(k==64) //一個周期取64點波數據
- k=0;
- while(delay) //延時處理
- delay--;
- }
- while(b) //產生方波
- {
- delay=pinglv;
- P0=juxing[k];
- k++;
- if(k==64)
- k=0;
- while(delay)
- delay--;
- }
- while(c) //產生鋸齒波
- {
- delay=pinglv;
- P0=juchi[k];
- k++;
- if(k==64)
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
資料.rar
(67.64 KB, 下載次數: 116)
2018-4-24 17:34 上傳
點擊文件名下載附件
程序文件 下載積分: 黑幣 -5
|