导航:首页 > 操作系统 > 用单片机控制

用单片机控制

发布时间:2022-04-03 15:36:59

⑴ 如何用单片机控制直流电机

通过与单片机相连的按键控制直流电机停启的电路如下图所示,通过P3.6口按键触发启动直流电机,P3.7口的按键触发停止直流电机的运行。由图可知,当P1.0输出高电平“1”时,NPN型三极管导通,直流电机得电转动;当P1.0输出低电平“0”时,NPN型三极管截止,直流电机停止转动。

(1)用单片机控制扩展阅读:

通过单片机产生PWM波控制直流电机程序

#include "reg52.h"


#define uchar unsigned char


#define uint unsigned int


uchar code table[10]={0x3f,0x06,0x5b,


0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴数码管显示码(0-9)


sbit xiaoshudian=P0^7;


sbit wei1=P2^4; //数码管位选定义


sbit wei2=P2^5;


sbit wei3=P2^6;


sbit wei4=P2^7;


sbit beep=P2^3; //蜂鸣器控制端


sbit motor = P1^0; //电机控制


sbit s1_jiasu = P1^4; //加速按键


sbit s2_jiansu= P1^5; //减速按键


sbit s3_jiting=P1^6; //停止/开始按键


uint pulse_count; //INT0接收到的脉冲数


uint num=0; //num相当于占空比调节的精度


uchar speed[3]; //四位速度值存储


float bianhuasu; //当前速度(理论计算值)


float reallyspeed; //实际测得的速度


float vv_min=0.0;vv_max=250.0;


float vi_Ref=60.0; //给定值


float vi_PreError,vi_PreDerror;


uint pwm=100; //相当于占空比标志变量


int sample_time=0; //采样标志


float v_kp=1.2,v_ki=0.6,v_kd=0.2; //比例,积分,微分常数


void delay (uint z)


{


uint x,y;


for(x=z;x>0;x--)


for (y=20;y>0;y--);


}


void time_init()


{


ET1=1; //允许定时器T1中断


ET0=1; //允许定时器T0中断


TMOD = 0x15; //定时器0计数,模式1;定时器1定时,模式1


TH1 = (65536-100)/256; //定时器1值,负责PID中断 ,0.1ms定时


TL1 = (65536-100)%6;


TR0 = 1; //开定时器


TR1 = 1;


IP=0X08; //定时器1为高优级


EA=1; //开总中断


}


void keyscan()


{


float j;


if(s1_jiasu==0) //加速


{


delay(20);


if(s1_jiasu==0)


vi_Ref+=10;


j=vi_Ref;


}


while(s1_jiasu==0);


if(s2_jiansu==0) //减速


{


delay(20);


if(s2_jiansu==0)


vi_Ref-=10;


j=vi_Ref;


}


while(s2_jiansu==0);


if(s3_jiting==0)


{


delay(20);


motor=0;


P1=0X00;


P3=0X00;


P0=0x00;


}


while(s3_jiting==0);


}


float v_PIDCalc(float vi_Ref,float vi_SpeedBack)


{


register float error1,d_error,dd_error;


error1=vi_Ref-vi_SpeedBack; //偏差的计算


d_error=error1-vi_PreError; //误差的偏差


dd_error=d_error-vi_PreDerror; //误差变化率


vi_PreError=error1; //存储当前偏差


vi_PreDerror=d_error;


bianhuasu=(v_kp*d_error+v_ki*vi_PreError+v_kd*dd_error);


return (bianhuasu);


}


void v_Display()


{


uint su;


su=(int)(reallyspeed*10); //乘以10之后强制转化成整型


speed[3]=su/1000; //百位


speed[2]=(su00)/100; //十位


speed[1]=(su0)/10; //个位


speed[0]=su; //小数点后一位


wei1=0; //第一位打开


P0=table[speed[3]];


delay(5);


wei1=1; //第一位关闭


wei2=0;


P0=table[speed[2]];


delay(5);


wei2=1;


wei3=0;


P0=table[speed[1]];


xiaoshudian=1;


delay(5);


wei3=1;


wei4=0;


P0=table[speed[0]];


delay(5);


wei4=1;


}


void BEEP()


{


if((reallyspeed)>=vi_Ref+5||(reallyspeed


{


beep=~beep;


delay(4);


}


}


void main()


{


time_init();


motor=0;


while(1)


{


v_Display();


BEEP();


}


if(s3_jiting==0) //对按键3进行扫描,增强急停效果


{


delay(20);


motor=0;


P1=0X00;


P3=0X00;


P0=0x00;


}


while(s3_jiting==0);


}


void timer0() interrupt 1


{


}


void timer1() interrupt 3


{


TH1 = (65536-100)/256; //1ms定时


TL1 = (65536-100)%6;


sample_time++;


if(sample_time==5000) //采样时间0.1ms*5000=0.5s


{


TR0=0; //关闭定时器0


sample_time=0;


pulse_count=TH0*255+TL0; //保存当前脉冲数


keyscan(); //扫描按键


reallyspeed=pulse_count/(4*0.6); //计算速度


pwm=pwm+v_PIDCalc(vi_Ref,reallyspeed);


if(pwm


if(pwm>100)pwm=100;


TH0=TL0=0;


TR0=1; //开启定时器0


}


num++;


if(num==pwm) //此处的num值,就是占空比


{


motor=0;


}


if(num==100) //100相当于占空比调节的精度


{


num=0;


motor=1;


}


}



⑵ 如何用单片机控制开关

直接用单片机给个信号给按键开关,用开关给cpu发信号

⑶ 单片机 控制

这个东西我以前在一种微波报警器中用过,很不错。

一楼说的不行,理由是:“要带端口方向寄存器的那种,设为输入且禁用内部上拉下拉电阻”这是什么单片机呀?为了简单的控制而放弃51?恐怕没人这样做。

二楼说用“可以用IO口驱动三极管,或者IO口驱动光耦的方法实现”,这倒是可行的。

我的方法很简单,51单片机任意三条口线加一个74HC125就解决问题,电路即简单又便宜,效果极好。

P1.0=0,其他口=1,1Y输出+5V(F1接+);

P1.1=0,其他口=1,2Y接GND,(F1接负);

P1.2=0,其他口=1,3Y输出+5V(F2接+)。

电阻R1和R2是防止P1.0和P1.1切换时电源短路。

⑷ 比如我想用单片机普通I/O控制74LS164

#include <reg52.h> //51芯片管脚定义头文件
#include <intrins.h> //内部包含延时函数 _nop_();
#define uchar unsigned char
#define uint unsigned int
sbit data_164 = P1^0;
sbit clk_164 = P1^1;
sbit mr_164 = P1^2;
uchar code display[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
/**********************************************************
延时t毫秒
11.0592MHz时钟,延时约1ms
**********************************************************/
void delayms(uint t)
{
uchar k;
while(t--)
{
for(k=0; k<125; k++)
{;}
}
}
/**********************************************************
写数据子函数
**********************************************************/
void wr_bits(uchar num)
{
uchar i;
for(i=0;i<8;i++)
{
if(num&0x80) //从数据的高位开始送
data_164 =1;
else
data_164 =0;
num<<=1; //向左移动一位
clk_164 =0; //下降沿将数据写入164
_nop_();
clk_164 =1;
}
}

/**********************************************************
主函数
**********************************************************/
void main()
{
uchar n;
P1 = 0xff;
clk_164 =0;
mr_164 =0; //清164输出
delayms(1);
mr_164 =1;

delayms(40);
while(1)
{
for(n=0;n<10;n++)
{
wr_bits(display[n]); //取数显示
delayms(800);
}
}
}

wr_bits(display[n]) 这个语句里的display[n] 就是你要发的数据。你可以根据需要改程序

⑸ 现实生活中,哪些东西可以用单片机控制

大部分都是些具有单一用途的简单的电子设备,普通的有电表,霓虹灯,电子显示器等等,具有特殊用途的有传感器,某些家用电器的部分部件就是单片机,电视,冰箱,空调……

⑹ 什么样的电路要用单片机控制

复杂的电路嘛,如果很简单的就用不着了,简单的也可以用,但是没有那么必要咯,比如你在楼梯见安装一个触摸是灯开关,就用电阻,电容,三极管,或者场效应管就做得出来了,但如果你要用遥控器来控制的话,用普通电路做就难了,但用单片机做也比较容易了。

⑺ 如何用单片机控制开关

上电初始化程序段里面加程序 用以控制全部是低电平,当D1为低电平时 输出D2也为低电平,D3为低电平时 D2输出为高电平 你还要注意程序里面还要处理好 不然会出现矛盾的地方 程序还是要调整好!

⑻ 用单片机控制一个电路的开关

如果用220电源的话,使用继电器,1、不用再考虑强弱信号隔离问题,2、开关电流容量大。
如果用低压电源给灯供电,可以用继电器,也可以用晶体管开关

⑼ 怎样用单片机来控制电机的方向

步进电机只需改变绕组的供电顺序,可以首先电机的方向控制。

阅读全文

与用单片机控制相关的资料

热点内容
手游mc服务器怎么设置管理员 浏览:200
pso算法优化参数 浏览:606
java打开pdf文件怎么打开 浏览:369
用银行家算法拒绝死锁的例题 浏览:670
洗盘选股指标源码 浏览:705
百度云盘下载的压缩包怎么解压 浏览:737
加密类型是TKIP被我弄掉了 浏览:234
贝刻智能手环app如何下载 浏览:838
公司电脑上的加密文件解密 浏览:462
服务器怎么配置数据库 浏览:889
压缩机和制冷剂 浏览:182
树莓派手机版编程 浏览:926
谷歌编程挑战赛时间安排 浏览:438
自动学习机源码 浏览:938
明日之后星曳镇是什么服务器 浏览:474
编程学有年龄限制吗 浏览:571
工程可靠度pdf 浏览:900
包子解压玩具会爆吗 浏览:143
资治通鉴柏杨版pdf 浏览:852
跆拳道pdf 浏览:205