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

单片机智能窗帘proteus仿真图与代码

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

单片机源程序如下:

/*********51单片机智能窗帘设计*********/

/*************JJ电子直营店*************/

/***************原创设计***************/


#include                                  //头文件

#define uchar unsigned char

#define uint unsigned int


#define CS        P3_0                //ADC0804 CS端口

#define RD        P3_1                //ADC0804 RD端口

#define WR        P3_2                //ADC0804 WR端口

#define g_kz        P2_5         //数码管个位控制

#define s_kz        P2_4        //数码管十位控制

#define b_kz        P2_3        //数码管百位控制

#define q_kz        P2_2        //码管千位控制

#define SMG_XS        P0                //数码管显示端口

#define AD_data        P1                //ADC0804输出端口

#define Up                P2_1        //上限限位开关端口

#define Down         P2_0        //下限限位开关端口

#define Key1        P3_3        //手动/自动切换 按键

#define Key2        P3_4        //定时/光控功能切换 按键

#define Key3        P3_5        //设置 按键

#define Key4        P3_6        //加 按键 (手动模式:打开窗帘 定时模式:定时打开窗帘)

#define Key5        P3_7        //减 按键 (手动模式:关闭窗帘 定时模式:定时关闭窗帘)


#define IA                P2_7        //直流电机控制端口

#define IB                P2_6        //直流电机控制端口


int adval;                 //ADC 输出变量

int j;                        //定义循环变量 i j

uchar flag=0;        //显示标志位(0:正常显示 1:上限光照度设置(调时) 2:下限光照度设置(调分)                                 

bit flag_gd=0;        //光控/定时标志位(0:当前光照度 1:定时时间 )        

bit ms=0;                //模式(0:手动模式 1:自动模式)

bit move=0;                //定时时间到标志位(0:时间未到 1:时间到)

bit OFF_ON=0;        //电机正反转标志位,表示窗帘打开或关闭(0:窗帘关闭 1:窗帘打开)

bit Time_OFF_ON=0;//定时时间到执行窗帘打开或关闭(0:定时关闭窗帘 1:定时打开窗帘)


char hour=12,min=0;sec=0; //定义时间 “时 分 秒”变量 上电默认12.00.00

char num=0;        //时间基数

uint H_GM=240;        //定义上限光敏度设置变量,上电默认200

uint L_GM=100;        //定义下限光敏度设置变量,上电默认100

uchar t=1;                 //数码管动态扫描延时参数

                

uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};        

//数码管显示数组      0    1    2    3    4    5    6    7    8    9


void delay(uint time)                   //延时函数

{

        uint x,y;                         //定义临时变量 x y

        for(x=time;x>0;x--)

        for(y=110;y>0;y--);        //空操作

}


void  Time_init()                //定时器初始化

{

        EA=1;

        TMOD=0x11;


        /*定时器0初始化(产生PWM控制电机转速)*/        

        TH0=0xf8;        //定时2ms

        TL0=0xcc;

        ET0=1;                //使能T0中断

        TR0=0;                //先不启动定时器0

        /*定时器1初始化(产生50ms定时时间)*/

        TH1=0x4c;                 //50ms

        TL1=0x00;

        ET1=1;

        TR1=0;                //先不启动定时器1        

}


void Key_cl()

{

        static bit keybuf1=1;          //Key1值暂存,临时保存按键扫描值

        static bit backup1=1;          //Key1值备份,保存前一次的扫描值

        static bit keybuf2=1;         //Key2值暂存,临时保存按键扫描值        

        static bit backup2=1;        //Key2值备份,保存前一次的扫描值

        static bit keybuf3=1;        //Key3值暂存,临时保存按键扫描值

        static bit backup3=1;         //Key3值备份,保存前一次的扫描值

        static bit keybuf4=1;        //Key4值暂存,临时保存按键扫描值

        static bit backup4=1;         //Key4值备份,保存前一次的扫描值

        static bit keybuf5=1;        //Key5值暂存,临时保存按键扫描值

        static bit backup5=1;         //Key5值备份,保存前一次的扫描值

        keybuf1=Key1;                          //把Key1当前值扫描值暂存

        if(keybuf1!=backup1)        //Key1当前值与前次值不相等,说明Key1按键有动作

        {

                delay(1);                        //延时去抖

                if(keybuf1==Key1)        //判断Key1扫描值有没有发生变化,即按键抖动

                {

                        if(backup1==1)        //Key1按键按下有效

                        {

                                move=0;                   //重置时间标志位为0(时间未到)

                                TR0=0;                //关闭定时器0

                                ms=~ms;                // 模式取反

                                q_kz=1;b_kz=1;s_kz=1;g_kz=1;//关闭数码管显示

                                IA=0;IB=0;        //窗帘停止        

                        }

                        backup1=keybuf1; //更新备份Key1当前值,以备进行下次比较

                }

        }

        if(ms==0)                          //手动模式下

        {

                if(Key4==0)                //当打开窗帘按键 按下

                {

                        delay(10);        //延时去抖

                        if(Key4==0)        //再判断按键是否按下

                        {

move=0; //



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

热门文章 更多
浅谈AVR中定时器几种工作模式