完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
下面是原来的代码 想让电机先以一定速度正转两圈再过几秒钟再以另外一个速度逆转三圈 各个大神帮忙写下代码 小弟感激不尽!
#include #include "lcd1602.h" #include "eeprom.h" unsigned char T0_NUM; unsigned char END_FLAG = 0; ***it SW1=P3^0; //四个独立按键定义 ***it SW2=P3^1; ***it SW3=P3^2; ***it SW4=P3^3; ***it MotorEn = P2^1; // 使能 ***it FX = P2^0; // 方向 ***it CLK = P2^2; // 脉冲 unsigned char g_MotorSt = 0; // 启停 unsigned char g_MotorDir = 0; // 正反 unsigned int CLK_OUT_NUM = 0; // 脉冲计数 signed int MotorSpedNum = 0; // 速度档 unsigned int CUR_MotorSpedQuan = 0; // 当前圈数 unsigned int SET_MotorSpedQuan = 0; // 设定圈数 unsigned char cMode = 0; unsigned char s1_num; unsigned int iSetData; signed char RL = 0; // 方向 signed char iSet[3]; unsigned int SYS_NUM = 0; unsigned char MotorTab[10] = {63, 42, 27, 18, 12, 8, 5, 3, 2}; unsigned int MotorSpedTab[6] = {400, 800, 1600, 3200, 6400, 12800}; signed char g_MotorNum = 0; //-------------- void delayms(xms); void mDelay(unsigned int Delaytime); //延时函数 void EEPROM_Init(); void T0_Init(); void LCD_Init(); void KeyScan(void); void KeyProcess(); void SecondPro(); //void Display(void); // 主程序 main() void main(void) { EEPROM_Init(); // 读取数据 T0_Init(); // 定时器0 初始化 LCD_Init(); // 显示初始化 MotorEn = 0; // L297 使能(只有智能,才能正常工作,否则停止) while(1) { if (!g_MotorSt) // 只有在空闲状态按键操作才有效;否则不能打断电机工作 { KeyScan(); // 按键 KeyProcess(); if (SYS_NUM >= 100) // 10ms { SYS_NUM = 0; write_com(0x80+0x40+8); write_sfm(2,7,CUR_MotorSpedQuan); } } if (SYS_NUM >= 100) // 10ms { SYS_NUM = 0; write_com(0x80+0x40+8); write_sfm(2,7,CUR_MotorSpedQuan); } } } /************存储初始化*****************/ void EEPROM_Init() { iSet[0]=byte_read(0x2000);//程序开始时读取EEPROM中数据 iSet[1]=byte_read(0x2200); iSet[2]=byte_read(0x2400); if((iSet[0] > 9) || (iSet[0] < 0)) //防止首次上电时读取出错 iSet[0] = 0; if((iSet[1] > 9) || (iSet[1] < 0)) iSet[1] = 0; if((iSet[2] > 9) || (iSet[2] < 0)) iSet[2] = 0; iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2]; MotorSpedNum=byte_read(0x2600); if((MotorSpedNum > 9) || (MotorSpedNum < 0)) MotorSpedNum = 0; RL = byte_read(0x2800); if((RL > 2) || (RL < 0)) RL = 0; } /********定时器初始化***********************************************************/ void T0_Init() { TMOD = 0x01; TH0 = (65535-100)/256; // 1ms TL0 = (65535-100)%256; EA = 1; ET0 = 1; // TR0 = 1; } // 液晶显示初始化 void LCD_Init() { init_1602(); //lcd1602初始化 write_string(1, 2, "set:"); write_sfm(1,7,iSetData); write_string(2, 2, "cur:"); write_sfm(2,7,0); // mDelay(1); write_string(1, 13, "S:"); write_one_data(1, 15, MotorSpedNum); if(RL == 0) { FX = 0; write_string(2, 13, "R"); } else { FX = 1; write_string(2, 13, "L"); } } /********定时器中断*****************/ void T0_time() interrupt 1 { // TR0 = 0; TH0 = (65535-100)/256; TL0 = (65535-100)%256; T0_NUM++; SYS_NUM++; if(T0_NUM >= MotorTab[MotorSpedNum]) // 增加按键g_MotorNum++ 减小按键g_MotorNum-- { T0_NUM = 0; CLK=CLK^0x01; // 输出脉冲 CLK_OUT_NUM++; if(CLK_OUT_NUM >= MotorSpedTab[1]) // 一圈 { CLK_OUT_NUM = 0; CUR_MotorSpedQuan++; if(CUR_MotorSpedQuan >= iSetData) // 达到设定圈数 { TR0 = 0; cMode = 0; g_MotorSt = 0; MotorEn = 1; write_com(0x80+0x40+8); write_sfm(2,7,CUR_MotorSpedQuan); END_FLAG = 1; // SecondPro(); } } } // TR0 = 1; } /********按键扫描函数***********************************************************/ void KeyScan() { if(SW1 == 0) { delayms(10); if(SW1 == 0) // 功能键 { while(!SW1); // 等待松开 cMode = 1; // 功能模式 } } if(SW2 == 0) { delayms(10); if(SW2 == 0) // 增加 { while(!SW2); // 等待松开 cMode = 2; } } if(SW3 == 0) { delayms(10); if(SW3 == 0) // 减小 { while(!SW3); // 等待松开 cMode = 3; } } if(SW4 == 0) { delayms(10); if(SW4 == 0) // 启停 { while(!SW4); // 等待松开 cMode = 4; g_MotorSt = 1; MotorEn = 1; CUR_MotorSpedQuan = 0; TR0 = 1; } } } /********按键处理函数***********************************************************/ void KeyProcess() { switch(cMode) { case 0: // 无模式 break; case 1: // 功能模式 { s1_num++; cMode = 0; // 功能模式 if(s1_num ==1) // 第1次被按下 { write_com(0x80+7); // 角度 百位 write_com(0x0f); // 光标闪烁 } if(s1_num ==2) { write_com(0x80+8); } if(s1_num == 3) { write_com(0x80+9); } if(s1_num == 4) { write_com(0x80+15); } if(s1_num == 5) { write_com(0x80+0x40+13); } if(s1_num == 6) { s1_num = 0; // 记录按键清零 cMode = 0; // 退出模式 write_com(0x0c); // 取消光标闪烁 // 保存数据 SectorErase(0x2000);//擦除扇区 byte_write(0x2000,iSet[0]);//重新写入数 SectorErase(0x2200);//擦除扇区 byte_write(0x2200,iSet[1]);//重新写入数 SectorErase(0x2400);//擦除扇区 byte_write(0x2400,iSet[2]);//重新写入数 SectorErase(0x2600);//擦除扇区 byte_write(0x2600,MotorSpedNum);//重新写入数 SectorErase(0x2800);//擦除扇区 byte_write(0x2800,RL);//重新写入数 } } break; case 2: // 增加 { // s2_num++; cMode = 0; if(s1_num == 1) // 百 { iSet[0]++; if(iSet[0] >= 10) iSet[0] = 0; iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2]; write_sfm(1, 7, iSetData); write_com(0x80+7); } if(s1_num == 2) { iSet[1]++; if(iSet[1] >= 10) iSet[1] = 0; iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2]; write_sfm(1, 7, iSetData); write_com(0x80+8); } if(s1_num == 3) { iSet[2]++; if(iSet[2] >= 10) iSet[2] = 0; iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2]; write_sfm(1, 7, iSetData); write_com(0x80+9); } if(s1_num == 4) // 速度档 { MotorSpedNum++; if(MotorSpedNum >= 10) { MotorSpedNum = 9; } write_one_data(1, 15, MotorSpedNum); write_com(0x80+15); } if(s1_num == 5) // 方向 { RL++; if(RL > 1) RL = 0; if(RL == 0) { FX = 0; write_string(2, 13, "R"); } else { FX = 1; write_string(2, 13, "L"); } write_com(0x80+0x40+13); } } break; case 3: // 减小 { // s3_num++; cMode = 0; if(s1_num == 1) { iSet[0]--; if(iSet[0] < 0) iSet[0] = 9; iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2]; write_sfm(1, 7, iSetData); write_com(0x80+7); } if(s1_num == 2) { iSet[1]--; if(iSet[1] < 0) iSet[1] = 9; iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2]; write_sfm(1, 7, iSetData); write_com(0x80+8); } if(s1_num == 3) { iSet[2]--; if(iSet[2] < 0) iSet[2] = 9; iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2]; write_sfm(1, 7, iSetData); write_com(0x80+9); } if(s1_num == 4) // 速度档 { MotorSpedNum--; if(MotorSpedNum < 0) { MotorSpedNum = 0; } write_one_data(1, 15, MotorSpedNum); write_com(0x80+15); } if(s1_num == 5) // 方向 { RL--; if(RL < 0) RL = 1; if(RL == 0) { FX = 0; write_string(2, 13, "R"); } else { FX = 1; write_string(2, 13, "L"); } write_com(0x80+0x40+13); } } break; case 4: // { // 运行程序 g_MotorSt = 1; cMode = 0; /* if (SYS_NUM >= 100) // 10ms { SYS_NUM = 0; write_com(0x80+0x40+8); // write_string(1, 2, "set:"); write_sfm(2,7,CUR_MotorSpedQuan); }*/ } break; default: break; } } void SecondPro() { if (END_FLAG) // 到达目的 { END_FLAG = 0; if(RL == 0) { RL = 1; FX = 1; write_string(2, 13, "L"); } else { FX = 0; write_string(2, 13, "R"); } g_MotorSt = 1; MotorEn = 1; CUR_MotorSpedQuan = 0; TR0 = 1; } } /********延时函数***********************************************************/ void delayms(xms) { unsigned int x,y; for(x=xms;x>0;x--) for(y=110;y>0;y--) ; } |
|
相关推荐
1个回答
|
|
你这代码不是写好了吗?哪里有问题呢?还是哪里不明白。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
《DNESP32S3使用指南-IDF版_V1.6》第三十五章 摄像头实验
492 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第三十章 DHT11数字温湿度传感器
638 浏览 0 评论
742 浏览 0 评论
【敏矽微ME32G070开发板免费体验】之原厂2812测试例程解析
1263 浏览 0 评论
1133 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12055 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-28 10:54 , Processed in 0.625462 second(s), Total 73, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号