標題: Proteus仿真單片機電風扇自然風控制程序 [打印本頁]

作者: lzh10620    時間: 2020-6-5 13:10
標題: Proteus仿真單片機電風扇自然風控制程序
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
#include"reg51.h"
#include"intrins.h"
#include"lcd.h"

#define uchar unsigned char
#define uint  unsigned int
#define dula P0        //段選         
#define wela P2 //位選        
sbit P20=P3^4;
sbit P21=P3^5;
uint v_low=50,v_mid=100,v_high=200;  //高中低速度
uchar flag=0;/***高低電平標志***/
bit direction=0;/***方向標志***/
static uint constant=380-50;//可以改變占空比
uint count_ms,count_s;
/****函數聲明****/
void delay(uchar i);
void reverse(void);
uchar k; //按鍵值
uchar kflag=1; //標志位
uchar tflag; //標志位
uchar dis[4];  //顯示
const unsigned  char  table[]={          //數字不帶小數點
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x40,0x76,0x38};        
/***定時器t0***/
void time0(void) interrupt 1 using 1
{        
   static uint i;
        i++;
        if(kflag==1)  //低-中-高  自然風
        {
        count_ms++;
        if(count_ms>10000)
        {
                count_ms=0;
                count_s++;
               
                if(count_s==1) {constant=380-v_low;dis[0]=v_low/1000;   //低
                dis[1]=v_low/100;
                dis[2]=v_low%100/10;
                dis[3]=v_low%10;}
                else if(count_s==30) {constant=380-v_mid;dis[0]=v_mid/1000;//中
                dis[1]=v_mid/100;
                dis[2]=v_mid%100/10;
                dis[3]=v_mid%10;}
                else if (count_s==60) {constant=380-v_high;dis[0]=v_high/1000;//高
                dis[1]=v_high/100;
                dis[2]=v_high%100/10;
                dis[3]=v_high%10;}
                else if (count_s>90) {count_s=0;}
        }
  }
         /**頻率為固定的1kHZ左右,只是占空比發(fā)生變化**/
        if(i<=constant)
                flag=1;
        if(i<=380&&i>constant)
                flag=2;               
        if(i==380)
                i=0;
        TH0=0xff;
        TL0=0xe7;
}
/***************
  延時函數  毫秒
****************/
void delay_ms(unsigned int timer)
{
        unsigned int i,j;
        for(i=0; i<timer; i++)
                for(j=0; j<110; j++);
}
/****改變轉向標志*****/
void int1_srv (void) interrupt 2 using 2
{
        if(INT1==0)
        {
                while(!INT1);
                 direction=!direction;
        }
}



/****延時****/
void delay(uchar i)
{
        while(i--)
        _nop_();
}
/***************
  顯示函數
****************/
void display(unsigned int first,unsigned int second,unsigned int third,unsigned int forth)                //顯示函數
{        
  wela = 0xfe;  //位選1
        dula = table[first]; //段選1
        delay_ms(2);     //延時
        dula = 0x00;                 //清零
        wela = 0xfd; //位選2
        dula = table[second];//段選2
        delay_ms(2); //延時
        dula = 0x00;//清零
        wela = 0xfb; //位選3
        dula = table[third];//段選3
        delay_ms(2); //延時
        dula = 0x00;//清零
        wela = 0xf7; //位選4
        dula = table[forth];//段選4
        delay_ms(2); //延時
        dula = 0x00; //清零        

}


