数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 3337|回复: 3

[other] 步进电机(用定时器中断方法)LCD12864显示,按键可设置参数

[复制链接]
发表于 2019-10-8 16:26:09 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
程序如下:main.c

//步进电机
//用定时器中断(S曲线7段法)。LCD12864串口模式显示,用按键设置定时器(TIM5_Int_Init(999,999);)的两个传入参数来
//改变中断次数与分频系数达到单位时间内的脉冲值。
//脉冲可设置

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "motor.h"
#include "s_curve.h"
#include "key.h"
#include "12864.h"
//////////////////////////////////////////////
u8 key_num=0;
u8 Table0[3]={0x00};
u8 Table1[3]={0x00};
u8 Table2[3]={0x00};
u16 arr,psc,pulse;
////////////////////////////////////////////////

////////////////////////////////////////////////////////////////
int main(void)
{
        u8        key;             
        delay_init();                     //延时函数初始化          
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
        lcd_gpio_Init();
        Motor_Init();
        TIM5_Int_Init(999,999);//
        KEY_Init();
        lcd_init();//12864初始化
        delay_ms(20);
        lcd_clear();//清屏
        delay_ms(10);

        lcd_wstr(1,0,"重装值   ");
        lcd_wstr(2,0,"分频系数 ");
        lcd_wstr(3,0,"脉冲数     ");
        display();
        delay_ms(2000);
        s_curve_start_Motor(1,40);//1代表顺时针,400旋转脉冲
        delay_ms(3000);
        s_curve_start_Motor(0,40);//0代表逆时针,400旋转脉冲
        delay_ms(3000);
        while(1)
        {       
                key=KEY_Scan(0);
       
                if(key==KEY0_PRES)
                {
                        delay_ms(50);                                               
                        key_num++;
                        switch(key_num)
                        {
                                case 1:
                                send_cmd(0x0c);        //关光标关闪烁
                               
                                lcd_pos(1,3); //
                                write_char(':');
                                Table0[0]=(arr%1000/100+0x30);
                                Table0[1]=(arr%100/10+0x30);
                                Table0[2]=(arr%10+0x30);
                                write_char(Table0[0]);
                                write_char(Table0[1]);
                                write_char(Table0[2]);
                                send_cmd(0x80|0x04);
                                send_cmd(0x0f);        //开光标并闪烁
                               
                                    break;
                                case 2:
                                        send_cmd(0x0c);        //关光标关闪烁
                                        lcd_pos(2,4); //
                                        write_char(':');
                                        Table1[0]=(psc%1000/100+0x30);
                                        Table1[1]=(psc%100/10+0x30);
                                        Table1[2]=(psc%10+0x30);
                                        write_char(Table1[0]);
                                        write_char(Table1[1]);
                                        write_char(Table1[2]);
                                send_cmd(0x90|0x05);
                                send_cmd(0x0f);        //开光标并闪烁
                                        break;
                                case 3:
                                        send_cmd(0x0c);        //关光标关闪烁
                                        lcd_pos(3,3); //
                                        write_char(':');
                                        Table2[0]=(pulse%1000/100+0x30);
                                        Table2[1]=(pulse%100/10+0x30);
                                        Table2[2]=(pulse%10+0x30);
                                        write_char(Table2[0]);
                                        write_char(Table2[1]);
                                        write_char(Table2[2]);
                                send_cmd(0x88|0x04);
                                send_cmd(0x0f);        //开光标并闪烁
                                        break;
                                case 4:
                                        send_cmd(0x0c);        //关光标关闪烁
                                        key_num=0;
                                        TIM5_Int_Init(arr,psc);//
                                break;
                        }
                }
                if(key_num!=0)
                {
                        if(key==KEY1_PRES)
                        {                               
                                delay_ms(50);
                                switch(key_num)
                                {
                                        case 1:arr+=10;if(arr==1000)arr=0;
                                        send_cmd(0x0c);        //关光标关闪烁
                                                        lcd_pos(1,3); //
                                                        write_char(':');
                                                        Table0[0]=(arr%1000/100+0x30);
                                                        Table0[1]=(arr%100/10+0x30);
                                                        Table0[2]=(arr%10+0x30);
                                                        write_char(Table0[0]);
                                                        write_char(Table0[1]);
                                                        write_char(Table0[2]);
                                        send_cmd(0x80|0x04);
                                send_cmd(0x0f);        //开光标并闪烁
                               
                                        break;
                                        case 2:psc+=10;if(pulse==1000)pulse=0;
                                        send_cmd(0x0c);        //关光标关闪烁
                                                        lcd_pos(2,4); //
                                                        write_char(':');
                                                        Table1[0]=(psc%1000/100+0x30);
                                                        Table1[1]=(psc%100/10+0x30);
                                                        Table1[2]=(psc%10+0x30);
                                                        write_char(Table1[0]);
                                                        write_char(Table1[1]);
                                                        write_char(Table1[2]);
                                                        send_cmd(0x90|0x05);
                                send_cmd(0x0f);        //开光标并闪烁
                                        break;
                                        case 3:pulse+=10;if(pulse==1000)pulse=0;
                                        send_cmd(0x0c);        //关光标关闪烁
                                                        lcd_pos(3,3); //
                                                        write_char(':');
                                                        Table2[0]=(pulse%1000/100+0x30);
                                                        Table2[1]=(pulse%100/10+0x30);
                                                        Table2[2]=(pulse%10+0x30);
                                                        write_char(Table2[0]);
                                                        write_char(Table2[1]);
                                                        write_char(Table2[2]);
                                                        send_cmd(0x88|0x04);
                                send_cmd(0x0f);        //开光标并闪烁
                                        break;
                                }
                        }                                                       
                }               
                if(key_num==0)
                {
//                        if(key==KEY0_PRES)
//                        {
//                                s_curve_start_Motor(1,400);//顺时针旋转1圈
//                                delay_ms(500);
//                        }
                        if(key==KEY1_PRES)
                        {
                                s_curve_start_Motor(0,pulse);//顺时针旋转1圈
                                delay_ms(500);
                        }
                }
        }
}






