cuihaodianzi 发表于 2019-10-22 19:17 程序来了,大神 #include<reg52.h>//51单片机头文件 #define uchar unsigned char//宏定义 #define uint unsigned int uchar code digit[]="0123456789";//定义字符数组数字 uchar disp[8];//存储拆开的数 uint cnt;//中断次数 uchar v;//电机0速度 uchar s;//电机1速度 uchar flag; //计满1秒钟标志位 ///////// sbit rs=P2^6;//数据命令选择 sbit rw=P2^5;//读写控制信号 sbit e=P2^7;//使能信号 /////////////// void delay_50us(uint t)//50us延时函数 { uchar j; for(;t>0;t--) for(j=19;j>0;j--); } ///////////// /* void delay_50ms(uint t)//50ms延时函数 { uint j; for(;t>0;t--) for(j=6245;j>0;j--); } ///////// */ void write_com(uchar com)//写地址 { e=0; rs=0; rw=0; P0=com; delay_50us(10); e=1; delay_50us(10); e=0; } /////// void write_data(uchar dat)// 写数据 { e=0; rs=1; rw=0; P0=dat; delay_50us(10); e=1; delay_50us(10); e=0; } ////// void init(void)//液晶初始化 { delay_50us(300); write_com(0x38); delay_50us(100); write_com(0x38); delay_50us(100); write_com(0x38); write_com(0x38); write_com(0x08); write_com(0x01); write_com(0x06); write_com(0x0c); } ///////////// void writeaddress(uchar x)//指定字符的实际地址 { write_com(x|0x80);//显示位置的确定方法规定为“80h+地址码x“ } ////////// void display_sym(void)//显示速度提示符 { writeaddress(0x00);//写显示地址第一行第一列 write_data('v');//写数据v write_data('=');//写数据= writeaddress(0x00+0x40);//写显示地址第一行第一列 write_data('s');//写数据v write_data('=');//写数据= } ////// void dispose()// { disp[0]=v/1000; disp[1]=(v%1000)/100; disp[2]=(v/100)/10; disp[3]=v%10; disp[4]=s/1000; disp[5]=(s%1000)/100; disp[6]=(s/100)/10; disp[7]=s%10; } ///////////// void display_val(void) { writeaddress(0x02);//写显示地址,第一行第三列 write_data(digit[disp[0]]);//千 write_data(digit[disp[1]]);//百 write_data(digit[disp[2]]);//时 write_data(digit[disp[3]]);//个 writeaddress(0x02+0x40);//写显示地址,第2行第三列 write_data(digit[disp[4]]);//千 write_data(digit[disp[5]]);//百 write_data(digit[disp[6]]);//时 write_data(digit[disp[7]]);//个 } //////// void display_uint(void)//显示速度单位 { writeaddress(0x06);//第1行第7列 write_data('r');//千 write_data('/');//百 write_data('m');//时 write_data('i');//个 write_data('n');//个 writeaddress(0x06+0x40);//第2行第7列 write_data('r');//千 write_data('/');//百 write_data('m');//时 write_data('i');//个 write_data('n');//个 } void initial()//初始化 { TMOD=0x55; //定时器T1工作与计数器模式1,定时器T0工作于计数器模式1 RCAP2H=(65536-50000)/256; RCAP2L=(65536-50000)%256; ET2=1; TR2=1; EA=1; } /////// void main() { init(); v=0; s=0; initial(); cnt=0; display_sym(); display_uint(); while(1) { TR1=1; TR0=1; TH1=0; TL1=0; TH0=0; TL0=0; flag=0; // 时间还未满1分钟 while(flag==1); // 时间未满等待 v=(TH1*256+TL1)*60/20; // 计算速度,每周产生20个脉冲 s=(TH0*256+TL0)*60/20; // 计算速度,每周产生20个脉冲 dispose(); display_val(); } } ////// void time2() interrupt 5//定时器T2中断服务程序 { TF2=0; cnt++; if(cnt==20) { flag=1; cnt=0; } } |
csmyldl 发表于 2019-10-22 18:35 大神,不是这样的吧,我们是用电机风扇叶来测的,有间隙的啊 |
cuihaodianzi 发表于 2019-10-22 19:17 #include<reg52.h>//51单片机头文件 #define uchar unsigned char//宏定义 #define uint unsigned int uchar code digit[]="0123456789";//定义字符数组数字 uchar disp[8];//存储拆开的数 uint cnt;//中断次数 uchar v;//电机0速度 uchar s;//电机1速度 uchar flag; //计满1秒钟标志位 ///////// sbit rs=P2^6;//数据命令选择 sbit rw=P2^5;//读写控制信号 sbit e=P2^7;//使能信号 /////////////// void delay_50us(uint t)//50us延时函数 { uchar j; for(;t>0;t--) for(j=19;j>0;j--); } ///////////// /* void delay_50ms(uint t)//50ms延时函数 { uint j; for(;t>0;t--) for(j=6245;j>0;j--); } ///////// */ void write_com(uchar com)//写地址 { e=0; rs=0; rw=0; P0=com; delay_50us(10); e=1; delay_50us(10); e=0; } /////// void write_data(uchar dat)// 写数据 { e=0; rs=1; rw=0; P0=dat; delay_50us(10); e=1; delay_50us(10); e=0; } ////// void init(void)//液晶初始化 { delay_50us(300); write_com(0x38); delay_50us(100); write_com(0x38); delay_50us(100); write_com(0x38); write_com(0x38); write_com(0x08); write_com(0x01); write_com(0x06); write_com(0x0c); } ///////////// void writeaddress(uchar x)//指定字符的实际地址 { write_com(x|0x80);//显示位置的确定方法规定为“80h+地址码x“ } ////////// void display_sym(void)//显示速度提示符 { writeaddress(0x00);//写显示地址第一行第一列 write_data('v');//写数据v write_data('=');//写数据= writeaddress(0x00+0x40);//写显示地址第一行第一列 write_data('s');//写数据v write_data('=');//写数据= } ////// void dispose()// { disp[0]=v/1000; disp[1]=(v%1000)/100; disp[2]=(v/100)/10; disp[3]=v%10; disp[4]=s/1000; disp[5]=(s%1000)/100; disp[6]=(s/100)/10; disp[7]=s%10; } ///////////// void display_val(void) { writeaddress(0x02);//写显示地址,第一行第三列 write_data(digit[disp[0]]);//千 write_data(digit[disp[1]]);//百 write_data(digit[disp[2]]);//时 write_data(digit[disp[3]]);//个 writeaddress(0x02+0x40);//写显示地址,第2行第三列 write_data(digit[disp[4]]);//千 write_data(digit[disp[5]]);//百 write_data(digit[disp[6]]);//时 write_data(digit[disp[7]]);//个 } //////// void display_uint(void)//显示速度单位 { writeaddress(0x06);//第1行第7列 write_data('r');//千 write_data('/');//百 write_data('m');//时 write_data('i');//个 write_data('n');//个 writeaddress(0x06+0x40);//第2行第7列 write_data('r');//千 write_data('/');//百 write_data('m');//时 write_data('i');//个 write_data('n');//个 } void initial()//初始化 { TMOD=0x55; //定时器T1工作与计数器模式1,定时器T0工作于计数器模式1 RCAP2H=(65536-50000)/256; RCAP2L=(65536-50000)%256; ET2=1; TR2=1; EA=1; } /////// void main() { init(); v=0; s=0; initial(); cnt=0; display_sym(); display_uint(); while(1) { TR1=1; TR0=1; TH1=0; TL1=0; TH0=0; TL0=0; flag=0; // 时间还未满1分钟 while(flag==1); // 时间未满等待 v=(TH1*256+TL1)*60/20; // 计算速度,每周产生20个脉冲 s=(TH0*256+TL0)*60/20; // 计算速度,每周产生20个脉冲 dispose(); display_val(); } } ////// void time2() interrupt 5//定时器T2中断服务程序 { TF2=0; cnt++; if(cnt==20) { flag=1; cnt=0; } } |
|
程序呢 ? 这样问貌似没法回答 |
| 应该是传感器位置装的不对,从图上看是红外对管进行检测,需在飞轮上钻一个孔,光从孔中通过,当飞轮转动时测出对管产生的脉冲间隔时间来计算速度的 |