这个实验的内容是:电脑通过虚拟的COM端口与单片机进行相互通讯(电脑发给单片机,然后单片机又把接收到的信息发给电脑),发送的信息分别为正转、反转、加速、减速、停止,来控制电机做出相应的反应,并在Proteus上仿真。
模拟串口通讯需要用到2个软件,这里是网盘下载链接:
串口助手
提取码:rzqe
虚拟串口驱动
提取码:1172
这个实验有一个重要的问题,就是一定要选对虚拟串口和波特率,要不然就会不能进行通讯或是通讯时出现乱码。COM端口使用要配对,COM1-COM2,COM3-COM4,优先推荐使用COM3-COM4,波特率最好设置低一点,因为我传输时没有校验位,波特率太高的话容易出现乱码,所以我选择的波特率是4800。再就是程序中设置波特率初值,如果你设置了波特率加倍的话,最终波特率要在波特率的初值上乘以2,注意程序设置的波特率与串口助手要一致。
Proteus图:
具体实现方式请看下面的程序:
#include"main.h"
// 五条信息的Unicode 码如下
//正转:d5 fd d7 aa
//反转:b7 b4 d7 aa
//加速:bc d3 cb d9
//减速:bc f5 cb d9
//停止:cd a3 d6 b9
void main(){
UsartInit(); //串口初始化
timer0_init(); //定时器初始化
while(1){
setmotor(); //控制电机状态的函数
}
}
#ifndef __MAIN_H__
#define __MAIN_H__
#include"setmotor.h"
#include"usart.h"
#endif
#include"setmotor.h"
static unsigned char state=0; //赋0、1、2分别表示电机的三个状态
static unsigned char k=4; //k值决定电机速度的大小,k值越小电机的速度就越大,k值代表延时的长度
static int i;
unsigned char code zz[]={
0x11,0x31,0x21,0x61,0x41,0xc1,0x81,0x91};//正转四相八拍步进电机
unsigned char code fz[]={
0x91,0x81,0xc1,0x41,0x61,0x21,0x31,0x11};//反转
//电机正转
void motor_zz(){
unsigned int j;
for(j=0;j<8;j++){
P1=zz[j];
//每一拍延时一下
for(i=0;i<k;i++){
unsigned int t;
for(t=0;t<3;t++){
timer0_init();
while(~TF0); //当定时器溢出时,TF0为1,退出循环
TF0