1.用P1或P3口,產生一方波信號,頻率為1000Hz,用LCD顯示頻率和周期。 2.將輸出信號輸入到另一端口作頻率計的信號輸入端,測量此方波信號的頻率、周期和脈寬,在另一LCD上將參數值顯示出來。 3.設置一功能鍵,能將當前LCD上的信號值鎖定。
1.硬件部分電路設計 由于本次實驗設計的是一個單片機的基于8255的LCD的頻率計實驗,通過使用定時器T0產生1s鐘的定時,同時測量T1口輸入的方波的低電平的次數,就可以得出所輸入信號的頻率,然后將測得的頻率由鎖存器連接到8255,再通過8255擴展連接到LCD液晶顯示器。完整電路原理圖如下:file:///C:/Users/acer/AppData/Local/Temp/msohtmlclip1/01/clip_image002.png2.軟件部分設計 #include <reg52.h> #include <intrins.h> #include <absacc.h> #define uchar unsigned char #define uint unsigned int #define PA XBYTE[0x007c] #define PB XBYTE[0x007d] #define COM XBYTE[0x007f] uchar codetab1[]="F:"; uchar codetab2[]="C:"; uchardisp1[]="0000HZ"; uchardisp2[]="0.00ms"; sbit key1=P1^6; sbit key2=P1^7; uchar count,i; uchar time; unsigned long freq; sbit lcdrs=P1^0; sbit lcdrw=P1^1; sbit lcden=P1^2; void delay(uchar z) //延時函數 { uchar x,y; for(x=110;x>0;x--) for(y=z;y>0;y--); } void write_com(uchar com) //寫命令 { lcdrs=0; PA=com; delay(5); lcden=1; delay(2); lcden=0; } void write_dat(uchar dat) //寫數據 { lcdrs=1; PA=dat; delay(5); lcden=1; delay(5); lcden=0; } void init_lcd() //lcd初始化 { lcden=0; // lcdrs=0; lcdrw=0; write_com(0x38);/****工作方式設置***/ write_com(0x0c);/****顯示狀態設置***/ write_com(0x06);/****輸入方式設置***/ write_com(0x01);/****清除屏幕顯示***/ write_com(0x80); } void display() //顯示函數 { if(freq>0&&freq<10000) { disp1[0]=freq/1000+'0'; disp1[1]=freq/100%10+'0'; disp1[2]=freq/10%10+'0'; disp1[3]=freq/2%10+'0'; if(freq<1000) { disp2[0]=1000/freq+'0'; disp2[2]=10000/freq%10+'0'; disp2[3]=100000/freq%10+'0'; } else { disp2[0]=1000/freq+'0'; disp2[2]=10000/freq+'0'; disp2[3]=100000/freq%10+'0'; } write_com(0x82); for(i=0;i<6;i++) { write_dat(disp1); delay(2); } write_com(0x80+0x42); for(i=0;i<6;i++) { write_dat(disp2); delay(2); } } } void main() { COM=0x80; init_lcd(); write_com(0x80); for(i=0;i<2;i++) { write_dat(tab1); delay(5); } write_com(0x80+0x40); for(i=0;i<2;i++) { write_dat(tab2); delay(5); } write_com(0x80+0x49); TMOD=0x51; //T0定時,T1計數 TH1=0; TL1=0; TH0=(65536-50000)/256; TL0=(65536-50000)%256; ET0=1; ET1=1; EA=1; while(1) { if(key2==0) { delay(5); if(key2==0) { TR1=TR0=1; } } else { display(); } } } void timer0() interrupt 1 //T0中斷,定時1s { TH0=(65536-50000)/256; TL0=(65536-50000)%256; count++; if(count==20) { count=0; TR1=0;TR0=0; freq=(TH1*256+TL1); // display(); TH1=0;TL1=0; } } 仿真測試 1.開始階段輸入第一組數據:file:///C:/Users/acer/AppData/Local/Temp/msohtmlclip1/01/clip_image003.png輸入第二組數據:file:///C:/Users/acer/AppData/Local/Temp/msohtmlclip1/01/clip_image004.pngfile:///C:/Users/acer/AppData/Local/Temp/msohtmlclip1/01/clip_image005.png
|