久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5948|回復: 2
打印 上一主題 下一主題
收起左側

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左右,只是占空比發生變化**/
        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; //保存行掃描有按鍵按下的狀態
                P1=0xf0; //列掃描
                Y=P1;    //保存列掃描有按鍵按下的狀態
                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;}   //連續風
        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是低風  此時可調整轉速  連續輸入三位0-9的數字  注意不能超過100
//按D是中風  此時可調整轉速  連續輸入三位0-9的數字  注意不能超過200
//按E是高風  此時可調整轉速  連續輸入三位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) // 連續輸入三位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) // 連續輸入三位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;         //連續輸入三位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)

評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

板凳
ID:1009501 發表于 2022-3-10 16:11 | 只看該作者
正在學習51,感謝樓主
回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 81精品国产乱码久久久久久 | 成人网av| 久久久91精品国产一区二区三区 | 毛片免费在线 | 久久99精品久久久久 | 性色综合 | 色爱区综合| 免费a在线| 日韩成人在线电影 | 一区二区三区av夏目彩春 | 国产激情免费视频 | 91亚洲精品国偷拍自产在线观看 | 特级生活片 | 国产极品车模吞精高潮呻吟 | 一区二区三区视频在线观看 | 91精品国产91久久久久久吃药 | 狠狠色香婷婷久久亚洲精品 | 欧美三级久久久 | 亚洲成年在线 | 在线男人天堂 | 欧美色综合一区二区三区 | 日韩欧美视频免费在线观看 | 黄色网址在线播放 | 久久久国产精品 | 亚洲 欧美 综合 | 午夜影院在线观看版 | 日日夜夜免费精品视频 | 久久精品中文字幕 | 毛片一区二区三区 | 剑来高清在线观看 | 色综合久 | www.久久精品 | 91大片| 欧美成人精品 | 亚洲精品国产一区 | 欧美精品日韩精品 | 在线观看第一区 | av网站免费观看 | 国产精品久久久久久一区二区三区 | 91人人澡人人爽 | 久久国产综合 |