![]() |
發(fā)布時間: 2018-5-23 10:52
正文摘要:仿真結(jié)果應(yīng)該是,顯示屏顯示的數(shù)字頻率,和示波器周期算出來的頻率差不多誤差較小。但是我現(xiàn)在仿真出來以后誤差特別大,示波器顯示的周期基本就在8.6變化,不管是1hz還是10000hz。程序在附件,或者我貼到下面 電路 ... |
求大佬指點 |
{set4=9;} else set4--; write_com(0x80+num); write_data(0x30+set4); write_com(0x80+num); break; case 10: if(set5==0) {set5=9;} set5--; write_com(0x80+num); write_data(0x30+set5); write_com(0x80+num); break; case 11: if(set6==0) {set6=9;} set6--; write_com(0x80+num); write_data(0x30+set6); write_com(0x80+num); break; } } if(gap1==1)/*步長減少*/ { switch(num2) { case 6: if(sett1==0) {sett1=9;} else sett1--; write_com(0x80+num2); write_data(0x30+sett1); write_com(0x80+num2); break; case 7: if(sett2==0) {sett2=9;} else sett2--; write_com(0x80+num2); write_data(0x30+sett2); write_com(0x080+num2); break; case 8: if(sett3==0) {sett3=9;} else sett3--; write_com(0x80+num2); write_data(0x30+sett3); write_com(0x80+num2); break; case 9: if(sett4==0) {sett4=9;} else sett4--; write_com(0x80+num2); write_data(0x30+sett4); write_com(0x80+num2); break; case 10: if(sett5==0) {sett5=9;} else sett5--; write_com(0x80+num2); write_data(0x30+sett5); write_com(0x80+num2); break; case 11: if(sett6==0) {sett6=9;} else sett6--; write_com(0x80+num2); write_data(0x30+sett6); write_com(0x80+num2); break; } } if(ad1==1)/*終值減少*/ { switch(num1) { case 6: if(set11==0) {set11=9;} else set11--; write_com(0x80+0x40+num1); write_data(0x30+set11); write_com(0x80+0x40+num); break; case 7: if(set22==0) {set22=9;} else set22--; write_com(0x80+0x40+num1); write_data(0x30+set22); write_com(0x80+0x40+num1); break; case 8: if(set33==0) {set33=9;} else set33--; write_com(0x80+0x40+num1); write_data(0x30+set33); write_com(0x80+0x40+num1); break; case 9: if(set44==0) {set44=9;} else set44--; write_com(0x80+0x40+num1); write_data(0x30+set44); write_com(0x80+0x40+num1); break; case 10: if(set55==0) {set55=9;} else set55--; write_com(0x80+0x40+num1); write_data(0x30+set55); write_com(0x80+0x40+num1); break; case 11: if(set66==0) {set66=9;} else set66--; write_com(0x80+0x40+num1); write_data(0x30+set66); write_com(0x80+0x40+num1); break; } } star=0; while(!red); } } if(exit==0)/*退出設(shè)定頻率系統(tǒng),將star置1,允許方波產(chǎn)生*/ { delay(10); if(exit==0) { ad=0; ad1=0; gap1=0; star=1; display(); while(!exit); } } } void chuzhi() { a=0x0000; b=0x0000; cs=0;h=0;e=0; while(c>0) { d=c; switch(cs) { case 0: f=d%16; a=a+f; c=c/16; h=a; break; case 1: f=d%16; b=b+f; for(i=cs;i>0;i--) {b=b<<4;} c=c/16; h=b|h; b=0; break; case 2: case 3: f=d%16; b=b+f; for(i=cs-2;i>0;i--) {b=b<<4;} c=c/16; e=b|e; b=0; break; } cs++; } } void produce()/*掃頻產(chǎn)生程序*/ { n3=sett1*100000+sett2*10000+sett3*1000+sett4*100+sett5*10+sett6; if(flag1==1&flag2==1)/*使用定時器0*/ { a1=0;b1=0;c1=0; n2=low; while(n2<high) { n1=50000/n2; c=n1; chuzhi(); COM0=h; COM0=e; ET0=1; TR0=1; display1(n2); while(n<50) { keyscan(); } n=0; ET0=0; TR0=0; n2=n2+n3; if(star==0) break; } n2=high; while(n2>low) { n1=50000/n2; c=n1; chuzhi(); COM0=h; COM0=e; ET0=1; TR0=1; display1(n2); while(n<50) { keyscan(); } n=0; ET0=0; TR0=0; n2=n2-n3; if(star==0) break; } } if(flag1==2&flag2==2)/*使用定時器1*/ { a1=1;b1=0;c1=0; n2=low; while(n2<high) { n1=1000000/n2; c=n1; chuzhi(); COM1=h; COM1=e; ET0=1; TR0=1; display1(n2); while(n<50) { keyscan(); } n=0; ET0=0; TR0=0; n2=n2+n3; if(star==0) break; } n2=high; while(n2>low) { n1=1000000/n2; c=n1; chuzhi(); COM1=h; COM1=e; ET0=1; TR0=1; display1(n2); while(n<50) { keyscan(); } n=0; ET0=0; TR0=0; n2=n2-n3; if(star==0) break; } } if(flag1==1&flag2==2)/*先使用定時器0,再使用定時器1*/ { a1=0;b1=0;c1=0; n2=low; while(n2<5000) { n1=50000/n2; c=n1; chuzhi(); COM0=h; COM0=e; ET0=1; TR0=1; display1(n2); while(n<50) { keyscan(); } n=0; ET0=0; TR0=0; n2=n2+n3; if(star==0) break; } a1=1;b1=0;c1=0; while(n2<high) { n1=1000000/n2; c=n1; chuzhi(); COM1=h; COM1=e; ET0=1; TR0=1; display1(n2); while(n<50) { keyscan(); } n=0; ET0=0; TR0=0; n2=n2+n3; if(star==0) break; } n2=high; while(n2>low) { n1=1000000/n2; c=n1; chuzhi(); COM1=h; COM1=e; ET0=1; TR0=1; display1(n2); while(n<50) {keyscan();} n=0; ET0=0; TR0=0; n2=n2-n3; if(star==0) break; } a1=0;b1=0;c1=0; while(n2>low) { n1=50000/n2; c=n1; chuzhi(); COM0=h; COM0=e; ET0=1; TR0=1; display1(n2); while(n<50) {keyscan();} n=0; ET0=0; TR0=0; n2=n2-n3; if(star==0) break; } } } void main() { COM8253=0x36;/*8253初始化,選擇定時器0,工作方式3,二進制*/ COM8253=0x76;/*選擇定時器1,工作方式3,二進制*/ init();/*1602初始化*/ display();/*頻率顯示界面*/ TMOD=0x01;/*定時器0工作方式1*/ TH0=(65536-50000)/256;/*定時器0初值裝入*/ TL0=(65536-50000)%256; EA=1;/*開總中斷*/ ET0=0;/*允許定時器0中斷*/ TR0=0;/*允許定時器計數(shù)*/ a1=0;b1=0;c1=0; while(1) { keyscan(); setlow(set1,set2,set3,set4,set5,set6,set11,set22,set33,set44,set55,set66); if(star==1) { produce(); } } } void T0_time() interrupt 1/*使定時器中斷0*/ { TH0=(65536-50000)/256; TL0=(65536-50000)%256; n++; } |
#include<reg51.h>/*51單片機頭文件*/ #include<absacc.h> #include<stdio.h> #define COM8253 XBYTE[0x0003] #define COM0 XBYTE[0x0000] #define COM1 XBYTE[0x0001] #define uchar unsigned char #define uint unsigned int uchar code table[]="Clock Speed:"; uchar code table1[]="range:"; uchar code table2[]=" gap:"; sbit icden=P3^0; sbit rs=P3^1;/*1602使能icden和寫rs*/ sbit set=P2^0; sbit wei=P2^1; sbit wei1=P2^7; sbit wei2=P2^5; /*set進入掃頻頻率設(shè)置窗口,wei掃頻初始頻率設(shè)置,wei1終值頻率窗口*/ sbit add=P2^2; sbit red=P2^3; /*add數(shù)值增加,red數(shù)值減少,*/ sbit gap=P2^6;/*步長設(shè)置*/ sbit exit=P2^4;/*exit退出設(shè)定程序*/ sbit a1=P3^2; sbit b1=P3^3; sbit c1=P3^4;/*74151數(shù)據(jù)選擇器,ABC端口*/ uchar num=5,num1=5,num2=5,ad=0,ad1=0,gap1=0;/*num,num1用于設(shè)置光標(biāo)位置,ad,ad1,gap1允許設(shè)置初始或終值頻率的標(biāo)示符*/ uchar set1=0,set2=0,set3=0,set4=0,set5=0,set6=0;/*初始頻率各位的變量*/ uchar set11=0,set22=0,set33=0,set44=0,set55=0,set66=0;/*終值頻率各位的變量*/ uchar sett1=0,sett2=0,sett3=0,sett4=0,sett5=0,sett6=0;/*步長各位的變量*/ unsigned long low,high,n1,n2,n3;/*low、high分別存儲初始和終值頻率,n2存儲實時頻率,n3存儲步長,n1存放8253初值*/ int n=0;/*n每中斷一次加一,最大值50,即發(fā)生50次中斷n歸0,用于規(guī)定掃頻間隔時間。*/ unsigned long sw,wan,qian,bai,shi,ge;/*存儲從n2分離的各位,用于實時顯示頻率*/ uchar flag1,flag2,star=1;/*flag1、flag2用于確定使用定時器0還是定時器1。star允許頻率產(chǎn)生的標(biāo)示符*/ unsigned long c,d; uint a,b,e,f,h; uchar cs=0,i,z; void delay(uint z)/*延遲函數(shù)*/ { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void write_com(uchar com)/*1602寫入指令*/ { rs=0; P1=com; delay(5); icden=1; delay(5); icden=0; } void write_data(uchar date)/*1602寫入數(shù)據(jù)*/ { rs=1; P1=date; delay(5); icden=1; delay(5); icden=0; } void init()/*1602初始化*/ { icden=0; write_com(0x38); write_com(0x0e); write_com(0x01); } void display()/*掃頻顯示界面*/ { write_com(0x01); write_com(0x80); for(num=0;num<12;num++) { write_data(table[num]); delay(5); } } void display1(unsigned long n2)/*掃頻頻率顯示*/ { if(star==1) { sw=n2/100000; wan=n2/10000%10; qian=n2/1000%10; bai=n2/100%10; shi=n2/10%10; ge=n2%10; write_com(0x80+0x40); write_data(0x30+sw); write_data(0x30+wan); write_data(0x30+qian); write_data(0x30+bai); write_data(0x30+shi); write_data(0x30+ge); } } void setlow(uint set1,set2,set3,set4,set5,set6,set11,set22,set33,set44,set55,set66)/*將鍵盤輸入的數(shù)據(jù)存入low、high中,確定flag1、flag2值*/ { low=set1*100000+set2*10000+set3*1000+set4*100+set5*10+set6; high=set11*100000+set22*10000+set33*1000+set44*100+set55*10+set66; if(low<5000) {flag1=1;} else flag1=2; if(high<5000) {flag2=1;} else flag2=2; } void keyscan()/*鍵盤掃描*/ { if(set==0)/*進入設(shè)置界面*/ { delay(10); if(set==0) { write_com(0x01); write_com(0x80); for(num=0;num<6;num++) { write_data(table1[num]); } write_com(0x80+6); write_data(0x30+set1); write_data(0x30+set2); write_data(0x30+set3); write_data(0x30+set4); write_data(0x30+set5); write_data(0x30+set6); write_com(0x80+12); write_data('H'); write_data('Z'); write_com(0x80+0x40+5); write_data(':'); write_com(0x80+0x40+6); write_data(0x30+set11); write_data(0x30+set22); write_data(0x30+set33); write_data(0x30+set44); write_data(0x30+set55); write_data(0x30+set66); write_com(0x80+0x40+12); write_data('H'); write_data('Z'); num=6; write_com(0x80+6); ad=1;/*ad=1,ad=0,標(biāo)志只可進行初始頻率設(shè)置*/ ad1=0; gap1=0; star=0; while(!set); } } if(gap==0)/*對掃頻步長進行設(shè)定,初始為20HZ*/ { delay(10); if(gap==0) { write_com(0x01); write_com(0x80); for(num2=0;num2<6;num2++) {write_data(table2[num2]);} write_com(0x80+6); write_data(0x30+sett1); write_data(0x30+sett2); write_data(0x30+sett3); write_data(0x30+sett4); write_data(0x30+sett5); write_data(0x30+sett6); write_com(0x80+12); write_data('H'); write_data('Z'); num2=6; write_com(0x80+6); gap1=1;/*選位的同時,gap1置1,只可對步長進行設(shè)置*/ ad=0; ad1=0; star=0; while(!gap); } } if(wei==0)/*初始頻率進行位選,選擇要增加或減少的位置*/ { delay(10); if(wei==0) { num++; if(num>11) {num=6;} write_com(0x80+num); ad=1;/*選位的同時,ad置1,只可對初始頻率進行設(shè)置*/ ad1=0; gap1=0; star=0; while(!wei); } } if(wei1==0)/*終值頻率進行位選,選擇要增加或減少的數(shù)據(jù)位*/ { delay(10); if(wei1==0) { num1++; if(num1>11) {num1=6;} write_com(0x80+0x40+num1); ad1=1;/*選位的同時,ad1置1,只可對終值頻率進行設(shè)置*/ ad=0; gap1=0; star=0; while(!wei1); } } if(wei2==0)/*步長進行位選,選擇要增加或減少的數(shù)據(jù)位*/ { delay(10); if(wei2==0) { num2++; if(num2>11) {num2=6;} write_com(0x80+num2); gap1=1;/*選位的同時,gap1置1,只可步長進行設(shè)置*/ ad1=0; ad=0; star=0; while(!wei2); } } if(add==0)/*增加數(shù)值*/ { delay(10); if(add==0) { if(ad==1)/*掃頻初值增加*/ { switch(num)/*由num值來確定設(shè)置哪個數(shù)據(jù)位*/ { case 6: set1++; if(set1>9) {set1=0;} write_com(0x80+num); write_data(0x30+set1); write_com(0x80+num); break; case 7: set2++; if(set2>9) {set2=0;} write_com(0x80+num); write_data(0x30+set2); write_com(0x80+num); break; case 8: set3++; if(set3>9) {set3=0;} write_com(0x80+num); write_data(0x30+set3); write_com(0x80+num); break; case 9: set4++; if(set4>9) {set4=0;} write_com(0x80+num); write_data(0x30+set4); write_com(0x80+num); break; case 10: set5++; if(set5>9) {set5=0;} write_com(0x80+num); write_data(0x30+set5); write_com(0x80+num); break; case 11: set6++; if(set6>9) {set6=0;} write_com(0x80+num); write_data(0x30+set6); write_com(0x80+num); break; } } if(gap1==1)/*步長增加*/ { switch(num2)/*由num2來確定增加哪個數(shù)據(jù)位*/ { case 6: if(sett1==9) {sett1=0;} else sett1++; write_com(0x80+num2); write_data(0x30+sett1); write_com(0x80+num2); break; case 7: if(sett2==9) {sett2=0;} else sett2++; write_com(0x80+num2); write_data(0x30+sett2); write_com(0x80+num2); break; case 8: if(sett3==9) {sett3=0;} else sett3++; write_com(0x80+num2); write_data(0x30+sett3); write_com(0x80+num2); break; case 9: if(sett4==9) {sett4=0;} else sett4++; write_com(0x80+num2); write_data(0x30+sett4); write_com(0x80+num2); break; case 10: if(sett5==9) {sett5=0;} else sett5++; write_com(0x80+num2); write_data(0x30+sett5); write_com(0x80+num2); break; case 11: if(sett6==9) {sett6=0;} else sett6++; write_com(0x80+num2); write_data(0x30+sett6); write_com(0x80+num2); break; } } if(ad1==1)/*終值頻率增加*/ { switch(num1)/*由num1確定增加的位置*/ { case 6: if(set11>=9) {set11=0;} else set11++; write_com(0x80+0x40+num1); write_data(0x30+set11); write_com(0x80+0x40+num1); break; case 7: if(set22>=9) {set22=0;} else set22++; write_com(0x80+0x40+num1); write_data(0x30+set22); write_com(0x80+0x40+num1); break; case 8: if(set33>=9) {set33=0;} else set33++; write_com(0x80+0x40+num1); write_data(0x30+set33); write_com(0x80+0x40+num1); break; case 9: if(set44>=9) {set44=0;} else set44++; write_com(0x80+0x40+num1); write_data(0x30+set44); write_com(0x80+0x40+num1); break; case 10: if(set55>=9) {set55=0;} else set55++; write_com(0x80+0x40+num1); write_data(0x30+set55); write_com(0x80+0x40+num1); break; case 11: if(set66>=9) {set66=0;} else set66++; write_com(0x80+0x40+num1); write_data(0x30+set66); write_com(0x80+0x40+num1); break; } } star=0; while(!add); } } if(red==0)/*對數(shù)據(jù)進行減操作*/ { delay(10); if(red==0) { if(ad==1)/*初始頻率減少*/ { switch(num) { case 6: if(set1==0) {set1=9;} else set1--; write_com(0x80+num); write_data(0x30+set1); write_com(0x80+num); break; case 7: if(set2==0) {set2=9;} else set2--; write_com(0x80+num); write_data(0x30+set2); write_com(0x80+num); break; case 8: if(set3==0) {set3=9;} else set3--; write_com(0x80+num); write_data(0x30+set3); write_com(0x80+num); break; case 9: if(set4==0) |
Powered by 單片機教程網(wǎng)