发表于 2019-10-12 00:02:46 | 显示全部楼层
论坛发帖和回贴不是有添加代码文字功能吗?为什么要搞成那样?
  1. //步进电机
  2. //用定时器中断(S曲线7段法)。LCD12864串口模式显示,用按键设置定时器(TIM5_Int_Init(999,999);)的两个传入参数来
  3. //改变中断次数与分频系数达到单位时间内的脉冲值。
  4. //脉冲可设置

  5. #include "sys.h"
  6. #include "delay.h"
  7. #include "usart.h"
  8. #include "motor.h"
  9. #include "s_curve.h"
  10. #include "key.h"
  11. #include "12864.h"
  12. //////////////////////////////////////////////
  13. u8 key_num=0;
  14. u8 Table0[3]={0x00};
  15. u8 Table1[3]={0x00};
  16. u8 Table2[3]={0x00};
  17. u16 arr,psc,pulse;
  18. ////////////////////////////////////////////////

  19. ////////////////////////////////////////////////////////////////
  20. int main(void)
  21. {
  22.         u8        key;            
  23.         delay_init();                     //延时函数初始化         
  24.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  25.         lcd_gpio_Init();
  26.         Motor_Init();
  27.         TIM5_Int_Init(999,999);//
  28.         KEY_Init();
  29.         lcd_init();//12864初始化
  30.         delay_ms(20);
  31.         lcd_clear();//清屏
  32.         delay_ms(10);

  33.         lcd_wstr(1,0,"重装值   ");
  34.         lcd_wstr(2,0,"分频系数 ");
  35.         lcd_wstr(3,0,"脉冲数     ");
  36.         display();
  37.         delay_ms(2000);
  38.         s_curve_start_Motor(1,40);//1代表顺时针,400旋转脉冲
  39.         delay_ms(3000);
  40.         s_curve_start_Motor(0,40);//0代表逆时针,400旋转脉冲
  41.         delay_ms(3000);
  42.         while(1)
  43.         {        
  44.                 key=KEY_Scan(0);
  45.         
  46.                 if(key==KEY0_PRES)
  47.                 {
  48.                         delay_ms(50);                                                
  49.                         key_num++;
  50.                         switch(key_num)
  51.                         {
  52.                                 case 1:
  53.                                 send_cmd(0x0c);        //关光标关闪烁
  54.                                 
  55.                                 lcd_pos(1,3); //
  56.                                 write_char(':');
  57.                                 Table0[0]=(arr%1000/100+0x30);
  58.                                 Table0[1]=(arr%100/10+0x30);
  59.                                 Table0[2]=(arr%10+0x30);
  60.                                 write_char(Table0[0]);
  61.                                 write_char(Table0[1]);
  62.                                 write_char(Table0[2]);
  63.                                 send_cmd(0x80|0x04);
  64.                                 send_cmd(0x0f);        //开光标并闪烁
  65.                                 
  66.                                     break;
  67.                                 case 2:
  68.                                         send_cmd(0x0c);        //关光标关闪烁
  69.                                         lcd_pos(2,4); //
  70.                                         write_char(':');
  71.                                         Table1[0]=(psc%1000/100+0x30);
  72.                                         Table1[1]=(psc%100/10+0x30);
  73.                                         Table1[2]=(psc%10+0x30);
  74.                                         write_char(Table1[0]);
  75.                                         write_char(Table1[1]);
  76.                                         write_char(Table1[2]);
  77.                                 send_cmd(0x90|0x05);
  78.                                 send_cmd(0x0f);        //开光标并闪烁
  79.                                         break;
  80.                                 case 3:
  81.                                         send_cmd(0x0c);        //关光标关闪烁
  82.                                         lcd_pos(3,3); //
  83.                                         write_char(':');
  84.                                         Table2[0]=(pulse%1000/100+0x30);
  85.                                         Table2[1]=(pulse%100/10+0x30);
  86.                                         Table2[2]=(pulse%10+0x30);
  87.                                         write_char(Table2[0]);
  88.                                         write_char(Table2[1]);
  89.                                         write_char(Table2[2]);
  90.                                 send_cmd(0x88|0x04);
  91.                                 send_cmd(0x0f);        //开光标并闪烁
  92.                                         break;
  93.                                 case 4:
  94.                                         send_cmd(0x0c);        //关光标关闪烁
  95.                                         key_num=0;
  96.                                         TIM5_Int_Init(arr,psc);//
  97.                                 break;
  98.                         }
  99.                 }
  100.                 if(key_num!=0)
  101.                 {
  102.                         if(key==KEY1_PRES)
  103.                         {                                
  104.                                 delay_ms(50);
  105.                                 switch(key_num)
  106.                                 {
  107.                                         case 1:arr+=10;if(arr==1000)arr=0;
  108.                                         send_cmd(0x0c);        //关光标关闪烁
  109.                                                         lcd_pos(1,3); //
  110.                                                         write_char(':');
  111.                                                         Table0[0]=(arr%1000/100+0x30);
  112.                                                         Table0[1]=(arr%100/10+0x30);
  113.                                                         Table0[2]=(arr%10+0x30);
  114.                                                         write_char(Table0[0]);
  115.                                                         write_char(Table0[1]);
  116.                                                         write_char(Table0[2]);
  117.                                         send_cmd(0x80|0x04);
  118.                                 send_cmd(0x0f);        //开光标并闪烁
  119.                                 
  120.                                         break;
  121.                                         case 2:psc+=10;if(pulse==1000)pulse=0;
  122.                                         send_cmd(0x0c);        //关光标关闪烁
  123.                                                         lcd_pos(2,4); //
  124.                                                         write_char(':');
  125.                                                         Table1[0]=(psc%1000/100+0x30);
  126.                                                         Table1[1]=(psc%100/10+0x30);
  127.                                                         Table1[2]=(psc%10+0x30);
  128.                                                         write_char(Table1[0]);
  129.                                                         write_char(Table1[1]);
  130.                                                         write_char(Table1[2]);
  131.                                                         send_cmd(0x90|0x05);
  132.                                 send_cmd(0x0f);        //开光标并闪烁
  133.                                         break;
  134.                                         case 3:pulse+=10;if(pulse==1000)pulse=0;
  135.                                         send_cmd(0x0c);        //关光标关闪烁
  136.                                                         lcd_pos(3,3); //
  137.                                                         write_char(':');
  138.                                                         Table2[0]=(pulse%1000/100+0x30);
  139.                                                         Table2[1]=(pulse%100/10+0x30);
  140.                                                         Table2[2]=(pulse%10+0x30);
  141.                                                         write_char(Table2[0]);
  142.                                                         write_char(Table2[1]);
  143.                                                         write_char(Table2[2]);
  144.                                                         send_cmd(0x88|0x04);
  145.                                 send_cmd(0x0f);        //开光标并闪烁
  146.                                         break;
  147.                                 }
  148.                         }                                                        
  149.                 }               
  150.                 if(key_num==0)
  151.                 {
  152. //                        if(key==KEY0_PRES)
  153. //                        {
  154. //                                s_curve_start_Motor(1,400);//顺时针旋转1圈
  155. //                                delay_ms(500);
  156. //                        }
  157.                         if(key==KEY1_PRES)
  158.                         {
  159.                                 s_curve_start_Motor(0,pulse);//顺时针旋转1圈
  160.                                 delay_ms(500);
  161.                         }
  162.                 }
  163.         }
  164. }
复制代码


回复 支持 1 反对 0

使用道具 举报

发表于 2022-4-25 09:24:53 来自手机浏览器 | 显示全部楼层
595953427@qq 发表于 2019-10-12 00:02
论坛发帖和回贴不是有添加代码文字功能吗?为什么要搞成那样?

有程序下载吗?
回复 支持 反对

使用道具 举报

发表于 2022-4-29 14:09:23 | 显示全部楼层
不错,看得明,如果有图说明过程,又是一篇优秀精品文
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-8-3 08:14 , Processed in 0.296401 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表