Arduino智能小车+L298N+测速模块+5110液晶屏,车速显示功能实现过程遇到的小问题(液晶屏一直保持000cm/s的状态,但修改中断时间为5000ms时会出现速度值,但也只持续5000ms,之后一直保持000cm/s,求各路前辈指教,新手一枚)
以下为烧录的代码
- #include <MsTimer2.h>
- #define Value 1.02101761 //计算周长的常量
-
- //volatile int state = HIGH;
-
- int u_left = 2;//定义U型测速端口
- int u_right = 3;
-
- int IN1=4;
- int IN2=5;
- int leftPWM=10;
- int IN3=6;
- int IN4=7;
- int rightPWM=11;
- int lcd_ce=2;
- int lcd_rst=3;
- int sclk=4;
- int sdin=5;
- int lcd_dc=6;//5110
- //****************************定义ascii字符**********************//
- /**********************************
- 6 x 8 font
- 1 pixel space at left and bottom
- index = ascii - 32
- ***********************************/
- const unsigned char font6x8[][6] =
- {
- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // sp
- { 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 }, // !
- { 0x00, 0x00, 0x07, 0x00, 0x07, 0x00 }, // "
- { 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // #
- { 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $
- { 0x00, 0x62, 0x64, 0x08, 0x13, 0x23 }, // %
- { 0x00, 0x36, 0x49, 0x55, 0x22, 0x50 }, // &
- { 0x00, 0x00, 0x05, 0x03, 0x00, 0x00 }, // '
- { 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00 }, // (
- { 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00 }, // )
- { 0x00, 0x14, 0x08, 0x3e, 0x08, 0x14 }, // *
- { 0x00, 0x08, 0x08, 0x3e, 0x08, 0x08 }, // +
- { 0x00, 0x00, 0x00, 0xa0, 0x60, 0x00 }, // ,
- { 0x00, 0x08, 0x08, 0x08, 0x08, 0x08 }, // -
- { 0x00, 0x00, 0x60, 0x60, 0x00, 0x00 }, // .
- { 0x00, 0x20, 0x10, 0x08, 0x04, 0x02 }, // /
- { 0x00, 0x3e, 0x51, 0x49, 0x45, 0x3e }, // 0
- { 0x00, 0x00, 0x42, 0x7f, 0x40, 0x00 }, // 1
- { 0x00, 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2
- { 0x00, 0x21, 0x41, 0x45, 0x4b, 0x31 }, // 3
- { 0x00, 0x18, 0x14, 0x12, 0x7f, 0x10 }, // 4
- { 0x00, 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5
- { 0x00, 0x3c, 0x4a, 0x49, 0x49, 0x30 }, // 6
- { 0x00, 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7
- { 0x00, 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8
- { 0x00, 0x06, 0x49, 0x49, 0x29, 0x1e }, // 9
- { 0x00, 0x00, 0x36, 0x36, 0x00, 0x00 }, // :
- { 0x00, 0x00, 0x56, 0x36, 0x00, 0x00 }, // ;
- { 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 }, // <
- { 0x00, 0x14, 0x14, 0x14, 0x14, 0x14 }, // =
- { 0x00, 0x00, 0x41, 0x22, 0x14, 0x08 }, // >
- { 0x00, 0x02, 0x01, 0x51, 0x09, 0x06 }, // ?
- { 0x00, 0x32, 0x49, 0x59, 0x51, 0x3e }, // @
- { 0x00, 0x7c, 0x12, 0x11, 0x12, 0x7c }, // a
- { 0x00, 0x7f, 0x49, 0x49, 0x49, 0x36 }, // b
- { 0x00, 0x3e, 0x41, 0x41, 0x41, 0x22 }, // c
- { 0x00, 0x7f, 0x41, 0x41, 0x22, 0x1c }, // d
- { 0x00, 0x7f, 0x49, 0x49, 0x49, 0x41 }, // e
- { 0x00, 0x7f, 0x09, 0x09, 0x09, 0x01 }, // f
- { 0x00, 0x3e, 0x41, 0x49, 0x49, 0x7a }, // g
- { 0x00, 0x7f, 0x08, 0x08, 0x08, 0x7f }, // h
- { 0x00, 0x00, 0x41, 0x7f, 0x41, 0x00 }, // i
- { 0x00, 0x20, 0x40, 0x41, 0x3f, 0x01 }, // j
- { 0x00, 0x7f, 0x08, 0x14, 0x22, 0x41 }, // k
- { 0x00, 0x7f, 0x40, 0x40, 0x40, 0x40 }, // l
- { 0x00, 0x7f, 0x02, 0x0c, 0x02, 0x7f }, // m
- { 0x00, 0x7f, 0x04, 0x08, 0x10, 0x7f }, // n
- { 0x00, 0x3e, 0x41, 0x41, 0x41, 0x3e }, // o
- { 0x00, 0x7f, 0x09, 0x09, 0x09, 0x06 }, // p
- { 0x00, 0x3e, 0x41, 0x51, 0x21, 0x5e }, // q
- { 0x00, 0x7f, 0x09, 0x19, 0x29, 0x46 }, // r
- { 0x00, 0x46, 0x49, 0x49, 0x49, 0x31 }, // s
- { 0x00, 0x01, 0x01, 0x7f, 0x01, 0x01 }, // t
- { 0x00, 0x3f, 0x40, 0x40, 0x40, 0x3f }, // u
- { 0x00, 0x1f, 0x20, 0x40, 0x20, 0x1f }, // v
- { 0x00, 0x3f, 0x40, 0x38, 0x40, 0x3f }, // w
- { 0x00, 0x63, 0x14, 0x08, 0x14, 0x63 }, // x
- { 0x00, 0x07, 0x08, 0x70, 0x08, 0x07 }, // y
- { 0x00, 0x61, 0x51, 0x49, 0x45, 0x43 }, // z
- { 0x00, 0x00, 0x7f, 0x41, 0x41, 0x00 }, // [
- { 0x00, 0x55, 0x2a, 0x55, 0x2a, 0x55 }, // 55
- { 0x00, 0x00, 0x41, 0x41, 0x7f, 0x00 }, // ]
- { 0x00, 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^
- { 0x00, 0x40, 0x40, 0x40, 0x40, 0x40 }, // _
- { 0x00, 0x00, 0x01, 0x02, 0x04, 0x00 }, // '
- { 0x00, 0x20, 0x54, 0x54, 0x54, 0x78 }, // a
- { 0x00, 0x7f, 0x48, 0x44, 0x44, 0x38 }, // b
- { 0x00, 0x38, 0x44, 0x44, 0x44, 0x20 }, // c
- { 0x00, 0x38, 0x44, 0x44, 0x48, 0x7f }, // d
- { 0x00, 0x38, 0x54, 0x54, 0x54, 0x18 }, // e
- { 0x00, 0x08, 0x7e, 0x09, 0x01, 0x02 }, // f
- { 0x00, 0x18, 0xa4, 0xa4, 0xa4, 0x7c }, // g
- { 0x00, 0x7f, 0x08, 0x04, 0x04, 0x78 }, // h
- { 0x00, 0x00, 0x44, 0x7d, 0x40, 0x00 }, // i
- { 0x00, 0x40, 0x80, 0x84, 0x7d, 0x00 }, // j
- { 0x00, 0x7f, 0x10, 0x28, 0x44, 0x00 }, // k
- { 0x00, 0x00, 0x41, 0x7f, 0x40, 0x00 }, // l
- { 0x00, 0x7c, 0x04, 0x18, 0x04, 0x78 }, // m
- { 0x00, 0x7c, 0x08, 0x04, 0x04, 0x78 }, // n
- { 0x00, 0x38, 0x44, 0x44, 0x44, 0x38 }, // o
- { 0x00, 0xfc, 0x24, 0x24, 0x24, 0x18 }, // p
- { 0x00, 0x18, 0x24, 0x24, 0x18, 0xfc }, // q
- { 0x00, 0x7c, 0x08, 0x04, 0x04, 0x08 }, // r
- { 0x00, 0x48, 0x54, 0x54, 0x54, 0x20 }, // s
- { 0x00, 0x04, 0x3f, 0x44, 0x40, 0x20 }, // t
- { 0x00, 0x3c, 0x40, 0x40, 0x20, 0x7c }, // u
- { 0x00, 0x1c, 0x20, 0x40, 0x20, 0x1c }, // v
- { 0x00, 0x3c, 0x40, 0x30, 0x40, 0x3c }, // w
- { 0x00, 0x44, 0x28, 0x10, 0x28, 0x44 }, // x
- { 0x00, 0x1c, 0xa0, 0xa0, 0xa0, 0x7c }, // y
- { 0x00, 0x44, 0x64, 0x54, 0x4c, 0x44 }, // z
- { 0x14, 0x14, 0x14, 0x14, 0x14, 0x14 } // horiz lines
- };
- /************************lcd初始化函数********************************/
- void lcd_init(void)
- {
- //先设置为输出
- pinMode(sclk,OUTPUT);
- pinMode(sdin,OUTPUT);
- pinMode(lcd_dc,OUTPUT);
- pinMode(lcd_ce,OUTPUT);
- pinMode(lcd_rst,OUTPUT);
-
- // 产生一个让lcd复位的低电平脉冲
- digitalWrite( lcd_rst, LOW);
-
- delayMicroseconds(1);
- digitalWrite( lcd_rst, HIGH);
-
- // 关闭lcd
- digitalWrite( lcd_ce, LOW);
- delayMicroseconds(1);
- // 使能lcd
- digitalWrite( lcd_ce, HIGH); //lcd_ce = 1;
- delayMicroseconds(1);
- lcd_write_byte(0x21, 0); // 使用扩展命令设置lcd模式
- lcd_write_byte(0xc8, 0); // 设置偏置电压
- lcd_write_byte(0x06, 0); // 温度校正
- lcd_write_byte(0x13, 0); // 1:48
- lcd_write_byte(0x20, 0); // 使用基本命令
- lcd_clear(); // 清屏
- lcd_write_byte(0x0c, 0); // 设定显示模式,正常显示
-
- // 关闭lcd
- digitalWrite( lcd_ce, LOW); //lcd_ce = 0;
- }
- /************************lcd清屏函数*******************************/
- void lcd_clear(void)
- {
- unsigned int i;
- lcd_write_byte(0x0c, 0);
- lcd_write_byte(0x80, 0);
- for (i=0; i<504; i++)
- {
- lcd_write_byte(0, 1);
- }
- }
- /*************************设置字符位置函数**************************/
- void lcd_set_xy(unsigned char x, unsigned char y)
- {
- lcd_write_byte(0x40 | y, 0);// column
- lcd_write_byte(0x80 | x, 0);// row
- }
- /*************************ascii字符显示函数*************************/
- void lcd_write_char(unsigned char c)
- {
- unsigned char line;
- c -= 32;
- for (line=0; line<6; line++)
- {
- lcd_write_byte(font6x8[c][line], 1);
- }
- }
- /*******************************************************************/
- /*-------------------------------------------------
- lcd_write_english_string : 英文字符串显示函数
- 输入参数:*s :英文字符串指针;
- x、y : 显示字符串的位置,x 0-83 ,y 0-5
- --------------------------------------------------*/
- void lcd_write_english_string(unsigned char x,unsigned char y,char *s)
- {
- lcd_set_xy(x,y);
- while (*s)
- {
- lcd_write_char(*s);
- s++;
- }
- }
- /******************************************************************/
- /*---------------------------------------------
- lcd_write_byte : 写数据到lcd
- 输入参数:data :写入的数据;
- command :写数据/命令选择;
- ---------------------------------------------*/
- void lcd_write_byte(unsigned char dat, unsigned char command)
- {
- unsigned char i;
- digitalWrite( lcd_ce, LOW); // 使能lcd_ce = 0
- if (command == 0)
- {
- digitalWrite( lcd_dc, LOW);// 传送命令 lcd_dc = 0;
- }
- else
- {
- digitalWrite( lcd_dc, HIGH);// 传送数据lcd_dc = 1;
- }
- for(i=0;i<8;i++)
- {
- if(dat&0x80)
- {
- digitalWrite( sdin, HIGH);//sdin = 1;
- }
- else
- {
- digitalWrite( sdin, LOW);//sdin = 0;
- }
- digitalWrite( sclk, LOW);//sclk = 0;
- dat = dat << 1;
- digitalWrite( sclk, HIGH);//sclk = 1;
- }
- digitalWrite( lcd_ce, HIGH);//lcd_ce = 1;
-
- }
- /******************************************************************/
-
- int r_wheel = 0; //记录U型测速模块的次数
- int l_wheel = 0;
- float r_velocity=0;//速度;
- float l_velocity=0;
-
- float velocity(int n)
- {
- //(n/20)轮子装的圈数,轮子直径是65mm
- //速度的计算公式应该为 (n/20)×(65×π) 即n*1.02101761
- //后面的计算得常数
- float vel =Value*(n/20)*(65*3.14159);
- return vel;
- }
- void flash()
- {
- lcd_init();//初始化液晶
- lcd_clear();
- lcd_write_english_string(0,0,"L:");
- lcd_write_english_string(0,1,"R:");
- int r,l;
- r=r_wheel;l=l_wheel;
- int rv,lv;
- rv=velocity(r);
- lv=velocity(l);
- //Serial.print(r_velocity);
- // Serial.print("\0");
- // itoa (r_wheel,buffer1,10);
- //itoa (l_wheel,buffer2,10);
- //s1+=r;
- //s2+=l;
-
- lcd_write_english_string(60,0,"cm/s");
- lcd_set_xy(10, 0);
- lcd_write_char( 0x30+lv%1000/100);
- lcd_write_char( 0x30+lv%100/10);
- lcd_write_char( 0x30+lv%10);//显示位数
- lcd_write_english_string(60,1,"cm/s");
- lcd_set_xy(10, 1);
- lcd_write_char( 0x30+rv%1000/100);
- lcd_write_char( 0x30+rv%100/10);
- lcd_write_char( 0x30+rv%10); //显示位数
- r_wheel = 0;
- l_wheel = 0;
- // interrupts();
- }
-
-
- void setup ()
- {
- Serial.begin(9600);
-
- attachInterrupt(0,RCount, FALLING);
- attachInterrupt(1,LCount, FALLING);
-
- pinMode(IN1,OUTPUT);
- pinMode(IN2,OUTPUT);
- pinMode(IN3,OUTPUT);
- pinMode(IN4,OUTPUT);
- pinMode(leftPWM,OUTPUT);
- pinMode(rightPWM,OUTPUT);
-
- MsTimer2::set(1000, flash); // 中断设置函数,每 1s 进入一次中断
- MsTimer2::start();
-
- }
-
- void loop()
- {
- digitalWrite( leftPWM,50);//电机1全速前进
- digitalWrite(rightPWM,50);//电机2全速前进
- digitalWrite(IN1,HIGH);
- digitalWrite(IN2,LOW);//电机1正转
- digitalWrite(IN3,HIGH);
- digitalWrite(IN4,LOW);//电机2正转
-
- while (1)
- {
- // digitalWrite(13, state);
- }
-
- }
- void LCount()
- {
- l_wheel++;
- // state=!state;
-
- }
- void RCount()
- {
- r_wheel++;
- }
复制代码 |