#include #define uint unsigned int #define uchar unsigned char #define DataPort P0 sbit RS = P3^5; sbit RW = P3^6; sbit EN = P3^4; sbit PSB=P3^7; sbit Busy=DataPort^7; sbit warning=P2^1; //蜂鸣器端 sbit gg=P2^0; sbit yy=P2^2; uint i,z,count,zhuan,msec; //定义参数 uint m,mm,zhuan1; uchar time[3];//显示缓冲区 uchar code num1[]={\"speed= /*******延时1ms*********/ void delay (uint t) { uint j; for(;t>0;t--) for(j=25;j>0;j--); } /*void delayms(uchar xms) { 定义显示参数 r/sec \uchar i,j; for(i=xms;i>0;i--) for(j=125;j>0;j--); }*/ /**********判忙函数********/ void lcd_Busy(void) { DataPort=0xff; RS = 0; RW = 1; EN = 1; while(Busy==1); EN = 0; } /**********写命令********/ void w_cmd(uint cmd) { lcd_Busy(); RS = 0; RW = 0; DataPort = cmd; EN = 1; delay(1); EN = 0; } /***写数据****/ void w_dat(uint dat) { lcd_Busy(); RS = 1; RW = 0; DataPort = dat; EN = 1; delay(1); EN = 0; } /*******初始化*******/ void init(void) { PSB = 1; w_cmd(0x30); w_cmd(0x38); w_cmd(0x01); w_cmd(0x06); w_cmd(0x0c); } void disp_chinese(uchar code *s)//显示汉字 { while(*s>0) { w_dat(*s); s++; delay(3); } } void rt() { TMOD=0x01; //内部中断定时器选择 TH0=(65536-50000)/256; //50ms定时 TL0=(65536-50000)/256; EA=1; //开中断总开关 ET0=1; //开内部中断0 TR0=1; //计时器开始工作 IT0=1; //外部中断0为下降沿触发 EX0=1; //开外部中断0 } void disp_count() { //zhuan=z; mm=m; w_cmd(0x80+3); //zhuan1=((zhuan*12)*0.00001)/0.00028; zhuan1=zhuan*14;// w_dat(0x30+zhuan1/1000); //转换转速的千位 w_dat(0x30+zhuan1/100%10); //转换转速的百位 w_dat(0x30+zhuan1/10%10); //转换转速的十位 w_dat(0x30+zhuan1%10); //转换转速的个位 } /*-------------------转速过高警告程序--------------------*/ void warning_speed() { if(zhuan>5000) { warning=1; } if(zhuan<=5000) { warning=0; } } void fenli_sfm() //高于5000转打开警告 //低于5000转关闭警告 { time[0] = m%10; time[1] = m%100/10; time[2] = m/100; w_cmd(0x90+2); w_dat(0x30+time[2]); w_dat(0x30+time[1]); w_dat(0x30+time[0]); } /*-----------主函数------------*/ void main() { uchar qq,a=0; init(); //液晶初始化 rt(); //定时器初始化 w_cmd(0x80); disp_chinese(\"speed= while(1) { if(gg==0) { delay(5); if(gg==0) { a++; } r/s \"); } if(a==1) {TR0=1;yy=1;} if(a==2) {TR0=0;yy=0;} if(msec==20) { msec=0; m++; qq=z; z=0; zhuan=qq; } //50*20=1S fenli_sfm(); disp_count(); //数据处理 warning_speed(); //转速警告 } } /*-------------------外部中断0计数程序-------------------*/ void counter(void) interrupt 0 { EX1=0; //关外部中断0 count++; if(count==2) //4次循环为电机转一圈 { count=1; //初始化计数 z++; //转圈计数加1 } //计数+1 EX1=1; //开外部中断0 return; } /*-----------------内部中断0计时计数程序-----------------*/ void Timer_0(void) interrupt 1 { TH0=(65536-50000)/256; //50ms定时 TL0=(65536-50000)/256; msec++; } 因篇幅问题不能全部显示,请点此查看更多更全内容