📄 text1.c
字号:
#include <AT89X51.h>//51芯片管脚定义头文件
#include <intrins.h>//内部包含延时函数 _nop_() ;
#include <LCD1602.H>
#define uchar unsigned char
#define uint unsigned int
#define keys P1 //按键控制端口
#define stepper P2 //stepper motor control output
#define TMax 20000
#define TMin 100
uchar nstr[5]; //字符串形式的转速值
uchar code cdis1[ ] = {" welcome "};
uchar code cdis2[ ] = {" On P "};
uchar code cdis3[ ] = {" On N"};
uchar code cdis4[ ] = {" off "};
uchar ctlw[8]={0x0c,0x06,0x03,0x09,0x0c,0x06,0x03,0x09}; //双三拍控制字
uchar m;
bit qt=0; //启停
bit fx=0; //方向
bit max=0; //最大转速限制 =1时,到达最大值允许值
bit min=0; //最小转速限制
unsigned int T=10000; //时钟控制;
// init()初始化
void init()
{
TMOD = 0x01; // 设置定时器0工作模式
EA = 1;
ET0 = 1;
TH0 = -T/256;
TL0 = -T%256;
lcd_init();
lcd_pos(0) ;
m = 0 ;
while(cdis1[m] != '\0')
{
lcd_wdat(cdis1[m]) ; //显示字符
m++ ;
}
}
//计算转速
int ncal()
{
uint fw,N,ZR;
fw=500000/T;
return 60*fw/N/ZR;
}
//整数转字符串,保存到 nstr 中
void itoa(uint Value)
{
uchar ch,*right,*left;
left = right = nstr;
//把数字转换成字符串(倒置的)
while(Value)
{
*right = (Value%10)+0x30;
Value = Value/10;
right++;
}
*right-- = '\0';
//把倒置的字符串正放过来
while(right > left)
{
ch = *left;
*left++ = *right;
*right-- = ch;
}
}
//显示转速
void ndisp()
{
uint i=ncal();
itoa(i);
lcd_pos(0) ;
m = 0 ;
while(nstr[m] != '\0')
{
lcd_wdat(nstr[m]) ; //显示字符
m++ ;
}
}
//显示函数
void display()
{
if(qt)
{
if(fx)
{lcd_wcmd(0x01) ;
lcd_pos(0) ;
m = 0 ;
while(cdis2[m] != '\0')
{
lcd_wdat(cdis2[m]) ; //显示字符
m++ ;
}
}
else
{lcd_wcmd(0x01);
lcd_pos(0) ;
m = 0 ;
while(cdis3[m] != '\0')
{
lcd_wdat(cdis3[m]) ; //显示字符
m++ ;
}
}
ndisp();
}
else
{lcd_wcmd(0x01);
lcd_pos(0) ;
m = 0 ;
while(cdis4[m] != '\0')
{
lcd_wdat(cdis4[m]) ; //显示字符
m++ ;
}
}
}
//加速
void accelerate()
{
if(T>=TMin+500){T-=200;min=0;}
else max=1;
}
//减速
void decelerate()
{
if(T<=TMax+500){T+=200;max=0;}
else min=1;
}
/* 定时器0服务子程序 */
void time0() interrupt 1 using 1 // 用定时器0中断来产生CLK时钟
{
/* 定时10ms,产生20ms周期的时钟,也就是50Hz的时钟 */
static uchar n=0;
TH0 = -T/256;
TL0 = -T%256;
if(fx)
{
stepper=ctlw[n%4];
if(n<3)n++;
else n=0;
}
else
{
stepper=ctlw[n%4];
if(n>0)n--;
else n=3;
}
}
/* 键消抖延时函数 */
void delay(void)
{
uchar i;
for (i=300;i>0;i--);
}
/* 键扫描函数 */
void keyscan(void)
{
uchar tmpkey;
keys = 0x0f; // 发全0行扫描码
if ((keys&0x0f)!=0x0f) // 若有键按下
{
delay(); // 延时去抖动
if ((keys&0x0f)!=0x0f) // 延时后再判断一次,去除抖动影响
{tmpkey=keys&0x0f;
while((keys&0x0f)!=0x0f); //直至键松开
switch(tmpkey)
{case 0x0e:
qt=~qt;
break;
case 0x0d:
if(qt==1)fx=~fx;
break;
case 0x0b:
if(qt==1&&!max)accelerate();
break;
case 0x07:
if(qt==1&&!min)decelerate();
break;
default: break;
}
display();
}
} // 无键按下,返回值为0
}
/* 主程序 */
void main()
{
init();
while(1)
{
keyscan(); // 调用键盘扫描函数
if(qt) TR0=1;
else TR0=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -