52单片机如51单片机的指令集是一样的,写电机的正反转程序,就是用一个电桥啊,就是4个三极管组成桥B,然后对应的墙壁打通就可以让电系症状,另外的对对比对面的桥臂导通可以用电机反转,所以直接用单片机的io口引脚输出高低电平就可以控制电机的症状和反转的。
"测速直流电机的c程序"这是什么意思?直流电机测速还需要c程序?直流电机通电就转c程序可以通过PWM对其调速,但这与测速好像木有太大关系,下面是51单片机I/O模拟PWM程序:
/
声明: 在网上找的
Title: 模拟PWM输出
Description: 51单片机模拟PWM输出控制灯的100个档级
/
#include <reg51h>
#define uInt unsigned int
#define uchar unsigned char
uchar PWM_T = 0; //占空比控制变量
//////////////////主程序入口//////////////////////
void main(void)
{
bit flag = 1; //控制灯渐亮渐熄方式
uInt n;
TMOD=0x02; //定时器0,工作模式2,8位定时模式
TH0=210; //写入预置初值(取值1-255,数越大PWM频率越高)
TL0=210; //写入预置值 (取值1-255,数越大PWM频率越高)
TR0=1; //启动定时器
ET0=1; //允许定时器0中断
EA=1; //允许总中断
P1=0xff; //初始化P1
while(1)
{
for(n=0;n<600;n++); //延时,将响应定时器中断,灯会自动加/减一个档次的亮度
//取值0-65535,数字越大变化越慢
if(flag==1) //灯渐亮
PWM_T++;
else //灯渐熄
PWM_T--;
if(PWM_T>=100) //设置灯亮度级别为10
flag=0;
if(PWM_T==0) //限定最低亮度级别为0
flag = 1;
}
}
///////////////////定时器0中断模拟PWM////////////////////
timer0() interrupt 1 using 2
{
static uchar t ; //PWM计数
t++; //每次定时器溢出加1
if(t==100) //PWM周期
{
t=0; //使t=0,开始新的PWM周期
P1=0x00; //使LED灯亮
}
if(PWM_T==t) //按照当前占空比切换输出为高电平
P1=0xff; //使LED灯灭
}
这里我用的是独立按键,自己改成4x4矩阵键盘就好了
#include<reg52h>
#include<intrinsh>
#define uchar unsigned char
#define uint unsigned int
sbit start_stop=P1^0;
sbit speedup=P1^1;
sbit speeddown= P1^2;
sbit reverse=P1^3;
sbit direction=P0^0;
sbit pwm=P0^1;
sbit shiwei=P3^2;
sbit gewei=P3^3;
uint number1=0;
uchar number=0;
uchar code LEDDis[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳数码管0到9码表
void initial()//T0,C1 定时器0和计数器1的初始设置
{
TMOD=0x51;//T0 工作方式1,C1工作方式1
TH0=(65536-46070)/256;//50ms 定时(在晶振为110592M下)
TL0=(65536-46070)%256;
TH1=0;
TL1=0;
TR0=1;//启动Timer0
TR1=1;//启动COUNTER 1
ET0=1; //定时器1开中断
EA=1; //全局中断允许
}
void timer0() interrupt 1 {
number++;
if(number==19){ // 1 second !19个50ms+中断程序处理时间
number=0;
number1=TL1+256TH1;
TH1=0;
TL1=0;
}
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
void delay(uchar i)//100us delay
{
for(;i>0;i--)
{
uchar j;
for(j=29;j>0;j--){
_nop_();
_nop_();
}
}
}
void display()
{
P2=LEDDis[number1/40];//送十位显示
gewei=1;
shiwei=0;
_nop_();
shiwei=1;
P2=LEDDis[number1/4%10];//送个位显示
gewei=0;
_nop_();
gewei=1;
}
void PWM( uchar count)
{
pwm=1;
delay(count);
//display();
pwm=0;
delay(100-count);
display();//转速显示
}
main()
{
static uchar count;//脉冲宽度数
static uchar on_off=0;//on_off设为启停标志位
pwm=0;
direction=0;
initial();
while(1){
PWM (count);
if(start_stop==0){ //启停按键扫描
delay(100); //按键消抖
if(start_stop==0){
while(!start_stop); //松手检测
if(on_off){
on_off=0;
count=0;
}
else{
on_off=1;
count=50;//启动是瞬时电流大,采用半电压启动
if(count>=60){
count=60;
}
else{
count++;
}
}
while(speedup&speeddown&reverse&start_stop){
PWM(count);
}
}
}
if(!speedup){ //加速检测
delay(100);
if(!speedup){
while(!speedup);
count++;
if(count>=100){
count=100;
}
while(speedup&start_stop&reverse&speeddown){
PWM(count);
}
}
}
if(!speeddown){ // 减速检测
delay(100);
if(!speeddown){
while(!speeddown);
if(count<=1){
count=0;
}
else{
count--;
}
while(speedup&start_stop&reverse&speeddown){
PWM(count);
}
}
}
if(!reverse){ // 换向检测
delay(100);
if(!reverse){
while(!reverse);
direction=!direction;
while(speedup&start_stop&reverse&speeddown){
PWM(count);
}
}
}
}
}
以上就是关于52单片机直流电机正反转程序全部的内容,包括:52单片机直流电机正反转程序、求测速直流电机的c程序、用单片机C51驱动直流电机,可调转速的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)