?? motor.c
字號:
#include <reg52.h>
#include<absacc.h>
#include <intrins.h>
#include <math.h>
#include <stdio.h> /* prototype declarations for I/O functions */
sbit cflag=ACC^7;
sbit L297_L_CW=P1^0;
sbit L297_L_CLK=P1^1;
sbit L297_L_HALF=P1^2;
sbit L297_L_RST=P1^3;
sbit L297_L_CTL=P1^4;
sbit L297_L_EN=P1^5;
sbit L297_R_CW=P1^6;
sbit L297_R_CLK=P1^7;
sbit L297_R_HALF=P3^0;
sbit L297_R_RST=P3^1;
sbit L297_R_CTL=P3^2;
sbit L297_R_EN=P3^4;
#define uchar unsigned char
#define uint unsigned int
#define STEP 26
#define SPEED 5
#define ctrl8279 XBYTE[0X0100]
#define data8279 XBYTE[0X0000]
uchar x0,y0;
unsigned int i,j;
uchar k,eol;
float mmx,mmy;
float mx,my;
int cr=25;
int cx0=40,cy0=50;
/*********************************/
void msec(unsigned int x){
uchar j;
while(x--){
for(j=0;j<125;j++)
{;}
}
}
/*************************/
uchar code table[]={0x0fc,0x60,0x0da,0x0f2,0x66,0x0b6,0x0be,0x0e0,0x0fe,0x0f6,0x8e,0x02};
/****************************/
void wdat_8279(uchar d){
msec(1);
do
{ACC=ctrl8279;}
while (cflag==1);
data8279=d;
}
/*******************************************/
void wcom_8279(uchar c){
msec(1);
do
{ACC=ctrl8279;}
while (cflag==1);
ctrl8279=c;
}
/********************/
void init8279()
{
//unsigned char i;
ctrl8279=0x32; //biancheng minglin shizhong :ale 18 fenping 00110010
ctrl8279=0x00; //8zifuxianshi you ru kou ,bianma sao miao jianpan,shuang jian suo
ctrl8279=0xd0; //xianshi ram qing 0,quan zhi 1;
}
/******************/
void display_xy(int x, int y , uchar ch){
if (y<1) y=1;
if (y>2) y=2;
if (x<1) x=1;
if (x>4) x=4;
if (ch<0) ch=0;
if (ch>15) ch=15;
if (y==1) {
switch (x) {
case 1: wcom_8279(0x87);
wdat_8279(table[ch]);
break;
case 2: wcom_8279(0x83);
wdat_8279(table[ch]);
break;
case 3: wcom_8279(0x85);
wdat_8279(table[ch]);
break;
case 4: wcom_8279(0x81);
wdat_8279(table[ch]);
break;
}
}else {
switch (x) {
case 1: wcom_8279(0x86);
wdat_8279(table[ch]);
break;
case 2: wcom_8279(0x82);
wdat_8279(table[ch]);
break;
case 3: wcom_8279(0x84);
wdat_8279(table[ch]);
break;
case 4: wcom_8279(0x80);
wdat_8279(table[ch]);
break;
}
}
}
void display2( int k){
uint s=0,a=0,d=0, m=0,f=0,n=0,i;
uint neg=0;
if(k>-999&&k<=9999)
{
// ctrl8279=0x00;
if (k<0) {
k=-k;
neg=1;
}
s=k/1000;
wcom_8279(0x86);
wdat_8279(table[s]);
a=k%1000;
d=a/100;
wcom_8279(0x82);
i=0x80;
wdat_8279(table[d]);
//
m=a%100;
f=m/10;
wcom_8279(0x84);
i=0x80;
wdat_8279(table[f]);
n=m%10;
wcom_8279(0x80);
wdat_8279(table[n]);
}
if (neg) display_xy(1,2,11);
}
void display1( int k)
{
uint s=0,a=0,d=0, m=0,f=0,n=0,i;
uint neg=0;
if(k>-999&&k<=9999)
{
// ctrl8279=0x00;
if (k<0) {
k=-k;
neg=1;
}
s=k/1000;
wcom_8279(0x87);
wdat_8279(table[s]);
a=k%1000;
d=a/100;
wcom_8279(0x83);
i=0x80;
wdat_8279(table[d]);
//
m=a%100;
f=m/10;
wcom_8279(0x85);
i=0x80;
wdat_8279(table[f]);
n=m%10;
wcom_8279(0x81);
wdat_8279(table[n]);
//
}
if (neg) display_xy(1,1,11);
}
/***********************/
uchar key_pressed(void) //判斷FIFO有鍵按下函數
{uchar k;
k=ctrl8279;
return(k&0x0f); //非0,有鍵按下
}
uchar keyin(void)
{uchar i,k;
while(key_pressed()==0);
wcom_8279(0x40); //讀FIFO RAM命令
i=data8279;
k=0;
switch(i)
{
case 196:
display1(0);
k=0;
break;
case 228:
display1(1);
k=1;
break;
case 192:
display1(2);
k=2;
break;
case 224:
display1(3);
k=3;
break;
case 197:
display1(4);
k=4;
break;
case 229:
display1(5);
k=5;
break;
case 193:
display1(6);
k=6;
break;
case 225:
display1(7);
k=7;
break;
case 198:
display1(8);
k=8;
break;
case 230:
display1(9);
k=9;
break;
case 194:
display1(10);
k=10;
break;
case 226:
display1(11);
k=11;
break;
case 199:
display1(12);
k=12;
break;
case 231:
display1(13);
k=13;
break;
case 195:
display1(14);
k=14;
break;
case 227:
display1(15);
k=15;
break;
}
return(k);
}
/**************************/
void Rmotor(float L){
int i,j;
if (L<0){
L297_L_CW=1;
}else {
L297_L_CW=0;
}
j=abs(STEP*L);
for (i=0;i<j;i++){
L297_L_CLK=0;
msec(SPEED);
L297_L_CLK=1;
msec(SPEED);
}
}
void Lmotor(float L){
int i,j;
if (L>0){
L297_R_CW=1;
}else {
L297_R_CW=0;
}
j=abs(STEP*L);
for (i=0;i<j;i++){
L297_R_CLK=0;
msec(SPEED);
L297_R_CLK=1;
msec(SPEED);
}
}
void clear_led(){
wcom_8279(0xd0);
}
void initL297(){
L297_L_RST=0;
msec(50);
L297_L_RST=1;
L297_L_CTL=1;
L297_L_EN=1;
L297_L_HALF=0;
L297_R_RST=0;
msec(50);
L297_R_RST=1;
L297_R_CTL=1;
L297_R_EN=1;
L297_R_HALF=0;
}
void test(){
uchar i;
initL297();
for (i=0;i<200;i++){
L297_R_CLK=0;
msec(SPEED);
L297_R_CLK=1;
msec(SPEED);
}
for (i=0;i<200;i++){
L297_L_CLK=0;
msec(SPEED);
L297_L_CLK=1;
msec(SPEED);
}
}
float LL(float x, float y){
int r1;
r1=sqrt((15+x)*(15+x)+(115-y)*(115-y));
return r1;
}
float LR(float x, float y){
int r2;
r2=sqrt((95-x)*(95-x)+(115-y)*(115-y));
return r2;
}
void move( float x0, float y0, float x1 ,float y1){
float Ll0,Lr0,Ll1,Lr1;
Ll0=LL(x0,y0);
Lr0=LR(x0,y0);
Ll1=LL(x1,y1);
Lr1=LR(x1,y1);
Lmotor(Ll1-Ll0);
Rmotor(Lr1-Lr0);
}
void move_xy(){
move(x0,y0,mx,my);
x0=mx;
y0=my;
}
void drawcircle(){
mmx=cx0;
mmy=cy0+cr;
move(x0,y0,mmx,mmy);
for (i=1;i<360;i++){
mx=cx0+28*(sin(3.1415926*i/180));
my=cy0+25*(cos(3.1415926*i/180));
move(mmx,mmy,mx,my);
display1(mx);
display2(my);
mmx=mx;
mmy=my;
}
}
bit int_flag;
main() {
IT1=1;
IE=0X84;
init8279();
display1(1234);
display2(5678);
msec(1500);
clear_led();
for(i=1;i<3;i++)
{for(j=1;j<5;j++) {
display_xy(j,i,2);
msec(100);
clear_led();
}
}
display1(0000);
display2(0000);
initL297();
test();
while (1) {
i=0;
while (!int_flag) ;
int_flag=0;
k=keyin();
if (k==14) {
test();
}
if (k==12) {
cx0=40;
cy0=50;
cr=25;
drawcircle();
}
if (k==13) {
move(0,0,20,20);
move(20,20,30,50);
move(30,50,60,60);
move(60,60,70,90);
}
if (k==10) {
display1(0000);
msec(1000);
clear_led();
display1(0000);
msec(1000);
clear_led();
display1(0000);
msec(1000);
clear_led();
eol=0;
while (!eol) {
while (!int_flag);
int_flag=0;
k=keyin();
if (k<10)
mx=mx*10+k;
display1(mx);
if (k==15) eol=1;
}
eol=0;
while (!eol) {
while (!int_flag);
int_flag=0;
k=keyin();
if (k<10)
my=my*10+k;
display2(my);
if (k==15) eol=1;
}
move_xy();
}
if (k==11) {
display1(8888);
msec(1000);
clear_led();
display2(8888);
msec(1000);
clear_led();
display1(8888);
msec(1000);
clear_led();
eol=0;
while (!eol) {
while (!int_flag);
int_flag=0;
k=keyin();
if (k<10)
cx0=cx0*10+k;
display1(cx0);
if (k==15) eol=1;
}
display1(7777);
msec(1000);
clear_led();
display2(7777);
msec(1000);
clear_led();
display1(7777);
msec(1000);
clear_led();
eol=0;
while (!eol) {
while (!int_flag);
int_flag=0;
k=keyin();
if (k<10)
cy0=cy0*10+k;
display2(cy0);
if (k==15) eol=1;
}
display1(6666);
msec(1000);
clear_led();
display2(6666);
msec(1000);
clear_led();
display1(6666);
msec(1000);
clear_led();
eol=0;
while (!eol) {
while (!int_flag);
int_flag=0;
k=keyin();
if (k<10)
cr=cr*10+k;
display2(cr);
if (k==15) eol=1;
}
drawcircle();
}
}
while (1);
}
void int1() interrupt 2{
int_flag=1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -