📄 悬挂控制最终程序20050910.c
字号:
//*************************************
//*************************************
#pragma small
#include<reg52.h>
#include<math.h>
#include<absacc.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
//--------------------------------------------电机接口宏定义
#define open 0
#define close 1
sbit motor1_z = P0^5 ;
sbit motor1_f = P0^7 ;
sbit motor2_z = P0^1 ;
sbit motor2_f = P0^3 ;
sbit L_guang = P1^5; //接左边光感
sbit R_guang = P1^4; //接右边光感
//--------------------------------------------7279IO口宏定义
sbit HD7279_CS =P3^5;
sbit HD7279_CLK =P3^4;
sbit HD7279_DATA=P3^3;
sbit HD7279_KEY =P3^2;
//--------------------------------------------7279命令宏定义
#define HD7279_RESET 0xa4 //复位,相当于重新上电
#define HD7279_TEST 0xbf //测试,点亮全部LED并闪烁
#define HD7279_RL 0xa1 //左移
#define HD7279_RR 0xa0 //右移
#define HD7279_RLC 0xa3 //循环左移
#define HD7279_RRC 0xa2 //循环右移
#define HD7279_DECODE0 0x80 //译码方式0
#define HD7279_DECODE1 0xc8 //译码方式1
#define HD7279_UNDECODE 0x90 //译码方式2: 不译码
#define HD7279_FLASH 0x88 //闪烁
#define HD7279_HIDE 0x98 //消隐
#define HD7279_SEGON 0xe0 //段亮
#define HD7279_SEGOFF 0xc0 //段灭
#define HD7279_READ 0x15 //读按键代码
//-------------------------------------------
#define L_start 115.974 //左边绳子开始长度
#define R_start 149.163 //右边绳子开始长度
//#define DJ_SPEED 0.04 //电机转一下0.75mm/10ms
#define DJ_SPEED 0.23 //电机转一下0.75mm/10ms
uchar cir_bj;//所画圆的半径
float L_next;//记录左边绳子下一次长度
float R_next;//记录右边绳子下一次长度
float L_length;//记录左边绳子当前长度
float R_length;//记录右边绳子当前长度
float L_change;//记录左边绳子变化长度
float R_change;//记录右边绳子变化长度
unsigned long L_dollop = 0;//左边需要转动的块数
unsigned long R_dollop = 0;//右边需要转动的块数
unsigned long motor1_sign = 0;//电机1中断控制标志
unsigned long motor2_sign = 0;//电机2中断控制标志
bit L_sign = 0;//电机1计数开始标志
bit R_sign = 0;//电机2计数开始标志
//--------------------------------------------全局变量定义
uchar key_value;
uchar key_fun_counter;
bit xy_select;
uint timer0_counter;
uint data_x = 0; //x坐标数据
uint data_y = 0; //y坐标数据
//--------------------------------------------
//--------------------------------------------
void delay(uint i)//延时程序
{ uint j;
for(j=0;j<=i;j++);
}
//--------------------------------------------
// 以下是HD7279驱动程序 |
//--------------------------------------------
void HD7279_LongDelay(void)//长延时
{ uchar i;
for (i=0;i<0x30;i++);
}
//--------------------------------------------
void HD7279_ShortDelay(void)//短延时
{ uchar i;
for (i=0;i<8;i++);
}
//--------------------------------------------
void HD7279_SendByte(uchar out_byte)//向HD7279写字节
{ uchar i;
HD7279_CLK=0;
HD7279_LongDelay();
for(i=0;i<8;i++)
{if(out_byte&0x80) HD7279_DATA=1;
else HD7279_DATA=0;
HD7279_ShortDelay();
HD7279_CLK=1;
HD7279_ShortDelay();
HD7279_CLK=0;
HD7279_ShortDelay();
out_byte=out_byte<<1;
}
HD7279_DATA=0;
}
//--------------------------------------------
uchar HD7279_ReceiveByte(void)//从HD7279读字节
{ uchar i, in_byte=0;
HD7279_CLK=0;
HD7279_DATA=1;
HD7279_LongDelay();
for(i=0;i<8;i++)
{HD7279_CLK=1;
HD7279_ShortDelay();
in_byte=in_byte<<1;
if(HD7279_DATA) { in_byte=in_byte|0x01; }
HD7279_CLK=0;
HD7279_ShortDelay();
}
HD7279_DATA=0;
return (in_byte);
}
//--------------------------------------------
//在指定位置显示数据//形参:显示位置,数据,有无点(1有点)
void HD7279_ShowData(uchar Position,uchar ShowData,bit Have_DP)
{
HD7279_SendByte( Position|HD7279_DECODE0 );//按方式0译码
if(Have_DP) ShowData = ShowData|0x80;
HD7279_SendByte( ShowData );
HD7279_ShortDelay();
}
//--------------------------------------------
uchar HD7279_GetKey(void)//获得按键代码
{ uchar key;
HD7279_SendByte(HD7279_READ);
key=HD7279_ReceiveByte();
return(key);
}
//--------------------------------------------
void HD7279_Initial(void)//HD7279初始化
{
HD7279_SendByte( HD7279_RESET );//复位
}
//--------------------------------------------
//--------------------------------------------
//显示十进制数,形参:数据,在8位LED高4位还是低4位显示(1高),千百十个哪位有小数点(4千3百2十1个0无)
void show_led(uint data_show,bit Select_HL,uchar Select_DP)
{ uchar t4,t3,t2,t1;
bit dp1=0,dp2=0,dp3=0,dp4=0;
t4 = (uchar)(data_show/1000);
t3 = (uchar)((data_show%1000)/100);
t2 = (uchar)((data_show%100)/10);
t1 = (uchar)(data_show%10);
switch(Select_DP)
{case 4:dp4=1;break;
case 3:dp3=1;break;
case 2:dp2=1;break;
case 1:dp1=1;break;
default:break;
}
if(Select_HL)
{HD7279_ShowData(7,t1,dp4);
HD7279_ShowData(6,t2,dp3);
HD7279_ShowData(5,t3,dp2);
//HD7279_ShowData(4,t4,dp1);
}
else
{HD7279_ShowData(3,t1,dp4);
HD7279_ShowData(2,t2,dp3);
HD7279_ShowData(1,t3,dp2);
//HD7279_ShowData(0,t4,dp1);
}
}
void show_led4(float data_show,bit Select_HL,uchar Select_DP)
{ uchar t4,t3,t2,t1;
uint data_show4;
bit dp1=0,dp2=0,dp3=0,dp4=0;
data_show4 = (uint)(data_show*1000);
t4 = (uchar)(data_show4/1000);
t3 = (uchar)((data_show4%1000)/100);
t2 = (uchar)((data_show4%100)/10);
t1 = (uchar)(data_show4%10);
switch(Select_DP)
{case 4:dp4=1;break;
case 3:dp3=1;break;
case 2:dp2=1;break;
case 1:dp1=1;break;
default:break;
}
if(Select_HL)
{HD7279_ShowData(7,t1,dp4);
HD7279_ShowData(6,t2,dp3);
HD7279_ShowData(5,t3,dp2);
HD7279_ShowData(4,t4,dp1);
}
else
{HD7279_ShowData(3,t1,dp4);
HD7279_ShowData(2,t2,dp3);
HD7279_ShowData(1,t3,dp2);
HD7279_ShowData(0,t4,dp1);
}
}
//--------------------------------------------
//--------------------------------------------电机控制
void control_motor1_z(void)//电机1正转
{
motor1_z = close;//
motor1_f = close;//
//delay(200);
motor1_z = open;
}
void control_motor1_f(void)//电机1反转
{
motor1_z = close;//
motor1_f = close;//
//delay(200);
motor1_f = open;
}
void control_motor1_close(void)//电机1关闭
{
motor1_z = close;//
motor1_f = close;//
}
//--------------------------------------------
void control_motor2_z(void)//电机2正转
{
motor2_z = close;//
motor2_f = close;//
//delay(200);
motor2_z = open;
}
void control_motor2_f(void)//电机2反转
{
motor2_z = close;//
motor2_f = close;//
//delay(200);
motor2_f = open;
}
void control_motor2_close(void)//电机2关闭
{
motor2_z = close;//
motor2_f = close;//
}
//--------------------------------------------
//---------------------------------------------
void move_point(float a,float b)
{
L_next = sqrt((15+a)*(15+a)+(115-b)*(115-b));//a
R_next = sqrt((95-a)*(95-a)+(115-b)*(115-b));//b
L_change = (L_next - L_length)*10;
R_change = (R_next - R_length)*10;
L_length = L_next;
R_length = R_next;
if(R_change > 0)
{//判断从当前点移动到下一个点码盘需要转动的块数以及是收还是放线
R_dollop = R_change/DJ_SPEED;
control_motor2_z();
R_sign = 1;
}
else{
R_dollop = abs(R_change)/DJ_SPEED;
control_motor2_f();
R_sign = 1;
}
if(L_change > 0)
{//判断从当前点移动到下一个点码盘需要转动的块数以及是收还是放线
L_dollop = L_change/DJ_SPEED;
control_motor1_z();
L_sign = 1;
}
else{
L_dollop = abs(L_change)/DJ_SPEED;
control_motor1_f();
L_sign = 1;
}
while(1)
{
if(motor1_sign >=L_dollop)
{
motor1_z = close;
motor1_f = close;
L_sign = 0;
}
if(motor2_sign >=R_dollop)
{
motor2_z = close;
motor2_f = close;
R_sign = 0;
}
if((L_sign == 0)&&(R_sign == 0))
{motor1_sign = 0;
motor2_sign = 0;
break;
}
}
delay(20000);
}
//--------------------------------------------
void draw_line(float x2,float y2)
{
float xi,yi=0;
uchar j;
L_length = L_start;
R_length = R_start;
for(xi=0;xi<=x2;xi+=1.0)
{
yi = y2/x2*xi;
move_point(xi,yi);
}
for(j=0;j<=9;j++) //数码管显示提示
{ EA=0;
HD7279_ShowData(0,0x0d,0);
EA=1;
delay(20000);
EA=0;
HD7279_ShowData(0,0x0f,0);
EA=1;
delay(20000);
}
}
void draw_cir(int a,int b)//以(a,b)为圆心画圆
{
float i,x,y;
uint angle;
uchar j,loop=0;
L_length = sqrt((15+a+cir_bj)*(15+a+cir_bj)+(115-b)*(115-b));
R_length = sqrt((95-a-cir_bj)*(95-a-cir_bj)+(115-b)*(115-b));
for(angle=5;angle<=365;angle+=5) //分360度,每5度画一个点,
{
loop++;
i=(float)(angle)*3.14159/180;
x=a+cir_bj*cos(i);
y=b+cir_bj*sin(i);
if(loop >=5)
{
show_led4(x,0,3); //在数码管上显示坐标,保留2位小数
show_led4(y,1,3);
loop = 0;
}
move_point(x,y);
}
for(j=0;j<=9;j++) //数码管显示提示
{ EA=0;
HD7279_ShowData(0,0x0d,0);
EA=1;
delay(20000);
EA=0;
HD7279_ShowData(0,0x0f,0);
EA=1;
delay(20000);
}
}
//--------------------------------------------
//-----键盘-----------------------------------
//-----按键功能选择---------------------------
void key_chose(void)
{uchar i;
while(1)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -