久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3194|回復: 12
打印 上一主題 下一主題
收起左側

求助:網上找來的單片機程序,想添加控制繼電器功能

[復制鏈接]
跳轉到指定樓層
樓主
ID:816562 發表于 2023-2-12 19:47 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
    網上找來的程序,基于51單片機的倒計時裝置,定時時間到后蜂鳴器鳴叫,倒計時結束,想添加一個控制繼電器功能,就是計時開始繼電器吸合,計時結束繼電器釋放,不知道怎么加,請各位大佬幫幫忙,在此謝過了!
    以下是源碼:
//======================================================================
//
//        Copyright (C) 2020 Jobcrazy   
//        All rights reserved
//
//======================================================================

#include <reg52.h>

//Button registers
sbit Step1m = P3^6;  //按鍵3,+1分鐘
sbit Step10m = P3^5;  //按鍵2,+10分鐘
sbit Step1h = P3^4;  //按鍵1,+1小時
sbit StepStart = P3^7;  //按鍵4,開始計時

//Beep register
sbit Beep = P1^6;  //蜂鳴器

//Relay
sbit Relay = P1^7;  //繼電器


//Time Led Dot register
sbit TIME_DOT = P1^5;  //數碼管":"

//Time Led Segment register
sbit ShuMa_Duan_0 = P1^0;  //數碼管1
sbit ShuMa_Duan_1 = P1^1;  //數碼管2
sbit ShuMa_Duan_2 = P1^2;  //數碼管3
sbit ShuMa_Duan_3 = P1^3;  //數碼管4

//Initial settings
#define DEFAULT_HOUR 00
#define DEFAULT_MINUTE 00
#define DEFAULT_SECOND 00
volatile int Hour = DEFAULT_HOUR;
volatile int Minute = DEFAULT_MINUTE;
volatile int Second = DEFAULT_SECOND;

//Led Number Definitions
code unsigned char ShuMa_Data[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92,0x82,0xF8,0x80,0x90};

//Led Number Indexes
volatile int Shi_Left = 0;
volatile int Ge_Left = 0;
volatile int Shi_Right = 0;
volatile int Ge_Right = 0;

//Delay 1 minisecond
void Delay_1ms( int i )
{      
    for( ; i > 0; --i )
    {
        int j = 0;
        for( ; j < 110; ++j )
        {
                        
        }
    }
}

//Timer Settings
void Init_Timer()
{
    TMOD = 0x11; //Using timer 0 and timer 1
    TH0  = 0xB8;
    TL0  = 0x00;  //Timer0 = 20ms

    TH1  = 0xB8;
    TL1  = 0x00;  //Timer1 = 20ms

    TR0  = 0x01;  //Enable Timer 0
    TR1  = 0x00;
}

//Enable Timer
void Init_Interrupt()
{
    ET0 = 1;
    ET1 = 1;
    EA = 1;
}

//Show Number on the Timer Led
void  ShuMa(unsigned char ShuMa_Wei, unsigned char ShuMa_Index)
{
    P2 = ShuMa_Data[ShuMa_Index];

    if( ShuMa_Wei == 0 )
    {
        ShuMa_Duan_0 = 0;
        ShuMa_Duan_1 = 1;
        ShuMa_Duan_2 = 1;
        ShuMa_Duan_3 = 1;        
    }
    else if( ShuMa_Wei == 1 )
    {
        ShuMa_Duan_0 = 1;
        ShuMa_Duan_1 = 0;
        ShuMa_Duan_2 = 1;
        ShuMa_Duan_3 = 1;
    }
    else if( ShuMa_Wei == 2 )
    {
        ShuMa_Duan_0 = 1;
        ShuMa_Duan_1 = 1;
        ShuMa_Duan_2 = 0;
        ShuMa_Duan_3 = 1;
    }
    else if( ShuMa_Wei == 3 )
    {
        ShuMa_Duan_0 = 1;
        ShuMa_Duan_1 = 1;
        ShuMa_Duan_2 = 1;
        ShuMa_Duan_3 = 0;
    }

    //We must delay 1ms here, or else the Led will not show a correct number
    Delay_1ms(1);
}

//Convert the time to a displayable format
void CalcSecond()
{
    if( 0 < Hour )
    {
        Shi_Left = Hour / 10;
        Ge_Left = Hour % 10;

        Shi_Right = Minute / 10;
        Ge_Right =  Minute % 10;
    }
    else
    {
        Shi_Left = Minute / 10;
        Ge_Left = Minute % 10;

        Shi_Right = Second / 10;
        Ge_Right = Second % 10;
    }        
}

