一个闹钟的单片机程序

发布者:Blissful444最新更新时间:2012-08-13 来源: 51hei关键字:闹钟  单片机程序  STC89C52 手机看文章 扫描二维码
随时随地手机看文章

一个闹钟的单片机程序。

其中蜂鸣器接P37,我的单片机数码管是四位共阳数码管,接P0和P2,K1接P14,K2接P15,K3接P16,K4接P17。晶振采用12MHz。STC89C52

点击浏览下一页[page]

代码如下:

//File: Clock.c
#include
const unsigned char LED7Code[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
unsigned int hour,minute,second,cHour,cMinute;
bit isClick = 0;
unsigned char modify =0x00;//是否处于时间编辑状态
bit isClock =0;//是否开启闹钟

unsigned char timercount;
void timer0() interrupt 1
{
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    timercount++;
    if(timercount==20)
    {
        timercount=0;
        second++;
        if(second==60)
        {
            minute++;
            second=0;
        }
        if(minute==60)
        {
            hour++;
            minute=0;
        }
        if(hour==24)
        {
            hour=0;
        }
    }  
}
//延迟
void Delay(unsigned int time)
{
    unsigned char a,b;
    for(a=0;a            for(b=0;b<120;b++);
}

//用于显示时间
void ShowTime(void)
{  
    unsigned int a,b, tempH,tempM;
    unsigned char showChar;
    if(modify==0x00 || modify ==0x01 || modify ==0x02)
    {
        tempH=hour;
        tempM=minute;
    }
    else
    {
        tempH=cHour;
        tempM=cMinute;
    }  
  
    if(modify==0x00 || modify ==0x01 || modify ==0x03)
    {
        //显示第4个数码管
        P0=0xFF;
        P2=0xFF;  
        a=tempH/10;
        showChar=LED7Code[a];
        P0=showChar;
        P2_3=0x00;
        Delay(1);//延迟很短
  
        //显示第3个数码管
        P0=0xFF;
        P2=0xFF;  
        b=tempH%10;
        showChar=LED7Code[b];
        P2_2=0x00;
        P0=showChar;
        Delay(1);//延迟很短
    }
  
    if(modify==0x00 || modify ==0x02 || modify ==0x04)
    {
        //显示第2个数码管
        P0=0xFF;
        P2=0xFF;  
        a=tempM/10;
        showChar=LED7Code[a];
        P0=showChar;
        P2_1=0x00;
        Delay(1);//延迟很短
  
        //显示第1个数码管
        P0=0xFF;
        P2=0xFF;  
        b=tempM%10;
        showChar=LED7Code[b];
        P2_0=0x00;
        P0=showChar;
        Delay(1);//延迟很短
    }
}

//蜂鸣器响
void Beep()   
{
   unsigned char i  ;
   for (i=0  ;i<100  ;i++)
   {
     Delay(100)  ;
     P3_7=!P3_7  ;   //Beep取反
   }
   P3_7=1  ;         //关闭蜂鸣器
   Delay(100);
  }

void main(void)
{
    unsigned int i;
    hour=12;
    minute=30;
    second=0;
    cHour=7;
    cMinute=0;
  
    TMOD=0x01;
    ET0=0x01;//定时器T0可以中断
    EA=0x01;//表示允许所有的中断
    TR0=0x01;//开始T0计时
  
    while(1)
    {
        if(P1_4==0x00)//按下了K1键,增加小时或分钟
        {
            if(!isClick)
            {
                switch(modify)
                {
                    case 0x01://调整小时
                        hour++;
                        if(hour==24)
                            hour=0;
                        break;
                    case 0x02://调整分钟
                        minute++;
                        if(minute==60)
                            minute=0;
                        break;
                    case 0x03://调整闹钟的小时
                        cHour++;
                        if(cHour==24)
                            cHour=0;
                        break;
                    case 0x04://调整闹钟的分钟
                        cMinute++;
                        if(cMinute==60)
                            cMinute=0;
                        break;  
                    default:
                        break;
                }
                isClick=1;  
            }
        }
        else if(P1_5==0x00)//按下了K2键,减少小时或分钟
        {
            if(!isClick)
            {
                switch(modify)
                {
                    case 0x01://调整时间的小时                      
                        if(hour==0)
                            hour=23;
                        else
                            hour--;
                        break;
                    case 0x02://调整时间的分钟                      
                        if(minute==0)
                            minute=59;
                        else
                            minute--;
                        break;
                  case 0x03://调整闹钟的小时                      
                        if(cHour==0)
                            cHour=23;
                        else
                            cHour--;
                        break;
                    case 0x04://调整闹钟的分钟                      
                        if(cMinute==0)
                            cMinute=59;
                        else
                            cMinute--;
                        break;
                    default:
                        break;
                }
                isClick=1;  
            }
        }
        else if(P1_6==0x00)//按下了K3键,更改模式,第一次修改小时,第二次修改分钟,第三次恢复
        {
            if(!isClick)
            {
                switch(modify)
                {
                    case 0x00://不是修改状态,调整小时                  
                        modify=0x01;
                        break;
                    case 0x01://调整分钟                  
                        modify=0x02;
                        break;
                    case 0x02://调整闹钟的小时      
                        modify=0x03;
                        break;
                    case 0x03://调整闹钟的分钟      
                        modify=0x04;
                        break;
                    case 0x04://不修改      
                        modify=0x00;
                        break;              
                    default:
                        break;
                }
                isClick=1;  
            }
        }
        else if(P1_7==0x00)//按下了K4键,开启或关闭闹钟
        {
            if(!isClick)
            {
                isClock=~isClock;
                isClick=1;  
            }
        }
        else
            isClick=0;
      
        //闹钟是否响了
        if(isClock)
        {
            if(hour==cHour && minute == cMinute)
            {
                Beep();//响
            }
        }
        ShowTime();          
    }  
}

关键字:闹钟  单片机程序  STC89C52 引用地址:一个闹钟的单片机程序

上一篇:51单片机:8x8点阵显示心形图案
下一篇:基于stc89c52rc单片机的数字钟设计程序

推荐阅读最新更新时间:2024-03-16 13:05

用普中开发板做的51单片机的智能时钟具有闹钟功能
本贴针对学完单片机并且有读懂代码的非新手同学。本人目前放寒假,这个是本人在上个学期的单片机课上要求做的综合实验,现在重新修改了下增加了菜单目前测试毫无问题可以完美使用。有志向做闹钟的同学可以参考一下,原码上由本人写的大量注释可以方便看懂。 使用了LCD1602、DS1302、DS18B20用来测试温度、内部含闹钟系统但本人没有做EEPROM有需要的同学可以自行添加。 单片机源程序如下: #include reg52.h #include key.h #include LCD1602.h #include DS1302.h #include music.h #include DS18B20.H #define no
[单片机]
基于51单片机的光驱激光雕刻机源程序电路图+上位机
根据他人DIY 激光雕刻机 手绘原理图 画得不好勿怪,实验操中 电路原理图如下: 单片机源程序如下: /*z地址定义 50 1=x+,2=x-,3=y+,4=y- 51 前进后退步数高 52 前进后退步数低 53 54/55 字宽 56 57 弱光开关 58/59 激光强度 60 x轴速度 61 y轴速度 62 开始打印0,57 63 暂停 64 停止标志 65 66 左右标记 100开始时灰度图数据 */ #include reg52.h #define uint unsigned int #define uchar unsigned char #define N z //X速度 #define
[单片机]
基于51<font color='red'>单片机</font>的光驱激光雕刻机源<font color='red'>程序</font>电路图+上位机
51单片机-STC89C52系列学习第三篇之中断学习
八个中断请求源: 1、外部中断0 2、外部中断1 3、外部中断 2 4、外部中断3 5、定时器0中断 6、定时器1中断 7、定时器2中断 8、串口中断 所有的中断都具有四个中断优先级: 优先级0:0,0(最低) 优先级1:0,1 优先级2:1,0 优先级3:1,1(最高) 中断触发方式: 外部中断0、1、2、3既可低电平触发也可下降沿触发。 定时器中断0、1:溢出 串口中断:发送或接收完成 C语言编程,中断查询次序号就是中断号: void Int0_ISR(void) interrupt 0; void timer0_ISR(void) interrupt 1; void Int1_ISR(void) interrupt
[单片机]
51<font color='red'>单片机</font>-<font color='red'>STC89C52</font>系列学习第三篇之中断学习
LD3320语音识别模块系列单片机程序代码
单片机源程序如下: /***************************飞音云电子**************************** ** 工程名称:YS-V0.7语音识别模块驱动程序 ** CPU: STC11L08XE ** 晶振:22.1184MHZ ** 波特率:9600 bit/S ** 配套产品信息:YS-V0.7语音识别开发板 ** 说明:普通+按键触发模式: 即每次识别时都需要说“小杰”这个口令 ,才能够进行下一级的识别 /***************************飞音云电子******************************/ #include config.
[单片机]
ADC0832模数转换MSP430单片机程序+电路图
下面是电路图: ADC0832封装图 ADC0832与单片机连接图 ADC0832时序图 程序源码下载: #include msp430f2121.h #define DO (P1IN&BIT7) #define uchar unsigned char #define uint unsigned int /*********************************************** sbit cs=P2^0; sbit clk=P2^1; sbit DI=P2^2; sbit DO=P2^6; ***************************************
[单片机]
ADC0832模数转换MSP430<font color='red'>单片机</font><font color='red'>程序</font>+电路图
超声波测距单片机C程序
单片机源程序如下: #include reg52.h //STC89C52头文件 #define uchar unsigned char #define uint unsigned int unsigned int time=0; unsigned int timer=0; unsigned long S=0; //距离变量 bit flag =0; //超声波模块量程溢出标志( 5米时置1) sbit echo=P1^0; //超声波模块的发射端 sbit trig=P1^1; //超声波模块的接收端 sbit ds=P2^2; //DS18B2
[单片机]
超声波测距<font color='red'>单片机</font>C<font color='red'>程序</font>
单片机复位程序
今天在网上看到这么一个单片机复位的程序,这个程序据说是一个大三的学生写出来的,不错,写的很有一定的道理,其C编程也达到了一定程度了【小盒子我还是很佩服这个人的】。下面我们来看看这个代码: void main(void) { unsigned char code rst ={0xe4,0xc0,0xe0,0xc0,0xe0,0x32}; // 复位代码 (*((void (*)())(rst)))(); // 执行上一行代码,将rst数组当函数调用 } 第一句定义一个数组rst ,数组内数据就是完成复位功能的汇编机器码,具体对应关系为: clr a == 0xe4、push acc == 0xc0,0xe0、reti
[单片机]
单片机监控程序的实现
1 引 言   在调试单片机应用系统时,需要反复地修改用户程序,为了避免频繁地使用编程器写存储芯片,可以编制单片机监控程序,单片机的监控程序接收来自PC机的用户程序,PC机向单片机发送用户程序。 2 用户程序格式   用户将单片机源程序(.asm文件)汇编后形成.hex格式的文件,该文件即为发送至单片机的十六进制可执行文件。该文件的结构是:由多行构成,行头为起始符(:),然后是该行有效数据字节数(满行时该数为10,即十进数16),接下来为两字节地址及00,接着是有效数据,行尾是校验码及换行符。为了简化单片机监控程序,仅向单片机发送行字节数和有效数据,可用下面的简单C语句从.hex文件中提取字节数和有效数据:   fscan
[单片机]
<font color='red'>单片机</font>监控<font color='red'>程序</font>的实现
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved