目录
一、主要功能
二、硬件资源
三、程序编程
四、实现现象
一、主要功能
基于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单片机的电机控制和角度检测
全部资料(源程序、仿真文件、安装包、演示视频):
百度网盘资料下载