//Counter Timer
void Interrupt_Timer_0() interrupt 1
{
    static int Counter = 0;
    TH0 = 0xB8;
    TL0 = 0x00;

    ++Counter;

    if( 49 < Counter )
    {
        //Ths scope will run 1 time per second
        Counter = 0;
        TIME_DOT = ~TIME_DOT;

        Second--;

        //Let's see how long time is left
        if( Second < 0 )
        {
            Second = 59;
            Minute -= 1;
        }

        if( Minute < 0 )
        {
            if( 0 < Hour )
            {
                Hour--;
                Minute = Second = 59;
            }
            else
            {
                Hour = Minute = Second = 0;
                TR0 = 0; //Disable counter timer
                TR1 = 1; //Enable Beep Timer
            }
        }

        CalcSecond();
    }         
}

//Beep timer
void Interrupt_Timer_1() interrupt 3
{
    static int n = 0, Counter = 0;
    TH1 = 0xB8;
    TL1 = 0x00;

    ++Counter;
        


    if( Counter < 10 )
    {
        Beep = 0;
    }
    else if( Counter < 30 )
    {
        Beep = 1;
    }
    else if( Counter > 49 )
    {
        Counter = 0;
        TIME_DOT = ~TIME_DOT;

        n++;

        if( n >= 5 )
        {
            Hour =         DEFAULT_HOUR;
            Minute = DEFAULT_MINUTE;
            Second = DEFAULT_SECOND;
            n = 0;

            //Disable two timers
            TR0 = 0;
            TR1 = 0;        
        }        
    }
}

//Covert time to be recognizable
void formatTime()
{
    if( Minute >= 60 )
    {
        Minute = 0;
        Hour = Hour + 1;        
    }

    if( Hour >= 99 )
    {
        Hour = 0;
        Minute = 0;
        Second = 0;
    }

    CalcSecond();        
}

void main()
{
    //To avoid long press
    int Pressed = 0;

    //Light Timer Dot
    TIME_DOT = 0;

    //Turn Off Beep
    Beep = 1;
        
                 

        
    //Make P3 output high-level signal
    P3 = 0xFF;

    CalcSecond();

    //Infinite loop
    while(1)
    {
        //Covert time to be recognizable
        formatTime();

        //Show time the led screen
        ShuMa( 0, Shi_Left );                        
        ShuMa( 1, Ge_Left );
        ShuMa( 2, Shi_Right );
        ShuMa( 3, Ge_Right );

        if( 0 == TR0 && 0 == TR1 ) //If timer is not running
        {
            if( 0 == Step1m && 0 == Pressed )
            {
                //If Step1m button is pressed down
                Pressed = 1;
                Minute = Minute + 1;
            }
            else if( 0 == Step10m && 0 == Pressed )
            {
                //If Step10m button is pressed down
                Pressed = 1;
                Minute = Minute + 10;
            }
            else if( 0 == Step1h && 0 == Pressed )
            {
                //If Step1h button is pressed down
                Pressed = 1;
                Hour = Hour + 1;        
            }
            else if( 0 == StepStart && 0 == Pressed )
            {
                //If StepStart button is pressed down
                Pressed = 1;
                if ( 0 != Hour || 0 != Minute || 0 != Second )
                {
                    Init_Timer();
                    Init_Interrupt();
                }                                
            }
            else
            {
                if( 1 == Step1m && 1 == Step10m && 1 == Step1h && 1 == StepStart )
                {
                    //If no button is pressed down
                    Pressed = 0;
                }        
            }
        }        

    }
}

Timer-master.zip

46.24 KB, 下載次數: 6

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

使用道具 舉報

沙發
ID:996773 發表于 2023-2-13 09:14 | 只看該作者
搞匯編的我真心看不懂這c語言,天書一樣,倒計時是很簡單的程序,用c寫怎么這么長?對于匯編來說,只要在蜂鳴器不工作的時候加一條clr p0.1或者0.2任意端口拉低就可以用這個口驅動繼電器了
回復

使用道具 舉報

板凳
ID:161164 發表于 2023-2-13 09:30 | 只看該作者
  1. //...
  2. sbit Relay = Px^y;
  3. void main()
  4. {
  5. //...
  6. while(1)
  7. {
  8. //...
  9. Relay = !TR0;
  10. }
  11. }
復制代碼
回復

使用道具 舉報

地板
ID:816562 發表于 2023-2-13 19:16 來自手機 | 只看該作者
lkc8210 發表于 2023-2-13 09:30

萬分感謝,我通過您的代碼問題已經解決!

IMG_20230213_191446.jpg (975.54 KB, 下載次數: 99)

