欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2778|回復: 5
收起左側

請教單片機1-9小時定時程序怎樣加啟動和停止?

[復制鏈接]
ID:891876 發表于 2023-9-20 11:53 | 顯示全部樓層 |閱讀模式
試著寫了單片機程序,但不知如何加人啟動和停止,定時器TR0為什么不能被其它函數調用呢?

js.JPG
#include <REGX52.H>
#include<intrins.h>
#include"Delay.h" //延時函數申明
unsigned char tem_key=0; //按鍵+次數
unsigned char tem_min;//1分
unsigned char tem; //中間變量
unsigned char        timing_time; //定時時間
sbit key=P1^0; //按鍵定義
sbit LED=P1^1; //定時工作指示

unsigned char smgxs[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//數碼管編碼

void Key()  //按鍵函數
{
        if(key==0)
         {
                 Delay(20);
                 while(key==0);
                 Delay(20);
                 tem_key++;
               
         if(tem_key>=10)  //0-9值循環
                {
                        tem_key=0;
                }
                 tem=tem_key;
                 timing_time=(tem*60); //顯示值*60分鐘
        }
}
void T0Init(void)                //50毫秒@11.0592MHz
{
        TMOD=0x01;                //設置定時器模式
        TL0 = 0x00;                //設置定時初始值
        TH0 = 0x4C;                //設置定時初始值
        TF0 = 0;        //清除TF0標志
        ET0=1;
        EA=1;
        TR0 = 1;                //T0開始計時
}
void Timer0_Rountiue() interrupt 1 //中斷程序
{
        unsigned char tem_ms;
        unsigned int tem_s; //1秒
        TL0 = 0x00;                //重裝初始值
        TH0 = 0x4C;                //重裝初始值
        tem_ms++;
        if(tem_ms==20)
        {
                tem_s++; //秒
                tem_ms=0;
                LED=~LED;
        }
        if(tem_s==3600)
        {
                tem_min++;  //分
                tem_s=0;
        }
}
void main()
{
        T0Init(); //T0初始化
        while(1)
        {
                Key();
                P0=smgxs[tem_key]; //顯示送P0
                if(timing_time==tem_min) //時間到
                {
                        tem_min=0; //時間到清零
                        //執行程序。。。
                }
        }
}

75行加上定時器沒起作用,開機就執行程序了,是什么原因?

3.JPG






回復

使用道具 舉報

ID:140644 發表于 2023-9-20 12:08 | 顯示全部樓層
比較啊==  >=  <=
回復

使用道具 舉報

ID:123289 發表于 2023-9-21 09:14 | 顯示全部樓層
先畫個邏輯框圖,理理思路,而后再寫程序。
回復

使用道具 舉報

ID:642276 發表于 2023-9-27 12:10 | 顯示全部樓層
/*
uint8        time10ms_count = 0;
uint8        time1s_count = 0;
bit                time10ms_flag = 0;
bit                time1s_flag = 0;
定時中斷函數  //1ms進入一次
{
        if(++time10ms_count>10)
        {
                time10ms_count = 0;
                time10ms_flag = 1;                //10ms標志
                if(++time1s_count>100)
                {
                        time1s_count = 0;
                        time1s_flag = 1;        //1s標志
                }
        }
}
uint8        key_value = 0;
uint8        key_count = 0;
bit         key_flag = 0;
按鍵判斷函數  //10ms跑一次
{
        if(!key)
        {
                if(key_count<100)
                {
                        if(++key_count>100)
                        {
                                key_count = 100;
                                key_flag = !key_flag;                //長按啟動 暫停標志
                        }                       
                }
        }
        else
        {
                if(key_count>2&&key_count<50)                //按下時間大于20ms小于500ms判斷為點擊
                {
                        if(++key_value>9)                //鍵值加加
                                key_value = 0;
                }
                key_count = 0;               
        }
}
uint8 time = 0;
uint16 time_count = 0;
uint8        time_s = 0;
定時時間函數  //1s跑一次
{
        if(key_value==time)
        {
                ;
        }
        else
        {
                time_s = 0;                //重新計時
                time = key_value;        //賦值定時
        }
        if(time>0)               
        {
                if(++time_count>3600)
                {
                        time_count = 0;
                        if(++time_s>=time)
                        {
                                time_s = 0;        //定時時間到

                        }
                }
        }
}

void main()
{
        while(1)
        {
                if(time10ms_flag)
                {
                        time10ms_flag = 0;
                        按鍵判斷函數 ; //10ms跑一次
                }
                if(time1s_flag)
                {
                        time1s_flag = 0;
                        if(key_flag)                //啟動
                                定時時間函數 ; //1s跑一次
                        else  //停止
                        //可以清除定時之類的
                }
        }
}

*/
回復

使用道具 舉報

ID:213173 發表于 2023-9-27 20:25 | 顯示全部樓層
此2變量要加關鍵字static 為靜態或聲明全局變量,否則會亂套。
void Timer0_Rountiue() interrupt 1 //中斷程序
{
        static unsigned char tem_ms;
        static unsigned int tem_s; //1秒
回復

使用道具 舉報

ID:195496 發表于 2023-9-28 08:33 | 顯示全部樓層
很簡單,按鍵控制一個變量,再去判斷是否啟動定時,關定時后,重按啟動,清除原來的計時值,重啟定時器,不難
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表