#include <reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int #define DataPort P0 //LCD1602數據端口 sbit LCM_RS=P2^5; //LCD1602命令端口 sbit LCM_EN=P2^7; //LCD1602命令端口 sbit KEY1=P1^1; //確認按鍵 sbit KEY2=P1^3; //減按鍵 sbit KEY3=P1^5; //加按鍵 uchar table[] = "Mode selection:"; uint M1 = 0;bit M_FLAG = 0; //M法測速參數 uint M2 = 0;bit T_FLAG = 0; //T法測速參數 uint Z = 1,T = 1000,n = 100; //倍頻系數*編碼器光柵數 采樣周期 bit flag = 0; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void write_com(uchar com) { LCM_RS=0; DataPort=com; delay(5); LCM_EN=1; delay(5); LCM_EN=0; } void write_data(uchar date) { LCM_RS=1; DataPort=date; delay(5); LCM_EN=1; delay(5); LCM_EN=0; } void init() { LCM_EN=0; write_com(0x38); write_com(0x0e); write_com(0x06); write_com(0x01); write_com(0x80+0x00); } void main(void) { uchar i; init(); //液晶初始化 write_com(0x80); for(i = 0;i < 15;i++) write_data(table); while(!flag) { if(!KEY2) { delay(15);write_com(0x80 + 15);write_data('M'); M_FLAG = 1;T_FLAG = 0;while(!KEY2); } if(!KEY3) { delay(15);write_com(0x80 + 15);write_data('T'); T_FLAG = 1;M_FLAG = 0;while(!KEY3); } if(!KEY1 &&(T_FLAG || M_FLAG)) {flag = 1;while(!KEY1);} } write_com(0x80 + 0x40); write_data('Z'); write_data('='); write_data(Z / 100 + '0'); write_data(Z / 10 % 10 + '0'); write_data(Z % 10 + '0'); flag = 0; while(!flag) { if(!KEY2) { delay(15); Z--; write_com(0x80 + 0x42); write_data(Z / 100 + '0'); write_data(Z / 10 % 10 + '0'); write_data(Z % 10 + '0'); delay(15);while(!KEY2); } if(!KEY3) { delay(15); Z++; write_com(0x80 + 0x42); write_data(Z / 100 + '0'); write_data(Z / 10 % 10 + '0'); write_data(Z % 10 + '0'); delay(15);while(!KEY3); } if(!KEY1) {flag = 1;while(!KEY1);} } write_com(0x80 + 0x48); write_data('T'); write_data('='); write_data(T / 1000 + '0'); write_data(T / 100 % 10 + '0'); write_data(T / 10 % 10 + '0'); write_data(T % 10 + '0'); write_com(0x80 + 0x4E); write_data('m'); write_data('s'); flag = 0; while(!flag) { if(!KEY2) { delay(15); T--; write_com(0x80 + 0x4A); write_data(T / 1000 + '0'); write_data(T / 100 % 10 + '0'); write_data(T / 10 % 10 + '0'); write_data(T % 10 + '0'); while(!KEY2); } if(!KEY3) { delay(15); T++; write_com(0x80 + 0x4A); write_data(T / 1000 + '0'); write_data(T / 100 % 10 + '0'); write_data(T / 10 % 10 + '0'); write_data(T % 10 + '0'); while(!KEY3); } if(!KEY1) {flag = 1;while(!KEY1);} } flag = 0;write_com(0x01); IT0 = 1; //下降沿觸發 EX0 = 1; TMOD = 0x11; //定時/計數器0、1工作于方式1 TH0 = 0xFC; //12.000 TL0 = 0x18; ET0=1; //允許定時/計數器0 中斷 if(M_FLAG) TR0=1; //啟動定時/計數器0 中斷 else if(T_FLAG) TR0=0; //啟動定時/計數器0 中斷 EA=1; while(1) { ; } } void Int0(void) interrupt 0 { if(M_FLAG) M1++; if(T_FLAG) { TR0=1; if(flag) { flag = 0; n = T*60/Z/M2; write_com(0x80); write_data('S'); write_data('p'); write_data('e'); write_data('e'); write_data('d'); write_data(':'); write_data(n / 10000 + '0'); write_data(n / 1000 % 10 + '0'); write_data(n / 100 % 10 + '0'); write_data(n / 10 % 10 + '0'); write_data(n % 10 + '0'); write_data('r'); write_data('/'); write_data('m'); write_data('i'); write_data('n'); EA = 0; } flag = 1;M2 = 0; } } void Timer0(void) interrupt 1 { TH0 = 0xFC; //12.000 TL0 = 0x18; M2++; if(T == M2)
|