1024手机基地看电影,午夜福利视频导航,国产精品福利在线一区,亚洲欧美日韩另类成人,在线观看午夜日本理论片,成年超爽免费网站,国产精品成人免费,精品动作一级毛片,成人免费观看网站,97精品伊人久久大香蕉
標(biāo)題:
求直流伺服電機(jī)怎么控制輸出脈沖個數(shù)轉(zhuǎn)動一度角度,哪位大佬能改下我這程序
[打印本頁]
作者:
51游來魚去
時間:
2019-5-30 21:30
標(biāo)題:
求直流伺服電機(jī)怎么控制輸出脈沖個數(shù)轉(zhuǎn)動一度角度,哪位大佬能改下我這程序
哪位大佬能看看我這程序,為啥我按鍵輸入一度角度值,電機(jī)不能轉(zhuǎn)轉(zhuǎn)動對應(yīng)角度,是脈沖函數(shù)部分錯了嗎,會的大佬能不能改一下,有感謝
US7S]@$EDC4{9LQTPR}93LQ.png
(132.93 KB, 下載次數(shù): 47)
下載附件
protues仿真圖
2019-5-30 21:23 上傳
單片機(jī)源程序如下:
#include <reg52.h>
#include<string.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcdrs=P2^0; //寄存器選擇,0:數(shù)據(jù)寄存器。1:為狀態(tài)/命令寄存器
sbit lcden=P2^1; //--LCD控制引腳
sbit angle=P3^3; //測轉(zhuǎn)角端口
sbit ENA=P2^2; //電機(jī)使能控制端
sbit Zheng=P2^5; //正反轉(zhuǎn)電平設(shè)置端口
sbit Fan=P2^6;
uchar Timer0_flag=0;
uchar Timer0_BiaoZhi=0;//初始化占空比為1:3(高:低)
uchar da;
uchar gewei;
uchar shiwei;
uchar baiwei;
uchar n;
uchar angel;
int aa[3];
/******標(biāo)志位設(shè)置*****/
uchar KEY1=0;//優(yōu)先級標(biāo)志
uchar KEY2=0;//加速標(biāo)志
uchar INT1_FLAG=0;
uchar COUNTER_high=0;
uchar COUNTER_low=0;
uchar SUM=0;
uint TIMER1_COUNTER=0;
uint INT1_tingzhi=0; //在要測速時置0
/****面板顯示****/
uchar code lcd_desktop11[]="stop";//停止
uchar code lcd_desktop12[]="ford";//正轉(zhuǎn)
uchar code lcd_desktop13[]=" fanzhuang";//反轉(zhuǎn)
uchar code lcd_desktop21[]=" speedup";//加速
uchar code lcd_desktop22[]=" speeddn";//減速
uchar code num[]={'0','1','2','3','4','5','6','7','8','9'};//要顯示的轉(zhuǎn)速數(shù)字。
//-----lcd液晶屏頭文件-----//
/**延時函數(shù)**/
void delayms(uchar xms)
{
uchar i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
/****LCD寫命令******/
void write_command(uchar com)//com寫入命令
{
lcdrs=0;
P0=com;
delayms(2);
lcden=1;
delayms(2);
lcden=0;
}
/**************LCD寫數(shù)據(jù)*********/
void write_data(uchar date)//數(shù)據(jù)為DATA
{
lcdrs=1;
P0=date;
delayms(2);
lcden=1;
delayms(2);
lcden=0;
}
/********LCD初始化****************/
void lcd_init()//顯示模式設(shè)置
{
lcden=0;
write_command(0x38);
write_command(0x0c);
write_command(0x06);
write_command(0x01);
}
/**電機(jī)初始化函數(shù)**/
void motor_init(void)
{
ENA=0; // 停止
}
void ZhongDuanKaiQi(void)
{
EA=1;
ET0=1; //計(jì)時器0允許中斷。產(chǎn)生脈沖。
ET1=1; //計(jì)時器1允許中斷。對低電平進(jìn)行計(jì)時。
//EX1=1; //INT0允許中斷。測速。由外部來啟動。
IT1=1; //低電平觸發(fā)。
PX1=0; //低級中斷。
PT0=1;
PT1=0;
TMOD=0x12;//定時器工作方式控制
}
/***定時器T1初始化!!!等待外部脈沖的到來***/
void Timer1_init(void)
{
TH1=0;
TL1=0; //等待外部脈的到來。INT1
}
/*****定時T0初始化*****/
void Timer0_init(void)
{
TH0=0;
TL0=0;
TR0=1;
}
/********測速模塊,顯示速度*******/
/*void speed_test(void)
{
// TIMER1_COUNTER;
COUNTER_high=TH1;
COUNTER_low=TL1;
SUM=COUNTER_high*256+COUNTER_low+TIMER1_COUNTER*65536;//得到的是多少us。
SUM=SUM/1000; //化為毫秒。
SUM=1000/SUM; //圈每秒。
SUM=SUM*60; //圈每分鐘;三位數(shù)。
gewei=SUM%10;
shiwei=SUM/10%10;
baiwei=SUM/100;
write_command(0xc0);
write_data(baiwei);
write_command(0xc1);
write_data(shiwei);
write_command(0xc2);
write_data(gewei);
SUM=0;
TIMER1_COUNTER=0;
}
/********外中斷1函數(shù)**********/
void INT1_QIDONG() interrupt 2
{
INT1_tingzhi++;
if(INT1_tingzhi==5)
{
INT1_tingzhi=5;EX1=0;//關(guān)閉中斷。
}
if(INT1_tingzhi<=4)
{
INT1_FLAG++;
if(INT1_FLAG==2)
{
INT1_FLAG=0;TR1=0;speed_test();
}
else
{
Timer1_init();
TR1=1;
}
}
}
/******定時器T1計(jì)數(shù)*******/
void Timer1_QIDONG() interrupt 3
{
TIMER1_COUNTER++;
}
/**相位測量并輸出!!!!!出現(xiàn)問題???**/
/*void xiangwei_test(void)
{
uchar i=0,j=0;
//while((P2^3==0)&&(P2^4==0));
//if((P2^3==0)&&(P2^4==0))
{
//delayms(5);
if(P2^3==1)
{
write_command(0x01);
write_command(0x80);for(i=0;i<=3;i++) write_data(lcd_desktop13[i]);//反轉(zhuǎn)。
j++;//反轉(zhuǎn)
}
if(P2^4==1)
{
write_command(0x01);
write_command(0x80);for(i=0;i<=3;i++) write_data(lcd_desktop12[i]);//正轉(zhuǎn)。
j++;
}
}
}
/****T0中斷發(fā)出信號并進(jìn)行通道選擇****/
void Timer0() interrupt 1
{
Timer0_flag--;
if((Timer0_BiaoZhi)>=(Timer0_flag))
{
if(KEY2==0)
{
Zheng=1;Fan=0;
}
else
{
Zheng=0;Fan=1;
}
}
else
{
Zheng=0;Fan=0;
}
if(Timer0_flag==0) Timer0_flag=5;
}
void Guan(void)
{
ET0=0;
EX1=0;
ET1=0;
}
/*********/
void pulsegenerate(){
int g,N;
N=angel*40;
for(g=0;g<N;g++)
{
ENA=0;
delayms(10);
ENA=1;
delayms(10);
ENA=0;
delayms(10);
}
}
void keyscan() //按鍵掃描函數(shù)
{
uint i=0;
KEY1=5;
Fan=0;
Zheng=0;
//ENA=1;
KEY2=0;//初始化為正轉(zhuǎn)。
Timer0_BiaoZhi=0;
Timer0_flag=4;
ZhongDuanKaiQi();//開啟中斷
Timer0_init();// 初始化并開始發(fā)出脈場外中斷已經(jīng)開啟。
EX1=1; //外中斷開啟;測速,顯示速度。五次后結(jié)束關(guān)閉外中斷1。出現(xiàn)問題!!!
write_command(0x80);
for(i=0;i<strlen(lcd_desktop11);i++)//顯示正轉(zhuǎn)。
write_data(lcd_desktop12[i]);
}
/******鍵盤0-9輸入模塊*******/
uchar keyin(){ //鍵盤
uchar temp;
uchar com,com1,com2;
P1=0xf0;
if(P1!=0xf0){
com1=P1;
P1=0x0f;
com2=P1;
}
P1=0xf0;
while(P1!=0xf0);
temp=com1|com2;
if(temp==0xee)com=0x01;
if(temp==0xed)com=0x02;
if(temp==0xeb)com=0x03;
if(temp==0xde)com=0x04;
if(temp==0xdd)com=0x05;
if(temp==0xdb)com=0x06;
if(temp==0xbe)com=0x07;
if(temp==0xbd)com=0x08;
if(temp==0xbb)com=0x09;
if(temp==0x7e)com=0x0a;
if(temp==0x7d)com=0x00;
if(temp==0x7b)com=0x0b;
return com;
}
void xianshi(){
uchar a;
uchar d=1;
uchar da;
P1=0xf0;
for(a=0;a<d;a++){
int i1=0;
while(P1==0xf0);
da=keyin(); //調(diào)用keyin函數(shù)
if(da>=0x00&&da<=0x09){
aa[i1]=da;
i1++;
if(i1==3){
angel=aa[0]*100+aa[1]*10+aa[2];
i1=0;
}
}
Timer0_flag = angel;
//if(da>=0x00&&da<=0x09){aa[i1]=da;i1++;if(i1==3){angel1=aa[0]*100+aa[1]*10+aa[2];i1=0;}}
if(4==d) {
while(1){
da=keyin(); //調(diào)用keyin函
if(da==0x0a){
lcd_init();
//xianshi();
}else if(da==0x0b){
keyscan();
}
}
}
if(da==0x01){
write_data('1');
d++;
}else if(da==0x02){
write_data('2');
d++;
}else if(da==0x03){
write_data('3');
d++;
}else if(da==0x04){
write_data('4');
d++;
}else if(da==0x05){
write_data('5');
d++;
}else if(da==0x06){
write_data('6');
d++;
}else if(da==0x07){
write_data('7');
d++;
}else if(da==0x08){
write_data('8');
d++;
}else if(da==0x09){
write_data('9');
d++;
}else if(da==0x00){
write_data('0');
d++;
}/*else if(da==0x0a){
lcd_init();
//xianshi();
}else if(da==0x0b){
pulsegenerate();
break;
}*/
}
}
/***************/
/*****************/
/* if((key2==0)&&(KEY1=5)) //按鍵K2按下,(正轉(zhuǎn))只改變轉(zhuǎn)向(標(biāo)志位改變輸出端口)
{
delayms(10);
if(key2==0)
{
while(!key1);
KEY1=5;
Fan=0;
Zheng=0;
ENA=1;
KEY2=0;//初始化為正轉(zhuǎn)。
Timer0_BiaoZhi=0;
Timer0_flag=4;
ZhongDuanKaiQi();//開啟中斷
Timer0_init();// 初始化并開始發(fā)出脈場外中斷已經(jīng)開啟。
EX1=1; //外中斷開啟;測速,顯示速度。五次后結(jié)束關(guān)閉外中斷1。出現(xiàn)問題!!!
write_command(0x80);
for(i=0;i<strlen(lcd_desktop11);i++)//顯示正轉(zhuǎn)。
write_data(lcd_desktop12[i]);
}
}
if((key3==0)&&(KEY1=5)) //按鍵K3按下,(反轉(zhuǎn))只改變轉(zhuǎn)向
{
delayms(10);
if(key3==0)
{
while(!key3);
KEY2=~0; //反轉(zhuǎn)標(biāo)志。
//KEY2=(~0);
xiangwei_test();
KEY1=5;
lcd_init();
for(n=0;n<10;n++){
write_data(lcd_desktop13[n]);}
}
}
if((key4==0)&&(KEY1==5)) //按鍵K4按下,(加速)改變裝入的數(shù)值?循環(huán)次數(shù)?執(zhí)行if里面的語句,通過size++來改變幅值的頻率
{
delayms(10);
if(key4==0)
{
while(!key4);
if(Timer0_BiaoZhi<4)
{
Timer0_BiaoZhi++;
}
else
{
Timer0_BiaoZhi=4;
}
EX1=1;
KEY1=5;
lcd_init();
for(n=0;n<8;n++){
write_data(lcd_desktop21[n]);}
}
}
if((key5==0)&&(KEY1==5)) //按鍵K5按下,(減速)對其它標(biāo)志位沒有影響。
{
delayms(5);
if(key5==0)
{
while(!key5);
if(Timer0_BiaoZhi==0)
{
Timer0_BiaoZhi=0;
}
else
{
Timer0_BiaoZhi--;
}
EX1=1;
KEY1=5;
lcd_init();
for(n=0;n<8;n++){
write_data(lcd_desktop22[n]);}
}
}
if((key6==0)&&(KEY1==5))//按鍵K6按下,電機(jī)停止轉(zhuǎn)動使能端和計(jì)數(shù)啟動關(guān)閉,計(jì)數(shù)器工作否?設(shè)立標(biāo)志位。此按鍵按下后除K1外無法啟動
{
delayms(5);
if(key6==0)
{
while(!key6);
//置位,保證后續(xù)操作正常。
EA=0; //總中斷關(guān)
motor_init(); //電機(jī)關(guān)
lcd_init();
Guan();
}
}
}
/*主函數(shù)*/
void main()
{
ZhongDuanKaiQi();//初始化
motor_init(); //電機(jī)停止
lcd_init();
while(1)
{
xianshi();
}
}
復(fù)制代碼
所有資料51hei提供下載:
lyp22.zip
(84.34 KB, 下載次數(shù): 23)
2019-5-30 21:29 上傳
點(diǎn)擊文件名下載附件
仿真與程序文件
作者:
無敵8888
時間:
2020-5-15 12:47
你的D4連在哪里啊,圖中沒有
作者:
13119197478
時間:
2020-7-9 10:13
你是用51做的啊
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1