📄 rs232c.c
字号:
#include <at89x52.h>
#include <stdio.h>
sfr WDTRST = 0xA6;
sbit MOTOR_STOP = P2^0;
unsigned int number = 0;
unsigned char r_buf=0;
unsigned char motor_direction = 0;
unsigned char stop = 0;
unsigned char disp_buf=0;
unsigned char counter;
#define STEP 500 //设置step_run模式时的步长
void watch_dog(void);
void step_motor(unsigned int);
void delay_msec(unsigned int);
//实验板上的数码管编码
unsigned char code tube_array[23] = {0x28,0x7e,0xA2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60,0x30,0x25,0xa9,0x26,0xa1,0xb1,0x35,0xad,0x38,0xb0,0x2c,0xFF,0xa0};
// ********************* 0 ** 1 ** 2 ** 3 ** 4 ** 5 ** 6 ** 7 ** 8 ** 9 ** A ** b ** C ** d ** E ** F ** h ** L ** n ** P ** U ** ** e **
void main()
{
unsigned int msec_reg = 5, number_reg = 0;
TMOD = 0x21;//定时器1用来作为串行通讯的波特率发生器,工作在方式2; 定时器0用来喂狗
SCON = 0x50;//串行口工作在方式1,置位串行口接收允许位REN。
PCON = 0;//设置SMOD为0.
TH0 = (65536-2000)/256; TL0 = (65536-2000)%256;//定时器0置初值
TH1 = 0xE8; TL1 = 0xE8;//设置波特率为1200。
TR0 = 1;
ET0 = 1;
TR1 = 1;
ES = 1;
IP=0x10;
EA = 1;
watch_dog();
stop = 1;
while(1)
{
if(r_buf&&r_buf!=255)
{
disp_buf=r_buf;
//SBUF = 1;
//while(!TI);
//TI=0;
ES = 0; //关串口中断
switch(r_buf) //根据串口送过来的不同字符,单片机采取不同动作
{
case 49: r_buf = 0; //步进,步长可以通过宏STEP调整
number_reg = number;
if(40000-number_reg<1000)
{
number = 0;
number_reg = 0;
}
stop = 0;
while((number-number_reg<=STEP)&&!stop)
{
step_motor(msec_reg);
}
stop = 1;
break;
case 50: r_buf = 0; //改变msec_reg,从而改变电机的速度,低速模式
msec_reg = 5;
break;
case 51: r_buf = 0; //改变msec_reg,从而改变电机的速度,高速模式
msec_reg = 2;
break;
case 52: r_buf = 0;
motor_direction = 1; //改变电机转动的方向
break;
case 53: r_buf = 0; //改变电机转动的方向
motor_direction = 0;
break;
default: r_buf = 0; //清除r_buf不做任何动作
break;
}
ES = 1;//开串口中断
}
}
}
void step_motor(unsigned int msec) //电机工作在八拍工作方式
{
if(!stop)
{
if(motor_direction)
{
P1 = 0xf1; //A#
delay_msec(msec);
P1 = 0xf3; //A#B#
delay_msec(msec);
P1 = 0xf2; //B#
delay_msec(msec);
P1 = 0xf6; //B#A
delay_msec(msec);
P1 = 0xf4; //A
delay_msec(msec);
P1 = 0xfc; //AB
delay_msec(msec);
P1 = 0xf8; //B
delay_msec(msec);
P1 = 0xf9; //BA#
delay_msec(msec);
}
else
{
P1 = 0xf9; //BA#
delay_msec(msec);
P1 = 0xf8; //B
delay_msec(msec);
P1 = 0xfc; //AB
delay_msec(msec);
P1 = 0xf4; //A
delay_msec(msec);
P1 = 0xf6; //B#A
delay_msec(msec);
P1 = 0xf2; //B#
delay_msec(msec);
P1 = 0xf3; //A#B#
delay_msec(msec);
P1 = 0xf1; //A#
delay_msec(msec);
}
number++; //计数
if(number==40000) number = 0;
}
}
void watch_dog(void)
{
WDTRST=0x1e;
WDTRST=0xe1;
}
void time0(void) interrupt 1
{
TH0 = (65536-2000)/256; TL0 = (65536-2000)%256;//定时器0置初值
watch_dog();
if(MOTOR_STOP) stop = 1; //当P2_0为高时,停止电机转动
counter++; //将串口接受到的数据在数码管上显示
if(counter>=3) counter=0;
switch(counter)
{
case 0:
P2=0x7F;
P0=tube_array[disp_buf%100%10];
break;
case 1:
P2=0xBF;
P0=tube_array[(disp_buf%100)/10];
break;
case 2:
P2=0xDF;
P0=tube_array[disp_buf/100];
break;
}
}
void serial(void) interrupt 4
{
if(RI)
{
r_buf=SBUF;
RI=0;
}
}
void delay_msec(unsigned int i)
{
unsigned char j;
while(i--)
{
for(j=0;j<125;j++);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -