📄 rainwiper v10a
字号:
/********************************
名称:雨刷控制器
日期:2007-06-23
作者:Mavinger
版本:
V1.0:2007-07-8 ,创建此版本
V2.0:2006-11-5 ,修改外部晶振为11.0592M
硬件:
1.控制单片机: 12C5052AD
2.步进电机驱动器: L293D
********************************/
#include "STC12C2052AD.h"
#include <INTRINS.h>
#include <math.h>
#include <stdio.h>
//数据类型定义
typedef unsigned char byte;
typedef unsigned int word;
typedef unsigned long dword;
//#define Timer_H 0xFF //0.1ms
//#define Timer_L 0xBD
#define Timer_H 0xFF //0.01ms
#define Timer_L 0xF9
//电机驱动控制
//input
sbit Run_Mode =P3^5;
sbit Stop_Mode =P3^4;
sbit Speed_Mode =P3^3;
//output
sbit Step_EN1 =P1^7;
sbit Step_EN2 =P1^6;
sbit Out_A0 =P1^3;
sbit Out_A1 =P1^2;
sbit Out_B0 =P1^1;
sbit Out_B1 =P1^0;
#define Open 1
#define Close 0
#define ON 1
#define OFF 0
bit MotorDir;
byte np;
const byte forward[]=
//{0b10100011,0b11101011,0b11001011,0b11011011,0b10010011,0b11010111,0b11000111,0b11100111,};
//{0xA3,0xEB,0xCB,0xDB,0x93,0xD0,0xC7,0xE7};
//{0b11111000,0b1111010,0b11110010,0b11110110,0b11110100,0b11110101,0b11110001,0b11111001,};
{0xF8,0xFA,0xF2,0xF6,0xF4,0xF5,0xF1,0xF9};
const byte backward[]=
{0xF9,0xF1,0xF5,0xF4,0xF6,0xF2,0xFA,0xF8};
void Initial(void)
{
AUXR=AUXR & 0x7F; //T0x12=0; 系统时钟12分频,即 T=12/6=2us
TMOD=0x01; //C/T1作定时用,16位模式
//定时模式1,10ms
//0xEC78 : 晶振6M
//TH0=0xEC;
//TL0=0x78;
//0xE5F5 : 晶振8M
//0xCBEA : 晶振16M
//定时模式1,1ms
//0xFE0C : 晶振6M
//0xFD65 : 晶振8M
//TH0=0xFD;
//TL0=0x65;
//定时模式1,0.1ms
//0xFFCE : 晶振6M
//0xFFBD : 晶振8M
TH0=Timer_H;
TL0=Timer_L;
ET0=1;
EA=1;
P1M0=0; //P1M0=0,P1M1=0,P1口为准双向口
P1M1=0;
P3M0=0;
P3M1=0;
TR0=0;
}
void InitialUART(void)
{
SCON = 0X50;
TMOD = 0X21;
TH1 = 0xF7; //Baudrate:2400
TR1 = 1 ;
TI=1;
}
//1ms*N 延时
void Delay1MS(word delay1ms)
{
word cnt;
byte cnt1;
for(cnt=0;cnt<delay1ms;cnt++)
{
for(cnt1=0;cnt1<200;cnt1++)
_nop_();
}
}
void StepRun(byte StepDir,word Speednum) // One step run
{
if(StepDir & 0x01)
{
if(np==0)
np=7;
else
np--;
P1=forward[np];
Delay1MS(Speednum);
}
else
{
if(np==0)
np=7;
else
np--;
P1=backward[np];
Delay1MS(Speednum);
}
}
void MotorTurn(byte StepDir,word Speednum,word Degree) //方向,速度,度数
{
byte degreecnt;
byte stepcnt;
degreecnt=(byte)(Degree/0.9);
for(stepcnt=0;stepcnt<degreecnt;degreecnt++)
{
StepRun(StepDir,Speednum);
}
}
main()
{
byte cnt;
Initial();
InitialUART();
Run_Mode=1;
Stop_Mode=1;
Speed_Mode=1;
while(1)
{
if(!Run_Mode)
{
MotorTurn(1,20,90);
}
}
}
void Timer0(void) reentrant interrupt 1
{
TH0=Timer_H;
TL0=Timer_L;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -