找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5270|回复: 2
收起左侧

Proteus仿真单片机电风扇自然风控制程序

[复制链接]
ID:399416 发表于 2020-6-5 13:10 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
a947ffdae7334b497c6e5604726475c.png

单片机源程序如下:
#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.png
全部资料51hei下载地址:
单片机自然风.rar (107.64 KB, 下载次数: 74)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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 单片机教程网

快速回复 返回顶部 返回列表