数码之家

 找回密码
 立即注册
搜索
查看: 4927|回复: 6

请高手帮忙编一下STC15W104程序

[复制链接]
发表于 2019-2-19 21:50:31 | 显示全部楼层 |阅读模式
500家元
本帖最后由 统领大人 于 2019-2-19 21:52 编辑

单片机:STC15W104程序要求:
第一:通电3分钟内不管(3.5脚)状态如何,3.3脚都不动作(显高电平);
第二:3分钟后,如果3.5脚(低电平)触发200下,3.3脚显低电平10秒后断开;
第三:之后一直循环检测3.5脚状态,如果3.5脚(低电平)触发200下,3.3脚显低电平10秒后断开;
第四:断电回到第一。

要完整的可修改相应时间的程序源码。

最佳答案

查看完整内容

没芯片测试,只管编译通过,你自己试吧,有问题再改。频率改为12MHz。
发表于 2019-2-19 21:50:32 | 显示全部楼层

没芯片测试,只管编译通过,你自己试吧,有问题再改。频率改为12MHz。


// Writen by elecfunwb @ 2019-02-21
// https://www.mydigit.cn/forum.php?mod=viewthread&tid=9377
// 单片机:STC15W104程序要求:
// 第一:通电3分钟内不管(3.5脚)状态如何,3.3脚都不动作(显高电平);
// 第二:3分钟后,如果3.5脚(低电平)触发200下,3.3脚显低电平10秒后断开;
// 第三:之后一直循环检测3.5脚状态,如果3.5脚(低电平)触发200下,3.3脚显低电平10秒后断开;
// 第四:断电回到第一。

// MCU: STC15W104
// 时钟设置为12MHz
// PIN1  P3.4/RST/T0/~INT2/MCLKO
// PIN2  VCC
// PIN3  P3.5/T0CLKO/~INT3
// PIN4  GND
// PIN5  T2CLKO/~INT4/P3.0
// PIN6  T2/P3.1
// PIN7  INT0/P3.2
// PIN8  RSTOUT_LOW/INT1/P3.3

#include "reg51.h"

#define FOSC 12000000L

#define T1MS (65536-FOSC/1000)      //1T模式
//#define T1MS (65536-FOSC/12/1000) //12T模式

sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;

sfr AUXR = 0x8e;                    //Auxiliary register
sfr INT_CLKO = 0x8f;                //外部中断与时钟输出控制寄存器
sbit P33 = P3^3;

static unsigned int gsMsCnt = 0;    //定时器中断毫秒计数
static unsigned int gsSec = 0;      //定时器倒计时秒数
static unsigned int gs35Cnt = 0;    //P35下降沿计数
bit gb35f = 0;                      //P35计满200次

//定时器0中断服务函数,每1ms中断一次
void tm0_isr() interrupt 1
{
    if (++gsMsCnt >= 1000) {
        gsMsCnt = 0;
        if (gsSec > 0)
            --gsSec;
        else
            TR0 = 0;                //倒计时完成自动关闭
    }
}

//P3.5/INT3中断服务程序
void exint3() interrupt 11
{
    if (++gs35Cnt >= 200) {
        P33 = 0;
        gb35f = 1;                  //指示P35计满200次
        gs35Cnt = 0;                //清空计数
        INT_CLKO &= 0xDF;           //关INT3中断
    }
}

void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;

    AUXR |= 0x80;                   //定时器0为1T模式
//  AUXR &= 0x7f;                   //定时器0为12T模式

    TMOD = 0x00;                    //设置定时器为模式0(16位自动重装载)
    TL0 = T1MS;                     //初始化计时值
    TH0 = T1MS >> 8;
   
    ET0 = 1;                        //打开定时器0中断
    EA = 1;                         //打开全局中断

    //通电3分钟内不管(3.5脚)状态如何,3.3脚都不动作(显高电平)
    P33 = 1;
    gsMsCnt = 0;
    gsSec = 180;                    //3分钟即180秒
    TR0 = 1;                        //定时器0开始计时
    while (TR0);

    //3分钟后,如果3.5脚(低电平)触发200下,3.3脚显低电平10秒后断开;
    gs35Cnt = 0;
    INT_CLKO |= 0x20;               //(EX3 = 1)使能INT3中断

    while(1){
        if (gb35f) {
            gb35f = 0;              //清除计满标志
            gsMsCnt = 0;
            gsSec = 10;             //计时10秒
            TR0 = 1;
            while (TR0);
            P33 = 1;                //10秒后P33恢复高电平
            INT_CLKO |= 0x20;       //重新使能INT3中断,进入下一个触发周期
        }
    }
   
}




回复

使用道具 举报

发表于 2019-2-20 18:58:33 | 显示全部楼层
搞个time1中断计时,以秒为单位,3分钟就是180秒,P33=1。180秒后,计数P35下降沿触发=200下时,P33=0,并计时,10秒钟P33=1。写个while死循环一直检测,结束。
回复

使用道具 举报

发表于 2019-2-21 08:52:57 | 显示全部楼层
大学生就是好,只要上了大学后。就懂编程序了。
回复

使用道具 举报

发表于 2019-2-21 12:11:23 | 显示全部楼层
不是大学生一样可以编程的,
回复

使用道具 举报

发表于 2019-2-21 21:52:38 | 显示全部楼层
定时器用外部中断作为时钟源
回复

使用道具 举报

发表于 2019-3-8 00:24:20 来自手机浏览器 | 显示全部楼层
是大学生也不一定会编程
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-20 09:06 , Processed in 0.312001 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

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