找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6044|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

Proteus仿真單片機電風(fēng)扇自然風(fēng)控制程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:399416 發(fā)表于 2020-6-5 13:10 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
仿真原理圖如下(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;
/****函數(shù)聲明****/
void delay(uchar i);
void reverse(void);
uchar k; //按鍵值
uchar kflag=1; //標志位
uchar tflag; //標志位
uchar dis[4];  //顯示
const unsigned  char  table[]={          //數(shù)字不帶小數(shù)點
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)  //低-中-高  自然風(fēng)
        {
        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;
}
/***************
  延時函數(shù)  毫秒
****************/
void delay_ms(unsigned int timer)
{
        unsigned int i,j;
        for(i=0; i<timer; i++)
                for(j=0; j<110; j++);
}
/****改變轉(zhuǎn)向標志*****/
void int1_srv (void) interrupt 2 using 2
{
        if(INT1==0)
        {
                while(!INT1);
                 direction=!direction;
        }
}



/****延時****/
void delay(uchar i)
{
        while(i--)
        _nop_();
}
/***************
  顯示函數(shù)
****************/
void display(unsigned int first,unsigned int second,unsigned int third,unsigned int forth)                //顯示函數(shù)
{        
  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置數(shù)  行掃描
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;}   //自然風(fēng)
  if (k==11){kflag=2;}   //連續(xù)風(fēng)
        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;}
               
        }
}
//按鍵設(shè)置   開機后自動是自然風(fēng)   按B切換成固定風(fēng)  在固定風(fēng)模式下
//按C是低風(fēng)  此時可調(diào)整轉(zhuǎn)速  連續(xù)輸入三位0-9的數(shù)字  注意不能超過100
//按D是中風(fēng)  此時可調(diào)整轉(zhuǎn)速  連續(xù)輸入三位0-9的數(shù)字  注意不能超過200
//按E是高風(fēng)  此時可調(diào)整轉(zhuǎn)速  連續(xù)輸入三位0-9的數(shù)字  注意不能超過350
void set_mode(void)
{
        static uchar num=0;
        static uchar temp[3];
        if(tflag==1)//按C是低風(fēng)
        {
                if(k<10)
                {
                        temp[num]=k;               
                        num++;
                        if(num>=3) // 連續(xù)輸入三位0-9的數(shù)字
                        {
                                v_low=temp[0]*100+temp[1]*10+        temp[2]        ;        //算出數(shù)值
                                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是中風(fēng)
        {
                if(k<10)
                {
                        temp[num]=k;               
                        num++;
                        if(num>=3) // 連續(xù)輸入三位0-9的數(shù)字
                        {
                                v_mid=temp[0]*100+temp[1]*10+        temp[2]        ;        //算出數(shù)值
                                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是高風(fēng)
        {
                if(k<10)
                {
                        temp[num]=k;         //連續(xù)輸入三位0-9的數(shù)字        
                        num++;
                        if(num>=3)
                        {
                                v_high=temp[0]*100+temp[1]*10+        temp[2]        ;        //算出數(shù)值
                                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();//設(shè)置模式
                set_mode();//設(shè)置轉(zhuǎn)速
                reverse();
                display(dis[0],dis[1],dis[2],dis[3]);                //顯示函數(shù)

        }
}

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

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:1009363 發(fā)表于 2022-3-10 02:02 | 只看該作者
謝謝大哥,感激不盡
回復(fù)

使用道具 舉報

板凳
ID:1009501 發(fā)表于 2022-3-10 16:11 | 只看該作者
正在學(xué)習(xí)51,感謝樓主
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表