#include "reg52.h"//此文件中定义了单片机的一些特殊功能寄存器
#include <intrins.h>
/***********数据类型声明***********/
typedef unsigned int u16;//对数据类型进行声明定义
typedef unsigned char u8;
/***********IO口相关定义***********/
sbit RS = P2^7;
sbit RW = P2^6;
sbit E = P2^5;
sbit CH_B = P3^3;
sbit PWM = P2^0;
/**********变量定义*************/
u8 flag = 1; //正反转标志位
u8 count = 0; //定时器溢出次数计数
unsigned char count1 = 0; //定时器溢出次数计数 0~255
u16 Pulse_A = 0; //脉冲数计数
float Speed_A = 0;//转数 r/min
void Timer0Init();//定时器0初始化
void Timer1Init();//定时器1初始化
void Int0Init(); //外部中断0初始化
void lcd_int(); //LCD初始化函数
void lcd_w_cmd(unsigned char com); //写命令字函数
void lcd_w_dat(unsigned char dat); //写数据函数
unsigned char lcd_r_start(); //读状态函数
void Delayus(unsigned int t); //延时函数
/*******************主函数*****************************************************/
void main()
{
u8 i = '0';
u16 pulse_a = 0;
u8 arr[5]={0};
lcd_int(); //LCD初始化
Timer0Init(); //定时器0初始化
Timer1Init();//定时器1初始化
Int0Init(); //外部中断0初始化
while(1)
{
lcd_w_cmd(0x80 + 0x00); //设置LCD显示位置,第1行
if( flag == 0) //正反转判断
{
lcd_w_dat('Z'); //正转
}
else
{
lcd_w_dat('F'); //反转
}
if( count >= 20) //20*50ms = 1s 计算转速
{
count = 0; //清0
pulse_a = Pulse_A;
Pulse_A = 0; //清0
Speed_A = pulse_a * 60.0 / 24 ; //计算转数 r/min
arr[0] = (u8)Speed_A/100 + '0'; //百位
arr[1] = (u8)Speed_A/10%10 + '0';//十位
arr[2] = (u8)Speed_A%10 + '0'; //个位
arr[3] = '.'; //小数点
arr[4] = (u8)(Speed_A*10)%10 + '0'; //十分位
lcd_w_cmd(0x80+0x40); //第二行显示位置
for(i=0;i<5;i++)
{
lcd_w_dat(arr[i]); //打印转数
}
}
if( count1 >= 100 ) //周期100*1ms = 100ms
{
count1 = 0 ;
}
if( count1 <= 80 ) //占空比
{
PWM = 1; //高电平 40ms
}
else
{
PWM = 0 ; //低电平 100-50 = 50ms
}
}
}
/*********外部中断0初始化**********************************/
void Int0Init() //设置INT0
{
IT0=1;//跳变沿出发方式(下降沿)
EX0=1;//INT0的中断允许
EA=1;//打开总中断
}
/*外部中断0的中断函数*/
void Int0() interrupt 0
{
Pulse_A++; //脉冲数++
if(CH_B == 1)
{
flag = 0;//正转
}
else
{
flag = 1;//反转
}
}
/*定时器0的中断函数*/
void Timer0() interrupt 1
{
count ++; //每过50ms加1
TH0 = (65536 - 50000)/256; //给定时器赋初值,定时50ms
TL0 = (65536 - 50000)%256;
}
/**********定时器0初始化**************************/
void Timer0Init()
{
TMOD |= 0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
TH0 = (65536 - 50000)/256; //给定时器赋初值,定时50ms
TL0 = (65536 - 50000)%256;
ET0 = 1; //定时器0中断允许
EA = 1; //总中断允许
TR0 = 1; //启动定时器T0
}
/*定时器1的中断函数*/
void Timer1() interrupt 3 // 0 1 2 3 4
{
count1 ++; //每过1ms加1
TH1 = (65536 - 1000)/256; //给定时器赋初值,定时1ms
TL1 = (65536 - 1000)%256;
}
/*******定时器1初始化******************/ //pwm周期100ms 占空比40% 高电平40ms T1定时1ms
void Timer1Init()
{
TMOD |= 0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。 0001 0000
TH1 = (65536 - 1000)/256; //给定时器赋初值,定时1ms
TL1 = (65536 - 1000)%256;
ET1 = 1; //定时器1中断允许
EA = 1; //总中断允许
TR1 = 1; //启动定时器T1
}
/*************LCD初始化函数***************/
void lcd_int()
{
lcd_w_cmd(0x3c); //功能设置:工作方式
lcd_w_cmd(0x0c); //光标控制 0000 1100
lcd_w_cmd(0x01); //清屏
lcd_w_cmd(0x06); //输入方式设置
}
/*************读状态字函数***************/
unsigned char lcd_r_start()
{
unsigned char s;
RW=1;RS=0;_nop_(); _nop_(); _nop_(); E=1; _nop_(); _nop_(); _nop_();
s = P1; //从LCD的数据口读状态
_nop_(); _nop_(); _nop_(); E=0; RW=0;
return s;
}
/*************写命令函数***************/
void lcd_w_cmd(unsigned char com)
{
unsigned char i = 0;
do{ //查LCD忙操作
i=lcd_r_start(); //调用读状态字函数
i = i&0x80; //"与"操作屏蔽掉低7位
}while(i!=0); //LCD忙,继续查询,否则退出循环
RW=0;RS=0; _nop_(); _nop_(); _nop_();
P1=com; _nop_(); _nop_(); _nop_(); //将com值字写入LCD数据口
E=1;_nop_(); _nop_(); _nop_();
E=0;RW=1;nop_();nop_();nop_();
}
/*************写数据函数***************/
void lcd_w_dat(unsigned char dat)
{
unsigned char i = 1;
while( i != 0) //LCD忙,继续查询(等待),否则退出循环
{
i=lcd_r_start(); //读LCD状态
i = i&0x80; //"与"操作屏蔽掉低7位
}
RW=0;RS=1; _nop_(); _nop_(); _nop_(); //RW=0,RS=1,写LCD命令字
P1=dat;_nop_(); _nop_(); _nop_(); //将dat中的显示数据写入LCD数据口
E=1;_nop_(); _nop_(); _nop_();
E=0;RW=1;_nop_(); _nop_(); _nop_();
}
没有合适的资源?快使用搜索试试~ 我知道了~
编码电机测速_电机测速_51单片机电机速度测量仿真_
共17个文件
lst:2个
obj:2个
uvopt:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 3 下载量 7 浏览量
2021-09-29
05:33:59
上传
评论 2
收藏 71KB RAR 举报
温馨提示
Proteus平台上实现直流电机测速,速度测量准确。
资源推荐
资源详情
资源评论
收起资源包目录
编码电机测速.rar (17个子文件)
编码电机测速
Last Loaded 编码器-测速 -LCD-可调电阻.pdsbak 18KB
编码电机测速-C51
MOTOT ENCODE.uvgui.Administrator 87KB
MOTOT ENCODE.uvproj 14KB
Listings
main.lst 10KB
MOTOT ENCODE.m51 14KB
STARTUP.lst 14KB
STARTUP.A51 6KB
MOTOT ENCODE.uvopt 6KB
Objects
MOTOT ENCODE.lnp 115B
MOTOT ENCODE.build_log.htm 1KB
main.obj 10KB
STARTUP.obj 819B
MOTOT ENCODE 11KB
MOTOT ENCODE.hex 4KB
main.c 5KB
编码器-测速 -LCD-可调电阻.pdsprj.LAPTOP-8LG61E2H.Administrator.workspace 985B
编码器-测速 -LCD-可调电阻.pdsprj 18KB
共 17 条
- 1
资源评论
- qq_458096462021-11-24用户下载后在一定时间内未进行评价,系统默认好评。
- m0_570515462021-10-23用户下载后在一定时间内未进行评价,系统默认好评。
- 2301_768119552023-06-14资源内容总结地很全面,值得借鉴,对我来说很有用,解决了我的燃眉之急。
弓弢
- 粉丝: 42
- 资源: 4022
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功