目录
一、主要功能
二、硬件资源
三、程序编程
四、实现现象
一、主要功能
基于51单片机,采用滑动变阻器连接ADC0832数模转换器模拟角度传感器,然后通过LCD1602显示数值,然后按键按下不动,电机正转,松开停止。第二个按键按下,电机反转,松开停止,角度范围10到80度。
二、硬件资源
基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。
编辑
三、程序编程
#include <REGX52.H> //定义头文件#include<intrins.h> //定义头文件#include<stdio.h> //定义头文件#include "Delay.h" //定义Delay头文件#include "LCD1602.h" //定义LCD1602头文件#define uchar unsigned char //定义变量#define uint unsigned int //定义变量sbit CS=P2^5; //adc0832引脚sbit CLK=P2^3; //adc0832引脚sbit DIO=P2^4; //adc0832引脚sbit Motor1\_IN1 = P3^3; //电机IN口sbit Motor1\_IN2 = P3^4; //电机IN口sbit key1 = P1^0;
sbit key2 = P1^1;
sbit key3 = P1^2;
sbit key4 = P1^3;
sbit key5 = P1^4;uchar get\_AD\_Res() //ADC0832启动读取函数{
uchar i, data1=0, data2=0; //赋值变量
CS=0; //CS赋值低电平
CLK=0;DIO=1;\_nop\_(); //赋值变量 并且等待
CLK=1;\_nop\_(); //赋值变量 并且等待
CLK=0;DIO=1;\_nop\_(); //赋值变量 并且等待
CLK=1;\_nop\_(); //赋值变量 并且等待
CLK=0;DIO=0;\_nop\_(); //赋值变量 并且等待
CLK=1;\_nop\_(); //赋值变量 并且等待
CLK=0;DIO=1;\_nop\_(); //赋值变量 并且等待
for(i=0; i<8; i++) //循环
{
CLK=1;\_nop\_(); //赋值变量 并且等待
CLK=0;\_nop\_(); //赋值变量 并且等待
data1=(data1<<1)|(uchar)DIO;//赋值变量 并且等待
}
for(i=0; i<8; i++) //循环
{
data2=data2|(uchar)DIO<<i;//赋值变量 并且等待
CLK=1;\_nop\_(); //赋值变量 并且等待
CLK=0;\_nop\_(); //赋值变量 并且等待
}
CS=1; //赋值高电平
return(data1 == data2)?data1:0; //返回值}void main() //主函数{
double u,U,R; //定义变量
LCD_Init(); //显示屏初始化
LCD_ShowString(1,1,"jiaodu:"); while(1)
{
u=get\_AD\_Res(); //读取ADC0832值
R=(u/255)*70+10;
// U=(250\*u)/128; //此处将模拟信号转化为数字信号,要根据上拉电阻阻值来确定// R=200\*U/250; //公式换算
LCD_ShowNum(1,8,R,3); //LCD1602第一行第13个字符开始显示R的值
if(key1==0)
{
Motor1_IN1 = 1;
Motor1_IN2 = 0;
} else if(key1 == 1)
{
Motor1_IN1 = 0;
Motor1_IN2 = 0;
}
if(key2==0)
{
Motor1_IN2 = 1;
Motor1_IN1 = 0;
} else if(key1 == 1)
{
Motor1_IN1 = 0;
Motor1_IN2 = 0;
}
if(key3==0)
{ Delay(100); if(key3==0)
{
R=10;
}
} if(key4==0)
{ Delay(100); if(key4==0)
{
R=30;
}
}
if(key5==0)
{ Delay(100); if(key5==0)
{
R=55;
}
}
}
}
四、实现现象
具体动态效果看B站演示视频:
基于51单片机的电机控制和角度检测
全部资料(源程序、仿真文件、安装包、演示视频):
百度网盘资料下载