串口扫描1602电机控制.docx
- 文档编号:30157065
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:25
- 大小:83.57KB
串口扫描1602电机控制.docx
《串口扫描1602电机控制.docx》由会员分享,可在线阅读,更多相关《串口扫描1602电机控制.docx(25页珍藏版)》请在冰豆网上搜索。
串口扫描1602电机控制
串口扫描1602电机控制
/****串口实验详.c******/
/*******************************************************************************
--------------------------------------------------------------------------------
*实验名:
RS232串口试验
*实验说明:
单片机将接收到的数据以10进制显示在LCD1602上面。
*同时通过接收到的数控制程序运行。
*连接方式:
*注意:
*******************************************************************************/
#include
//#include"lcd.h"
#include"lcd1602.h"
//--定义全局函数--//
sbitMotor_1=P1^0;
sbitMotor_2=P1^1;
sbitMotor_3=P1^2;
sbitMotor_4=P1^3;
sbitMotor_5=P1^4;
sbitMotor_6=P1^5;
unsignedcharChCode[]="Receiveddata:
";
unsignedcharCode[13]="";
/*
unsignedcharidataMotor1[13]="9787512415232";
unsignedcharidataMotor2[13]="9787560728544";
unsignedcharidataMotor3[13]="9787030267870";
unsignedcharidataMotor4[13]="9787115122551";
unsignedcharidataMotor5[13]="9787121078934";
unsignedcharidataMotor6[13]="9787121265921";
*/
//--声明全局函数--//
voidDelay10ms(unsignedintc);
voidUsartConfiguration();
voidTimerConfiguration();
unsignedcharreceiveData=0;
unsignedcharnum=0;
unsignedcharn=0;
unsignedintTime1=0;
unsignedintTime2=0;
unsignedintTime3=0;
unsignedintTime4=0;
unsignedintTime5=0;
unsignedintTime6=0;
intflag1=0;
intflag2=0;
intflag3=0;
intflag4=0;
intflag5=0;
intflag6=0;
voiddisplay(unsignedchar*p);
voidMotor();
voidmain()
{
//unsignedchari;
Motor_1=1;
Motor_2=1;
Motor_3=1;
Motor_4=1;
Motor_5=1;
Motor_6=1;
LcdInit();
LCDWrite_String(0,0,"Receiveddata:
");
UsartConfiguration();
TimerConfiguration();
while
(1)
{
/*
if(Time1==20)
{
Motor_4=0;
}
if(Time1==40)
{
Motor_4=1;
Time1=0;
}
*/
/*
if(n==13)
{
LCDWrite_String(0,1,"");
LcdWriteCom(0xc0);
}
*/
Motor();
LcdWriteCom(0xc0);
display(Code);
//LCDWrite_String(0,1,Code);
}
}
voidDelay10ms(unsignedintc)//误差0us
{
unsignedchara,b;
//--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
for(;c>0;c--)
{
for(b=380;b>0;b--)
{
for(a=130;a>0;a--);
}
}
}
voiddisplay(unsignedchar*p)//显示////978751241523297875607285449787030267870
{//978711512255197871210789349787121265921
while(*p!
='\0')
{
LcdWriteData(*p);
p++;
Delay10ms
(1);
}
}
voidMotor()
{
//unsignedchari;
if((Code[0]=='9')&&
(Code[1]=='7')&&
(Code[2]=='8')&&
(Code[3]=='7')&&
(Code[4]=='5')&&
(Code[5]=='1')&&
(Code[6]=='2')&&
(Code[7]=='4')&&
(Code[8]=='1')&&
(Code[9]=='5')&&
(Code[10]=='2')&&
(Code[11]=='3')&&
(Code[12]=='2')
)
{
//Motor_1=0;
ET0=1;//打开定时器0中断
TR0=1;//启动定时器0
}
else
Time1=0;
if((Code[0]=='9')&&
(Code[1]=='7')&&
(Code[2]=='8')&&
(Code[3]=='7')&&
(Code[4]=='5')&&
(Code[5]=='6')&&
(Code[6]=='0')&&
(Code[7]=='7')&&
(Code[8]=='2')&&
(Code[9]=='8')&&
(Code[10]=='5')&&
(Code[11]=='4')&&
(Code[12]=='4')
)
{
//Motor_2=0;
ET0=1;//打开定时器0中断
TR0=1;//启动定时器0
}
else
Time2=0;
if((Code[0]=='9')&&
(Code[1]=='7')&&
(Code[2]=='8')&&
(Code[3]=='7')&&
(Code[4]=='0')&&
(Code[5]=='3')&&
(Code[6]=='0')&&
(Code[7]=='2')&&
(Code[8]=='6')&&
(Code[9]=='7')&&
(Code[10]=='8')&&
(Code[11]=='7')&&
(Code[12]=='0')
)
{
//Motor_3=0;
ET0=1;//打开定时器0中断
TR0=1;//启动定时器0
}
else
Time3=0;
if((Code[0]=='9')&&
(Code[1]=='7')&&
(Code[2]=='8')&&
(Code[3]=='7')&&
(Code[4]=='1')&&
(Code[5]=='1')&&
(Code[6]=='5')&&
(Code[7]=='1')&&
(Code[8]=='2')&&
(Code[9]=='2')&&
(Code[10]=='5')&&
(Code[11]=='5')&&
(Code[12]=='1')
)
{
//Motor_4=0;
ET0=1;//打开定时器0中断
TR0=1;//启动定时器0
}
else
Time4=0;
if((Code[0]=='9')&&
(Code[1]=='7')&&
(Code[2]=='8')&&
(Code[3]=='7')&&
(Code[4]=='1')&&
(Code[5]=='2')&&
(Code[6]=='1')&&
(Code[7]=='0')&&
(Code[8]=='7')&&
(Code[9]=='8')&&
(Code[10]=='9')&&
(Code[11]=='3')&&
(Code[12]=='4')
)
{
//Motor_5=0;
ET0=1;//打开定时器0中断
TR0=1;//启动定时器0
}
else
Time5=0;
if((Code[0]=='9')&&
(Code[1]=='7')&&
(Code[2]=='8')&&
(Code[3]=='7')&&
(Code[4]=='1')&&
(Code[5]=='2')&&
(Code[6]=='1')&&
(Code[7]=='2')&&
(Code[8]=='6')&&
(Code[9]=='5')&&
(Code[10]=='9')&&
(Code[11]=='2')&&
(Code[12]=='1')
)
{
//Motor_6=0;
ET0=1;//打开定时器0中断
TR0=1;//启动定时器0
}
else
Time6=0;
}
voidUsartConfiguration()
{
SCON=0X50;//设置为工作方式1
//TMOD=0X20;//设置计数器工作方式2
TMOD=0X21;//设置计数器工作方式2和定时器0
PCON=0X80;//波特率加倍
//TH1=0XF4;//计数器初始值设置,注意波特率是4800的
//TL1=0XF4;
TH1=0XFA;//计数器初始值设置,注意波特率是9600的
TL1=0XFA;
ES=1;//打开接收中断
EA=1;//打开总中断
TR1=1;//打开计数器
}
/*******************************************************************************
*函数名:
TimerConfiguration()
*函数功能:
配置定时器值
*输入:
无
*输出:
无
*******************************************************************************/
voidTimerConfiguration()
{
EA=1;
TMOD=0x21;//选择工作方式1定时器0串口
//TMOD=0x11;//选择工作方式1定时器0和定时器1
//TMOD=0x01;//选择工作方式1定时器0
TH0=0x3C;//设置初始值,定时50MS
TL0=0xB0;
}
/*******************************************************************************
*函数名:
Timer0()
*函数功能:
定时器0中断函数
*输入:
无
*输出:
无
*******************************************************************************/
voidTimer1()interrupt1
{
unsignedchari;
TH0=0x3C;//设置初始值
TL0=0xB0;
Time1++;
Time2++;
Time3++;
Time4++;
Time5++;
Time6++;
if(Time1==20)
{
Motor_1=0;
}
if(Time1==40)
{
Motor_1=1;
for(i=0;i<13;i++)
{
Code[i]='';
}
Time1=0;
ET0=0;//打开定时器0中断
TR0=0;//启动定时器0
}
if(Time2==20)
{
Motor_2=0;
}
if(Time2==40)
{
Motor_2=1;
for(i=0;i<13;i++)
{
Code[i]='';
}
Time2=0;
ET0=0;//打开定时器0中断
TR0=0;//启动定时器0
}
if(Time3==20)
{
Motor_3=0;
}
if(Time3==40)
{
Motor_3=1;
for(i=0;i<13;i++)
{
Code[i]='';
}
Time3=0;
ET0=0;//打开定时器0中断
TR0=0;//启动定时器0
}
if(Time4==20)
{
Motor_4=0;
}
if(Time4==40)
{
Motor_4=1;
for(i=0;i<13;i++)
{
Code[i]='';
}
Time4=0;
ET0=0;//打开定时器0中断
TR0=0;//启动定时器0
}
if(Time5==20)
{
Motor_5=0;
}
if(Time5==40)
{
Motor_5=1;
for(i=0;i<13;i++)
{
Code[i]='';
}
Time5=0;
ET0=0;//打开定时器0中断
TR0=0;//启动定时器0
}
if(Time6==20)
{
Motor_6=0;
}
if(Time6==40)
{
Motor_6=1;
for(i=0;i<13;i++)
{
Code[i]='';
}
Time6=0;
ET0=0;//打开定时器0中断
TR0=0;//启动定时器0
}
}
voidUsart()interrupt4
{
unsignedchari;
Code[n]=SBUF;
n++;
i++;
if(n==13)
{
//Code[0]=Code[13];
//LcdWriteCom(0x01);
n=0;
}
RI=0;
}
/****lcd1602.c******/
#include"lcd1602.h"
/*******************************************************************************
*函数名:
Lcd1602_Delay1ms
*函数功能:
延时函数,延时1ms
*输入:
c
*输出:
无
*说名:
该函数是在12MHZ晶振下,12分频单片机的延时。
*******************************************************************************/
voidLcd1602_Delay1ms(uintc)//误差0us
{
uchara,b;
for(;c>0;c--)
{
for(b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
/*******************************************************************************
*函数名:
voidLCDWrite_String(ucharx,uchary,uchar*s)
*函数功能:
向LCD写入一个字符串
*输入:
x,y,*s
*输出:
无
*******************************************************************************/
voidLCDWrite_String(ucharx,uchary,uchar*s)//x0~15,y0,1
{
LCD_set_xy(x,y);
while(*s)
{
LcdWriteData(*s);
s++;
}
}
/*******************************************************************************
*函数名:
voidLCD_set_xy(ucharx,uchary)
*函数功能:
指定向LCD写入字符串的位置
*输入:
x,y
*输出:
无
*******************************************************************************/
voidLCD_set_xy(ucharx,uchary)
{
uchar*t="";
if(y==1)
{
LcdWriteCom(0xc0);//写入前清空整行
//LcdWriteCom(0xc0+x);//写入前除此行指定写入位置外全部清空
while(*t)
{
LcdWriteData(*t);
t++;
}
LcdWriteCom(0xc0+x);
}
if(y==0)
{
LcdWriteCom(0x80);//写入前清空整行
//LcdWriteCom(0x80+x);//写入前除此行指定写入位置外全部清空
while(*t)
{
LcdWriteData(*t);
t++;
}
LcdWriteCom(0x80+x);
}
}
/*******************************************************************************
*函数名:
LcdWriteCom
*函数功能:
向LCD写入一个字节的命令
*输入:
com
*输出:
无
*******************************************************************************/
#ifndefLCD1602_4PINS//当没有定义这个LCD1602_4PINS时
voidLcdWriteCom(ucharcom)//写入命令
{
LCD1602_E=0;//使能
LCD1602_RS=0;//选择发送命令
LCD1602_RW=0;//选择写入
LCD1602_DATAPINS=com;//放入命令
Lcd1602_Delay1ms
(1);//等待数据稳定
LCD1602_E=1;//写入时序
Lcd1602_Delay1ms(5);//保持时间
LCD1602_E=0;
}
#else
voidLcdWriteCom(ucharcom)//写入命令
{
LCD1602_E=0;//使能清零
LCD1602_RS=0;//选择写入命令
LCD1602_RW=0;//选择写入
LCD1602_DATAPINS=com;//由于4位的接线是接到P0口的高四位,所以传送高四位不用改
Lcd1602_Delay1ms
(1);
LCD1602_E=1;//写入时序
Lcd1602_Delay1ms(5);
LCD1602_E=0;
//Lcd1602_Delay1ms
(1);
LCD1602_DATAPINS=com<<4;//发送低四位
Lcd1602_Delay1ms
(1);
LCD1602_E=1;//写入时序
Lcd1602_Delay1ms(5);
LCD1602_E=0;
}
#endif
/*******************************************************************************
*函数名:
LcdWriteData
*函数功能:
向LCD写入一个字节的数据
*输入:
dat
*输出:
无
*******************************************************************************/
#ifndefLCD1602_4PINS
voidLcdWriteData(uchardat)//写入数据
{
LCD1602_E=0;//使能清零
LCD1602_RS=1;//选择输入数据
LCD1602_RW=0;//选择写入
LCD1602_DATAPINS=dat;//写入数据
Lcd1602_Delay1ms
(1);
LCD1602_E=1;//写入时序
Lcd1602_Delay1ms(5);//保持时间
LCD1602_E=0;
}
#else
voidLcdWriteData(uchardat)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 串口 扫描 1602 电机 控制