欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
基于l297的51單片機步進電機轉速控制問題
[打印本頁]
作者:
megadna
時間:
2018-6-5 20:40
標題:
基于l297的51單片機步進電機轉速控制問題
我們用T0來發出不同占空比的脈沖來控制電機轉速,然后用T1去計T0發出脈沖的數量來達到我們所需要的步數,達到步數后電機停止并且蜂鳴器響。我們現在的問題是用鍵盤在液晶屏上控制轉速和步數后,發送給我們的兩個定時器作為初值去運轉電機,但是設置的轉速一旦大于30(r/min),電機就會一直轉下去不會停止,蜂鳴器也不會叫,而且不論轉速怎么提升,電機的轉動速度都差不多不會變,只有在轉速設定小于30的時候才能正常實現我們的功能,用設定轉速行走我們所規定的步數后電機停止并且蜂鳴器報警。求51hei論壇大佬進行指點!!
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
QQ圖片20180605203237.png
(49.77 KB, 下載次數: 31)
下載附件
2018-6-5 20:33 上傳
單片機源程序如下:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
sbit S1=P2^3; //定義鍵-----進入設置界面
sbit S2=P2^4; //定義鍵-----調整光標位置
sbit S3=P2^5; //定義鍵-----調整光標位置數值
sbit S4=P2^6; //定義鍵-----保存設置值
sbit S5=P2^7; //定義鍵-----發送鍵
uchar code table1[]="z:0 v:000 b:000";
uchar code table0[]=" 000";
uchar S1num,S2num,S3num;
uint z,v1,v2,v3,b1,b2,b3,sv;
uchar i;
void delay(uint z) //延時函數
{
int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void LCD_write_data(uint dat) //寫數據
{
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P1=dat;
delay(5);
LCD_EN = 1;
delay(5);
LCD_EN = 0;
}
void LCD_write_com(uint com) //寫指令
{
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
P1=com;
delay(5);
LCD_EN = 1;
delay(5);
LCD_EN = 0;
}
void init()//1602初始化
{
z=0;
v1=0;
v2=0;
v3=0;
b1=0;
b2=0;
b3=0;
sv=0;
LCD_write_com(0x38);
LCD_write_com(0x01);
LCD_write_com(0x06);
LCD_write_com(0x0c);
}
void write_v1(uchar add,uint dat)//寫轉速v函數
{
uchar bai;
bai=dat;
LCD_write_com(0xc0+add);
LCD_write_data(0x30+bai);
}
void write_v2(uchar add,uint dat)//寫轉速v函數
{
uchar shi;
shi=dat;
LCD_write_com(0xc0+add);
LCD_write_data(0x30+shi);
}
void write_v3(uchar add,uint dat)//寫轉速v函數
{
uchar ge;
ge=dat;
LCD_write_com(0xc0+add);
LCD_write_data(0x30+ge);
}
void write_b1(uchar add,uint dat)//寫步數b函數
{
uint bai;
bai=dat;
LCD_write_com(0xc0+add);
LCD_write_data(0x30+bai);
}
void write_b2(uchar add,uint dat)//寫步數b函數
{
uint shi;
shi=dat;
LCD_write_com(0xc0+add);
LCD_write_data(0x30+shi);
}
void write_b3(uchar add,uint dat)//寫步數b函數
{
uint ge;
ge=dat;
LCD_write_com(0xc0+add);
LCD_write_data(0x30+ge);
}
void write_z(uchar add,uint dat)//寫轉向z函數
{
uint ge;
ge=dat;
LCD_write_com(0xc0+add);
LCD_write_data(0x30+ge);
}
void write_sv(uchar add,uint dat)//寫實際轉速sv函數
{
uint bai,shi,ge;
bai=dat/100;
shi=dat%100/10;
ge=dat%10;
LCD_write_com(0x80+add);
LCD_write_data(0x30+bai);
LCD_write_data(0x30+shi);
LCD_write_data(0x30+ge);
}
void display()//1602初始化顯示函數
{
init();
LCD_write_com(0x80|0x10);
for(i=0;i<11;i++)
{
LCD_write_data(table0[i]);
delay(5);
}
LCD_write_com(0xc0);
for(i=0;i<15;i++)
{
LCD_write_data(table1[i]);
delay(5);
}
write_z(2,z);
write_v1(6,v1);
write_v2(7,v2);
write_v3(8,v3);
write_b1(12,b1);
write_b2(13,b2);
write_b3(14,b3);
write_sv(6,sv);
S1num=0;
S2num=0;
S3num=0;
}
void keyscan()//鍵盤掃描函數
{
if(S1==0)//按鍵S1按下時
{
S1num=1;
delay(20);
if(S1==0)
{
LCD_write_com(0xc0+2);//光標到轉向位置處
LCD_write_com(0x0f);//光標閃爍
}
}
if(S1num!=0)//只有按鍵S1按下后,S2,S3,S4按鍵操作才有效
{
if(S2==0)//按鍵S2按下時
{
delay(20);
if(S2==0)
{
S2num++;
while(!S2);//松手檢測
if(S2num==0)
{
LCD_write_com(0xc0+2);//光標到指定位置
}
if(S2num==1)
{
LCD_write_com(0xc0+6);//光標到指定位置
}
if(S2num==2)
{
LCD_write_com(0xc0+7);
}
if(S2num==3)
{
LCD_write_com(0xc0+8);
}
if(S2num==4)
{
LCD_write_com(0xc0+12);
}
if(S2num==5)
{
LCD_write_com(0xc0+13);
}
if(S2num==6)
{
LCD_write_com(0xc0+14);
}
if(S2num==7)
{
LCD_write_com(0xc0+2);
S2num=0;
}
}
}
if(S3==0)//按鍵S3按下時
{
delay(20);
if(S3==0)
{
while(!S3);
if(S2num==0)
{
z++;
if(z==2)
{
z=0;
}
write_z(2,z);
LCD_write_com(0xc0+2);
}
if(S2num==1)
{
v1++;
if(v1==10)
{
v1=0;
}
write_v1(6,v1);
LCD_write_com(0xc0+6);
}
if(S2num==2)
{
v2++;
if(v2==10)
{
v2=0;
}
write_v2(7,v2);
LCD_write_com(0xc0+7);
}
if(S2num==3)
{
v3++;
if(v3==10)
{
v3=0;
}
write_v3(8,v3);
LCD_write_com(0xc0+8);
}
if(S2num==4)
{
b1++;
if(b1==10)
{
b1=0;
}
write_b1(12,b1);
LCD_write_com(0xc0+12);
}
if(S2num==5)
{
b2++;
if(b2==10)
{
b2=0;;
}
write_b2(13,b2);
LCD_write_com(0xc0+13);
}
if(S2num==6)
{
b3++;
if(b3==10)
{
b3=0;
}
write_b3(14,b3);
LCD_write_com(0xc0+14);
}
}
}
if(S4==0)//按鍵S4按下時
{
delay(5);
if(S4==0)
{
S1num=0;
S2num=0;
S3num=0;
LCD_write_com(0x0c);
}
}
}
}
void main()
{
display();//1602顯示
while(1)
{
keyscan();//不斷檢測鍵是否按下
}
}
復制代碼
所有資料51hei提供下載:
最新.zip
(265.78 KB, 下載次數: 29)
2018-6-5 20:39 上傳
點擊文件名下載附件
proteus仿真圖和keil代碼
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1