初學(xué)單片機(jī),.附件是對(duì)程序的分析和proteus仿真,適合初學(xué)搭建電路,按鍵1,2程序功能有問題,不知道那步的邏輯出現(xiàn)了問題,沒有實(shí)現(xiàn)頻率微調(diào)的功能.
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
無標(biāo)題.png (49.1 KB, 下載次數(shù): 66)
下載附件
2018-8-5 11:10 上傳
Proteus仿真中ANOLOGUE示波器使用簡(jiǎn)述: 第一次運(yùn)行示波器會(huì)自動(dòng)打開,在關(guān)閉示波器也就是叉了之后,再次運(yùn)行不會(huì)自動(dòng)打開,需右擊示波器選擇最下面英文選項(xiàng). 連接四個(gè)掃描口中的一個(gè),對(duì)應(yīng)有四個(gè)channal,旋鈕調(diào)節(jié)掃描電壓值以改變格子代表單位,,指向?yàn)橐桓袼淼碾妷褐?例如指向2mv,則上下一格代表2mv.滾輪移動(dòng)上下坐標(biāo),可調(diào)節(jié)使其對(duì)其某根線便于測(cè)量. Horizontal旋鈕橫向掃描周期調(diào)節(jié),可用于調(diào)節(jié)周期波形寬度,橫向滾輪調(diào)節(jié)水平坐標(biāo).小旋扭都為微調(diào). 
0.png (187.37 KB, 下載次數(shù): 53)
下載附件
2018-8-5 15:18 上傳
Proteus仿真 原件:res電阻 89c51 DAC0832 LM358N BUTTON GENELECT10U16V
主函數(shù): void main() { m=65536-(150000/pinlv); // a=m/256; b=m%256; initclock(); while(1) { if(h==0) { keyscan(); }
switch(boxing) { case 0 : P1=sin; break; case 1 : P1=juxing; break; case 2 : P1=sanjiao; break; case 3 : P1=juchi; break; } } }
主函數(shù): 首先給m,a,b賦初值,調(diào)用initclock(),initclock void initclock() { TMOD=0x01; TH0=a ; TL0=b ; EA=1; ET0=1; TR0=1; }
定時(shí)器方式寄存器TMOD: TMOD用于寫入方式控制字,,以選擇定時(shí)/計(jì)數(shù)器的工作狀態(tài)及控制方式;共八位,高四位與低四位相同,分別是GATE C/T M1 M0,高四位控制T1,低四位控制T0. M1M0用于指定工作方式,通過00 01 10 11的組合,可使定時(shí)/計(jì)數(shù)器分別對(duì)應(yīng)工作在0 1 2 3方式 C/T:選擇定時(shí)/計(jì)數(shù).C,T分別表示計(jì)數(shù)器和定時(shí)器.當(dāng)C/T=1時(shí),選擇計(jì)數(shù)狀態(tài),當(dāng)C/T=0時(shí)選擇定時(shí)狀態(tài) TH0= TL0= 計(jì)數(shù)器0的高八位和第八位,組合以放更大的數(shù)字,加一計(jì)數(shù)直至計(jì)數(shù)器滿溢出,這時(shí)打開EA(EA=1)開啟中斷總開關(guān),打開ET0開啟計(jì)數(shù)器一中斷開關(guān),TR0=1,開啟定時(shí)器0開關(guān)
實(shí)參賦給Initclock()TH0,TL0,a=m/256;b=m%256;賦初值的意義是使計(jì)數(shù)器提前溢出從而啟動(dòng)中斷 void T0_time()interrupt 1 { TH0= a ; TL0= b ; u++; if(u>=64) u=0; } 之后執(zhí)行循環(huán) while(1) { keyscan();
switch(boxing) { case 0 : P1=sin; break; case 1 : P1=juxing; break; case 2 : P1=sanjiao; break; case 3 : P1=juchi; break; } } } 循環(huán)體首先調(diào)用函數(shù)按鍵檢測(cè)函數(shù)keyscan() void keyscan() { if(s1==0) { EA=0; delay(2); if(s1==0) { while(!s1); pinlv+=bujin; if(pinlv>1000) { pinlv=100; } m=65536-(150000 / pinlv); a=m / 256; b=m % 256; EA=1; } } if(s2==0) { delay(5); if(s2==0) { EA=0; while(!s2); pinlv-=bujin; if(pinlv<100) { pinlv=1000; } m=65536-(150000/pinlv); a=m/256; b=m%256; EA=1; } } if(s3==0) { delay(5); if(s3==0) { EA=0; while(!s3); boxing++; if(boxing>=4) { boxing=0; }
EA=1; } } } S3是波形變換按鍵,首先關(guān)閉總中斷執(zhí)行下方語句,按鈕按下判斷,當(dāng) S3=0即按鈕按下,while(!s3); 語句代表按鍵按下時(shí),進(jìn)行死循環(huán)不執(zhí)行下方語句,松開按鍵后boxing++是波形變換關(guān)鍵,通過變boxing的值,賦給switch()語句選擇波形 switch(boxing) { case 0 : P1=sin; break; case 1 : P1=juxing; break; case 2 : P1=sanjiao; break; case 3 : P1=juchi; break; } Sin[] juxing[] sanjiao[] juchi[] 為四個(gè)數(shù)組,通過賦值給P1并行IO口,傳給DAC0832以VREF輸出模擬信號(hào),通過中斷中的u++實(shí)現(xiàn)數(shù)組取數(shù)組元素的移動(dòng),實(shí)現(xiàn)信號(hào)的變換,在波形顯示器上顯示波形,然后打開中斷執(zhí)行變換后波形, 按鍵s1,s2執(zhí)行波形頻率的加減.同樣關(guān)閉中斷,pinglv+=bujin改變值,然后打開中斷.
單片機(jī)源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit s1=P3^5;
- sbit s2=P3^6;
- sbit s3=P3^7;
- sbit s4=P3^4;
- int pinlv=100,bujin=1;
- unsigned int m;
- char boxing,u;
- int a,b;
- 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 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
- }; //三角波取碼
- 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
- }; //鋸齒波取碼
- void initclock()
- {
- TMOD=0x01;
- TH0=a ;
- TL0=b ;
- EA=1;
- ET0=1;
- TR0=1;
- }
-
- void delay(uint xms)
- {
- int c,d;
- for (c=xms;c>0;c--)
- for(d=110;d>0;d--);
- }
- void keyscan()
- {
- if(s1==0)
- {
- EA=0;
- delay(2);
- if(s1==0)
- {
- while(!s1);
- pinlv+=bujin;
- if(pinlv>1000)
- {
- pinlv=100;
- }
- m=65536-(150000 / pinlv);
- a=m / 256;
- b=m % 256;
- EA=1;
- }
- }
- if(s2==0)
- {
- delay(5);
- if(s2==0)
- {
- EA=0;
- while(!s2);
- pinlv-=bujin;
- if(pinlv<100)
- {
- pinlv=1000;
- }
- m=65536-(150000/pinlv);
- a=m/256;
- b=m%256;
- EA=1;
- }
- }
- if(s3==0)
- {
- delay(5);
- if(s3==0)
- {
- EA=0;
- while(!s3);
- boxing++;
- if(boxing>=4)
- {
- boxing=0;
- }
-
- EA=1;
- }
- }
- }
-
- void main()
- {
- m=65536-(150000/pinlv);
- a=m/256;
- b=m%256;
- initclock();
- while(1)
- {
- keyscan();
-
- switch(boxing)
- {
- case 0 : P1=sin[u]; break;
- case 1 : P1=juxing[u]; break;
- case 2 : P1=sanjiao[u]; break;
- case 3 : P1=juchi[u]; break;
- }
- }
- }
-
- void T0_time()interrupt 1
- {
- TH0= a ;
- TL0= b ;
- u++;
- if(u>=64)
- u=0;
- }
復(fù)制代碼
0.png (49.03 KB, 下載次數(shù): 63)
下載附件
2018-8-5 15:19 上傳
所有資料51hei提供下載:
波形發(fā)生器.rar
(334.09 KB, 下載次數(shù): 144)
2018-8-5 11:11 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|