?? 懸掛控制最終程序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 + -