找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2315|回復(fù): 11
打印 上一主題 下一主題
收起左側(cè)

DIY定時插座 附單片機程序原理圖

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:468209 發(fā)表于 2024-5-2 17:59 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
雖然定時插座很便宜 但diy是一種樂趣 現(xiàn)在的手機都是快充 很快充滿 適合睡覺用 也適合電車用
最大可以設(shè)置12小時定時 5個LED燈組合顯示時間 如程序圖所示  
帶記憶功能 為了減少不必要的刷寫 長按按鍵約3秒儲存 看到LED燈閃爍就表示儲存好了  下次點擊按鍵就可以直接進入所保存的時間了




大意了 前面發(fā)的電路圖畫錯了  現(xiàn)在是已修改好的電路圖

hh.jpg (5.53 MB, 下載次數(shù): 41)

hh.jpg

定時插座 -EEPROM.zip

69.38 KB, 下載次數(shù): 39, 下載積分: 黑幣 -5

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏9 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:468209 發(fā)表于 2024-5-3 12:16 來自觸屏版 | 只看該作者
昨晚用了一次 晚上LED有限刺眼 LED限流電阻已換成5K 這個可以跟據(jù)自己須求改動
回復(fù)

使用道具 舉報

板凳
ID:76027 發(fā)表于 2024-5-3 13:49 | 只看該作者
原理圖和程序?qū)Σ簧�,按鍵和繼電器畫錯了。
#include <STC8G.H>         //此文件中定義了單片機的一些特殊功能寄存器   
#include "STC8G_EEPROM.h"  //STC8G內(nèi)部EEPROM驅(qū)動

sbit anjian1=P1^7;   //按鍵引腳定義
sbit jidianqi=P1^0;  //繼電器引腳定義

typedef unsigned char u8;   //無符號字符形數(shù)據(jù)類型進行聲明定義 定義名稱u8 所占位數(shù)8位 范圍0~255
typedef unsigned int u16;   //無符號整形數(shù)據(jù)類型進行聲明定義 定義名稱u16 所占位數(shù)16位 范圍0~65535

u8 fen,miao; //分 秒 變量
bit ajyxzz1,EP_num; //條件允許終止 用于每次操作只允許執(zhí)行一次 防止重復(fù)執(zhí)行
u16 weimiao;


/*1T 12M晶振 延時函數(shù) Delay_ms(1)時大約1ms*/
void Delay_ms(u16 ms)
{

    u8 i,j;
    while(ms--)
    {
        for(i=0; i<7; i++)
            for(j=0; j<99; j++);
    }
}


/*io端口配置*/
void STCIO_in()
{
    P1M0 = 0x00;
    P1M1 = 0x00; //配置P1為準雙向輸出輸入
    P3M0 = 0x00;
    P3M1 = 0x00; //配置P3為準雙向輸出輸入
    //P5M0 = 0x00;
    //P5M1 = 0x00; //配置P5為準雙向輸出輸入
}

/*定時計數(shù)器配置*/
void Timer0_Init(void)                //1毫秒@12.000MHz 16位自動重裝
{
    AUXR |= 0x80;                        //定時器時鐘1T模式
    TMOD &= 0xF0;                        //設(shè)置定時器模式
    TL0 = 0x20;                                //設(shè)置定時初始值
    TH0 = 0xD1;                                //設(shè)置定時初始值
    TF0 = 0;                                //清除TF0標志
    //TR0 = 1;                                //定時器0開始計時
    ET0 = 1;                                //使能定時器0中斷
    EA=1;                   //定時器總開關(guān)
}

/*主函數(shù)*/
void main()
{
    u8 nj_num;    //按鍵累計變量
    u16 cn_num;   //按鍵長短按累計變量
    u16 fne_num;  //分鐘累計變量

    STCIO_in();   //io端口初始化

    jidianqi=1;     //關(guān)閉繼電器 此時斷電
    P3=0x00;        //開機LED全撿 開
    Delay_ms(1000); //延時約1秒
    P3=0xff;        //開機LED全撿 關(guān)

    Timer0_Init(); //定時計數(shù)器初始化
    while(1)
    {
        if(anjian1==0)//判斷時加按鍵是否按下
        {
            Delay_ms(5); //延時消抖
            if(anjian1==0) //再次判斷時加按鍵是否按下
            {
                                ajyxzz1=0; //按鍵條件復(fù)位 等待下一次按鍵操作
                cn_num++;  //長按累計器開始計數(shù)
                if(cn_num>1000)  //長按操作 約3秒
                {
                    P3=0xff;
                                        if(EP_num==0) //這里添加一個條件允許終止 不能它一直重復(fù)擦除寫數(shù)據(jù)
                                        {
                                                IapErase(0x0400);           //擦除EEPROM
                                            IapProgram(0x0400, nj_num); //寫數(shù)據(jù)到EEPROM
                                                EP_num=1;                   //數(shù)據(jù)寫好了 馬上終止 防止程序循環(huán)重復(fù)執(zhí)行
                                        }
                    Delay_ms(200);
                }
            }
        }
        else
        {
            if(cn_num>0&&cn_num<500&&ajyxzz1==0) //短按操作
            {
                                if(nj_num==0)
                                {
                                        nj_num = IapRead(0x0400);  //讀EEPROM
                                        nj_num = nj_num-1;
                                }
                if(nj_num<12)nj_num=nj_num+1;
                else(nj_num=1);

                 miao=0;     //清零秒
                 fen=0;      //清零分
                 jidianqi=0; //啟動繼電器 此時開始通電
                 TR0 = 1;    //定時器開始計數(shù)
                 ajyxzz1=1;  //執(zhí)行完畢 條件終止 防止重復(fù)執(zhí)行
            }
            cn_num=0;  //按鍵長短按累計變量復(fù)位 等待下一次執(zhí)行
                        EP_num=0;  //EEPROM條件允許終止復(fù)位 等待下一次執(zhí)行
        }

        if(nj_num>0)
        {
                        switch(nj_num) //顯示LED燈與時長選擇
            {
                case 1:P3=0x7f;fne_num=60;break;   //0111 1111  1小時
                case 2:P3=0xbf;fne_num=120;break;  //1011 1111  2小時
                case 3:P3=0xdf;fne_num=180;break;  //1101 1111  3小時
                case 4:P3=0xef;fne_num=240;break;  //1110 1111  4小時
                case 5:P3=0xf7;fne_num=300;break;  //1111 0111  5小時
                case 6:P3=0x77;fne_num=360;break;  //0111 0111  6小時  5+1
                case 7:P3=0xb7;fne_num=420;break;  //1011 0111  7小時  5+2
                case 8:P3=0xd7;fne_num=480;break;  //1101 0111  8小時  5+3
                case 9:P3=0xe7;fne_num=540;break;  //1110 0111  9小時  5+4
                case 10:P3=0x67;fne_num=600;break; //0110 0111  10小時 5+4+1
                case 11:P3=0xa7;fne_num=660;break; //1010 0111  11小時 5+4+2
                case 12:P3=0xc7;fne_num=720;break; //1100 0111  12小時 5+4+3
        }
            if(fen==fne_num) //判斷時間是否到了
            {
                TR0 = 0;      //關(guān)閉定時器
                P3 = 0xff;    //關(guān)閉所有LED燈
                jidianqi=1;   //關(guān)閉繼電器 此時斷電
                weimiao = 0;  //毫秒清零
                miao = 0;     //清零秒
                fen = 0;      //清零分
                nj_num = 0;   //按鍵累計變量清零
            }
        }
    }
}

/*定時器0*/
void Timer0_Isr(void) interrupt 1
{
    weimiao++;
    if(weimiao==1000) //1000毫秒=1秒
    {
        miao++;       //秒
        weimiao=0;    //毫秒清零
        if(miao==60)  //60秒=1分鐘
        {
            fen++;    //分
            miao=0;   //分清零
        }
    }
}
回復(fù)

使用道具 舉報

地板
ID:1057925 發(fā)表于 2024-5-3 14:22 | 只看該作者
直接4個指示燈,按二進制編碼
回復(fù)

使用道具 舉報

5#
ID:468209 發(fā)表于 2024-5-3 15:53 來自觸屏版 | 只看該作者
bd5fna 發(fā)表于 2024-5-3 13:49
原理圖和程序?qū)Σ簧�,按鍵和繼電器畫錯了。#include          //此文件中定義了單片機的一些特殊功能寄存器 ...

哦 是哦 我都沒注意看
回復(fù)

使用道具 舉報

6#
ID:468209 發(fā)表于 2024-5-3 15:55 來自觸屏版 | 只看該作者
黑色蜂鳥 發(fā)表于 2024-5-3 14:22
直接4個指示燈,按二進制編碼

可以啊 現(xiàn)在也是二進制 有空間的話 有多的IO口 上12個也夠
自己喜歡貝
回復(fù)

使用道具 舉報

7#
ID:137736 發(fā)表于 2024-5-18 18:57 | 只看該作者
1860774xxxx 發(fā)表于 2024-5-3 15:55
可以啊 現(xiàn)在也是二進制 有空間的話 有多的IO口 上12個也夠
自己喜歡貝

四個燈用不同顏色更好
回復(fù)

使用道具 舉報

8#
ID:468209 發(fā)表于 2024-5-19 07:48 來自觸屏版 | 只看該作者
zmc419 發(fā)表于 2024-5-18 18:57
四個燈用不同顏色更好

晚上睡覺用的 太耀眼了不好
回復(fù)

使用道具 舉報

9#
ID:1111684 發(fā)表于 2024-8-25 10:30 | 只看該作者

請問樓主:這里代碼正確嗎?  紅筆標記的。
回復(fù)

使用道具 舉報

10#
ID:468209 發(fā)表于 2024-8-25 23:52 來自觸屏版 | 只看該作者
ouco123 發(fā)表于 2024-8-25 10:30
請問樓主:這里代碼正確嗎?  紅筆標記的。

這句和
nj_num++;
if(nj_num>8)nj_num=1;
一樣  循環(huán)一周又從1開句 而不是從0開始
回復(fù)

使用道具 舉報

11#
ID:161164 發(fā)表于 2024-8-26 11:35 | 只看該作者
ouco123 發(fā)表于 2024-8-25 10:30
請問樓主:這里代碼正確嗎?  紅筆標記的。

正確寫法是else {nj_num=1;}
回復(fù)

使用道具 舉報

12#
ID:468209 發(fā)表于 2024-8-26 12:32 來自觸屏版 | 只看該作者
lkc8210 發(fā)表于 2024-8-26 11:35
正確寫法是else {nj_num=1;}

else執(zhí)行一條與執(zhí)行多條的區(qū)別 就一條else(xxx;)毛病
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表