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

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

用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 上升,下降沿中断

IT1 = 1;                //INT1 下降沿中断

//        IT1 = 0;                //INT1 上升,下降沿中断

PCON |= 0x02;        //Sleep

_nop_();

_nop_();

_nop_();

}

}

}

}

}

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

//========================================================================

// 函数: void  delay_ms(unsigned char ms)

// 描述: 延时函数。

// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.

// 返回: none.

// 版本: VER1.0

// 日期: 2013-4-1

// 备注:

//========================================================================

void  delay_ms(u8 ms)

{

u16 i;

do{

i = MAIN_Fosc / 13000;

while(--i)        ;   //14T per loop

}while(--ms);

}

/********************* INT0中断函数 *************************/

void INT0_int (void) interrupt INT0_VECTOR                //进中断时已经清除标志

{

EX0 = 0;        //INT0 Disable

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

}

/********************* INT1中断函数 *************************/

void INT1_int (void) interrupt INT1_VECTOR                //进中断时已经清除标志

{

EX1 = 0;        //INT1 Disable

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

}

/**************** 向HC595发送一个字节函数 ******************/

void Send_595(u8 dat)

{

u8        i;

for(i=0; i<8; i++)

{

dat <<= 1;

P_HC595_SER   = CY;

P_HC595_SRCLK = 1;

P_HC595_SRCLK = 0;

}

}

/********************** 显示扫描函数 ************************/

void DisplayScan(void)

{

Send_595(~T_COM[display_index]);                                //输出位码

Send_595(t_display[LED8[display_index]]);        //输出段码

P_HC595_RCLK = 1;

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

if(++display_index >= 8)        display_index = 0;        //8位结束回0

}

欢迎新手学习,老手指教。 1.使用STC15W408AS。DS1302时钟,闹钟,管码管,掉电模式(进入掉电模式电流<10ua,使用18650供电,3.7-5V电池也可通用)。 2.详细注释,非常适合新手学习。如: sfr WKTCL = 0xaa; //掉电唤醒定时器计时低字节 sfr WKTCH = 0xab; */ //掉电唤醒定时器计时高字节 //----------------------------------------------- //sbit P37 = P3^7; //+分。 //sbit P36 = P3^6; //+时。 //sbit P35 = P3^5; //调闹钟。 //sbit P34 = P3^4; //调时间。//-调时间-按P34按P36放P34放P36才能调时间- //sbit P33 = P3^3; //延时18小时。置值65535. //sbit P32 = P3^2; //确认--延时200S。 //sbit P31 = P3^1; //开关闹钟。 sbit TSCLK = P1^5;//时钟线 接到P37上用杜邦线 sbit TIO = P1^6;//数据线,接到P36上 sbit TRST = P1^7;//使能端,接到P35上 //sbit P54 = P5^4;//运行指示灯 //sbit P55 = P5^5; //蜂鸣器。 //------函数声明---------------- void delayms(uint z); //STC15W204S单片机即1MS延时=0.9989MS-11.0592 void qingling(); //P3清零 void Display(uchar Sec, Min);//显示 void Write_DS1302_DAT(uchar cmd, uchar dat);//写DS1302数据 uchar Read_DS1302_DAT(uchar cmd);////读DS1302数据 uchar Dat_Chg_BCD(uchar dat);//数据转BCD码 uchar BCD_Chg_Dat(uchar dat);//BCD码转换为数据 void tiaotime(); //调时间。 uchar duchi();//读一次小时数 uchar dufen();//读分钟数。 ---------------------------------- / ge = ii; //求余-求里面除整数10后的余数 // shi = ii/10; //求模-求里面有多少个整数倍10. -------------------------------- P11 = 0;//点亮第二位数码管 if(Sec1==1) //在调用显示前用求余法确定Sec1是0还是1 { uu=table[Hour]<>1; //再右移一位左补0,即改变第7位变成0。目的显示:两点。 P2 = uu;//显示第二位数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值