51单片机控制继电器
51单片机串口控制继电器
51单片机串口控制继电器
实验室有个项目,用到报警功能。
比如当温度或应力过高或者过低的时候启动报警器,通过给串口发送一个命令来控制继电器。
不巧去年被我正负极接反烧了,最近开始搞单片机,哥苦心经营,利用实验室单片机学习板给搞定了,程序如下:
#include;
#define uchar unsigned char
sbit JDQ=P3^7; //继电器接P3.7
sbit FMQ=P3^6;
sbit LED=P0^0;
sbit LEDra=P0^1;
sbit LEDar=P0^2;
uchar dat[4];
int i=0;
void Delay(unsigned int ii) //1mS
{
unsigned int jj;
for(;ii>;0;ii--)
for(jj=0;jj;=4)i=0;else;
}
EA=1;
}
main() //串口方式1发送时的定时信号,也就是移位脉冲,由定时器1产生。
不是定时器0。
{
init_serialcom();
Delay(10);
while(1);
}
第一次独立写的,程序粗糙了点,但是完美运行。
发送:E5A1 104E,继电器闭合
E5A1 114D,继电器断开
这里控制用到了四个字节,所以在中断程序里面我定义了一个数组,最后判断这四个字节是否都正确。
如果一个字节的话更简单。
下一步要用无线控制,等哥哥好消息吧。
单片机控制继电器的原理
单片机控制继电器的原理
单片机控制继电器的原理是通过单片机的IO口输出电平信号
来控制继电器的开关动作。
继电器是一种电磁开关,具有较大的电流和电压容量,可以实现对高功率设备的控制。
单片机通常通过GPIO(General Purpose Input Output)口来控
制继电器。
GPIO口可以通过配置寄存器来设置为输出模式。
在输出模式下,单片机可以将数字电平信号输出到GPIO口,
即可以控制高电平或低电平。
在控制继电器时,可以通过GPIO口输出高电平或低电平信号。
在某些型号的继电器中,高电平可以表示继电器的闭合状态,低电平表示继电器的断开状态;而在另一些型号的继电器中,情况恰好相反。
因此,在使用具体型号继电器时,需要根据其规格书来确定高低电平的含义。
当单片机的GPIO口输出电平与继电器的工作电平匹配时,继
电器将打开或关闭。
通过这种方式,单片机可以控制继电器的状态,从而控制与继电器相连的电路的通断。
需要注意的是,单片机的GPIO口一般只能提供较小的电流,
因此在连接继电器时,通常需要使用电流放大器或者继电器驱动电路来增加电流的驱动能力,以确保继电器可靠地工作。
此外,为了保护单片机的IO口,通常还会在继电器与单片机之
间加入保护电路,如继电器的阻抗匹配电路、电流限制电路等,以防止继电器产生的电压、电流冲击对单片机造成损坏。
51单片机DS18B20温度设定控制继电器程序
#include <AT89X52.h>//按键是P0.1、P0.2-P0.3#define uint unsigned int#define uchar unsigned charsbit JDQ=P3^7;//继电器sbit LED=P3^6;//LEDsbit DQ=P3^5;//DS18B20sbit wx1=P2^0;sbit wx2=P2^1;sbit wx3=P2^2;sbit wx4=P2^3;bit BZ1,BZ2,BZ0;static uchar key;uchar MS;uchar shuju,wendu;//温度设定上限下限uchar disdata[4];//1820温度分配内存uchar DispBuf[4];//设定温度分配内存下限uchar Disp[4];//设定温度上限static uint tvalue;//温度值uchar tflag;//温度正负标志uchar code weixuan[]={0xfe,0xfd,0xf7,0xfb};//0xfe,0xfd,0xfb,0xf7uchar code duanxuan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0 x8e};void delay1(uint ms){ uint x,y;for(x=ms;x>0;x--)for(y=120;y>0;y--);}void delayms(uint ms){ uint x,y;for(x=ms;x>0;x--)for(y=120;y>0;y--);}//**********ds1820程序*****1820延时程序void delay_18B20(unsigned int i)//延时1微秒{while(i--);}//*********************************1820复位程序//void ds1820rst()//{unsigned char x=0;DQ = 1; //DQ复位delay_18B20(4); //延时DQ = 0; //DQ拉低delay_18B20(100); //精确延时大于480usDQ = 1; //拉高delay_18B20(40);}//********************************1820读数据程序uchar ds1820rd()/*读数据*/{unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ = 0; //给脉冲信号dat>>=1;DQ = 1; //给脉冲信号if(DQ)dat|=0x80;delay_18B20(10);}return(dat);}//*********************************************1820写数据程序void ds1820wr(uchar wdata)/*写数据*/{unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = wdata&0x01;delay_18B20(10);DQ = 1;wdata>>=1;}}//********************************************1820访问void read_temp()/*读取温度值并转换*/{uchar a,b;ds1820rst(); //复位就是访问的开始ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0x44);//*启动温度转换*/ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0xbe);//*读取温度*/a=ds1820rd();//读数据b=ds1820rd();//tvalue=b;tvalue<<=8;tvalue=tvalue|a;if(tvalue<0x0fff)tflag=0;else{tvalue=~tvalue+1;tflag=1;}tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数disdata[2]=tvalue/1000;//百位数disdata[3]=tvalue%1000/100;//十位数disdata[1]=tvalue%100/10;//个位数disdata[0]=tvalue%10;//小数位}//***************************************************1820温度显示程序void xianshi(){ uchar BC;wx1=0;P1=duanxuan[disdata[0]]; //小数delay1(5);wx1=1;wx2=0;P1=duanxuan[disdata[1]]+0x80; //各位delay1(5);wx2=1;wx4=0;P1=duanxuan[disdata[3]]; //十位delay1(5);wx4=1;BC=disdata[2];if(BC==1)// 假如为0就不显示{ wx3=0;P1=duanxuan[disdata[2]]; //百位delay1(5);wx3=1;}if (tflag==1)//显示符号{ wx3=0;P1=0x40;delay1(5);wx3=1;}}//*******************************************// void Init(){TMOD=0x11;TH0=(65535-3000)/256;TL0=(65535-3000)%256;TH1=(65535-3000)/256;TL1=(65535-3000)%256;EA=1;ET0=1;ET1=1;}//**********************************//uchar Ajcx()//按键处理程序{static uchar Key,tmp;//Key=P0;if((Key&0xff)==0xff)//判断否则返回0return(0);delayms(5);Key=P0;if((Key&0xff)==0xff)return(0);for(;;){ tmp=P0;//等待按键释放if(tmp==0xff)break;//跳出当前循环}return(Key); //带回按键数据}//****************************************//void main(){Init();while(1){ if(BZ0==0){read_temp();xianshi();if((shuju*10)>tvalue) {LED=0;JDQ=0;}//下限温度if((wendu*10)<tvalue) {LED=1;JDQ=1;}//上限温度}key=Ajcx();//判断按键并带回数据if(key)//返回不是0说明有按键按下{if((key&0x02)==0)//发送代码1MS=MS+1;}if(MS==1) {BZ0=1;TR0=1;TR1=0;BZ1=0;BZ2=1;}if(MS==2) {BZ0=1;TR0=0;TR1=1;BZ1=1;BZ2=0;}}}void temp1() interrupt 1 //下限温度设定{ uchar tmp;static uchar cont;TH0=(65535-3000)/256;TL0=(65535-3000)%256;key=Ajcx();//判断按键并带回数据if(key)//返回不是0说明有按键按下{if((key&0x02)==0)//发送代码1MS=MS+1;}if(MS==2) {BZ1=1;TR0=0;}if(MS==1){DispBuf[3]=0x0a;if((key&0x04)==0)//shuju=shuju+1;if((key&0x08)==0)//shuju=shuju-1;}DispBuf[2]=shuju/100;//百位数DispBuf[1]=shuju%100/10;//十位数DispBuf[0]=shuju%10;//个位数tmp=weixuan[cont];P2=0xff|P2;P2=tmp;tmp=DispBuf[cont];tmp=duanxuan[tmp];P1=tmp;cont++;if(cont==4) cont=0;if(BZ1==1) TR0=0;}void temp2() interrupt 3//上限温度设定{uchar tmp1;static uchar cont1;TH1=(65535-3000)/256;TL1=(65535-3000)%256;key=Ajcx();//判断按键并带回数据if(key)//返回不是0说明有按键按下{if((key&0x02)==0)//发送代码1MS=MS+1;}if(MS==2){Disp[3]=0x0b;if((key&0x04)==0)//wendu=wendu+1;if((key&0x08)==0)//wendu=wendu-1;}else if(MS==3) {BZ2=1;TR1=0;BZ0=0;MS=0;}Disp[2]=wendu/100;//百位数Disp[1]=wendu%100/10;//十位数Disp[0]=wendu%10;//个位数tmp1=weixuan[cont1];P2=0xff|P2;P2=tmp1;tmp1=Disp[cont1];tmp1=duanxuan[tmp1];P1=tmp1;cont1++;if(cont1==4) cont1=0;if(BZ2==1) TR1=0;}。
C51 程序(数码管、继电器等控制程式)解析
以下程式,为T8试烧台的控制程式:器件有六位数码管显示、报警器、和控制交流接触器的12V继电器。
#include <reg52.h>#define uint unsigned int#define uchar unsigned charsbit set=P3^0; //设置时间,按一下相应的位闪烁;sbit jia=P3^3; //设置位按一下加1;sbit jian=P3^6; //设置位按一下减1;sbit go=P3^1; //功能启动按钮;sbit relay1=P2^7; //控制功率;sbit relay2=P2^6; //控制警报;sbit relay3=P2^5; //控制功率;sbit relay4=P2^4; //控制警报;uchar code table[]={ //显示编码0,1,2,3,4,5,6,7,8,9,-,H,E,L,U,R~0x3f,~0x06,~0x5b,~0x4f,~0x66,~0x6d,~0x7d,~0x07,~0x7f,~0x6f,~0x40,~0x76,~0x79,~0x38,~0x3e,~0x77,~0x49,~0x79,~0x38,~0x3f};uchar fen,miao,t0,t1,t2,set_flag,set_wei_flag,jia_flag,jian_flag,go_flag;uchar shi_qianwei,shi_baiwei,shi_shiwei,shi_gewei,fen_shiwei,fen_gewei,miao_shiwei,miao_gewei;uchar set_fen,set_miao,shan,shan_over;char set_shi_q,set_shi_b,set_shi_s,set_shi_g,set_fen_s,set_fen_g,set_miao_s,set_miao_g,set_wei;int shi,set_shi,jingbao;void delay(uint z) //延时函数1ms ;{uint t1,y;for(t1=z;t1>0;t1--)for(y=100;y>0;y--);}void MCUinit() //初始化MCU;{P0=0;P1=0;P2=0;P3=0;set=1;jia=1;jian=1;go =1;set_shi_q=0;set_shi_b=0;set_shi_s=0;set_shi_g=0;set_fen_s=0;set_fen_g=0;set_miao_s=0;set_miao_g=0;set_wei=7;set_flag=0;jia_flag=0;jian_flag=0;go_flag=0;shi=0;fen=0;miao=0;t0=0;t1=0;shan=0;jingbao=0;TMOD=0x11; //使能定时器并加入初值TH0=(65536-50000)/256;TL0=(65536-50000)%256;TH1=(65536-50000)/256;TL1=(65536-50000)%256;EA=1;ET0=1;ET1=1;TR1=1;}void setscanf() // 设置函数{while(set_flag==1){if(set_shi<=99){if(set_wei_flag==1) //设置位自左往右循环;{set_wei_flag=0;set_wei--;if(set_wei<1)set_wei=6;}switch(set_wei){case 1:{if(jia_flag==1){jia_flag=0;set_miao_g++;if(set_miao_g>9)set_miao_g=0;}if(jian_flag==1){jian_flag=0;set_miao_g--;if(set_miao_g<0)set_miao_g=9;}//时十位;=============================P0=table[set_shi_s];P1=0x20;delay(1);P0=0xff;//时个位;=============================P0=table[set_shi_g];P1=0x10;delay(1);P0=0xff;//分十位;=============================P0=table[set_fen_s];P1=0x08;delay(1);P0=0xff;//分个位;=============================P0=table[set_fen_g];P1=0x04;delay(1);P0=0xff;P0=table[set_miao_s];P1=0x02;delay(1);P0=0xff;//秒个位;=============================if(shan<20) //数码管闪烁占空比的控制1:1{P0=table[set_miao_g]&0x7f;}elseif(shan>=20){P0=0xff;}P1=0x01;delay(1);P0=0xff;break;}case 2:{if(jia_flag==1){jia_flag=0;set_miao_s++;if(set_miao_s>5)set_miao_s=0;}if(jian_flag==1){jian_flag=0;set_miao_s--;if(set_miao_s<0)set_miao_s=5;}//时十位;=============================P0=table[set_shi_s];P1=0x20;delay(1);P0=0xff;P0=table[set_shi_g];P1=0x10;delay(1);P0=0xff;//分十位;=============================P0=table[set_fen_s];P1=0x08;delay(1);P0=0xff;//分个位;=============================P0=table[set_fen_g];P1=0x04;delay(1);P0=0xff;//秒十位;=============================if(shan<20) //数码管闪烁占空比的控制1:1{P0=table[set_miao_s]&0x7f;}elseif(shan>=20){P0=0xff;}P1=0x02;delay(1);P0=0xff;//秒个位;=============================P0=table[set_miao_g];P1=0x01;delay(1);P0=0xff;break;}case 3:{if(jia_flag==1){jia_flag=0;set_fen_g++;if(set_fen_g>9)set_fen_g=0;}if(jian_flag==1){jian_flag=0;set_fen_g--;if(set_fen_g<0)set_fen_g=9;}//时十位;============================= P0=table[set_shi_s];P1=0x20;delay(1);P0=0xff;//时个位;============================= P0=table[set_shi_g];P1=0x10;delay(1);P0=0xff;//分十位;============================= P0=table[set_fen_s];P1=0x08;delay(1);P0=0xff;//分个位;============================= if(shan<20) //数码管闪烁占空比的控制1:1 {P0=table[set_fen_g]&0x7f;}elseif(shan>=20){P0=0xff;}P1=0x04;delay(1);P0=0xff;//秒十位;============================= P0=table[set_miao_s];P1=0x02;delay(1);P0=0xff;//秒个位;============================= P0=table[set_miao_g];P1=0x01;delay(1);P0=0xff;break;}case 4:{if(jia_flag==1){jia_flag=0;set_fen_s++;if(set_fen_s>5)set_fen_s=0;}if(jian_flag==1){jian_flag=0;set_fen_s--;if(set_fen_s<0)set_fen_s=5;}//时十位;=============================P0=table[set_shi_s];P1=0x20;delay(1);P0=0xff;//时个位;=============================P0=table[set_shi_g];P1=0x10;delay(1);P0=0xff;//分十位;=============================if(shan<20) //数码管闪烁占空比的控制1:1{P0=table[set_fen_s]&0x7f;}elseif(shan>=20){P0=0xff;}P1=0x08;delay(1);P0=0xff;//分个位;=============================P0=table[set_fen_g];P1=0x04;delay(1);P0=0xff;//秒十位;=============================P0=table[set_miao_s];P1=0x02;delay(1);P0=0xff;//秒个位;=============================P0=table[set_miao_g];P1=0x01;delay(1);P0=0xff;break;}case 5:{if(jia_flag==1){jia_flag=0;set_shi_g++;if(set_shi_g>9)set_shi_g=0;}if(jian_flag==1){jian_flag=0;set_shi_g--;if(set_shi_g<0)set_shi_g=9;}//时十位;=============================P0=table[set_shi_s];P1=0x20;delay(1);P0=0xff;//时个位;=============================if(shan<20) //数码管闪烁占空比的控制1:1{P0=table[set_shi_g]&0x7f;}elseif(shan>=20){P0=0xff;}P1=0x10;delay(1);P0=0xff;//分十位;=============================P0=table[set_fen_s];P1=0x08;delay(1);P0=0xff;//分个位;=============================P0=table[set_fen_g];P1=0x04;delay(1);P0=0xff;//秒十位;=============================P0=table[set_miao_s];P1=0x02;delay(1);P0=0xff;//秒个位;=============================P0=table[set_miao_g];P1=0x01;delay(1);P0=0xff;break;}case 6:{if(jia_flag==1){jia_flag=0;set_shi_s++;if(set_shi_s>9){set_shi_b++;set_shi_s=0;}}if(jian_flag==1){jian_flag=0;set_shi_s--;if(set_shi_s<0)set_shi_s=9;}//时十位;============================= if(shan<20) //数码管闪烁占空比的控制1:1 {P0=table[set_shi_s]&0x7f;}elseif(shan>=20){P0=0xff;}P1=0x20;delay(1);P0=0xff;//时个位;============================= P0=table[set_shi_g];P1=0x10;delay(1);P0=0xff;//分十位;============================= P0=table[set_fen_s];P1=0x08;delay(1);P0=0xff;//分个位;============================= P0=table[set_fen_g];P1=0x04;delay(1);P0=0xff;//秒十位;============================= P0=table[set_miao_s];P1=0x02;delay(1);P0=0xff;//秒个位;============================= P0=table[set_miao_g];P1=0x01;delay(1);P0=0xff;break;}}}else //画面‘三9999三’============ if(set_shi>99){if(set_wei>5)set_wei=4;if(set_wei_flag==1){set_wei_flag=0;set_wei--;if(set_wei<2)set_wei=5;}switch(set_wei){case 2:{if(jia_flag==1){jia_flag=0;set_shi_g++;if(set_shi_g>9)set_shi_g=0;}if(jian_flag==1){jian_flag=0;set_shi_g--;if(set_shi_g<0)set_shi_g=5;}//‘三’位;=============================P0=table[16];P1=0x20;delay(1);P0=0xff;//时千位;=============================P0=table[set_shi_q];P1=0x10;delay(1);P0=0xff;//时百位;=============================P0=table[set_shi_b];P1=0x08;delay(1);P0=0xff;//时分位;=============================P0=table[set_shi_s];P1=0x04;delay(1);P0=0xff;//时个位;=============================if(shan<20) //数码管闪烁占空比的控制1:1{P0=table[set_shi_g]&0x7f;}elseif(shan>=20){P0=0xff;}P1=0x02;delay(1);P0=0xff;//‘三’个位;=============================P0=table[16];P1=0x01;delay(1);P0=0xff;break;}case 3:{if(jia_flag==1){jia_flag=0;set_shi_s++;if(set_shi_s>9)set_shi_s=0;}if(jian_flag==1){jian_flag=0;set_shi_s--;if(set_shi_s<0)set_shi_s=9;}//时千位;============================= P0=table[16];P1=0x20;delay(1);P0=0xff;//时百位;============================= P0=table[set_shi_q];P1=0x10;delay(1);P0=0xff;//时分位;============================= P0=table[set_shi_b];P1=0x08;delay(1);P0=0xff;//时个位;============================= if(shan<20) //数码管闪烁占空比的控制1:1 {P0=table[set_shi_s]&0x7f;}elseif(shan>=20){P0=0xff;}P1=0x04;delay(1);P0=0xff;//秒十位;============================= P0=table[set_shi_g];P1=0x02;delay(1);P0=0xff;//秒个位;============================= P0=table[16];P1=0x01;delay(1);P0=0xff;break;}case 4:{if(jia_flag==1){jia_flag=0;set_shi_b++;if(set_shi_b>9)set_shi_b=0;}if(jian_flag==1){jian_flag=0;set_shi_b--;if(set_shi_b<0)set_shi_b=9;}//时十位;=============================P0=table[16];P1=0x20;delay(1);P0=0xff;//时个位;=============================P0=table[set_shi_q];P1=0x10;delay(1);P0=0xff;//分十位;=============================if(shan<20) //数码管闪烁占空比的控制1:1{P0=table[set_shi_b]&0x7f;}elseif(shan>=20){P0=0xff;}P1=0x08;delay(1);P0=0xff;//分个位;=============================P0=table[set_shi_s];P1=0x04;delay(1);P0=0xff;//秒十位;=============================P0=table[set_shi_g];P1=0x02;delay(1);P0=0xff;//秒个位;=============================P0=table[16];P1=0x01;delay(1);P0=0xff;break;}case 5:{if(jia_flag==1){jia_flag=0;set_shi_q++;if(set_shi_q>9)set_shi_q=0;}if(jian_flag==1){jian_flag=0;set_shi_q--;if(set_shi_q<0)set_shi_q=9;}//时十位;=============================P0=table[16];P1=0x20;delay(1);P0=0xff;//时个位;=============================if(shan<20) //数码管闪烁占空比的控制1:1{P0=table[set_shi_q]&0x7f;}elseif(shan>=20){P0=0xff;}P1=0x10;delay(1);P0=0xff;//分十位;=============================P0=table[set_shi_b];P1=0x08;delay(1);P0=0xff;;//分个位;=============================P0=table[set_shi_s];P1=0x04;delay(1);P0=0xff;//秒十位;=============================P0=table[set_shi_g];P1=0x02;delay(1);P0=0xff;//秒个位;=============================P0=table[16];P1=0x01;delay(1);P0=0xff;break;}}}set_shi=set_shi_q*1000+set_shi_b*100+set_shi_s*10+set_shi_g; set_fen=set_fen_s*10+set_fen_g;set_miao=set_miao_s*10+set_miao_g;if(go==0){delay(10);if(go==0)go_flag=1;set_flag=0;}continue;}}void setdisplay(uchar set_aa,uchar set_ab,uchar set_ba,uchar set_bb,uchar set_ca,uchar set_cb) {//时十位;=============================if(shi<=99){P0=table[set_aa];P1=0x20;delay(1);P0=0xff;}else{P0=table[set_aa];if(shan<=20){P1=0x20;}else{P0=0xff;}delay(1);P0=1;}//时个位;=============================P0=table[set_ab];P1=0x10;delay(1);P0=0xff;//分十位;=============================P0=table[set_ba];P1=0x08;delay(1);P0=0xff;//分个位;=============================P0=table[set_bb];P1=0x04;delay(1);P0=0xff;//秒十位;=============================P0=table[set_ca];P1=0x02;delay(1);P0=0xff;//秒个位;=============================if(shi<=99){P0=table[set_cb];P1=0x01;delay(1);P0=0xff;}else{P0=table[set_cb];if(shan<=20){P1=0x01;}else{P0=0xff;}delay(1);P0=0xff;}}//==================================================================== void display(uchar aa,uchar ab,uchar ba,uchar bb,uchar ca,uchar cb){//时十位;=============================P0=table[aa];P1=0x20;delay(1);P0=0xff;//时个位;=============================P0=table[ab]&0x7f;P1=0x10;delay(1);P0=0xff;//分十位;=============================P0=table[ba];P1=0x08;delay(1);P0=0xff;//分个位;=============================P0=table[bb]&0x7f;P1=0x04;delay(1);P0=0xff;//秒十位;=============================P0=table[ca];P1=0x02;delay(1);P0=0xff;//秒个位;=============================P0=table[cb];P1=0x01;delay(1);P0=0xff;}void initiate(){while(go_flag==1) //启动并开始计时{TR0=1;relay1=1;relay3=1;if(shi<=99) //小时数大于99,显示‘三9999三’方式{display(shi_shiwei,shi_gewei,fen_shiwei,fen_gewei,miao_shiwei,miao_gewei);}else{setdisplay(16,shi_qianwei,shi_baiwei,shi_shiwei,shi_gewei,16);}if(shi>=set_shi) //判断时间是否到设置时间{if(fen>=set_fen){if(miao>=set_miao){jingbao=0;while(1) //时间到了则停止计时,数码显示1s闪烁一次{TR0=0;relay1=0;relay3=0;if(jingbao<=20) //警报响二十秒钟,停3分钟。
动手用单片机控制5V继电器
用单片机控制继电器这里继电器由相应的S8050三极管来驱动,开机时,单片机初始化后的P2.3/P2.4为高电平,+5伏电源通过电阻使三极管导通,所以开机后继电器始终处于吸合状态,如果我们在程序中给单片机一条:CLR P2.3或者CLR P2.4的指令的话,相应三极管的基极就会被拉低到零伏左右,使相应的三极管截至,继电器就会断电释放,每个继电器都有一个常开转常闭的接点,便于在其他电路中使用,继电器线圈两端反相并联的二极管是起到吸收反向电动势的功能,保护相应的驱动三极管.51单片机驱动继电器电路1.基本电路如右图。
2.单片机的IO口输出电流很小4到20mA,所以要用三极管放大来驱动继电器。
主要技术参数1.触点参数:触点形式:1C(SPDT)触点负载:3A 220V AC/30V DC阻抗:≤100mΩ额定电流:3A电气寿命:≥10万次机械寿命:≥1000万次2.线圈参数:阻值(士10%):120Ω线圈功耗:0.2W额定电压:DC 5V吸合电压:DC 3.75V释放电压:DC 0.5V工作温度:-25℃~+70℃绝缘电阻:≥100MΩ型号:HK4100F-DC5V-SH 线圈与触点间耐压:4000V AC/1分钟触点与触点间耐压:750V AC/1分钟继电器工作吸合电流为0.2W/5V=40mA或5V/120Ω≈40mA。
三极管基极电流:继电器的吸合电流/放大倍数=基极电流(40mA/100 =4mA),为工作稳定,实际基极电流应为计算值的2倍以上。
基极电阻:(5V-0.7V)/基极电流=电阻值(4.7V/8mA =3.3KΩ)。
这里单片机IO口输出高电平触发三极管导通。
经过以上的分析计算得出:三极管可用极性是NPN 的9014或8050,电阻选3.3KAT89S52 每个单个的引脚,输出低电平的时候,允许外部电路,向引脚灌入的最大电流为 10 mA;每个 8 位的接口(P1、P2 以及 P3),允许向引脚灌入的总电流最大为 15 mA,而 P0 的能力强一些,允许向引脚灌入的最大总电流为 26 mA;全部的四个接口所允许的灌电流之和,最大为 71 mA。
51单片机串口控制继电器的C源程序
51单片机串口控制继电器的C 源程序————————————————————————————————作者:————————————————————————————————日期:51单片机串口控制继电器的C源程序2009—09-29 23:13计算机通过软件来控制单片机继电器。
操作:计算机使用串口调试助手,当然,可以自己编写控制软件(上位机软件).单片机P1.1口连上继电器C源程序为:#include 〈reg52。
h〉sbit RELAY = P1^1; //定义继电器:接P1^1void delay(unsigned int cnt){while(--cnt);}main(){TMOD=0x20; //TH1=0xfd;TL1=0xfd;SM0=0;SM1=1;REN=1; //控制RITR1=1;/*以上为定时器设置和波特率设置,这样的话,通过串口调试助手发送数据(随意数据)通过改变RI(串口接收标志来实现继电器的吸合与打开*/while(1){if(RI==1){RI=0;delay(500);RELAY=!RELAY; //如果吸合则打开,如果己打开则吸合.}}}以上在AT89s52+Keil上编译调试运行OK。
/****************************************************************************//*电子日历,有时间显示、闹铃、日期、秒表及键盘设置功能*//*功能键A: 设置位数字+1 闹钟模式下为闹钟开关秒表模式下为记时开关*//* 功能键B:设置位数字—1 闹钟模式下为闹钟开关*//* 功能键C:设置模式及设置位选择秒表模式下为清零键*//*功能键D:在四种工作模式下切换设置闹钟开关*//****************************************************************************/#include#include/***************这里设置程序初始化时显示的时间****************/#define SET_HOUR 12 /*设置初始化小时*/#define SET_MINUTE 00 /*设置初始化分钟*/#define SET_SECOND 00 /*设置初始化秒数*//*************************系统地址****************************/#define BASE_PORT 0x8000 /*选通基地址*/#define KEY_LINE BASE_PORT+1 /*键盘行线地址*/#define KEY_COLUMN BASE_PORT+2 /*键盘列线地址*/#define LED_SEG BASE_PORT+4 /*数码管段选地址*/#define LED_BIT BASE_PORT+2 /*数码管位选地址*/#define LED_ON(x) XBYTE[LED_BIT]=(0x01〈〈x) style=”line—height: 25px; ”> #define LED_OFF XBYTE[LED_SEG]=0x00 /*LED显示空*/</x) >/**************在设置模式下对秒分时的宏定义*****************/#define SECOND 0 /*对应数码管右边两位*/#define MINUTE 1 /*对应数码管中间两位*/#define HOUR 2 /*对应数码管左边两位*//********************定义四种工作模式***********************/#define CLOCK clockstr /*时钟模式*/#define ALART alartstr /*闹钟模式*/#define DATE datestr /*日期模式*/#define TIMER timerstr /*秒表模式*//****************以下是所有子函数的声明*********************/void sys_init(void); /*系统的初始化程序*/void display(void); /*动态刷新一次数码管子程序*/void clockplus(void); /*时间加1S的子程序*/void update_clockstr(void); /*更新时间显示编码*/void update_alartstr(void);/*更新闹钟时间的显示编码*/void update_datestr(void); /*更新日期显示编码*/void update_timerstr(void);/*更新秒表时间的显示编码*/void deley(int); /*延时子程序*/void update_dispbuf(unsigned char *); /*更新显示缓冲区*/unsigned char getkeycode(void); /*获取键值子程序*/void keyprocess(unsigned char); /*键值处理子程序*/unsigned char getmonthdays(unsigned int,unsigned char);/*计算某月的天数子程序*//*功能键功能子函数*/void Akey(void); /*当前设置位+1 开关闹钟开关秒表*/void Bkey(void);/*当前设置位—1 开关闹钟*/void Ckey(void); /*设置位选择秒表清零*/void Dkey(void);/*切换四种工作模式*//**********************全局变量声明部分*********************/unsigned char led[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};/*从0~9的LED编码*/unsigned char ledchar[3]={0x5c,0x54,0x71};/*o n f*///unsigned char key[24]={ /*键值代码数组对应键位:*/// 0x70,0x71,0x72,0x73,0x74,0x75, /*7 8 9 A TRACE RESET*/// 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5, /* 4 5 6 B STEP MON */// 0xd0,0xd1,0xd2,0xd3,0xd4,0xd5, /* 1 2 3 C HERE LAST */// 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5}; /* 0 F E D EXEC NEXT */struct{ /*时间结构体变量*/unsigned char s;unsigned char m;unsigned char h;}clock={SET_SECOND,SET_MINUTE,SET_HOUR};struct{ /*闹铃时间结构体变量*/unsigned char m;unsigned char h;}alart={SET_MINUTE,SET_HOUR};struct{ /*日期结构体变量*/unsigned int year;unsigned char month;unsigned char day;}date={6,1,1};struct{/*秒表时间结构体变量*/unsigned char ms;unsigned char s;unsigned char m;}timer={0,0,0};unsigned char dispbuf[6]; /*显示缓冲区数组*/unsigned char clockstr[6]; /*时间显示的数码管编码数组*/unsigned char alartstr[6]; /*闹钟显示的数码管编码数组*/unsigned char datestr[6]; /*日期显示的数码管编码数组*/unsigned char timerstr[6];/*秒表显示的数码管编码数组*/unsigned int itime=0,idot; /*定时器0中断计数*/unsigned char itime1=0; /*定时器1中断计数*/sbit P3_1=P3^1; /*外接蜂鸣器的管脚*/bdata bit IsSet=0; /*设置模式标志位0:正常走时1:设置模式*/bdata bit Alart_EN=0; /*闹铃功能允许位0:禁止闹铃1:允许闹铃*/bdata bit IsBeep=0;/*响铃标志位0:未响铃1:正在响铃*/unsigned char SetSelect=0; /*在设置模式IsSet=1时,正在被设置的位,对应上面的宏*/unsigned char *CurrentMode;/*标志当前正设置的功能,如CurrentMode=CLOCK 或CurrentMode=ALART等*/void timerplus(void);/**************************函数部分*************************/void main(void){sys_init();while(1){XBYTE[KEY_COLUMN,0x00]; /*给键盘列线赋全零扫描码,判断是否有键按下*/while((XBYTE[KEY_LINE]&0x0f)==0x0f) /*检测是否有键按下,无则一直进行LED 的刷新显示*/{if(Alart_EN&&(clock.h==alart。
51单片机控制继电器
引言:51单片机是一种广泛应用于嵌入式系统的微控制器,具有低功耗、易编程、性能稳定等特点。
而继电器则是一种常用的电气开关设备,可以实现对电路的远程控制。
本文将探讨如何使用51单片机控制继电器,介绍电路连接方式、编程实现方法以及常见应用案例。
概述:51单片机控制继电器是一种常见的嵌入式系统应用。
通过合理的电路连接和编程实现,可以实现对继电器的远程控制,从而控制电路的通断状态。
本文将从五个方面对51单片机控制继电器进行详细介绍。
正文:一、电路连接方式1.电源连接a.正确选择电源电压和电源类型b.连接稳压电路2.51单片机引脚连接a.确定控制继电器的引脚b.连接引脚到51单片机3.继电器连接方式a.根据继电器类型选择合适的连接方式b.连接继电器到电路二、编程实现方法1.了解51单片机的编程语言a.学习C语言b.掌握51单片机的特定指令2.基本控制指令a.设置引脚输入输出状态b.控制引脚高低电平3.继电器控制程序设计a.编写继电器控制函数b.调用函数实现对继电器的控制4.通信接口实现a.添加通信模块b.编程实现通信接口5.控制逻辑设计a.利用条件语句实现控制逻辑b.调试程序并提高效率三、常见应用案例1.家居自动化a.控制电灯开关b.控制窗帘的打开和关闭2.工业控制a.控制机器设备的启停b.监控温度、湿度等参数3.安防系统a.控制门禁系统b.控制报警器的开启4.智能农业a.控制灌溉系统b.控制温室内环境5.物联网应用a.控制智能家电b.实现远程监控和控制总结:51单片机控制继电器是一种常见的嵌入式系统应用,通过适当的电路连接和编程实现,可以实现对继电器的远程控制。
本文从电路连接方式、编程实现方法和常见应用案例等方面进行了详细介绍,希望能对读者在实际应用中提供一定的帮助和指导。
同时,读者在使用过程中应注意安全问题,合理使用继电器,确保电路的稳定运行。
引言:51单片机作为一种常用的微控制器,具有体积小、功耗低、性能稳定等特点,被广泛应用于各种控制系统中。
51系列八入八出继电器可编程工控板产品使用手册
八入八出继电器工控板带掉电存储简要说明:一、尺寸:长150mmX宽122mmX高25mm二、主要芯片:AT89S52单片机(或者STC89C52)三、工作电压:直流12伏四、单片机标准十针下载接口。
(可使用并口下载线和USB下载线下载)五、特点:1、具有电源指示。
2、八路输入光电隔离引入信号。
3、八路输出光电隔离输出控制继电器。
4、标准的11.0592M晶振。
(便于设置串口波特率)5、具有上电复位和手动复位。
6、支持AT89SXX系列单片机。
7、带有掉电存储功能,芯片24C08。
8、输入八路具有LED指示。
9、输出八路具有LED指示。
10、八路12V继电器控制,控制设备。
11、可控制交流220V/10A一下设备。
(最大控制设备2000W)12、具有串口通信功能(可以上位机控制)。
13、单片机无加密,可插拔更换,带有程序下载口,可随意更改程序。
使用说明:【输入部分标注说明】【输出部分标注说明】【主要器件标注说明】【上位机界面】(提供源代码)【测试程序】实现功能:1、实现输入对输出一对一控制,第一次按下开关,继电器吸合,再次按下继电器断开。
2、实现上位机(计算机)对继电器控制,发送不同的代码,控制对应的继电器(详细内容看程序)。
3、具有掉电存储功能,即,断电后,再恢复通电,继电器输出断电前状态。
/********************************************************************汇诚科技实现功能:此版配套测试程序使用芯片:AT89S52晶振:11.0592MHZ波特率:9600编译环境:Keil作者:zhangxinchun淘宝店:汇诚科技【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!*********************************************************************//********************************************************************单片机与PC机采用9针串口,MAX232通讯,波特率默认为9600.单片机接收PC机发送的十六进制码表如下:01、全开:PC发送0xFF;单片机返回0XFF;02、全关:PC发送0X00;单片机返回0X00;03、第一路开:PC发送0x01;单片机返回0X01;04、第二路开:PC发送0x02;单片机返回0X02;05、第三路开:PC发送0x03;单片机返回0X03;06、第四路开:PC发送0x04;单片机返回0X04;07、第五路开:PC发送0x05;单片机返回0X05;08、第六路开:PC发送0x06;单片机返回0X06;09、第七路开:PC发送0x07;单片机返回0X07;10、第八路开:PC发送0x08;单片机返回0X08;11、第一路关:PC发送0xFE;单片机返回0XFE;12、第二路关:PC发送0xFD;单片机返回0XFD;13、第三路关:PC发送0xFC;单片机返回0XFC;14、第四路关:PC发送0xFB;单片机返回0XFB;15、第五路关:PC发送0xFA;单片机返回0XFA;16、第六路关:PC发送0xF9;单片机返回0XF9;17、第七路关:PC发送0xF8;单片机返回0XF8;18、第八路关:PC发送0xF7;单片机返回0XF7;19、输入状态查询:PC发送0x55;单片机返回输出状态(返回值十六进制);20、输出状态查询:PC发送0xAA;单片机返回输出状态(返回值十六进制);21、输出取反指令:PC发送0X11;单片机返回0x11;*********************************************************************/ #include<reg52.h>#define uchar unsigned char//宏定义无符号字符型#define uint unsigned int//宏定义无符号整型/********************************************************************初始定义*********************************************************************/ uchar sj;//存储数据值bit write=0;//写24C08的标志;uchar dat=0xee;//用于存储单片机接收发送缓冲寄存器SBUF里面的内容/*定义八位出为单片机P2口*/sbit K1=P2^0;sbit K2=P2^1;sbit K3=P2^2;sbit K4=P2^3;sbit K5=P2^4;sbit K6=P2^5;sbit K7=P2^6;sbit K8=P2^7;/*定义八位入为单片机P1口*/sbit IN0=P1^0;sbit IN1=P1^1;sbit IN2=P1^2;sbit IN3=P1^3;sbit IN5=P1^5;sbit IN6=P1^6;sbit IN7=P1^7;/********************************************************************24C08读写驱动程序*********************************************************************/ sbit scl=P3^6;//24c08SCLsbit sda=P3^7;//24c08SDAvoid delay1(uchar x){uint i;for(i=0;i<x;i++);;}void flash(){;;}void x24c08_init()//24c08初始化子程序{scl=1;flash();sda=1;flash();}void start()//启动(I方C)总线{sda=1;flash();scl=1;flash();sda=0;flash();scl=0;flash();}void stop()//停止(I方C)总线{sda=0;flash();scl=1;flash();sda=1;flash();}void writex(uchar j)//写一个字节{uchar i,temp;temp=j;for(i=0;i<8;i++){temp=temp<<1;scl=0;flash();sda=CY;flash();scl=1;flash();}scl=0;flash();sda=1;flash();}uchar readx()//读一个字节{scl=0;flash();sda=1;for(i=0;i<8;i++){flash();scl=1;flash();if(sda==1)j=1;else j=0;k=(k<<1)|j;scl=0;}flash();return(k);}void clock()//(I方C)线时钟{unsigned char i=0;scl=1;flash();while((sda==1)&&(i<255))i++;scl=0;flash();}/********************************************************************从24c08的地址address中读取一个字节数据*********************************************************************/ unsigned char x24c08_read(unsigned char address){unsigned char i;start();writex(0xa0);clock();writex(address);clock();start();writex(0xa1);clock();i=readx();stop();delay1(10);return(i);}/********************************************************************向24c08的address地址中写入一字节数据*********************************************************************/ void x24c08_write(unsigned char address,unsigned char info){EA=0;start();writex(0xa0);clock();writex(address);clock();writex(info);clock();stop();EA=1;delay1(50);}/********************************************************************延时函数*********************************************************************/void delay(uchar t){uchar i,j;for(i=0;i<t;i++){for(j=13;j>0;j--);{;}}}/********************************************************************功能:串口初始化,波特率9600,方式1*********************************************************************/void Init_Com(void){TMOD=0x20;PCON=0x00;SCON=0x50;TH1=0xFd;TL1=0xFd;TR1=1;}/********************************************************************接收数据判断函数*********************************************************************/ chuankou(){switch(dat)//接收数据判断{uchar k;k=10;case0xff:P2=0X00;delay(k);SBUF=dat;dat=0xee;write=1;break;//全开case0x00:P2=0XFF;delay(k);SBUF=dat;dat=0xee;write=1;break;//全关case0x01:K1=0;delay(k);SBUF=dat;dat=0xee;write=1;break;//第一路开case0x02:K2=0;delay(k);SBUF=dat;dat=0xee;write=1;break;//第二路开case0x03:K3=0;delay(k);SBUF=dat;dat=0xee;write=1;break;//第三路开case0x04:K4=0;delay(k);SBUF=dat;dat=0xee;write=1;break;//第四路开case0x05:K5=0;delay(k);SBUF=dat;dat=0xee;write=1;break;//第五路开case0x06:K6=0;delay(k);SBUF=dat;dat=0xee;write=1;break;//第六路开case0x07:K7=0;delay(k);SBUF=dat;dat=0xee;write=1;break;//第七路开case0x08:K8=0;delay(k);SBUF=dat;dat=0xee;write=1;break;//第八路开case0xFE:K1=1;delay(k);SBUF=dat;dat=0xee;write=1;break;//第一路关case0xFD:K2=1;delay(k);SBUF=dat;dat=0xee;write=1;break;//第二路关case0xFC:K3=1;delay(k);SBUF=dat;dat=0xee;write=1;break;//第三路关case0xFB:K4=1;delay(k);SBUF=dat;dat=0xee;write=1;break;//第四路关case0xFA:K5=1;delay(k);SBUF=dat;dat=0xee;write=1;break;//第五路关case0xF9:K6=1;delay(k);SBUF=dat;dat=0xee;write=1;break;//第六路关case0xF8:K7=1;delay(k);SBUF=dat;dat=0xee;write=1;break;//第七路关case0xF7:K8=1;delay(k);SBUF=dat;dat=0xee;write=1;break;//第八路关case0x55:SBUF=P1;delay(k);dat=0xee;break;//读输入口状态case0xAA:SBUF=P2;delay(k);dat=0xee;write=1;break;//读输出口状态case0x11:P2=~P2;delay(k);SBUF=dat;dat=0xee;write=1;break;//输出口取反default:break;//跳出}}/********************************************************************按键函数*********************************************************************/KEY(){uchar k;k=100;if(IN0==0){delay(k);while(!IN0);K8=!K8;write=1;}if(IN1==0){delay(k);while(!IN1);K7=!K7;write=1;}if(IN2==0){delay(k);while(!IN2);K6=!K6;write=1;}if(IN3==0){delay(k);while(!IN3);K5=!K5;write=1;}if(IN4==0){delay(k);while(!IN4);K4=!K4;write=1;}if(IN5==0){delay(k);while(!IN5);K3=!K3;write=1;}if(IN6==0){delay(k);while(!IN6);K2=!K2;write=1;}if(IN7==0){delay(k);while(!IN7);K1=!K1;write=1;}}/********************************************************************主函数*********************************************************************/void main(){Init_Com();//串口初始化x24c08_init();//初始化24C08sj=x24c08_read(2);//读出保存的数据赋于datP2=sj;//将存储的数据赋予P2口while(1){chuankou();//接收数据判断函数if(RI)//扫描判断是否接收到数据,{dat=SBUF;//接收数据SBUF赋与datRI=0;//RI清零。
单片机控制继电器原理是怎样的
单片机控制继电器原理是怎样的
继电器是一种电磁开关,由电磁线圈和机械开关两部分组成。
当电磁线圈得到足够的电流激励时,会产生磁场,使得机械开关闭合或断开。
单片机通过控制继电器的电磁线圈电流来实现继电器的开关动作。
在单片机中,输出口可以输出高电平和低电平两种状态,分别代表逻辑1和逻辑0。
继电器的控制端接在单片机的输出口,当单片机输出高电平时,继电器的电磁线圈得到足够的电流激励,产生磁场,使得机械开关闭合。
当单片机输出低电平时,继电器的电磁线圈电流下降,磁场消失,机械开关断开。
1.确定单片机的输出口,并连接至继电器的控制端。
2.在单片机的程序中,通过代码设置输出口为高电平或低电平。
可以通过特定的语句或寄存器设置来实现。
3.当输出口为高电平时,继电器的电磁线圈获得足够的电流激励,产生磁场,机械开关闭合;当输出口为低电平时,电磁线圈的电流减小,磁场消失,机械开关断开。
通过改变输出口的电平状态,可以实现对继电器的开关状态的控制。
4.根据需要,可以在单片机的程序中设置相应的时间延迟,以控制继电器的动作时间。
通过调整延迟时间,可以控制继电器的开关速度。
需要注意的是,单片机的输出电流一般较小,不能直接驱动继电器的电磁线圈。
因此,通常需要通过驱动电路,如三极管或场效应管等,来放大单片机的输出电流,以满足继电器电磁线圈的工作电流要求。
单片机控制继电器可以应用于各种自动控制系统中,如家电控制、工业自动化控制、仪器仪表控制等。
通过合理地设置单片机的输出口,并结合相应的驱动电路,可以实现对继电器的精确控制,从而实现各种开关动作的自动化控制。
单片机控制继电器原理
单片机控制继电器原理单片机控制继电器原理继电器在电子控制领域中常常被用来进行交流电源开关的控制,而单片机作为一种常见的控制元件也常常被用于控制电路。
那么,单片机是如何控制继电器的呢?首先,我们需要了解继电器的基本工作原理。
继电器的核心部件是触点,当继电器激活时,触点会闭合或打开。
而继电器的激活信号通常是一段较小的电流信号,称为控制信号。
当控制信号沿着继电器的控制电路流动时,继电器将被激活。
接下来,我们来探讨单片机如何控制继电器。
单片机控制继电器的原理比较简单,简单来说,就是通过单片机GPIO的高低电平来控制继电器的激活和关闭。
具体的实现方法有以下两种:1. 通过直接控制继电器将继电器的控制电路连接到单片机的GPIO引脚上,当单片机的GPIO 引脚输出高电平时,继电器就会被激活,触点闭合,从而实现控制电路的通断。
当单片机的GPIO引脚输出低电平时,继电器就会被关闭,触点打开。
需要注意的是,在这种方法中,控制电路和继电器的驱动电路应该分别连接在单片机的不同引脚上,以防止电流方向相反而造成不必要的损害。
2. 通过控制继电器驱动模块继电器驱动模块是一种常见的电子元件,它可以将单片机的输出信号转化为能控制继电器的信号,从而实现对继电器的控制。
通常情况下,继电器驱动模块的输入端连接到单片机的GPIO引脚上,而输出端则连接到继电器的控制电路中,通过将单片机的输出信号转化为足够的控制电流信号,就可以实现对继电器的控制。
总体来说,单片机控制继电器的原理比较简单,主要是通过单片机输出的高低电平来控制继电器的开关,从而实现电子控制电路的通断控制。
在实际应用中,需要根据具体的需求和场景来选择合适的继电器和驱动模块,并以实验验证稳定性和可靠性。
动手用单片机控制5V继电器
用单片机控制继电器这里继电器由相应的S8050三极管来驱动,开机时,单片机初始化后的为高电平,+5伏电源通过电阻使三极管导通,所以开机后继电器始终处于吸合状态,如果我们在程序中给单片机一条:CLR 或者CLR 的指令的话,相应三极管的基极就会被拉低到零伏左右,使相应的三极管截至,继电器就会断电释放,每个继电器都有一个常开转常闭的接点,便于在其他电路中使用,继电器线圈两端反相并联的二极管是起到吸收反向电动势的功能,保护相应的驱动三极管.51单片机驱动继电器电路1.基本电路如右图。
2.单片机的IO口输出电流很小4到20mA,所以要用三极管放大来驱动继电器。
主要技术参数1.触点参数:触点形式:1C(SPDT)触点负载: 3A 220V AC/30V DC阻抗:≤100mΩ额定电流: 3A电气寿命:≥10万次机械寿命:≥1000万次2.线圈参数:阻值(士10%): 120Ω线圈功耗:额定电压:DC 5V吸合电压:DC释放电压:DC工作温度:-25℃~+70℃绝缘电阻:≥100MΩ型号:HK4100F-DC5V-SH线圈与触点间耐压:4000VAC/1分钟触点与触点间耐压:750VAC/1分钟继电器工作吸合电流为5V=40mA或5V/120Ω≈40mA。
三极管基极电流:继电器的吸合电流/放大倍数=基极电流(40mA/100 =4mA),为工作稳定,实际基极电流应为计算值的2倍以上。
基极电阻:()/基极电流=电阻值8mA =Ω)。
这里单片机IO口输出高电平触发三极管导通。
经过以上的分析计算得出:三极管可用极性是NPN的9014或8050,电阻选AT89S52 每个单个的引脚,输出低电平的时候,允许外部电路,向引脚灌入的最大电流为?10?mA;?每个?8?位的接口(P1、P2?以及?P3),允许向引脚灌入的总电流最大为?15?mA,而?P0?的能力强一些,允许向引脚灌入的最大总电流为?26?mA;?全部的四个接口所允许的灌电流之和,最大为?71?mA。
单片机继电器控制系统
C51单片机定时器应用/*这个程序用来控制电风扇的启停,当按下K1时,启动,按下K2停止,按下K3,设置定时,K4确定*//*作者,古名壬,2012-6-11*/#include<reg52.h>#define uchar unsigned char#define dua P0#define we P2code char wei[4]={0xf7,0xfb,0xfd,0xfe};/*显示位表*/code char duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; /* 显示段表*/sbit jdq=P3^7; //继电器接在P37sbit k1=P3^2; //四位独立按键sbit k2=P3^3;sbit k3=P3^4;sbit k4=P3^5;sbit dot=P0^7; //时分之间的小数点uchar sec=0;uchar keypress=0;uchar w=0; //对位选信号计数uchar q,b,s,g;uchar hour=0,min=0;uchar t0,t1;uchar smkey(); //扫描键盘void work(uchar hou,uchar mi); //拆开十位和个位void main(){ uchar keyp;uchar keys;EA=1;TMOD=0X11; //两个定时器工作在方式一TR1=1;ET1=1;TH1=(65536-5000)/256;TL1=(65536-5000)%256;while(1){ keyp=smkey();if(keyp==1){jdq=0;hour=0;min=1;}if(keyp==2){jdq=1;hour=0;min=0;}if(keyp==3){ hour=0;min=0;do{keys=smkey();if(keys==1){hour++;if(hour==8)hour=0;}else if(keys==2){min++;if(min==59)min=0;}if(t1<100){q=10,b=10,s=10,g=10;} //实现设置时闪烁else work(hour,min);}while(keys!=4); //直到扫下确定才退出设置TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1;ET0=1;jdq=0; //确定后输出}if(t0==20){sec++;t0=0;}if(sec==60){min--;sec=0;}if(min==0){ if(hour==0){ TR0=0;ET0=0;jdq=1; //时间到,关闭}else{hour--;}}work(hour,min);}}void timer1() interrupt 1 //50ms {TH0=(65536-50000)/256;TL0=(65536-50000)%256;t0++;}void delayms(uchar ms){ uchar i;for(;ms>0;ms--)for(i=0;i<120;i++);}void work(uchar hou,uchar mi){q=hou/10;b=hou%10;s=mi/10;g=mi%10;}uchar smkey() //独立按键扫描。
用51单片机做一个驱动继电器的电路
用51单片机做一个驱动继电器的电路,C程序救助。
2013-02-02 15:58 提问者悬赏:10分| 小小的梦想W | 分类:操作系统/系统故障| 浏览429次
功能是这样的:8个按键分别对应控制8个继电器的输出,按一下按键,继电器输出,再按一下,继电器关闭;另外还有8路数字量信号输入,当单片机检测到某一路数字量信号输入为0时(无输入是为1),关闭对应的该路继电器,也就是说只要有数字量信号输入,继电器就不能输出,按键也不能用。
现在单独的按键控制继电器输出没问题了,检测数字信号输入也可以,就是数字量信号输入与继电器输出部分的结合判断这块弄了好久,搞不好。
求大神帮忙!这块应该什么写才行。
[汽车继电器的控制原理及其检修]51单片机控制12v继电器
[汽车继电器的控制原理及其检修]51单片机控制12v继电器(本刊专家委员会委员) 1964年大学本科毕业,长期从事汽车拖拉机教学、研究和新技术推广工作,曾受聘担任江西省讲师团成员、汽车维修技工学校教师。
1988年获得高级工程师职称,1996年获得行业“全国优秀科普工作者”称号,1990年、1993年和1994年分别由同济大学出版社、东南大学出版社出版教材3本。
在汽车电子控制电路中,继电器(Relay)是一个必不可少的器件。
设计汽车电子控制电路时,继电器是采用逻辑代数的方法进行计算的,因为继电器的工作只有断开(表述为“0”)和闭合(表述为“1”)这两种状态。
1继电器的基本构造及主要功能继电器主要由线圈、衔铁、动触点和静触点组成(见图1)。
当电流经过线圈时,产生磁场,吸引动触点移动,并与静触点接触,使接线柱1和接线柱2导通,于是主电路形成回路,从而使被控制的用电器投入工作。
由此可见,继电器电路实际上包括由线圈工作的控制电路和由触点工作的主电路这样两部分。
主电路中的那对触点,只有在继电器线圈有工作电流流过的情况下才能动作。
车用继电器的主要功能是如下:①以弱小电流控制强大电流;②减少手动开关的数量;③达到顺序控制用电器的目的;④保护较小的开关以及较细的导线,进而保证电气设备的安全有序运行;⑤有的机型(如依维柯汽车SOFIM柴油共轨发动机)采用了许多小型化的、带内部电阻/二极管的继电器。
小型化继电器可以节省装配空间,继电器带电阻/二极管,可以降低或消除电路中可能出现的300~500V峰值电压,从而保护电控系统中的元器件,防止出现功能失误。
比较典型的如启动机继电器,有人可能会说:如果把电源正极直接接到启动机的一端,把点火开关的负极接到启动机的另外一端,就可以启动发动机了,为什么启动机要使用继电器呢?对于用电量比较大的电器(如启动机、电喇叭等),如果直接用开关控制电流的通断,往往会使控制开关很快烧坏。
因此,对于大电流用电设备的控制,普遍采用中间继电器的方式,即通过继电器触点的断开与闭合来控制大电流用电设备的工作状态。
用单片机驱动电磁式继电器的方法
在各种自动控制设备中,都存在一个低压的自动控制电路与高压电气电路的互相连接问题,一方面要使低压的电子电路的控制信号能够控制高压电气电路的执行元件,如电动机、电磁铁、电灯等;另一方面又要为电子线路的电气电路提供良好的电隔离,以保护电子电路和人身的安全,电磁式继电器便能完成这一桥梁作用。
电磁继电器是在在输入电路电流的作用下,由机械部件的相对运动产生预定响应的一种继电器。
它包括直流电磁继电器、交流电磁继电器、磁保持继电器、极化继电器、舌簧继电器,节能功率继电器。
(1)直流电磁继电器:输入电路中的控制电流为直流的电磁继电器。
(2)交流电磁继电器:输入电路中的控制电流为交流的电磁继电器。
(3)磁保持继电器:将磁钢引入磁回路,继电器线圈断电后,继电器的衔铁仍能保持在线圈通电时的状态,具有两个稳定状态。
(4)极化继电器:状态改变取决于输入激励量极性的一种直流继电器。
(5)舌簧继电器:利用密封在管,具有触点簧片和衔铁磁路双重作用的舌簧的动作来开、闭或转换线路的继电器。
(6)节能功率继电器:输入电路中的控制电流为交流的电磁继电器,但它的电流大(一般30-100A),体积小, 节电功能.电磁式继电器一般由控制线圈、铁芯、衔铁、触点簧片等组成,控制线圈和接点组之间是相互绝缘的,因此,能够为控制电路起到良好的电气隔离作用。
当我们在继电器的线圈两头加上其线圈的额定的电压时,线圈中就会流过一定的电流,从而产生电磁效应,衔铁就会在电磁力吸引的作用下克服返回弹簧的拉力吸向铁芯,从而带动衔铁的动触点与静触点(常开触点)吸合。
当线圈断电后,电磁的吸力也随之消失,衔铁就会在弹簧的反作用力返回原来的位置,使动触点与原来的静触点(常闭触点)吸合。
这样吸合、释放,从而达到了在电路中的接通、切断的开关目的。
下面是一个小型信号继电器HK4100F-DC5V-SH的实物照片和主要技术参数。
HK4100F电磁继电器主要技术参数:品牌:汇科(HUI KE)型号:HK4100F-DC5V-SH 外形尺寸(mm):10.5*15.5*11.8mm(W*L*H)重量:3.5g 触点参数:触点形式:1C(SPDT)触点负载:3A 220V AC/30V DC阻抗:≤100mΩ额定电流:3A电气寿命:≥10万次机械寿命:≥1000万次线圈参数:阻值(士10%):120Ω线圈功耗:0.2W产地:中国额定电压:DC 5V吸合电压:DC 3.75V释放电压:DC 0.5V工作温度:-25℃~+70℃绝缘电阻:≥100MΩ线圈与触点间耐压:4000VAC/1分钟触点与触点间耐压:750VAC/1分钟图1一、继电器驱动原理下图2是S51增强型单片机实验板上HK4100F继电器驱动电路原理图,三极管T5的基极B接到单片机的P3.6,三极管的发射极E接到继电器线圈的一端,线圈的另一端接到+5V电源VCC上;继电器线圈两端并接一个二极管IN4148,用于吸收释放继电器线圈断电时产生的反向电动势,防止反向电势击穿三极管T5及干扰其他电路;R3和发光二极管LED9组成一个继电器状态指示电路,当继电器吸合的时候,LED9点亮,这样就可以直观的看到继电器状态了。
单片机驱动继电器 (非常有用)
5V
想一想?
在实际应用中,三极 管这样驱动继电器的 电路有什么弊端吗?
5V
问题所在
1. 当三极管由导通变 为截止时,继电器 绕组感生出一个较 大的自感电压。它 与电源电压叠加后 加到控制继电器线 圈的三极管的e、c 两极上,使发射结 (e—c)有可能被 击穿。 2. 该如何解决呢?
5V
c b e
电路中各元器件的参数
1. 这里单片机IO口输出高 电平触发三极管导通。 经过以上的分析计算得 出:三极管可用极性是 NPN的9014或8050,电 阻选3.3K。 2. 三极管的放大倍数要求 不高,一般买的都可以, 100~500 (放大倍数分 段可选),随便买的都可 以用。 3. 电阻R1选3.3K/0.25W就 可以了,保证基极为MA级 电流就可以开关三极管 了。
继电器的参数
主要技术参数 1. 触点参数: 触点形式:1C(SPDT) 触点负载: 3A 220V AC/30V DC 阻 抗: ≤100mΩ 额定电流: 3A 电气寿命:≥10万次 机械寿命:≥1000万次 线圈参数: 阻值(士10%): 120Ω 线圈功耗:0.2W 额定电压:DC 5V 吸合电压:DC 3.75V 释放电压:DC 0.5V 工作温度:-25℃~+70℃ 绝缘电阻:≥100MΩ 线圈与触点间耐压:4000VAC/1分钟 触点与触点间耐压:750VAC/1分钟
PCM(0 1.5A 1.5A
BV(CEO)V 40 50 25 25
fT(MHZ) --190 200
hFE 64 ~ 202 60 ~ 1000 85 ~ 300 60 ~ 300
注释: 1. PCM是集电极最大允许耗散功率。 2. ICM是集电极最大允许电流。 3. BV(CEO)是三极管基极开路时,集电极-发射极反向击穿电压。 4. fT是特征频率。 5. hFE是放大倍数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(51单片机系列)用单片机控制继电器
2008-01-13 22:10
首先看看继电器的驱动
这是典型的继电器驱动电路图,这样的图在网络上随处可以搜到,并且标准教科书上一般也是这样的电路图
为什么要明白这个图的原理?
单片机是一个弱电器件,一般情况下它们大都工作在5V甚至更低.驱动电流在mA 级以下.而要把它用于一些大功率场合,比如控制电动机,显然是不行的.所以,就要有一个环节来衔接,这个环节就是所谓的"功率驱动".继电器驱动就是一个典型的、简单的功率驱动环节.在这里,继电器驱动含有两个意思:一是对继电器进行驱动,因为继电器本身对于单片机来说就是一个功率器件;还有就是继电器去驱动其他负载,比如继电器可以驱动中间继电器,可以直接驱动接触器,所以,继电器驱动就是单片机与其他大功率负载接口.这个很重要,因为,一直让我们的电气工程师(我指的是那些没有学习过相应的电子技术的)感到迷惑不解的是:一个小小的芯片,怎么会有如此强大的威力来控制像电动机这样强大的东西?
怎么样理解这个电路图?
要理解这个电路,其实也比较容易.那么请您按照我的思路来,应该没有问题: 首先的,里面的三极管很重要.三极管是电子电路里很重要的一个元件.怎么样理解三极管呢?
简单的来说三极管有两个作用一个是放大作用,一个是开关作用.(严格来讲开关作用是放大作用的极限情况,不过没关系,把两者分开,更便于理解它的工作原理).在这里,我们只了解它跟本电路有关的开关作用.
首先把三极管想成一个水龙头.
上面的Vcc就是水池,继电器是一个水轮机,下面的GND是比水池低的任何一点.刚才说过,三极管就是水龙头,它的把手就是那个带有电阻的引脚.
现在,单片机的某一个需要控制这个继电器电路的输出引脚就是一只"手",当单片机的这个引脚输出低电平的时候,就像"手"在打开三极管"水龙头",水就从上往下流,继电器"水轮机"就开始转起来了.反之,如果是输出高电平,"手"就开始关"水龙头",继电器"水轮机"因为没有水流下来,就会停止.
这就是三极管的开关作用.
简单的理解和记忆就是:三极管是一个开关器件,其实你真的可以将它看成是一个开关,只不过它不是用手来控制,而是用电压(电流)来控制的,因此,三极管有些时候也被称做电子开关(与机械开关相区别).
图上还有一个东西,是保护二极管,如果不需要深入理解的话,你大可不必追就为什么有它存在,但是一定得记住,只要是用三极管驱动继电器的场合,一般都有它的存在.需要特别注意的是它的接法:并联在继电器两端阴极一定是接Vcc
【电子制作实验室--转】
/DJS.htm
这里我们先要安装好51试验板上的两个轻触按钮开关,我们采用的是
独立式按钮开关,也就是说将开关直接连接到电源的地和单片机的对应
引脚之间,这里K1接到单片机的P3.6引脚,K2接到P3.7。
正常情况
下单片机的P3.6、P3.7都被程序初始化时置“1” 当有按键按下时对
应的单片机引脚被按钮开关下拉为“0”,这种方法比较直观,而且比
较简单,在按键数量不多的场合下使用很广泛。
因为机械开关开关时有抖动,所以需要在程序中加一个软件去抖动程序,它的工作原理如下:当单片机检测到有按键被按下后立即执行一个10毫秒的延时程序,然后再在检测该引脚是否仍然为闭合状态?如果仍然为闭合说明确认该键被按下立即执行相应的处理程序,否则可能是干扰,丢弃这次检测结果。
接下来我们再安装一个四位的拨码开关,就是图中红色的开关,它相当于四个装在一起的拨动开关,当开关拨到"ON"一侧时,对应的那路就会接通,反之断开.它在单片机中一般用于设置初始参数,而且不经常改变的场合。
这里因为单片机引脚资源不够,所以我们只使用了拨码开关的第2、3、4位,第1位闲置。
三个开关可以逻辑组合出8种状态,所以我们能够方便灵活地预置多达7种的倒计时时间。
最后我们来安装两个继电器和相关电路,有了继电器我们的实验板不再仅仅是做做实验而已,可以用于控制一些负载,比如说:充电器,洗衣机,电风扇等,使我们的实验板的实用功能大大增强,这也
是电子制作实验室网站的单片机实验板和其他公司的产品不同的地方。
这里继电器由相应的S8050三极管来驱动,开机时,单片机初始化后的P2.3/P2.4为高电平,+5伏电源通过电阻使三极管导通,所以开机后继电器始终处于吸合状态,如果我们在程序中给单片机一条:CLR P2.3或者CLR P2.4的指令的话,相应三极管的基极就会被拉低到零伏左右,使相应的三极管截至,继电器就会断电释放,每个继电器都有一个常开转常闭的接点,便于在其他电路中使用,继电器线圈两端反相并联的二极管是起到吸收反向电动势的功能,保护相应的驱动三极管,这种继电器驱动方式硬件结构比较简单。