×
单片机 > 单片机程序设计 > 详情

按钮 温度 红外三种方式控制电机转速的单片机程序

发布时间:2020-06-17 发布时间:
|

电路原理图如下:
 

单片机源程序如下:

#include

#include

unsigned int times;

unsigned int controlway;

unsigned int flag=0;

unsigned int flaghongwai=0;

//电机控制

sbit out3=P2^2;

sbit out1=P2^0;

sbit out2=P2^1;

//按钮控制

sbit button=P1^0;

sbit buttonup=P1^6;

sbit buttondown=P1^7;

//温度控制

sbit DQ=P3^7;

sbit temp=P1^1;

//红外控制

sbit hongwai=P1^2;

sbit        IR    = P3^2;

unsigned char        N[4];//识别码,操作码存放

unsigned char   X1,X2,X3,X4;


void delay(unsigned char n){

        do{

                _nop_();

                _nop_();

                _nop_();

                n--;

        }while(n);

}


//温度控制

void init_ds18b20(){

        unsigned char x=0;

        DQ=0;

        delay(120);

        DQ=1;

        delay(16);

        delay(80);

}

unsigned char readbyte(){

        unsigned char i=0;

        unsigned char date=0;

        for(i=8;i>0;i--){

                DQ=0;

                delay(1);

                DQ=1;

                date>>=1;

                if(DQ)

                date|=0x80;        

                delay(11);

        }        

        return (date);

}

void writebyte(unsigned char dat){

        unsigned char i=0;

        for(i=8;i>0;i--){

                DQ=0;

                DQ=dat&0x01;

                delay(5);

                DQ=1;

                dat>>=1;

                delay(5);

        }        

}

unsigned char retemp(){

        unsigned char a,b,tt;

        unsigned int t;

        init_ds18b20();

        writebyte(0xcc);

        writebyte(0x44);

        init_ds18b20();

        writebyte(0xcc);

        writebyte(0xbe);

        a=readbyte();

        b=readbyte();

        t=b;

        //t=t<<8;

        t<<=8;

        t=t|a;

        tt=t*0.0625;

        return (tt);

}


//按键检测,电机转速控制

timer0 () interrupt 1 {

        unsigned char tempread=0;

        if(button==0){

                controlway=1;                

        }else if(temp==0){

                controlway=2;

        }else if(hongwai==0){

                controlway=3;

        }else{

                controlway=1;

        }

        switch(controlway){

                        case 1:

                                if(buttonup==0){

                                         if(times<10000){

                                                times+=1000;

                                        }

                                }else if(buttondown==0){

                                         if(times>0){

                                                times-=1000;

                                        }

                                }

                                delay(100);

                        break;

                        case 2:

                                flag++;

                                if(flag==20)

                                {

                                        tempread=retemp();

                                        if(tempread>24&&tempread<34){ 

                                         times=1000*(tempread-24);

                                        }else{

                                                times=10000;

                                        }

                                        flag=0;

                                }

                        break;

                        case 3:

                        //转换为外部中断

                                IT0 = 0; 

                                EX0 = 1;

                        break;

                }

        TH0=0x3c;

        TL0=0xb0;

}          

//红外接收信号

/********************** 外部中断函数************************/

void exint0() interrupt 0 

{          

   unsigned int cnt;

   unsigned char i;

   EX0 = 0;

   cnt = 0;        

        

   while(!IR) cnt++;                               //记录引导码时间 

   if(cnt < 1000){EX0=1;return;}                   //9ms的计数值(12MHz:1000< cnt <1500)

           

   cnt = 0;                         

   while(IR) if(cnt++ > 400){EX0=1;return;}        //防卡死,超时保护(12MHz: > 300)    

   if(cnt < 200){EX0=1;return;}                    //(12MHz不分频: <260)            


   for(i=0; i<32; i++)                             //读取32位位码

       {

         cnt = 0;                                                                                                                                                

while(!IR);



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机CO2检测显示程序解析