/*************************/
void Getch (void)        //按鍵掃描
{
unsigned char X,Y,Z;
P1=0x0f; //對P1置數  行掃描
if(P1!=0x0f) //有按鍵按下
        {
        delay_ms(10); //延時消抖
        if(P1!=0x0f) //有按鍵按下
                {
                X=P1; //保存行掃描有按鍵按下的狀態(tài)
                P1=0xf0; //列掃描
                Y=P1;    //保存列掃描有按鍵按下的狀態(tài)
                Z=X|Y; //取出按鍵值
/*********************************************************************/
switch ( Z ) //判斷是哪個按鍵按下
                        {
                                case 0xee: k=0; break; //給按鍵賦值
                                case 0xed: k=1; break;
                                case 0xeb: k=2; break;
                                case 0xe7: k=3; break;
                                case 0xde: k=4; break;
                                case 0xdd: k=5; break;
                                case 0xdb: k=6; break;
                                case 0xd7: k=7; break;
                                case 0xbe: k=8; break;
                                case 0xbd: k=9; break;
                                case 0xbb: k=10;break;
                                case 0xb7: k=11;break;
                                case 0x7e: k=12;break;
                                case 0x7d: k=13;break;
                                case 0x7b: k=14;break;
                                case 0x77: k=15;break;
                        }
                        while(P1!=0xf0);  //按鍵抬起有效
                 }         
         }
}
void sel_mode(void)
{
        if (k==10){kflag=1;}   //自然風
  if (k==11){kflag=2;}   //連續(xù)風
        if(kflag==2)
        {
                if(k==12)  {tflag=1;constant=380-v_low;dis[0]=1;  //di低
                dis[1]=v_low/100;
                dis[2]=v_low%100/10;
                dis[3]=v_low%10;}
                if(k==13) {tflag=2;constant=380-v_mid;dis[0]=1; //中
                dis[1]=v_mid/100;
                dis[2]=v_mid%100/10;
                dis[3]=v_mid%10;}
                if(k==14) {tflag=3;constant=380-v_high;dis[0]=1; //高
                dis[1]=v_high/100;
                dis[2]=v_high%100/10;
                dis[3]=v_high%10;}
               
        }
}
//按鍵設置   開機后自動是自然風   按B切換成固定風  在固定風模式下
//按C是低風  此時可調整轉速  連續(xù)輸入三位0-9的數字  注意不能超過100
//按D是中風  此時可調整轉速  連續(xù)輸入三位0-9的數字  注意不能超過200
//按E是高風  此時可調整轉速  連續(xù)輸入三位0-9的數字  注意不能超過350
void set_mode(void)
{
        static uchar num=0;
        static uchar temp[3];
        if(tflag==1)//按C是低風
        {
                if(k<10)
                {
                        temp[num]=k;               
                        num++;
                        if(num>=3) // 連續(xù)輸入三位0-9的數字
                        {
                                v_low=temp[0]*100+temp[1]*10+        temp[2]        ;        //算出數值
                                num=0;
                                tflag=0;
              constant=380-v_low;
                                dis[0]=1;  //di低
                    dis[1]=v_low/100;
                    dis[2]=v_low%100/10;
                    dis[3]=v_low%10;
                        }
                        k=22;
                }
         }
                 if(tflag==2)//按D是中風
        {
                if(k<10)
                {
                        temp[num]=k;               
                        num++;
                        if(num>=3) // 連續(xù)輸入三位0-9的數字
                        {
                                v_mid=temp[0]*100+temp[1]*10+        temp[2]        ;        //算出數值
                                num=0;
                                tflag=0;
              constant=380-v_mid;
                                dis[0]=1;  //di低
                    dis[1]=v_mid/100;
                    dis[2]=v_mid%100/10;
                    dis[3]=v_mid%10;
                        }
                        k=22;
                }
         }
                 if(tflag==3)//按E是高風
        {
                if(k<10)
                {
                        temp[num]=k;         //連續(xù)輸入三位0-9的數字        
                        num++;
                        if(num>=3)
                        {
                                v_high=temp[0]*100+temp[1]*10+        temp[2]        ;        //算出數值
                                num=0;
                                tflag=0;
              constant=380-v_high;
                                dis[0]=1;  //di低
                    dis[1]=v_high/100;
                    dis[2]=v_high%100/10;
                    dis[3]=v_high%10;
                        }
                        k=22;
                }
         }
}
void main()
{        
        EA=1;
        TMOD=0x01;
        ET0=1;
        TR0=1;

        EX0=1;
        IT0=1;

        EX1=1;
        IT1=1;

        TH0=0xff;
        TL0=0xe7;//25us
        /************/
        LCD_Initial();
        delay(10);

        /*************/
        while(1)
        {
                Getch();////按鍵掃描
                sel_mode();//設置模式
                set_mode();//設置轉速
                reverse();
                display(dis[0],dis[1],dis[2],dis[3]);                //顯示函數

        }
}

全部資料51hei下載地址:
單片機自然風.rar (107.64 KB, 下載次數: 77)


作者: njuptlbw    時間: 2022-3-10 02:02
謝謝大哥,感激不盡
作者: xfan1225    時間: 2022-3-10 16:11
正在學習51,感謝樓主




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1