原程序過于復(fù)雜 修改后舍去了外部中斷優(yōu)化了程序結(jié)構(gòu) 用數(shù)組替換了原來的正弦波產(chǎn)生函數(shù) 添加了部分注釋
程序和仿真比較完美了
能產(chǎn)生比較完美的正弦波了,也比較容易理解。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (44.46 KB, 下載次數(shù): 79)
下載附件
2018-12-17 18:47 上傳
0.png (14.78 KB, 下載次數(shù): 70)
下載附件
2018-12-17 18:48 上傳
單片機(jī)源程序如下:
- /*******************************************************************
- 感謝javaleilei的分享
- 對于之前程序過于復(fù)雜 舍去了外部中斷優(yōu)化了程序結(jié)構(gòu) 用數(shù)組替換了原來的正弦波產(chǎn)生函數(shù) 添加了部分注釋
- 程序和仿真比較完美了
- 最終修改 BY:Pia Ji
- *******************************************************************/
- #include <reg51.h>
- unsigned char flag=0;
- sbit key1 = P3^0;
- sbit key2 = P3^1;
- sbit key3 = P3^2;
- sbit key4 = P3^3;
- unsigned char 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,64,66,67,68,70,71,73,74,75,77,78,
- 80,81,83,84,86,87,89,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,189,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
- }; //這是正弦波上升半周期的采樣
- void delay(unsigned int x)//延時
- {
- while(--x);
- }
- void key_pors()//按鍵處理函數(shù)
- {
- if(key1==0)
- flag=0;
- else if(key2==0)
- flag=1;
- else if(key3==0)
- flag=2;
- else if(key4==0)
- flag=3;
- }
- void show_wave()
- {
- int i;
- switch(flag)
- {
- case 0: //三角波
- for(i=0;i<255;i++)
- {
- P1=i;
- }
- for(i=255;i>0;i--)
- {
- P1=i;
- }
- break;
-
- case 1://方波
- P1=0;
- delay(100);
- P1=0xff;
- delay(100);
- break;
-
- case 2://三角波
- for(i=255;i>0;i--)
- P1=i;
- break;
-
- case 3: //正弦波 采用數(shù)組采樣值 波形更好
- for(i=0;i<255;i++)
- P1=sin_num[i];
- for(i=255;i>=0;i--)
- P1=sin_num[i];
- break;
- default : P1=0;//否則為0 防錯
- }
- }
- void main()
- {
- while(1)
- {
- key_pors();
- show_wave();
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
四種波形發(fā)生器.zip
(102.28 KB, 下載次數(shù): 185)
2018-12-17 18:41 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|