51hei圖片_20210226113706.png (261.6 KB, 下載次數: 30)
下載附件
2023-8-27 14:33 上傳
51hei圖片_20210226113738.png (504.56 KB, 下載次數: 38)
下載附件
2023-8-27 14:33 上傳
51hei圖片_20210226113743.png (255.51 KB, 下載次數: 31)
下載附件
2023-8-27 14:33 上傳
標示圖.jpg (120.93 KB, 下載次數: 32)
下載附件
2023-8-27 14:36 上傳
接線圖.jpg (355.37 KB, 下載次數: 33)
下載附件
2023-8-27 14:36 上傳
【聲明】此程序僅用于學習與參考,引用請注明版權和作者信息!
*********************************************************************/
#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)
2023-8-27 14:39 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|