#include #include #define uchar unsigned char #define uint unsigned int /********************************************************************** L7010r接口定义 **********************************************************************/ sbit MOTOR_A_2=P1^4; //正转 sbit MOTOR_A_1=P1^5; //反转 sbit EN_MOTOR_A =P3^4; sbit k1=P1^3; //定义k1为p1.5口 sbit k2=P1^2; //定义k2为p3.1口 sbit k3=P1^1; //定义k3为p3.2口 sbit k4=P1^0; //定义k4为p3.3口 sbit rs=P2^0; //LCD的数据/命令选择端 sbit rw=P2^1; //LCD的读写选择端 sbit lcdcs=P2^2; //LCD的使能信号端 sbit warning=P3^1; //蜂鸣器端 uchar e=0; uchar T=0; //定时标记 uchar W=0; //脉宽值 0~100 uchar A=0; //方向标记 0,1 uchar k=0; //按键标记 uchar i=0; //计数变量 uint b,z,count,zhuan,msec; //定义参数 uchar display[]={\" speed= r/sec\ //定义显示参数 //sbit rs=P2^7; //LCD的数据/命令选择端 //sbit rw=P2^6; //LCD的读写选择端 //sbit lcdcs=P2^5; //LCD的使能信号端 //sbit warning=P3^1; //蜂鸣器端 uint b,z,count,zhuan,msec; //定义参数 //uchar display[]={\" speed= r/sec\ //定义显示参数 void delay(uint ms); //固定函数声明 /*-----------------------毫秒延时------------------------*/ void delay(uint ms) { uint b,j; //为延时引入i,j两参数 for (j=0;j } /********************************************************************* 定时器变量定义 **********************************************************************/ void init(void) { warning=0; //关蜂鸣器 z=0; //初始化z的值 count=0; //初始化count的值 zhuan=0; //初始化转的值 rw=0; //选择LCD写数据指令 delay(15); //延时15ms write_command(0x38); //向LCD1602写命令38H delay(5); write_command(0x0e); delay(5); write_command(0x06); TMOD=0x01; TH0=0x66; TL0=0x50; EA=1; ET0=1; TR0=1; IT0=1; EX0=1; } //延时5ms //向LCD1602写命令0EH //延时5ms //向LCD1602写命令06H //内部中断定时器选择 //50ms定时 //开中断总开关 //开内部中断0 //计时器开始工作 //外部中断0为下降沿触发 //开外部中断0 void timer0() interrupt 1 //用于马达转速的中断服务程序 { //重置定时器时间 TL0=0x17; TH0=0xff; T++; //定时标记加1 disp(); //数码管显示 if(T>W){ EN_MOTOR_A =0; if(e==1) {MOTOR_A_2=0; } else if(e==0) {MOTOR_A_1=0; } } else { EN_MOTOR_A =1; MOTOR_A_1=1; MOTOR_A_2=1; } if(T==100) T=0; } /*--------------------向LCD1602写命令--------------------*/ void write_command(uchar command) { rs=0; //选择写命令 P0=command; //向LCD写命令 lcdcs=1; //信号使能端高电平 lcdcs=0; //信号使能端低电平 } /*-------------------------------------------------------*/ /*--------------------向LCD1602写数据--------------------*/ void write_data(uchar data0) { rs=1; //选着写数据 P0=data0; //向LCD写数据 lcdcs=1; //信号使能端高电平 lcdcs=0; //信号使能端低电平 } /*------------------------LCD显示------------------------*/ void displaytolcd() { write_command(0x80); //向LCD1602写命令80H for (b=0;b write_data(display[i]); delay(5); } } /*-------------------外部中断0计数程序-------------------*/ void counter(void) interrupt 0 { EX1=0; //关外部中断0 count++; if(count==4) //4次循环为电机转一圈 { count=1; //初始化计数 z++; //转圈计数加1 } //计数+1 EX1=1; //开外部中断0 return; } /*-----------------内部中断0计时计数程序-----------------*/ void Timer_0(void) interrupt 1 { TH0=0x65; TL0=0xF3; msec++; if(msec==20) { displaytolcd(); msec=0; zhuan=z; z=0; } } //50ms定时 //50*20=1S /*-----------------------数据处理------------------------*/ void disp_count() { display[9]=(zhuan/1000+'0'); //转换转速的千位 display[10]=(zhuan/100%10+'0'); //转换转速的百位 display[11]=(zhuan/10%10+'0'); //转换转速的十位 display[12]=(zhuan%10+'0'); //转换转速的个位 } /*-------------------转速过高警告程序--------------------*/ void warning_speed() { if(zhuan>5000) //高于5000转打开警告 { warning=1; } if(zhuan<=5000) //低于5000转关闭警告 { warning=0; } } /********************************************************************** 按键检测 **********************************************************************/ void key(void) //按键判断程序 { if(k1==0) //按键1按下 { while(k1==0); //按键1抬起 if(W==100) //如果脉宽为100 W=0; else W+=1; } else if(k2==0) { while(k2==0); if(W==0) W=100; else //脉宽置0 //否则加1 //按键2按下 //按键2抬起 //如果脉宽为0 //脉宽设置成100 W-=1; //否则减1 } else if(k3==0) //按键3按下 正 转 { while(k3==0); A=!A; k=0; e=1; } else if(k4==0) { while(k4==0); //W=0; //按键3抬起 //方向标记取反 //按键标记清0 //按键4按下 //按键4抬起 //脉宽清0 k=0; //按键标记清0 e=0; } } void main(void) { init(); while(1) { key(); disp_count(); warning_speed(); displaytolcd(); /////////系统初始化 ////////查询按键 //数据处理 //转速警告 //LCD显示 } } 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务