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

单片机睡眠-外中断INT0 INT1唤醒(汇编+C语言程序)

发布时间:2020-08-26 发布时间:
|

跟大家分享在网上寻找好久资料之后又自己改编的一个可以睡眠的程序,可以用来进行对静态功耗有要求的项目。


单片机源程序如下:

/*************        本程序功能说明        **************


用STC的MCU的IO方式控制74HC595驱动8位数码管。


用户可以修改宏来选择时钟频率.


显示效果为: 上电后显示秒计数, 计数范围为0~255,显示在右边的3个数码管.


显示5秒后, 睡眠. 按板上的AW17 SW18唤醒, 继续计秒显示. 5秒后再睡眠.


如果MCU在准备睡眠时, AW17 SW18任一键或两键同时按着(INT0 INT1任一个或两个同时为低电平), 


则MCU不睡眠, 直到INT0 INT1都为高电平为止.



******************************************/


#define MAIN_Fosc                22118400L        //定义主时钟


#include        "STC15Fxxxx.H"


#define DIS_DOT                0x20

#define DIS_BLACK        0x10

#define DIS_                0x11


/****************************** 用户定义宏 ***********************************/


#define                Timer0_Reload        (65536UL -(MAIN_Fosc / 1000))                //Timer 0 中断频率, 1000次/秒


/*****************************************************************************/







/*************        本地常量声明        **************/

u8 code t_display[]={                                                //标准字库

//         0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F

        0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,

//black         -     H    J         K          L           N        o   P         U     t    G    Q    r   M    y

        0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,

        0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};        //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1


u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};                //位码




/*************        IO口定义        **************/

sbit        P_HC595_SER   = P4^0;        //pin 14        SER                data input

sbit        P_HC595_RCLK  = P5^4;        //pin 12        RCLk        store (latch) clock

sbit        P_HC595_SRCLK = P4^3;        //pin 11        SRCLK        Shift data clock


/*************        本地变量声明        **************/


u8         LED8[8];                //显示缓冲

u8        display_index;        //显示位索引

u16        msecond;                //1000ms计数


u8        Test_cnt;        //测试用的秒计数变量

u8        SleepDelay;        //唤醒后再进入睡眠所延时的时间


void        delay_ms(u8 ms);

void        Display(void);

void         DisplayScan(void);





/********************** 主函数 ************************/

void main(void)

{

        u8        i;

        

        P0M1 = 0;        P0M0 = 0;        //设置为准双向口

        P1M1 = 0;        P1M0 = 0;        //设置为准双向口

        P2M1 = 0;        P2M0 = 0;        //设置为准双向口

        P3M1 = 0;        P3M0 = 0;        //设置为准双向口

        P4M1 = 0;        P4M0 = 0;        //设置为准双向口

        P5M1 = 0;        P5M0 = 0;        //设置为准双向口

        P6M1 = 0;        P6M0 = 0;        //设置为准双向口

        P7M1 = 0;        P7M0 = 0;        //设置为准双向口


        display_index = 0;

        for(i=0; i<8; i++)        LED8[i] = DIS_BLACK;        //全部消隐

        

        Test_cnt = 0;        //秒计数范围为0~255

        SleepDelay = 0;

        LED8[5] = 0;

        LED8[6] = 0;

        LED8[7] = 0;

        

        EA = 1;                //允许总中断


        while(1)

        {

                delay_ms(1);        //延时1ms

                DisplayScan();

                

                if(++msecond >= 1000)        //1秒到

                {

                        msecond = 0;                //清1000ms计数

                        Test_cnt++;                        //秒计数+1

                        LED8[5] = Test_cnt / 100;

                        LED8[6] = (Test_cnt % 100) / 10;

                        LED8[7] = Test_cnt % 10;


                        if(++SleepDelay >= 5)        //5秒后睡眠

                        {

                                SleepDelay = 0;


                                if(INT0 && INT1)        //两个中断都是高电平时才进入睡眠,下降沿唤醒。

                                {

                                        SleepDelay = 0;

                                        P_HC595_SER = 0;

                                        for(i=0; i<16; i++)                //先关闭显示,省电

                                        {

                                                P_HC595_SRCLK = 1;

                                                P_HC595_SRCLK = 0;

                                        }

                                        P_HC595_RCLK = 1;

                                        P_HC595_RCLK = 0;                //锁存输出数据


                                        IE1  = 0;        //外中断1标志位

IE0 = 0; //外中断0标志位


关键字:单片机  睡眠  外中断  INT0  INT1唤醒 

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

热门文章 更多
Keil(MDK-ARM)系列教程(七)_菜单