历史上的今天
返回首页

历史上的今天

今天是:2025年02月19日(星期三)

正在发生

2020年02月19日 | 单片机睡眠-外中断INT0 INT1唤醒(汇编+C语言程序)

2020-02-19 来源:51hei

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


单片机源程序如下:

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


用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标志位

                                        EX1 = 1;        //INT1 Enable

                                        EX0 = 1;        //INT0 Enable


                                        IT0 = 1;                //INT0 下降沿中断                

                                //        IT0 = 0;                //INT0 上升,下降沿中断        

推荐阅读

史海拾趣

FCI / Amphenol公司的发展小趣事

FCI公司起源于1988年,当时由Framatome组建,其初衷是作为核能领域外的一个多样化经营项目。然而,随着市场的变化和公司的战略调整,FCI逐渐将重心转向连接器制造。经过20多次的精心收购和策略性扩张,FCI在短短20年内便成长为全球最大的连接器制造公司之一。这一转变不仅展现了FCI对市场敏锐的洞察力,也体现了其卓越的管理能力和执行力。

Gauthier Connectique公司的发展小趣事
可能是遥控器电池电量不足、遥控器与接收电路之间距离过远或有障碍物遮挡。解决方法包括更换遥控器电池、缩短距离或移除障碍物。
Arduino公司的发展小趣事

随着物联网和智能设备的兴起,Arduino平台在智能家居、智能农业、机器人等领域的应用越来越广泛。开发者们可以利用Arduino平台来设计和开发各种智能设备和应用,实现设备的互联互通和智能化控制。这些应用不仅提高了人们的生活质量,也推动了电子行业的进步和发展。

这五个故事展示了Arduino公司在电子行业中的发展历程和取得的成就。从最初的廉价微控制器解决方案,到如今的多样化主板和广泛应用,Arduino始终秉持着创新、开放和合作的精神,为电子行业的发展做出了重要贡献。

CQR SECURITY公司的发展小趣事

在激烈的市场竞争中,CQR SECURITY公司不断探索创新服务模式。公司推出了基于云计算的安全服务平台,为客户提供更加便捷、高效的安全服务。同时,CQR还加强了对客户需求的深入了解,量身定制安全解决方案,满足客户的个性化需求。这种创新服务模式不仅提升了客户满意度,还为CQR带来了更多的商业机会。

Conditioning Semiconductor Devices Corp公司的发展小趣事

随着半导体行业的竞争加剧,价格战和技术更新速度不断加快。CSDC面临着巨大的市场压力。为了应对这些挑战,公司决定调整战略,专注于高端市场的开发。通过加大研发投入,提升产品质量和性能,CSDC逐渐在高端市场站稳了脚跟,实现了业务的稳步增长。

Clover Display Limited公司的发展小趣事

技术创新是Clover Display Limited得以持续发展的核心动力。公司高度重视研发团队的建设,不仅在香港设立了一支强大的研发团队,还不断引进国内外优秀人才。这些研发人员致力于开发液晶显示器(LCD)及液晶显示屏(LCM)的新应用,为公司带来了众多具有市场竞争力的产品。在他们的努力下,Clover Display Limited在液晶显示技术领域取得了多项突破,为公司的快速发展奠定了坚实基础。

问答坊 | AI 解惑

用于高灵敏度器件的交流与直流测量方法

用于高灵敏度器件的交流与直流测量方法…

查看全部问答>

新手请教一个shell问题

小弟现在在启动系统的时候出现shell不能正常运行的情况,感觉是没有shell fdIn = ioGlobalStdGet (STD_IN);     fdOut = ioGlobalStdGet (STD_OUT);     fdErr = ioGlobalStdGet (STD_ERR);     #endif /* SHEL ...…

查看全部问答>

关于U-BLOX 5S的GPS模块在接收数据上分析的问题

小弟最近调试GPS模块,通过单片机串口已经能够接收GPS模块发来的信息了,但是在接收$GPMRC消息的时候,总是有时间信息,后面的定位信息总是V,看手册说V是无法定位,只有A后面才是有效数据,但是总是收不到A,为什么还能收到时间呢?…

查看全部问答>

wince下用什么函数可代替getenv()???

wince下用什么函数可代替getenv()?希望知道的高手告诉一下…

查看全部问答>

求助!信号处理问题

我做一个多参数测试仪,现在有一个复合信号,怎么样分离出交流分量和直流分量. …

查看全部问答>

3D洗衣机 今天你凭什么牛气冲天?

本帖最后由 jameswangsynnex 于 2015-3-3 19:58 编辑 3D智能控制技术,小身材大容量的秘密   过去,人们不得不在洗衣机占位和洗衣效率之间做出选择,要么牺牲精致装修的效果,选择庞然大物;要么牺牲洗衣效率,忍受多次洗衣的繁琐。现在,为了调 ...…

查看全部问答>

请教版主STM32的抗干扰问题

                                 我用STM32做了一个光源控制器,下面有个驱动板。用STM32引脚中的PD8,9,10接1K电阻直接驱动一个指示用LED,一切正常 ...…

查看全部问答>

【晒经典】晒晒我设计的家用煤气报警器

这个从PCB到程序都是本楼主一人完成,现晒晒原理哈,这个老好了,重来就不误报呵呵       这个报警器可不是一般的报警器它可控制电磁阀。直接就关了煤气,等人回来后再把电磁阀拨出来。又重新使用,这个可以挂在家里煤气的 ...…

查看全部问答>

AVR单片机矩阵键盘控制电机

AVR单片机矩阵键盘控制电机,PE口接键盘,pc口接电机,电机正转是0x28,我不知道哪里有问题,求帮忙#include <iom128v.h> #define uchar unsigned char #define uint unsigned int uchar tab[]={0x28,0x28,0x28,0x28}; void delay(uint k) ...…

查看全部问答>

入门贴虚拟机+ubuntu 12.04 环境搭建教程

http://wenku.baidu.com/view/734ae36148d7c1c708a14530.html…

查看全部问答>