//简易绘画仪
#include <c8051f410.h>
#include <intrins.h>
#include <string.h>
#include <math.h>
#define pi 3.14159265
#define wait; _nop_();_nop_();_nop_();_nop_();
#define up 0xde //向上键
#define down 0xdb //向下键
#define left 0xed //向左键
#define right 0xbd //向右键
#define enter 0xdd //确定键
#define sine_wave 0xbe //返回键
#define huayuan 0xee //设定键
//lcd控制引脚
sbit rs=P0^0;
sbit rw=P0^1;
sbit e=P0^2;
unsigned char count_time=0,key=0xff;
//步进电机的驱动控制程序
//定义步进电机四个引脚
sbit pin1_a=P1^0;
sbit pin1_b=P1^1;
sbit pin1_c=P1^2;
sbit pin1_d=P1^3;
sbit pin2_a=P1^4;
sbit pin2_b=P1^5;
sbit pin2_c=P1^6;
sbit pin2_d=P1^7;
#define uchar unsigned char
#define uint unsigned int
void rot_delay(unsigned int k);
void Rotation1(unsigned char k);
void Rotation2(unsigned char k);
void StepperMotor_diever(float move1,float move2);
void move_point(float x,float y);
void move(float x,float y);
void lcd_init(void);
void lcd_en_command(unsigned char command);
void lcd_en_dat(unsigned char dat);
void delay4(void);
unsigned char xdata disp[]="cur:x-000 y-000 des:x-000 y-000";
unsigned char xdata tab[6]={0,0,0,0,0,0};
void timer1_init();
void main()
{
unsigned char index=0;
unsigned int i;
PCA0MD &= ~0x40;
PCA0MD = 0x00;
OSCICN = 0x87;
P0MDOUT = 0x07;
P1MDOUT = 0xFF;
XBR1 = 0x40;
while(1)
{
for(i=0;i<=360;i++)
move(50+25*cos(2*pi*i/360),75+25*sin(2*pi*i/360));
}
}
void move(float x,float y)
{
static float x1=0,y1=0;
float temp_x,temp_y;
unsigned char i,j;
temp_x=x-x1;
temp_y=y-y1;
j=abs(temp_x);
for(i=0;i<j;i++)
{
if(temp_x>=0) move_point((x1+i),(y1+i*(temp_y/temp_x)));
else move_point(x1-i,y1-i*temp_y/temp_x);
}
move_point(x,y);
x1=x;y1=y;
}
void move_point(float x,float y) //移动到坐标(x,y)上
{
static float L1_LAST=109.4;
static float L2_LAST=142.1;
float L1,L2,move_l1,move_l2;
unsigned int temp;
L1=sqrt((17.6+x)*(17.6+x)+(108-y)*(108-y))+0.5;
L2=sqrt((92.4-x)*(92.4-x)+(108-y)*(108-y))+0.5;
move_l1=L1-L1_LAST;
move_l2=L2-L2_LAST;
L1_LAST=L1;
L2_LAST=L2;
StepperMotor_diever(move_l1,move_l2);
temp=x;
lcd_en_command(0x86);
lcd_en_dat(temp/100+'0');
lcd_en_command(0x87);
lcd_en_dat((temp/10)%10+'0');
lcd_en_command(0x88);
lcd_en_dat((temp%10)+'0');
temp=y;
lcd_en_command(0x8c);
lcd_en_dat(temp/100+'0');
lcd_en_command(0x8d);
lcd_en_dat((temp/10)%10+'0');
lcd_en_command(0x8e);
lcd_en_dat(temp%10+'0');
}
//步时电机延时
void rot_delay(unsigned int k)
{
while(k--);
}
//转动
void Rotation1(unsigned char k)
{
switch(k)
{
case 0:pin1_a=0;pin1_b=1;pin1_c=1;pin1_d=1;break;
case 1:pin1_a=0;pin1_b=0;pin1_c=1;pin1_d=1;break;
case 2:pin1_a=1;pin1_b=0;pin1_c=1;pin1_d=1;break;
case 3:pin1_a=1;pin1_b=0;pin1_c=0;pin1_d=1;break;
case 4:pin1_a=1;pin1_b=1;pin1_c=0;pin1_d=1;break;
case 5:pin1_a=1;pin1_b=1;pin1_c=0;pin1_d=0;break;
case 6:pin1_a=1;pin1_b=1;pin1_c=1;pin1_d=0;break;
case 7:pin1_a=0;pin1_b=1;pin1_c=1;pin1_d=0;break;
default:break;
}
}
void Rotation2(unsigned char k)
{
switch(k)
{
case 0:pin2_a=0;pin2_b=1;pin2_c=1;pin2_d=1;break;
case 1:pin2_a=0;pin2_b=0;pin2_c=1;pin2_d=1;break;
case 2:pin2_a=1;pin2_b=0;pin2_c=1;pin2_d=1;break;
case 3:pin2_a=1;pin2_b=0;pin2_c=0;pin2_d=1;break;
case 4:pin2_a=1;pin2_b=1;pin2_c=0;pin2_d=1;break;
case 5:pin2_a=1;pin2_b=1;pin2_c=0;pin2_d=0;break;
case 6:pin2_a=1;pin2_b=1;pin2_c=1;pin2_d=0;break;
case 7:pin2_a=0;pin2_b=1;pin2_c=1;pin2_d=0;break;
default:break;
}
}
void StepperMotor_diever(float move1,float move2)
{
bit flag1,flag2;
static uchar index1=0,index2=0;
int move_temp1,move_temp2,move_num1,move_num2,i,j,x,y;
if(move1>=0) flag1=1;else flag1=0;
if(move2>=0) flag2=1;else flag2=0;
move_temp1=(move1*400)/13;
move_temp2=(move2*400)/13;
move_num1=abs(move_temp1);
move_num2=abs(move_temp2);
if(move_num1>=move_num2) {i=move_num1/move_num2;j=1;}
else {i=1;j=move_num2/move_num1;;}
while(move_num1!=0||move_num2!=0)
{
for(x=0;x<i;x++)
{
if(move_num1)
{
if(flag1)
{ Rotation1(index1);
rot_delay(10000);
index1++;
index1%=8;
move_num1--;
}
else
{
Rotation1(index1);
rot_delay(10000);
if(index1==0)index1=7;
else index1--;
move_num1--;
}
}
}
for(y=0;y<j;y++)
{
if(move_num2)
{
if(flag2)
{
Rotation2(index2);
rot_delay(10000);
index2++;
index2%=8;
move_num2--;
}
else
{
Rotation2(index2);
rot_delay(10000);
if(index2==0)index2=7;
else index2--;
move_num2--;
}
}
}
}
}
void delay4(void)
{unsigned int i=3000;
while(i--){wait;}
}
void lcd_init(void)
{
lcd_en_command(0x33);
delay4();
lcd_en_command(0x28);
delay4();
lcd_en_command(0x0c);//开显示
delay4();
lcd_en_command(0x01);
delay4();
lcd_en_command(0x0c);delay4();
lcd_en_command(0x06);delay4();
lcd_en_command(0x14);delay4();
}
void lcd_en_command(unsigned char command)//把命令写进去
{unsigned char k;
delay4();
P0=0x04;//设置为写命令状态
wait;wait;
k=command&0xf0;
P0|=k;
wait;wait;
e=0;
P0=0x04;
k=command&0x0f;
k<<=4;
wait;wait;
P0|=k;
wait;wait;
e=0;
}
void lcd_en_dat(unsigned char dat)//把要显示的字符写进去
{unsigned char k;
delay4();
P0=0x05;//设置为写数据状态
k=dat&0xf0;
wait;wait;
P0|=k;
wait;wait;
e=0;
delay4();
P0=0x05;
k=dat&0x0f;
k<<=4;
wait;wait;
P0|=k;
wait;wait;
e=0;
delay4();
}
//================================定时按键扫描=======================
//定时器0初始化
void timer1_init()
{
TMOD |= 0X20;
ET1 = 1;
TR1 = 1;
P2 = 0x0f;
}
//定时器0中断服务程序
void timer1_isr(void)interrupt 3
{
TR1=0;
count_time++;
if(count_time%100==0)
{
if((P2&0x0f)==0x0f) count_time%=100;
if(count_time/100==2)
{
key = P2;
P2 = 0xf0;
_nop_();_nop_();
_nop_();_nop_();
key|=P2;
P2 = 0x0f;
_nop_();_nop_();
_nop_();_nop_();
while(P2&0x0f!=0x0f);
}
}
TR1=1;
}
gui.zip_PLOTTER_c8051f410_绘图仪
版权申诉
20 浏览量
2022-09-23
10:15:38
上传
评论
收藏 2KB ZIP 举报
钱亚锋
- 粉丝: 88
- 资源: 1万+
最新资源
- keil2 + proteus + 8051.exe
- 1961ee27df03bd4595d28e24b00dde4e_744c805f7e4fb4d40fa3f695bfbab035_8(1).c
- mediapipe-0.9.0.1-cp37-cp37m-win-amd64.whl.zip
- windows注册表编辑工具
- mediapipe-0.9.0.1-cp37-cp37m-win-amd64.whl.zip
- 校园通行码预约管理系统20240522075502
- 车类型数据集6250张VOC+YOLO格式.zip
- The PyTorch implementation of STGCN.STGCN-main.zip
- 092300108.cpp
- 车类型数据集6000张VOC+YOLO格式.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