一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 1692|回复: 8
收起左侧

[51单片机] 厨房圆盘定时器制作设置时间重开机疑问?

[复制链接]
发表于 2015-2-4 21:09 | 显示全部楼层 |阅读模式
http://www.cdle.net/web/alldata%20/CDLE/cdle090001.htm
这里的厨房定时器有仿做的没,照着做了一个发现设置时间的时候,系统就重新启动复位了。我用的是STC5406AD 芯片。
以下是我自己改正后的电路图

无标题.jpg

发表于 2015-2-4 22:26 | 显示全部楼层
你改成5406,没改程序吗
发表于 2015-2-4 23:30 | 显示全部楼层
ain365 发表于 2015-2-4 22:26
你改成5406,没改程序吗

不是据说51内核都一样吗?
发表于 2015-2-4 23:55 | 显示全部楼层
40560335 发表于 2015-2-4 23:30
不是据说51内核都一样吗?

头文件?
发表于 2015-2-5 09:15 | 显示全部楼层
AT2051是12T单片机,STC是1T的,不知道你是否把STC设成12T的了
发表于 2015-2-5 12:10 | 显示全部楼层
40560335 发表于 2015-2-4 23:30
不是据说51内核都一样吗?

内核是一样的,我是说你要是运行在1T的情况下,要改程序的
发表于 2015-2-5 15:42 | 显示全部楼层
要修改定时器初值,可以用stc下载软件上的工具生成定时器c语言代码,延时函数也要调整一下!
 楼主| 发表于 2015-2-5 22:53 | 显示全部楼层
// #include <AT89x51.H>
// #include <AT89x051.H>
#include "STC12C5410AD.H"

#define KEY                        P32
#define POW                        P35
#define Buzzer        P25

static bit State_b;                                                                         //此值为1时说明定时开始了
static unsigned int  StateT_i;                        //此标识值为设置后按键松开的时标
static unsigned char Time_c;                                 //定时目标值 每单位5分种
static unsigned int  TimeCountS_i;        //当前秒值 每单位20MS
static unsigned char TimeCountM_c;        //当前分值 每5分清0
static unsigned char TimeCountCM_c;        //现走时,每单位5分
static unsigned char Flash_c;                                //闪烁计时
static unsigned char Cyc_c;                                        //圆周显示计时
static unsigned char CycN_c;

void DelayNms(unsigned int MS_i);
void InitMCU(void);
void Display(unsigned char LED_c);

void IO_Config(void)
{
        P1M1 = 0x00;
        P1M0 = 0x00;
        P2M1 = 0x20;//0010 0000
        P2M0 = 0x00;
        P3M1 = 0x20;//0010 0000
        P3M0 = 0x00;//0000 0000
}

void main(void)
{
        POW        = 1;
        P1 = 0x00; //开机全LED亮2秒
        P2 = 0xF0;
        DelayNms(2000);

        InitMCU();
        Buzzer = 0;
       
        while(1);
        {

        }
}

void InitMCU(void)
{
        EA = 1;                                        //允许CPU中断
        ET0 = 1;                                 //定时器0中断打开
        AUXR &= 0x7F;                //定时器时钟12T模式
        TMOD = 0x01;                //设定时器0为模式1,16位模式
//         TH0=0xB1;
//         TL0=0xDF;                                //设定时值为20000us(20ms)
        TL0 = 0xE0;                //设置定时初值
        TH0 = 0xB1;                //设置定时初值
       
        TR0 = 1;                                //开始定时
       
        IO_Config();                //-----------------
       
        State_b = 0;
        Time_c = 1;                        //开机定时值为5分钟
        TimeCountS_i = 0;
        TimeCountM_c = 0;
        TimeCountCM_c = 0;
        Flash_c = 0;
        CycN_c = 0;
        Cyc_c = 0;
}

