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
|