IMG_20230213_191446.jpg

IMG_20230213_191358.jpg (1.27 MB, 下載次數: 92)

IMG_20230213_191358.jpg
回復

使用道具 舉報

5#
ID:492633 發表于 2023-2-13 21:17 來自手機 | 只看該作者
蜂鳴器是0啟動1關閉,那你可以用npn型三極管直接驅動繼電器,當蜂鳴器不響時繼電器導通,蜂鳴器響時繼電器關閉
回復

使用道具 舉報

6#
ID:579397 發表于 2023-2-13 23:05 | 只看該作者
if ( 0 != Hour || 0 != Minute || 0 != Second )
                {
                    Init_Timer();
                    Init_Interrupt();
Relay=~Relay;
                }                              
            }
            else
            {
Relay=~Relay;
                if( 1 == Step1m && 1 == Step10m && 1 == Step1h && 1 == StepStart )
                {
                    //If no button is pressed down
                    Pressed = 0;
                }      
回復

使用道具 舉報

7#
ID:579397 發表于 2023-2-13 23:08 | 只看該作者


我也做了一個,用18650電池的
回復

使用道具 舉報

8#
ID:579397 發表于 2023-2-13 23:08 | 只看該作者
kingzr00 發表于 2023-2-13 19:16
萬分感謝,我通過您的代碼問題已經解決!

數碼管沒有消隱
回復

使用道具 舉報

9#
ID:816562 發表于 2023-2-14 00:54 來自手機 | 只看該作者
3wjkdhus 發表于 2023-2-13 21:17
蜂鳴器是0啟動1關閉,那你可以用npn型三極管直接驅動繼電器,當蜂鳴器不響時繼電器導通,蜂鳴器響時繼電器 ...

感謝你提供的解決思路,蜂鳴器是計時結束時響5聲,如果用蜂鳴器的引腳驅動繼電器,當計時結束時就會重復開關5次,有可能對電氣造成傷害,不過現在問題已經解決了!
回復

使用道具 舉報

10#
ID:816562 發表于 2023-2-14 00:55 來自手機 | 只看該作者
hi等你 發表于 2023-2-13 09:14
搞匯編的我真心看不懂這c語言,天書一樣,倒計時是很簡單的程序,用c寫怎么這么長?對于匯編來說,只要在蜂 ...

感謝,問題已經解決了!
回復

使用道具 舉報

11#
ID:816562 發表于 2023-2-16 23:40 來自手機 | 只看該作者
已經組裝好了,達到預期效果!
回復

使用道具 舉報

12#
ID:816562 發表于 2023-2-16 23:42 來自手機 | 只看該作者
完成效果

IMG_20230216_233836.jpg (819.92 KB, 下載次數: 98)

IMG_20230216_233836.jpg

IMG_20230216_233842.jpg (804.76 KB, 下載次數: 90)

IMG_20230216_233842.jpg

IMG_20230216_233853_BURST1.jpg (766.02 KB, 下載次數: 97)

IMG_20230216_233853_BURST1.jpg
回復

使用道具 舉報

13#
ID:816562 發表于 2023-2-18 15:49 來自手機 | 只看該作者
405616736 發表于 2023-2-13 23:05
if ( 0 != Hour || 0 != Minute || 0 != Second )
                {
                    Init_Timer() ...

謝謝!
回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品久久久久久一区二区 | 人人鲁人人莫人人爱精品 | 国产精品日韩欧美一区二区三区 | 精品福利av导航 | 久久综合久久久 | www久久久 | 一级欧美| 中文字幕一区二区三区乱码在线 | 国产精品资源在线 | 超碰电影| 久在线视频播放免费视频 | 99精品国产一区二区三区 | 国产精品视频观看 | 欧美日韩免费在线 | 欧美一区精品 | 日韩成人在线观看 | 久久久精品一区二区三区 | xxxxx黄色片| 天天精品在线 | 国产资源网 | 欧美h视频 | 日韩精品视频一区二区三区 | 国产一区二区三区久久 | 国产高清视频一区 | 免费一区 | 91久久精品日日躁夜夜躁欧美 | 国产乱码精品一区二区三区中文 | 人人干人人干人人 | 国产在线二区 | 成人在线免费观看 | 在线观看av不卡 | 91一区二区 | 久久精品影视 | 午夜午夜精品一区二区三区文 | 欧美日本韩国一区二区 | 秋霞在线一区 | 91精品国产91久久综合桃花 | 亚洲日韩中文字幕一区 | 老司机深夜福利网站 | 天天爱av| 日韩五月天 |