📄 contol.c
字号:
//***************************************************
// Created by sheriflee
// Edited by Jihengzhang
// Created time: Jun 24th,2004
// 计算时将数值都乘以10,即假定每一步走9度而非0.9度
//**************************************************
#include <reg51.h>
#include <math.h>
#include <head.h>
//*** 主程序 **
main()
{
for (tmr=0;tmr<0x2000;tmr++); //上电延时
send_byte(CMD_RESET); //复位HD7279A
//******************************************
// initialize cpu
//******************************************
// SCON = 0x52; //SCON 串行口设置
// TMOD = 0x20; //* TMOD 时钟模式设置
IE = 0x81; //允许外部中断int0
TCON = 0x01; //* TCON 定时器控制 int0边沿触发
//******************************************
// initialize L279
//******************************************
l297_en=0; // 禁止电机动作
l297_rst=0; // 复位
l297_ref=1; // 参考电压为5V
l297_half=1; // 半步
l297_ctrl=1; // 相位调脉宽
l297_clk=1; // 准备发脉冲
//******************************************
// 测试
//******************************************
send_byte(CMD_TEST); //发送测试指令
delay5p5ms(50);
send_byte(CMD_RESET); //清除显示
//**********************************************
// 闪烁等待键盘输入
//**********************************************
// wait_cnter=0;
key_number=0xff;
keyin_data[0]=0x0f;
keyin_data[1]=0x0f;
keyin_data[2]=0x0f;
angle =0;
write7279(BLINKCTL,0xf8); //第1、2、3 位设置为闪烁显示
write7279(UNDECODE,0X08); //在第1位显示下划线'_'
write7279(UNDECODE+1,0x08); //在第2位显示下划线'_'
write7279(UNDECODE+2,0x08); //在第3位显示下划线'_'
//**********************************************
// 电机控制相关的初始化
//**********************************************
angle =0;
keyin_angle =0;
do{
if (flag_run) //允许运转
{
if(real_angle >=9) //还够转一步
{
real_angle=real_angle-9; // 转过一步
if (flag_sign)
angle=angle - 9;
else
angle=angle + 9;
if (real_angle <= keyin_angle/8)
{ if (delay < NNN)
delay= delay +3;
}
else if (real_angle >=(keyin_angle/8)*7)
{ if (delay >3)
delay= delay -3;
}
l297_cw =flag_sign; // clockwise/counterclockwise
stepping(delay);
}
else
flag_run=0;
led1_show(real_angle);
}
led0_show(angle);
} while (1);
}
//*********** The end of main function ************
//**********************************************
// interrupt0 service function
//**********************************************
void int0_serv( void ) interrupt 0 using 1
{
IE =0; // 禁止中断
write7279(BLINKCTL,0xff); //第1、2、3 位设置为闪烁显示
key_number=read7279(CMD_READ); //读出按键
switch(key_number){
case KEY_1:
flag_run=0; // 停止转动
data_shift(keyin_data,3);
keyin_data[0]=0x01;
break;
case KEY_2:
flag_run=0; // 停止转动
data_shift(keyin_data,3);
keyin_data[0]=0x02;
break;
case KEY_3:
flag_run=0; // 停止转动
data_shift(keyin_data,3);
keyin_data[0]=0x03;
break;
case KEY_4:
flag_run=0; // 停止转动
data_shift(keyin_data,3);
keyin_data[0]=0x04;
break;
case KEY_5:
flag_run=0; // 停止转动
data_shift(keyin_data,3);
keyin_data[0]=0x05;
break;
case KEY_6:
flag_run=0; // 停止转动
data_shift(keyin_data,3);
keyin_data[0]=0x06;
break;
case KEY_7:
flag_run=0; // 停止转动
data_shift(keyin_data,3);
keyin_data[0]=0x07;
break;
case KEY_8:
flag_run=0; // 停止转动
data_shift(keyin_data,3);
keyin_data[0]=0x08;
break;
case KEY_9:
flag_run=0; // 停止转动
data_shift(keyin_data,3);
keyin_data[0]=0x09;
break;
case KEY_0:
flag_run=0; // 停止转动
data_shift(keyin_data,3);
keyin_data[0]=0x00; //输入零
break;
case KEY_A: //正向微调
flag_run=0;
angle=angle-9;
l297_cw =0; // clockwise/counterclockwise
stepping(NNN);
break;
case KEY_B: //正向微调
flag_run=0;
angle=angle+9;
l297_cw =1; // clockwise/counterclockwise
stepping(NNN);
break;
case KEY_C: //输入值正负切换
flag_run=0; // 停止转动
flag_sign=!flag_sign;
break;
case KEY_D: //急停
flag_run =!flag_run;
if(flag_run)
write7279(BLINKCTL,0xf8); //闪烁显示
else
write7279(BLINKCTL,0xff); //闪烁显示
break;
case KEY_E: //清除输入值
flag_run=0; // 停止转动
{
keyin_data[0]=0x0f;
keyin_data[1]=0x0f;
keyin_data[2]=0x0f;
angle =0;
}
break;
case KEY_F:
write7279(BLINKCTL,0xf8); //闪烁显示
if (keyin_data[0]>9)
keyin_angle=0;
else if (keyin_data[1]>9)
keyin_angle = keyin_data[0];
else if (keyin_data[2]>9)
keyin_angle = 10*keyin_data[1]+keyin_data[0];
else
keyin_angle = 100*keyin_data[2]+10*keyin_data[1]+keyin_data[0];
keyin_angle =keyin_angle*10; // 输入角度值×10便于计算
real_angle =keyin_angle; // 转动过程中数值随着变化
delay =NNN; // 装入延时的初始值
keyin_data[0]=0x0f; // 保存输入值缓冲区清零
keyin_data[1]=0x0f;
keyin_data[2]=0x0f;
flag_run=1; // 开始转动
break;}
led1_show( real_angle ); //调用显示函数
led0_show(angle);
IE =0x81; // 开启中断
}
void write7279(unsigned char cmd, unsigned char dta){
send_byte (cmd);
send_byte (dta);
}
unsigned char read7279(unsigned char command){
send_byte(command);
return(receive_byte());
}
//******************************************
// send_byte function
//******************************************
void send_byte( unsigned char out_byte){
unsigned char i;
cs=0;
long_delay();
for (i=0;i<8;i++){
if (out_byte&0x80)
dat=1;
else
dat=0;
clk=1;
short_delay();
clk=0;
short_delay();
out_byte=out_byte*2;
}
dat=0;
}
//******************************************
// receiv_byte function
//******************************************
unsigned char receive_byte(void){
unsigned char i, in_byte;
dat=1; //
long_delay();
for (i=0;i<8;i++){
clk=1;
short_delay();
in_byte=in_byte*2;
if (dat)
in_byte=in_byte|0x01;
clk=0;
short_delay();
}
dat=0;
return (in_byte);
}
//******************************************
// led0_show function
//******************************************
void led0_show(int dis){
unsigned char i,j,k,l;
i= abs(dis) /1000;
j= (abs(dis) - i*1000)/100;
k=(abs(dis) - (i*1000)-(j*100))/10;
l=abs(dis) - (i*1000)-(j*100)-(k*10);
k=k|0x80; //加小数点位
write7279(DECODE0+7,i);
write7279(DECODE0+6,j);
write7279(DECODE0+5,k);
write7279(DECODE0+4,l);
}
//******************************************
// led1_show function
//******************************************
void led1_show(unsigned int dis){ //下边的LED,
unsigned char i,j,k;
if (flag_sign)
write7279(UNDECODE+3,0x01);
else
write7279(UNDECODE+3,0x00);
if (flag_run)
{
i= dis /1000;
j= (dis - i*1000)/100;
k=(dis - (i*1000)-(j*100))/10;
write7279(DECODE0+2,i);
write7279(DECODE0+1,j);
write7279(DECODE0,k);
}
else
{
for(i=0;i<3;i++)
write7279(DECODE0+i,keyin_data[i]);
}
}
//******************************************
// long_delay function
//******************************************
void long_delay(void){
unsigned char i;
for (i=0;i<0x30;i++);
}
void short_delay(void){
unsigned char i;
for (i=0;i<8;i++);
}
//******************************************
// delay5p5ms function
//******************************************
void delay5p5ms(unsigned char time){
unsigned char i;
unsigned int j;
for (i=0;i<time;i++)
for(j=0;j<0x390;j++);
// if (!key) ??????????????
// key_int(); ??????????????
}
//******************************************
// data_shift function
//******************************************
void data_shift(unsigned char *p,unsigned char n)
{
unsigned char i;
p = p + n-1;
for(i=0;i<n-1;i++){
*p = *(p -1);
p --;}
}
//******************************************
// data_shift function
//******************************************
void stepping(unsigned char delay_n )
{
l297_clk=1;
delay5p5ms(delay_n); //20: 对应11ms
l297_clk=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -