找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1161|回复: 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 单片机教程网

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