void Time0(void) interrupt 1
{
        unsigned int Temp;

//         TH0=0xB2;                                //已修正35us
//         TL0=0x02;                                //设定时值为20000us(20ms)
        TL0 = 0xE0;                //设置定时初值
        TH0 = 0xB1;                //设置定时初值
        Flash_c++;
        if (Flash_c > 100)//100
                Flash_c = 0;

        Cyc_c++;
        if (Cyc_c > 25)
                Cyc_c = 0;

        if (State_b==0)
                StateT_i++;                                //设置时标计数
        else
                TimeCountS_i++;                //走时时标计数

        if (TimeCountS_i > 3000)
                {
                        TimeCountM_c++;                 //分值进1
                        TimeCountS_i = 0;                //毫秒值清零       
                }

        if (TimeCountM_c == 5)
                {
                        TimeCountCM_c++;                 //5分值进1
                        TimeCountM_c = 0;                //分值清零
                }

        if (Time_c == TimeCountCM_c) //时间到
                {
//                         Buzzer = 1; //响铃20秒  0
                        for(Temp=0; Temp<100; Temp++)
                                {
                                        Buzzer = !Buzzer; //响铃20秒  0
                                        DelayNms(200);                                       
                                        if (KEY == 0)
                                                Temp = 100; //当有按键时退出 无防抖必要
                                }
                               
                        POW = 0;  //控制电路断电
                }

        if (StateT_i == 200) //定时值设定后4秒或开机4秒,自动转入走时
                State_b = 1;
        if (KEY == 0)
                {                                                                       
                        DelayNms(30);         //延时30ms
                        if (KEY == 0) //按键生效
                                {
                                        if (State_b)  //当前状态在走时中
                                                {
                                                        POW = 0;  //控制电路断电
                                                        while(1); //这里电路已失电停止动作了
                                                }
                                        else
                                                {
                                                        //当前状态是设置状态时
                                                        Time_c++;                                        //定时值加1
                                                        while(0 == KEY);        //加入等待防止按键多次抖动
                                                        if (Time_c > 12)
                                                                Time_c = 1;
                                                        StateT_i = 0;         //清除计数标识
                                                }         
                                }
                        DelayNms(300);         //延时300ms
                }

        if (State_b)
                {
                        if (CycN_c == 12)
                                CycN_c = 0;         //一圈
                                 
                        if (Cyc_c == 0)
                                CycN_c++;
                       
                        Display(CycN_c);

                        if (Flash_c > 50) //闪烁,当前走时处理
                                Display(TimeCountCM_c);
                }

        Display(Time_c);                 //目标定时值显示
       
        DelayNms(4);
        P1 = 0xFF;
        P2 = P2 | 0x0F; //关显示
}

void DelayNms(unsigned int MS_i)
{
        unsigned char Temp_i;

        for(; MS_i > 0; MS_i--)       
        for(Temp_i = 0; Temp_i < 255; Temp_i++);
}

void Display(unsigned char LED_c)
{
        switch (LED_c)
                {
                        case 1:  P10 = 0;
                                break;
                        case 2:  P11 = 0;
                                break;
                        case 3:  P12 = 0;
                                break;
                        case 4:  P13 = 0;
                                break;
                        case 5:  P14 = 0;
                                break;
                        case 6:  P15 = 0;
                                break;
                        case 7:  P16 = 0;
                                break;
                        case 8:  P17 = 0;
                                break;
                        case 9:  P20 = 0;
                                break;
                        case 10: P21 = 0;
                                break;
                        case 11: P22 = 0;
                                break;
                        case 12: P23 = 0;
                                break;
                        case 0:  P23 = 0;
                                break;
                }
}
 楼主| 发表于 2015-2-5 22:55 | 显示全部楼层
还有看作者的主函数中的定时器初值,和定时中断服务程序中的定时值不一样,不知道是怎么计算的?

void Time0(void) interrupt 1
{
        unsigned int Temp;

        TH0=0xB2;                                //已修正35us
        TL0=0x02;                                //设定时值为20000us(20ms)

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-12 23:33 , Processed in 0.070252 second(s), 44 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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