完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
求助基于89C51 的液体点滴速度监控系统设计的相关资料我的邮箱453505854@qq.com 谢谢各位大虾 好人一生平安
由于是先用proteus仿真看看程序 所以两个检测模块没有画出 我感觉这个题目有点冷门淘宝上没有实物 我也是前阵子看了这个帖子才看到了实现的希望https://bbs.elecfans.com/jishu_480785_1_1.html 所以如果有大神懂得话 真心求教 顺便问下 检测模块在proteus里可以用什么实现 其中晚上有很多资料都是 ***it E=P2^2; ***it RW=P2^1; ***it RS=P2^0; 这么定义的 #include #define DB0_DB7 P0 #define busy 0x80 #define SCANPORT P1 ***it E=P2^7; ***it RW=P2^6; ***it RS=P2^5; ***it P23=P2^3; unsigned char uca_LineScan[4]={0xEF,0xDF,0xBF,0x7F};//列线扫描电压,分为第1,2,3,4根列线 unsigned char key_ctt[4]={0}; unsigned int time_sq[4]={0};//连续测得的三点的时间 unsigned char speed_bcd[4]={0}; unsigned int speed_ck[4]={0}; unsigned int di_xx[2]={0}; unsigned char speed_sc[2]={0}; unsigned char yy=0,temp; unsigned int ct=0,ttb=0,xx=0,tt3=0,speedct=0,speed=0,speedcd=10,cott=0; typedef unsigned char uchar; uchar code lcd3[]={"0123456789abcdef"}; uchar code lcdnow[]={"NOW:000"}; uchar code lcdset[]={"SET:000"}; unsigned char CONTROL[8]={0x38,0x18,0x98,0x88,0xC8,0x48,0x68,0x28}; unsigned char codes1[8]={0xb8,0x98,0xd8,0xc8,0xe8,0x68,0x78,0x38};///9,18,36,45,54,63,72,81度 顺时针*/ unsigned char codes2[8]={0x38,0x78,0x68,0xe8,0xc8,0xd8,0x98,0xb8}; //9,18,36,45,54,63,72,81度 逆时针 unsigned char counts,pt; bit flag=1;//度数,正/反转,速度控制 bit a_ac=0;//比较系统标志 unsigned char uc_KeyTemp=0; //按键键码暂存。 unsigned char uc_ClickCount=0; unsigned char ucCount; void vKeyProcess(unsigned char ucKeyCode); void bleep();//报警 bit bleept=0;//报警标准 bit moto=0;//电机标志位 void ac();///电机速度比较 void akey();//功能处理A bit a_key=0; bit b_key=0; void getspeed();//速度检测 void stdisplay();//显示 void Delay(unsigned int t);//延时 void delay_50ms(unsigned int t); void SendCommand(unsigned char ch);//发送命令 void vWriteData(unsigned char ch);//发送数据 void InitLcd();//初始化 void DisplayOneChar(unsigned char x,unsigned y,unsigned char ddata);//按指定位置显示一个字符 void DisplayListChar(unsigned char x, unsigned char y, unsigned char *DData);//按指定位置显示一串字符 //点滴速度检测子程序: void Delay(unsigned int t) // delay 40us { //for(;t!=0;t--) ; while(t--); } void delay_50ms(unsigned int t) {unsigned int j; for(;t>0;t--) for(j=6245;j>0;j--); } void SendCommand(unsigned char ch)//发送命令 { /*CheckBusy();*/ RS=0; RW=0; DB0_DB7=ch; E=1; Delay(1); E=0; Delay(5); //delay 40us } void vWriteData(unsigned char ch)//发送数据 { /* CheckBusy(); */ RS=1; RW=0; DB0_DB7=ch; E=1; Delay(1); E=0; Delay(5); //delay 40us } //显示子程序流程: void InitLcd()//初始化 { SendCommand(0x38); Delay(1); SendCommand(0x08); //设置工作方式 Delay(1); SendCommand(0x01); //显示状态设置 Delay(1); SendCommand(0x06); //清屏 Delay(200); SendCommand(0x0c); //输入方式设置 } void DisplayOneChar(unsigned char x,unsigned y,unsigned char ddata)//按指定位置显示一个字符 { y &= 0x1; x &= 0xF; //限制X不能大于15,Y不能大于1 if (y) x |= 0x40; //当要显示第二行时地址码+0x40; x |= 0x80; // 算出指令码 SendCommand(x); vWriteData(ddata); } void DisplayListChar(unsigned char x, unsigned char y, unsigned char *DData)//按指定开始位置显示字符串 { unsigned char ListLength; ListLength = 0; y &= 0x1; x &= 0xF; //限制X不能大于15,Y不能大于1 while (DData[ListLength]>0x20) //若到达字串尾则退出 { if (x <= 0xF) //X坐标应小于0xF { DisplayOneChar(x, y, DData[ListLength]); //显示单个字符 ListLength++; x++; } } } //键盘扫描子程序流程: void vShowOneChar(unsigned char ucChar) { switch(ucChar) { case '0': vWriteData(0x30);break; case '1': vWriteData(0x31);break; case '2': vWriteData(0x32);break; case '3': vWriteData(0x33);break; case '4': vWriteData(0x34);break; case '5': vWriteData(0x35);break; case '6': vWriteData(0x36);break; case '7': vWriteData(0x37);break; case '8': vWriteData(0x38);break; case '9': vWriteData(0x39);break; case 'a': vWriteData(0x61);break; case 'b': vWriteData(0x62);break; case 'c': vWriteData(0x63);break; case 'd': vWriteData(0x64);break; case 'e': vWriteData(0x65);break; case 'f': vWriteData(0x66);break; default: break; } } unsigned char ucKeyScan() { unsigned char ucTemp=0; //扫描状态暂存。 unsigned char ucRow=0,ucLine=0;//行号,列号。 for(ucLine=0;ucLine<4;ucLine++) //列扫描 { SCANPORT=uca_LineScan[ucLine]; //输出扫描电位。 ucTemp=SCANPORT&0x0F; //输入扫描电位,并屏蔽高4位。 if(ucTemp!=0x0F) { //判断该列是否有按键按下。 switch(ucTemp) { case 0x0E: ucRow=10;break; //如果有,则判断行号。 case 0x0D: ucRow=20;break; case 0x0B: ucRow=30;break; case 0x07: ucRow=40;break; default: ucRow=50;break; } break; } } SCANPORT=0x0F; //恢复P2口 return ucRow+ucLine+1; //返回按键编码。格式为2位数,高位为行号,低位为列号。 } void vKeyProcess(unsigned char ucKeyCode) { SendCommand(0xC4+uc_ClickCount); if(a_key==1) { switch(ucKeyCode) { case 41:vShowOneChar('7');temp=7;break; case 42:vShowOneChar('8');temp=8;break; case 43:vShowOneChar('9');temp=9;break; case 31:vShowOneChar('4');temp=4;break; case 32:vShowOneChar('5');temp=5;break; case 33:vShowOneChar('6');temp=6;break; case 21:vShowOneChar('1');temp=1;break; case 22:vShowOneChar('2');temp=2;break; case 23:vShowOneChar('3');temp=3;break; case 12:vShowOneChar('0');temp=0;break; SendCommand(0xc4+uc_ClickCount); SendCommand(0x0f); } switch(ucKeyCode) { case 44:/*vShowOneChar('c');*/temp=12;break; //'/' case 34:/*vShowOneChar('d')*/temp=13;break; //'清除' case 24:/*vShowOneChar('e')*/temp=14;break; //'下调' case 14:/*vShowOneChar('f')*/temp=15;break; //'上调' case 13:/*vShowOneChar('b');*/temp=11;break; //'返回' case 11:/*vShowOneChar('a');*/temp=10;break; //'ON/C' default:break; } if(temp==11) //判断按键与上一次所按的键是否相同。 { delay_50ms(10); if(uc_ClickCount<255) { uc_ClickCount++; SendCommand(0xc3+uc_ClickCount); SendCommand(0x0f);} if(uc_ClickCount==3) uc_ClickCount=0; SendCommand(0xc4+uc_ClickCount); SendCommand(0x0f); } if(temp<=9) {switch(uc_ClickCount) { case 0:key_ctt[0]=temp;break; case 1:key_ctt[1]=temp;break; case 2:key_ctt[2]=temp;break; default:break; } } } } //点滴速度控制子程序流程: void int_timer0(void) { TMOD=0X10; TMOD=0X01; TH0=0X3C; TL0=0XB0; TH1=0X3C; TL1=0XB0; ET1=1; TR1=1; ET0=1; TR0=1; EA=1; IT1=1; EX1=1; } void Timer1() interrupt 3 { TH1=0X3c; TL1=0Xb0; pt++; //控制速度 if(pt==2) { pt=0; if(flag==0&&moto==1) P2=(P2&0x0f)|CONTROL[counts]; if(flag==0&&moto==0) P2=(P2&0x0f)|codes2[counts]; counts++; if(counts==8)counts=0;//角度重置 } } void Timer0() interrupt 1 { TH0=0X3c; TL0=0Xb0; yy++; if(yy==2) { ct++; tt3++; yy=0; if(ct==600)//60秒定时 { ct=0; xx=0; } if(tt3==20) { tt3=0; di_xx[1]=di_xx[0]; di_xx[0]=xx; if((di_xx[0]==di_xx[1])&&a_ac==1) {bleept=1;flag=1;} } } } void Int1() interrupt 2 { static cott=0; cott++; if(cott==2) { xx++; time_sq[2]=time_sq[1]; time_sq[1]=time_sq[0]; time_sq[0]=ct; if(a_key==0) { DisplayOneChar(10,0,lcd3[speed/100]); DisplayOneChar(11,0,lcd3[speed%100/10]); DisplayOneChar(12,0,lcd3[speed%10]); DisplayOneChar(10,1,lcd3[xx/100]); DisplayOneChar(11,1,lcd3[xx%100/10]); DisplayOneChar(12,1,lcd3[xx%10]); SendCommand(0xC4+uc_ClickCount);} getspeed(); cott=0; } } void stdisplay() { DisplayListChar(0,0,lcdnow); DisplayListChar(0,1,lcdset); DisplayOneChar(14,0,0x4f); DisplayOneChar(15,0,0x46); DisplayListChar(8,0,"S:"); DisplayListChar(8,1,"T:"); } void main(void) { delay_50ms(1); int_timer0(); InitLcd(); P23=1; SCANPORT=0x0F; stdisplay(); while(1) { bleep(); if(SCANPORT!=0x0F) { for(ucCount=0;ucCount<200;ucCount++); if(SCANPORT!=0x0F) vKeyProcess(ucKeyScan()); }; switch(temp) { case 13:bleept=0;break;//D case 14:a_ac=1;b_key=1;if(b_key==1){DisplayOneChar(15,1,0x4f);b_key=0;};SendCommand(0xC4+uc_ClickCount);break;//e case 15:if(a_key==1){speedcd=key_ctt[0]*100+key_ctt[1]*10+key_ctt[2];uc_ClickCount=0;};break;//f case 10:a_key=1;akey();break;//a case 12:a_key=0;akey();break;//c default:break; } } } void ac() { if(speedct>=(speedcd+5)) {moto=0;flag=0;} else if(speedct<=(speedcd-5)) {moto=1;flag=0;} else flag=1; } void bleep() { if(a_ac==1) {if(bleept==1) P23=0; if(bleept==0) P23=1; } } void akey() { if(a_key==1) {SendCommand(0x0c); DisplayOneChar(14,0,0x4f); DisplayOneChar(15,0,0x4e); //On SendCommand(0xc4); SendCommand(0x0f); } if(a_key==0) { SendCommand(0x0c); DisplayOneChar(14,0,0x4f); DisplayOneChar(15,0,0x46);//Of } } void getspeed() { if(a_ac==1) {ac();}; speed=1200/(time_sq[0]-time_sq[2]); speed_ck[3]=speed_ck[2]; speed_ck[2]=speed_ck[1]; speed_ck[1]=speed_ck[0]; speed_ck[0]=speed; if((speed_ck[0]!=speed_ck[1])) { speed_sc[1]=speed_sc[0]; speed_sc[0]=speed_ck[0]; speedct=(speed_sc[0]+speed_sc[1])/2; } else {if((speed_ck[0]==speed_ck[2])&&(speed_ck[1]==speed_ck[3])) speedct=(speed_ck[0]+speed_ck[1])/2; if((speed_ck[0]==speed_ck[1])||(speed_ck[0]==speed_ck[2])) speedct=(speed_ck[1]+speed_ck[2])/2; if((speed_ck[0]!=speed_ck[1])&&(speed_ck[0]!=speed_ck[2])&&(speed_ck[1]==speed_ck[2])) speedct=(speed_ck[0]+speed_ck[1])/2; if((speed_ck[0]!=speed_ck[1])&&(speed_ck[0]!=speed_ck[2])&&(speed_ck[1]!=speed_ck[2])) speedct=(speed_ck[0]+speed_ck[1]+speed_ck[2]+speed_ck[4])/4;} speed_bcd[2]=speed/100; speed_bcd[1]=speed%100/10; speed_bcd[0]=speed%10; if(a_key==0) { DisplayOneChar(4,0,lcd3[speedct/100]); DisplayOneChar(5,0,lcd3[speedct%100/10]); DisplayOneChar(6,0,lcd3[speedct%10]); DisplayOneChar(4,1,lcd3[speedcd/100]); DisplayOneChar(5,1,lcd3[speedcd%100/10]); DisplayOneChar(6,1,lcd3[speedcd%10]); SendCommand(0xC4+uc_ClickCount); } } |
|
相关推荐
1个回答
|
|
有木有人 有木有人啊有木有人 有木有人啊有木有人 有木有人啊有木有人 有木有人啊有木有人 有木有人啊有木有人 有木有人啊有木有人 有木有人啊
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
852 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
592 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
705 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
926 浏览 2 评论
657 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11992 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 19:33 , Processed in 0.504348 second(s), Total 71, Slave 52 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号