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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機程序為什么時間有時快有時慢還有鬧鐘響了只會為什么秒數不會增加?

[復制鏈接]
跳轉到指定樓層
樓主
ID:924233 發表于 2021-5-20 08:47 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
能不能幫我看一下,先謝謝

#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define LCD1602_DB  P0 //定義1602的DB口為P0口
uchar code table[]="CurrentTime"; //當前時間
uchar code table1[]="00:00:00";
uchar key1Flag = 0;//定義按鍵關閉符
uchar key2Flag = 0;
uchar key3Flag = 0;
uchar key4Flag = 0;
uchar count = 0;
uchar sec = 57;//秒
uchar min = 59;//分
uchar hour = 9;//小時
uchar clockHour = 0;//鬧鐘小時
uchar clockMin = 0;//分
uchar clockFlag = 0;// 定義鬧鐘關閉符
uchar beepNum = 0;//聲音
uchar temp=0;
uchar shijian=0;
sbit LCD1602_RS = P2^0;        //指令1/數據0選擇端
sbit LCD1602_RW = P2^1;        //讀1寫0選擇端
sbit LCD1602_E = P2^2;        //讀1寫0使能端
sbit Key1 = P1^0;//定義鍵位符
sbit Key2 = P1^1;
sbit Key3 = P1^2;
sbit Key4 = P1^3;
sbit Speaker = P2^5;//定義蜂鳴器
sbit LED=P2^4;
void Delay1ms()                //@12.000MHz
{
        uchar i, j;

        i = 12;
        j = 169;
        do
        {
                while (--j);
        } while (--i);
}
void Delay20ms()                //@12.000MHz
{
        uchar i, j, k;

        _nop_();
        _nop_();
        i = 1;
        j = 234;
        k = 113;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}
void delay()
{
    unsigned int a;
        while(a--);
}
void Beep()         //蜂鳴器警報
{                                 
        Speaker = 0;
        Delay20ms();
        Speaker = 1;
}
void LcdWaitReady()         //檢查LCD忙函數
{

        uchar sta;
        LCD1602_DB = 0xFF;
        LCD1602_RS = 0;
        LCD1602_RW = 1;
        do        {
                LCD1602_E = 1;
                sta = LCD1602_DB;
                LCD1602_E = 0;
        }while(sta & 0x80);
}

void LcdWriteCmd(uchar cmd)        //寫命令函數
{

        LcdWaitReady();
        LCD1602_RS = 0;
        LCD1602_RW = 0;
        LCD1602_DB = cmd;
        LCD1602_E = 1;
        LCD1602_E = 0;
}
void LcdWriteDat(uchar dat)        //寫數據函數
{

        LcdWaitReady();
        LCD1602_RS = 1;
        LCD1602_RW = 0;
        LCD1602_DB = dat;
        LCD1602_E = 1;
        LCD1602_E = 0;
}
void LcdSetCursor(uchar x, uchar y)//時間設置
{

        uchar addr;
        if(y == 0)
                addr = 0x00 + x;
        else
                addr = 0x40 + x;
        LcdWriteCmd(addr | 0x80);
}
void LcdShowStr(uchar x, uchar y, uchar *str)
{

        LcdSetCursor(x, y);
        while(*str != '\0')
        {
                LcdWriteDat(*str++);   
        }
}
void InitLcd1602()//初始化LCD函數         
{

        LcdWriteCmd(0x01);
        LcdWriteCmd(0x38);
        LcdWriteCmd(0x0c);
        LcdWriteCmd(0x06);
}
void WriteAddress(uchar x)
{
         LcdWriteCmd(0x80 + x);
}
void DisplayMinTens()   //顯示分十位
{                                
        WriteAddress(0x49);
        LcdWriteDat((min / 10) + '0');
        Delay1ms();
}
void DisplayMinUnits()          //顯示分個位
{                    
        WriteAddress(0x4A);
        LcdWriteDat((min % 10) + '0');
        Delay1ms();        
}
void DisplayHourTens()   //顯示時十位
{                                
        WriteAddress(0x46);
        LcdWriteDat((hour / 10) + '0');
        Delay1ms();
}
void DisplayHourUnits()//顯示時個位
{                     
        WriteAddress(0x47);
        LcdWriteDat((hour % 10) + '0');
        Delay1ms();        
}
void DisplayClkMinTens()  //顯示鬧鐘分十位
{                                 
        WriteAddress(0x49);
        LcdWriteDat((clockMin / 10) + '0');
        Delay1ms();
}
void DisplayClkMinUnits() //顯示鬧鐘分個位
{                     
        WriteAddress(0x4A);
        LcdWriteDat((clockMin % 10) + '0');
        Delay1ms();        
}
void DisplayClkHourTens()  //顯示鬧鐘時十位
{                        
        WriteAddress(0x46);
        LcdWriteDat((clockHour / 10) + '0');
        Delay1ms();
}
void DisplayClkHourUnits() //顯示鬧鐘時個位
{                     
        WriteAddress(0x47);
        LcdWriteDat((clockHour % 10) + '0');
        Delay1ms();        
}
void DisplayClkSecTens() //顯示秒十位
{                     
        WriteAddress(0x4C);
        LcdWriteDat((sec / 10) + '0');
        Delay1ms();        
}
void DisplayClkSecUnits() //顯示秒個位
{                        
        WriteAddress(0x4D);
        LcdWriteDat((sec % 10) + '0');
        Delay1ms();        
}

void ScanKey4()
{
        if((Key4 == 0)&(clockFlag ==1))
        {
                Delay20ms();
                if((Key4 == 0)&(clockFlag ==1))
                 {
                        clockFlag = 0;
                        beepNum = 0;
                        key4Flag = 0;
                }
        }
}
void InitTimer0()//初始化定時器0
{                                 
        TMOD = 0x11;
        TH0 = (65536 - 50000) / 256;
        TL0 = (65536 - 50000) % 256;
        TH1 = (65536 - 50000) / 256;
        TL1 = (65536 - 50000) % 256;
        ET1=1;
   ET0=1;
        EA = 1;
        PT0=1;
        TR0=1;
        TR1=1;
        
               
}
void main()//主函數
{

        InitLcd1602();
        LcdShowStr(0,0,table);
        LcdShowStr(6,1,table1);
        InitTimer0();
        while(1)
         {
                if(sec == 60)
                {
                sec = 0;
                min++;
                }
                if(min == 60)
                 {
                        min = 0;
                        hour++;
                }
                if(hour == 24)
                 {
                        hour = 0;
                }
                LcdShowStr(0,0,table);
                DisplayHourTens();
                DisplayHourUnits();
                LcdShowStr(8,1,":");               
                DisplayMinTens();
                DisplayMinUnits();
                LcdShowStr(11,1,":");
                DisplayClkSecUnits();
                DisplayClkSecTens();
//==============================================================        
                if((Key1 == 0)&(key1Flag == 0)) {              //設置當前時間
                        Delay20ms();
                        if((Key1 == 0)&(key1Flag == 0)) {
                                TR0 = 0;
                                InitLcd1602();
                                LcdShowStr(0,0,"SetCurrentTime");
                                DisplayHourTens();
                                DisplayHourUnits();
                                LcdShowStr(8,1,":");
                                DisplayMinTens();
                                DisplayMinUnits();
                                key1Flag = 1;
                        }
           }
                while(key1Flag == 1)
                 {
                        if(Key1 == 0) {
                                Delay20ms();
                                if(Key1 == 0)
                                {
                                        hour++;
                                        if(hour == 24)
                                         {
                                                hour = 0;
                                        }
                                        DisplayHourTens();
                                        DisplayHourUnits();
                                        LcdShowStr(8,1,":");
                                        DisplayMinTens();
                                        DisplayMinUnits();
                                }
                        }
                        if(Key2 == 0)
                        {
                                Delay20ms();
                                if(Key2 == 0)
                                {
                                        min++;
                                        if(min == 60)
                                        {
                                                min = 0;
                                                hour++;
                                        }
                                        DisplayHourTens();
                                        DisplayHourUnits();
                                        LcdShowStr(8,1,":");
                                        DisplayMinTens();
                                        DisplayMinUnits();
                                }
                        }
                        if((Key3 == 0)&(key1Flag == 1)) {                 //退出設置當前時間
                                Delay20ms();
                                if((Key3 == 0)&(key1Flag == 1)) {
                                        InitLcd1602();
                                        LcdShowStr(0,0,table);
                                        DisplayHourTens();
                                        DisplayHourUnits();
                                        LcdShowStr(8,1,":");               
                                        DisplayMinTens();
                                        DisplayMinUnits();
                                        LcdShowStr(11,1,":");
                                        DisplayClkSecUnits();
                                        DisplayClkSecTens();        
                                        key1Flag = 0;
                                        TR0 = 1;
                                }
                        }                                       
                }
//==============================================================
                if((min==0)&(sec<5)) //時間到整點
                 {        
                         LED=0;
                        delay();
                         Beep();
                         Beep();
                         Delay20ms();            
                }
                if((min==0)&(sec>=5))
                {
                LED=1;
                }

//==============================================================
                if((Key2 == 0)&(key2Flag == 0))
                {                        //顯示鬧鐘時間
                        Delay20ms();  
                        if((Key2 == 0)&(key2Flag == 0))
                         {
                                key2Flag = 1;
                                InitLcd1602();
                                while(key2Flag == 1)
                                 {
                                        LcdShowStr(0,0,"Clock Time");
                                        DisplayClkHourTens();
                                        DisplayClkHourUnits();
                                        LcdShowStr(8,1,":");
                                        DisplayClkMinTens();
                                        DisplayClkMinUnits();
                                        if(Key2 == 0)
                                        {
                                                Delay20ms();
                                                if(Key2 == 0)
                                                 {
                                                        key2Flag = 0;
                                                        InitLcd1602();
                                                        DisplayHourTens();
                                                        DisplayHourUnits();
                                                        LcdShowStr(8,1,":");               
                                                        DisplayMinTens();
                                                        DisplayMinUnits();
                                                        LcdShowStr(11,1,":");
                                                        DisplayClkSecUnits();
                                                        DisplayClkSecTens();
                                                }
                                        }        
                                }
                        }
                }
//==============================================================
                if((Key3 == 0)&(key3Flag == 0))         //設置鬧鐘時間
                 {                        
                        Delay20ms();
                        if((Key3 == 0)&(key3Flag == 0))
                         {
                                TR0 = 0;
                                InitLcd1602();
                                LcdShowStr(0,0,"SetClockTime");
                                DisplayClkHourTens();
                                DisplayClkHourUnits();
                                LcdShowStr(8,1,":");
                                DisplayClkMinTens();
                                DisplayClkMinUnits();
                                key3Flag = 1;
                        }        
                }
                while(key3Flag == 1)
                {
                        if(Key1 == 0)
                        {
                                Delay20ms();
                                if(Key1 == 0)
                                {
                                         clockHour++;
                                         if(clockHour == 24)
                                         {
                                                 clockHour = 0;
                                         }
                                         DisplayClkHourTens();
                                         DisplayClkHourUnits();
                                         LcdShowStr(8,1,":");
                                         DisplayClkMinTens();
                                         DisplayClkMinUnits();
                                }
                        }
                        if(Key2 == 0)
                        {
                                Delay20ms();
                                if(Key2 == 0)
                                {
                                        clockMin++;
                                        if(clockMin == 60)
                                         {
                                                clockHour++;
                                                clockMin = 0;
                                        }
                                         DisplayClkHourTens();
                                         DisplayClkHourUnits();
                                         LcdShowStr(8,1,":");
                                         DisplayClkMinTens();
                                         DisplayClkMinUnits();
                                }
                        }
                        if(Key3 == 0)
                        {                                                         //退出設置鬧鐘時間
                                Delay20ms();
                                if(Key3 == 0)
                                {
                                        key3Flag = 0;
                                        InitLcd1602();
                                        TR0 = 1;
                                        DisplayHourTens();
                                        DisplayHourUnits();
                                        LcdShowStr(8,1,":");               
                                        DisplayMinTens();
                                        DisplayMinUnits();
                                        LcdShowStr(11,1,":");
                                        DisplayClkSecUnits();
                                        DisplayClkSecTens();
                                }
                        }
                }
//==============================================================
                if((Key4 == 0)&(key4Flag == 0)) //鬧鐘ON/OFF位設置
                {                        
                        Delay20ms();
                        if((Key4 == 0)&(key4Flag == 0))
                         {
                                key4Flag = 1;
                                InitLcd1602();
                                LcdShowStr(0,0,"Clock ON");
                                Delay20ms();
                                
                                Delay20ms();
                                
                                Delay20ms();
                                
                                Delay20ms();
                                
                                Delay20ms();
                        }
                }
                if((Key4 == 0)&(key4Flag == 1))         //鬧鐘ON/OFF位設置
                 {                        
                        Delay20ms();
                        if((Key4 == 0)&(key4Flag == 1))
                        {
                                key4Flag = 0;
                                InitLcd1602();                                   
                                LcdShowStr(0,0,"Clock OFF");
                                Delay20ms();
                                Delay20ms();
                                Delay20ms();
                                Delay20ms();
                        }
                }
//==============================================================
        if((key4Flag == 1)&(hour == clockHour)&(min == clockMin))
        {        
                        clockFlag = 1;                                                         //鬧鐘時間到
                        InitLcd1602();
                        LcdShowStr(0,0,table);
                        LcdShowStr(0,0,"Time's up");
                                        DisplayHourTens();
                                        DisplayHourUnits();
                                        LcdShowStr(8,1,":");               
                                        DisplayMinTens();
                                        DisplayMinUnits();
                                        LcdShowStr(11,1,":");
                                        DisplayClkSecUnits();
                                        DisplayClkSecTens();
                        while(clockFlag == 1)
                        {
                            LED=!LED;
                                Beep();
                                ScanKey4();
                                Delay20ms();
                                ScanKey4();
                                Delay20ms();
                                ScanKey4();
                                Delay20ms();
                                ScanKey4();
                                Delay20ms();
                                ScanKey4();
                                        Delay20ms();
                                ScanKey4();
                                        Delay20ms();
                                ScanKey4();
                                Delay20ms();
                                ScanKey4();
                                Delay20ms();
                                ScanKey4();
                                beepNum++;
                                if(beepNum == 20)
                                {
                                        clockFlag = 0;
                                        beepNum = 0;
                                        key4Flag = 0;
                                        LED=1;
                                }        
                        }
                }
        }
}
void Timer0() interrupt 1
{
        temp++;
        if(temp == 20)
        {
                sec++;
                temp = 0;
        }
        TH0 = (65536 - 50000) / 256;
        TL0 = (65536 - 50000) % 256;
}
void Timer1() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久精品一级 | 日韩欧美国产成人一区二区 | 人人澡人人爱 | 国产精品成人在线观看 | 久久免费精品 | 狠狠干狠狠操 | 成人国产在线观看 | 一区二区三区亚洲精品国 | 少妇一级淫片免费播放 | 成人综合视频在线观看 | 欧美久久久久久 | 毛片视频免费 | 日韩一区二区三区视频在线播放 | 国产在线a | 91精品一区二区三区久久久久久 | 日韩综合在线 | 国产美女免费视频 | 免费国产视频在线观看 | 综合激情久久 | 97国产成人 | 毛片.com| 精品一二三区 | 美美女高清毛片视频免费观看 | 日韩精品一区二区三区在线观看 | 特级生活片 | www.4567| 国产成人精品午夜视频免费 | 亚洲精品v日韩精品 | 亚洲一区二区三 | 精品九九九 | 婷婷国产一区二区三区 | 国产精品我不卡 | 国产2区| 男女视频在线观看 | 久久www免费人成看片高清 | 久草综合在线视频 | 日韩美女一区二区三区在线观看 | 午夜资源 | a精品视频| 国产亚洲精品久久久优势 | 欧美精品一区二区三区蜜桃视频 |