⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rs232c.c

📁 本程序为MCU端程序
💻 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 + -