久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1141|回復: 0
打印 上一主題 下一主題
收起左側

STC15W408AS單片機實現步進電機遙控控制程序設計分享

[復制鏈接]
跳轉到指定樓層
樓主







【聲明】此程序僅用于學習與參考,引用請注明版權和作者信息!     
*********************************************************************/
#include<STC15W408AS.h>
#include<math.h>                  //計算小數點的頭文件
#include <intrins.h>          //用nop函數延時的頭文件
#define uchar unsigned char//宏定義無符號字符型
#define uint unsigned int  //宏定義無符號整型
/*數據類型定義*/
typedef signed char        int8;
typedef signed int        int16;
typedef signed long        int32;
typedef unsigned char        uint8;
typedef unsigned int        uint16;
typedef unsigned long        uint32;

#define ENABLE_IAP 0x83 //系統工作時鐘<12MHz 時,對IAP_CONTR 寄存器設置此值
#define CMD_IDLE 0
#define CMD_READ 1
#define CMD_PROGRAM 2
#define CMD_ERASE 3
#define ENABLE_IAP 0x83//SYSCLK<12MH
#define IAP_ADDRESS 0x0000        //存儲地址

#define FOSC 11059200L  
#define BAUD 9600   
/**************************************************
                 IO口定義
***************************************************/
sbit D1 = P1^2; //遙控D
sbit D2 = P1^3; //遙控D
sbit D3 = P5^4; //遙控D
sbit D4 = P5^5; //遙控D

sbit IN1 = P3^2; //左限位
sbit IN2 = P3^3; //右限位

sbit KZ1 = P1^4; //擴展1
sbit KZ2 = P1^5; //擴展2

sbit DIR = P3^7;     //方向
sbit PW  = P3^6;         //脈沖
sbit EN  = P1^0;         //使能
sbit OUT = P1^1;     //抱閘

uchar dat;
uchar sudu;
uint sdz=0;
bit sjbz1=0;
uint sj1=0;
bit sjbz2=0;
uint sj2=0;
bit write=0;
bit sdbz=0;
uchar sendBuf[10];          //發送緩沖區
bit xsdbz=0;
bit bz1=0;
bit bz2=0;
bit bz3=0;
bit bz4=0;
bit bz5=0;

bit zzjsbz=0;//正轉按下計數標志
bit fzjsbz=0;//反轉按下計數標志
bit CLK_EN=0;//脈沖使能
/********************************************************************
                    初始定義
*********************************************************************/
uint sec; //定義計數值,每過1/10 秒,sec 加一
uchar keycnt=0;//按下次數值
uint tcnt; //鍵值判斷

uchar k=1;
uchar k1=50;
/********************************************************************
                    定義 ISP/IAP/EEPROM 命令
*********************************************************************/

void IapIdle();//禁用 ISP/IAP/EEPROM functionmake 單片機 在 一 安全 狀態
uint8 IapReadByte(uint16 addr);//讀數據
void IapProgramByte(uint16 addr, uint8 dat);//寫數據
void IapEraseSector(uint16 addr);//擦除數據
void key();
void Init_Com(void);
void delay(uchar date);
void tssz();
void senduart1();
void senduart2();
/********************************************************************
                    定時器
*********************************************************************/
void Init_Com(void)
{
SCON = 0x50;
T2L = (65536 - (FOSC/4/BAUD));
T2H = (65536 - (FOSC/4/BAUD))>>8;
AUXR = 0x14;               
AUXR |= 0x01;              
//ES = 1;                  
//EA = 1;

//AUXR |= 0x80;                //定時器時鐘1T模式
//TMOD &= 0xF0;                //設置定時器模式
//TL0 = 0x50;                //設置定時初值
//TH0 = 0xFB;                //設置定時初值
//TF0 = 0;                //清除TF0標志
           TMOD=0x02; //定時器工作在方式2
        TH0=0xf6; //對TH0 TL0 賦值
        TL0=0xf6;
        TR0=1; //開始定時
        ET0=1;
        EA=1;
        sec=0;
}
/********************************************************************
                    延時函數
*********************************************************************/
void delay(uchar date)//延時程序
{
uchar m,n,s;
for(m=date;m>0;m--)
for(n=2 ;n>0;n--)
for(s=248;s>0;s--);                                                                        
}

/*******************************************************************
*                        按鍵
********************************************************************/
void key()
{
if(KZ2==1)
{
if((D1==1)&&(D2==0)&&(D3==0)&&(D4==0)&&(bz1==0)&&(IN1==1)){delay(k);if((D1==1)&&(D2==0)&&(D3==0)&&(D4==0))
{
zzjsbz=!zzjsbz;        bz1=1;sj1=0;sjbz1=0;if(zzjsbz==1){OUT =0;CLK_EN=1;delay(k1);EN =1;}else{OUT =1;delay(k1);EN =0;CLK_EN=0;}DIR =1;}}//A        正轉  
if((D1==0)&&(D2==1)&&(D3==0)&&(D4==0)&&(bz1==0)&&(IN2==1)){delay(k);if((D1==0)&&(D2==1)&&(D3==0)&&(D4==0))
{
fzjsbz=!fzjsbz;        bz1=1;sj1=0;sjbz1=0;if(fzjsbz==1){OUT =0;delay(k1);EN =1;CLK_EN=1;}else{OUT =1;delay(k1);EN =0;CLK_EN=0;}DIR =0;}}//B        反轉
}        
        
if((D1==0)&&(D2==0)&&(D3==1)&&(D4==0)&&(bz1==0)){delay(k);if((D1==0)&&(D2==0)&&(D3==1)&&(D4==0)){sec=0;bz1=1;sj2=0;sjbz2=1;sdbz=1;}}//C        加速
if((D1==0)&&(D2==0)&&(D3==0)&&(D4==1)&&(bz1==0)){delay(k);if((D1==0)&&(D2==0)&&(D3==0)&&(D4==1)){sec=0;bz1=1;sj2=0;sjbz2=1;sdbz=0;}}//D        減速
if((D1==0)&&(D2==0)&&(D3==0)&&(D4==0)&&(bz1==1)){delay(k);if((D1==0)&&(D2==0)&&(D3==0)&&(D4==0)&&(bz1==1)){if((D1==0)&&(D2==0)&&(D3==0)&&(D4==0)&&(bz1==1)){sjbz1=1;bz1=0;}}}

if((IN1==0)&&(bz2==0)){delay(k);if((IN1==0)&&(bz2==0)){EN =0;bz2=1;}}        if((IN1==1)&&(bz2==1)){delay(k);if((IN1==1)&&(bz2==1)){bz2=0;}}
if((IN2==0)&&(bz3==0)){delay(k);if((IN2==0)&&(bz3==0)){EN =0;bz3=1;}}        if((IN2==1)&&(bz3==1)){delay(k);if((IN2==1)&&(bz3==1)){bz3=0;}}
}
void tssz()
{
if(KZ2==0)
{
if((D1==1)&&(D2==0)&&(D3==0)&&(D4==0)&&(bz1==0)&&(IN1==1)){delay(k);if((D1==1)&&(D2==0)&&(D3==0)&&(D4==0)){bz1=1;sj1=0;sjbz1=0;OUT =0;delay(k1);EN =1;DIR =1;}}//A        正轉  
if((D1==0)&&(D2==1)&&(D3==0)&&(D4==0)&&(bz1==0)&&(IN2==1)){delay(k);if((D1==0)&&(D2==1)&&(D3==0)&&(D4==0)){bz1=1;sj1=0;sjbz1=0;OUT =0;delay(k1);EN =1;DIR =0;}}//B        反轉        
if(sjbz1==1){sj1++;if(sj1>=5000){sjbz1=0;sj1=0;EN =0;OUT =1;}}
}
if(sjbz2==1){sj2++;if(sj2>=500)

{
if(sdbz==0){if(sudu<45){sudu++;write=1;}}
if(sdbz==1){if(sudu>=2){sudu--;write=1;}}
switch(sudu)
{
//case 0:        sdz=10;dat=0x01;senduart1();break;
case 1:        sdz=1;dat=0x01;senduart1();break;
case 2:        sdz=2;dat=0x02;senduart1();break;
case 3:        sdz=3;dat=0x03;senduart1();break;
case 4:        sdz=4;dat=0x04;senduart1();break;
case 5:        sdz=5;dat=0x05;senduart1();break;
case 6:        sdz=6;dat=0x06;senduart1();break;
case 7:        sdz=7;dat=0x07;senduart1();break;
case 8:        sdz=8;dat=0x08;senduart1();break;
case 9:        sdz=9;dat=0x09;senduart1();break;
case 10:sdz=10;dat=0x10;senduart1();break;
case 11:sdz=11;dat=0x10;senduart1();break;
case 12:sdz=12;dat=0x12;senduart1();break;
case 13:sdz=13;dat=0x13;senduart1();break;
case 14:sdz=14;dat=0x14;senduart1();break;
case 15:sdz=15;dat=0x15;senduart1();break;
case 16:sdz=16;dat=0x16;senduart1();break;
case 17:sdz=17;dat=0x17;senduart1();break;
case 18:sdz=18;dat=0x18;senduart1();break;
case 19:sdz=19;dat=0x19;senduart1();break;
case 20:sdz=20;dat=0x20;senduart1();break;
case 21:sdz=23;dat=0x21;senduart1();break;
case 22:sdz=26;dat=0x22;senduart1();break;
case 23:sdz=30;dat=0x23;senduart1();break;
case 24:sdz=34;dat=0x24;senduart1();break;
case 25:sdz=38;dat=0x25;senduart1();break;
case 26:sdz=42;dat=0x26;senduart1();break;
case 27:sdz=46;dat=0x27;senduart1();break;
case 28:sdz=50;dat=0x28;senduart1();break;
case 29:sdz=55;dat=0x29;senduart1();break;
case 30:sdz=60;dat=0x30;senduart1();break;
case 31:sdz=65;dat=0x31;senduart1();break;
case 32:sdz=70;dat=0x32;senduart1();break;
case 33:sdz=75;dat=0x33;senduart1();break;
case 34:sdz=80;dat=0x34;senduart1();break;
case 35:sdz=90;dat=0x35;senduart1();break;
case 36:sdz=100;dat=0x36;senduart1();break;
case 37:sdz=110;dat=0x37;senduart1();break;
case 38:sdz=120;dat=0x38;senduart1();break;
case 39:sdz=130;dat=0x39;senduart1();break;
case 40:sdz=145;dat=0x40;senduart1();break;
case 41:sdz=165;dat=0x41;senduart1();break;
case 42:sdz=180;dat=0x42;senduart1();break;
case 43:sdz=200;dat=0x43;senduart1();break;
case 44:sdz=220;dat=0x44;senduart1();break;
case 45:sdz=250;dat=0x45;senduart1();break;
default:break;
}
sjbz2=0;
sj2=0;
}
}
}
/****************發送函數*********************/
void senduart1()
{           
SBUF=0xAA;while(!TI);TI=0;
SBUF=0x00;while(!TI);TI=0;
SBUF=0x02;while(!TI);TI=0;
SBUF=dat;while(!TI);TI=0;
SBUF=0xBB;while(!TI);TI=0;
}
/****************發送函數*********************/
void senduart2()
{           
SBUF=0xAA;while(!TI);TI=0;
SBUF=0x00;while(!TI);TI=0;
SBUF=0x05;while(!TI);TI=0;
SBUF=0x00;while(!TI);TI=0;
SBUF=0xBB;while(!TI);TI=0;
}

/**************************************************
                主函數
***************************************************/
void main()
{
Init_Com();
sec=0;
sudu=IapReadByte(0x01);//讀取存儲的值
if(sudu>=45){sudu=10;}
KZ1 = 1;
KZ2 = 1;
EN =0;
switch(sudu)
{
//case 0:        sdz=10;dat=0x01;senduart1();break;
case 1:        sdz=1;dat=0x01;senduart1();break;
case 2:        sdz=2;dat=0x02;senduart1();break;
case 3:        sdz=3;dat=0x03;senduart1();break;
case 4:        sdz=4;dat=0x04;senduart1();break;
case 5:        sdz=5;dat=0x05;senduart1();break;
case 6:        sdz=6;dat=0x06;senduart1();break;
case 7:        sdz=7;dat=0x07;senduart1();break;
case 8:        sdz=8;dat=0x08;senduart1();break;
case 9:        sdz=9;dat=0x09;senduart1();break;
case 10:sdz=10;dat=0x10;senduart1();break;
case 11:sdz=11;dat=0x10;senduart1();break;
case 12:sdz=12;dat=0x12;senduart1();break;
case 13:sdz=13;dat=0x13;senduart1();break;
case 14:sdz=14;dat=0x14;senduart1();break;
case 15:sdz=15;dat=0x15;senduart1();break;
case 16:sdz=16;dat=0x16;senduart1();break;
case 17:sdz=17;dat=0x17;senduart1();break;
case 18:sdz=18;dat=0x18;senduart1();break;
case 19:sdz=19;dat=0x19;senduart1();break;
case 20:sdz=20;dat=0x20;senduart1();break;
case 21:sdz=23;dat=0x21;senduart1();break;
case 22:sdz=26;dat=0x22;senduart1();break;
case 23:sdz=30;dat=0x23;senduart1();break;
case 24:sdz=34;dat=0x24;senduart1();break;
case 25:sdz=38;dat=0x25;senduart1();break;
case 26:sdz=42;dat=0x26;senduart1();break;
case 27:sdz=46;dat=0x27;senduart1();break;
case 28:sdz=50;dat=0x28;senduart1();break;
case 29:sdz=55;dat=0x29;senduart1();break;
case 30:sdz=60;dat=0x30;senduart1();break;
case 31:sdz=65;dat=0x31;senduart1();break;
case 32:sdz=70;dat=0x32;senduart1();break;
case 33:sdz=75;dat=0x33;senduart1();break;
case 34:sdz=80;dat=0x34;senduart1();break;
case 35:sdz=90;dat=0x35;senduart1();break;
case 36:sdz=100;dat=0x36;senduart1();break;
case 37:sdz=110;dat=0x37;senduart1();break;
case 38:sdz=120;dat=0x38;senduart1();break;
case 39:sdz=130;dat=0x39;senduart1();break;
case 40:sdz=145;dat=0x40;senduart1();break;
case 41:sdz=165;dat=0x41;senduart1();break;
case 42:sdz=180;dat=0x42;senduart1();break;
case 43:sdz=200;dat=0x43;senduart1();break;
case 44:sdz=220;dat=0x44;senduart1();break;
case 45:sdz=250;dat=0x45;senduart1();break;
default:break;
}
delay(200);
senduart2();
delay(100);
while(1)
{
key();
tssz();

if(write==1)  //存儲數據
{
EA=0;
write=0;
IapEraseSector(0);  //擦除扇區
IapProgramByte(0x01,sudu);//寫入新的地址
delay(k);
EA=1;
}
}}

/********************************************************************
                    定時中斷服務函數
*********************************************************************/
void t0(void) interrupt 1 using 0 //定時中斷服務函數
{
//tcnt++; //每過250ust tcnt 加一
//
//if(tcnt>=2000) //計滿4000 次(1/10 秒)時
//{
//tcnt=0; //重新再計
//OUT=!OUT;
//}
//sec++;
//
//if(sec>=sdz) //設置4秒到時電機停止
//{
//sec=0;
//PW=!PW;
//}
sec++;

if(sec>=sdz) //設置4秒到時電機停止
{
sec=0;
if(CLK_EN==1)//脈沖使能        
{
PW=!PW;
}}
}
//}

void IapIdle(){//禁用 ISP/IAP/EEPROM functionmake 單片機 在 一 安全 狀態
IAP_CONTR = 0;           //
IAP_CMD = 0;           //
IAP_TRIG = 0;           //
IAP_ADDRH = 0x80;  //
IAP_ADDRL = 0;           //
}
uint8 IapReadByte(uint16 addr){//讀數據
uint8 dat;
IAP_CONTR = ENABLE_IAP;
IAP_CMD = CMD_READ;
IAP_ADDRL = addr;
IAP_ADDRH = addr >> 8;
IAP_TRIG = 0x5A;
IAP_TRIG = 0xA5;
_nop_();
dat = IAP_DATA;
IapIdle();
return dat;
}
void IapProgramByte(uint16 addr, uint8 dat){//寫數據
IAP_CONTR = ENABLE_IAP;
IAP_CMD = CMD_PROGRAM;
IAP_ADDRL = addr;
IAP_ADDRH = addr >> 8;
IAP_DATA = dat;
IAP_TRIG = 0x5A;
IAP_TRIG = 0xA5;
_nop_();
IapIdle();
}
void IapEraseSector(uint16 addr){//擦除數據
IAP_CONTR = ENABLE_IAP;
IAP_CMD = CMD_ERASE;
IAP_ADDRL = addr;
IAP_ADDRH = addr >> 8;
IAP_TRIG = 0x5A;
IAP_TRIG = 0xA5;
_nop_();
IapIdle();
}
/********************************************************************
                      結束
*********************************************************************/

原理圖: 無
仿真: 無
代碼: GYJ-0185 步進電機正反轉控制帶停止抱死程序 - 帶數碼管20230615.rar (57.5 KB, 下載次數: 17)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费看a | 中文字幕亚洲一区 | 国产精品成人国产乱一区 | 成人av免费看 | 九九亚洲| www.午夜| 成人夜晚看av| 成人欧美日韩一区二区三区 | 国产视频二区在线观看 | 日韩一级 | 波多野结衣在线观看一区二区三区 | 久久久久久电影 | 中文字幕亚洲视频 | 人人干超碰 | 国产剧情一区 | 日韩午夜网站 | 亚洲一区中文字幕 | 拍真实国产伦偷精品 | 8x国产精品视频一区二区 | 人人九九精 | 欧美1区 | 天堂在线免费视频 | 国产精品永久免费 | 久久久久久久电影 | 日韩中文字幕在线视频 | 影音先锋中文字幕在线观看 | 免费亚洲网站 | 2021天天躁夜夜看 | 欧美日韩精品综合 | 中国一级特黄毛片大片 | 99亚洲国产精品 | 欧美一区二区视频 | 久久国产精品99久久久大便 | 午夜精品在线观看 | 欧美区日韩区 | 亚洲免费一区 | 久久精品视频播放 | 欧美成人激情 | 亚洲欧洲精品成人久久奇米网 | 免费在线观看一区二区 | 91国产在线视频在线 |