我用单片机写的电子时钟

发布者:码字探险最新更新时间:2015-07-23 关键字:单片机  电子时钟 手机看文章 扫描二维码
随时随地手机看文章

 

学习单片机半个月了,学得也差不多了,今天写一个写程序练习练习哈哈

跟电子表的功能一模一样,可以进行设置,准确度非常高哈哈,用的是1602型号的液晶显示器,大家只需要简单的修改一下端口就能应用到你自己的设计上去了.

 下面是源代码:

#include

#define  uchar unsigned char

#define  uint  unsigned int 

uchar  code  year_table[]="  2010-04-11 SUN";

uchar  code  time_table[]="    00:00:00";


uchar  time_count,key_count;

char  hour,minute,second,mouth,day,week;

uint year;

sbit    rs=P3^5;

sbit    lcden=P3^4;

sbit dula=P2^6;

sbit wela=P2^7;

sbit key_set=P3^0;

sbit key_inc=P3^1;

sbit key_dec=P3^2;

sbit rd=P3^7;

void delay(uint delay_time)

{

uint x,y;

for(x=delay_time;x>0;x--)

for(y=110;y>0;y--);

}

void write_com(uchar com)

{

        rs=0;

        lcden=0;

        P0=com;

        delay(5);

        lcden=1;

        delay(5);

        lcden=0;

   

}

void write_date(uchar date)

{

        rs=1;

        lcden=0;

        P0=date;

        delay(5);

        lcden=1;

        delay(5);

        lcden=0;

}

void timer_Init()

{

        TMOD=0x01;

        TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

        EA=1;

        ET0=1;

        TR0=1;

}

write_time(uchar addr,uchar time)

{

        uchar shi,ge;

        shi=time/10;

        ge=time%10;

        write_com(0x80+0x40+addr);

        write_date(0x30+shi);

        write_date(0x30+ge);

  

}

write_day(uchar addr,uchar day)

{

        uchar shi,ge;

        shi=day/10;

        ge=day%10;

        write_com(0x80+addr);

        write_date(0x30+shi);

        write_date(0x30+ge);

}

write_year(uchar addr,uint year)

{

        uchar shi,ge,qian,bei;

        qian=year/1000;

        bei=year%1000/100;

        shi=year%100%100/10;

        ge=year%10;

        write_com(0x80+addr);

        write_date(0x30+qian);

        write_date(0x30+bei);

        write_date(0x30+shi);

        write_date(0x30+ge);

}

write_week(uchar addr,uchar week)

{

    write_com(0x80+addr);

    switch(week)

    {

     case 1:

        write_date('M');

        write_date('O');

        write_date('N');

        break;

     case 2:

       write_date('T');

       write_date('U');

       write_date('E');


        break;

     case 3:

       write_date('W');

       write_date('E');

       write_date('D');

        break;

     case 4:

        write_date('T');

       write_date('H');

       write_date('U');

        break;

     case 5:

        write_date('F');

       write_date('R');

       write_date('I');

        break;

     case 6:

        write_date('S');

       write_date('A');

       write_date('T');

        break;

     case 7:

        write_date('S');

       write_date('U');

       write_date('N');

       break;


    }

}[page]

void Init()

{

    uchar num;

    dula=0;

    wela=0;

    lcden=0;

    year=2010;

    mouth=4;

    day=11;

    week=7;

    write_com(0x38);

    write_com(0x0c);

    write_com(0x06);

    write_com(0x01);

    write_com(0x80);


    for(num=0;num<16;num++)

{

write_date(year_table[num]);

delay(5);

}

write_com(0x80+0x40);

    for(num=0;num<12;num++)

{

write_date(time_table[num]);

delay(5);

}

     timer_Init();

       


}

void keyscan()

{

        rd=0;

        if(key_set==0)

        {

             delay(5);

             if(key_set==0)

             {

                key_count++;

                while(!key_set);//等待键盘释放

                if(key_count==1)

                {

                        TR0=0;

                        write_com(0x80+0x40+10);

                        write_com(0x0f);

                }


                if(key_count==2)

                {

                      

                        write_com(0x80+0x40+7);

                      

                }

                if(key_count==3)

                {

                      

                        write_com(0x80+0x40+4);

                      

                }

                if(key_count==4)

                {

                        write_com(0x80+13);

                }

                if(key_count==5)

                {

                        write_com(0x80+10);

                }

                if(key_count==6)

                {

                        write_com(0x80+7);

                }

                if(key_count==7)

                {

                        write_com(0x80+2);

                }

                if(key_count==8)

                {

                        key_count=0;

                        write_com(0x0c);

                        TR0=1;

                      

                }

             }

            

        }

        if(key_count!=0)

             {

                if(key_inc==0)

                {

                        delay(5);

                        if(key_inc==0)

                        {

                                while(!key_inc);

                                if(key_count==1)

                                {

                                        second++;

                                        if(second==60)

                                        {

                                                second=0;

                                        }

                                        write_time(10,second);

                                        write_com(0x80+0x40+10);


                                }

                                if(key_count==2)

                                {

                                        minute++;

                                        if(minute==60)

                                        {

                                                minute=0;

                                        }

                                        write_time(7,minute);

                                        write_com(0x80+0x40+7);

                                }

                                if(key_count==3)

                                {

                                        hour++;

                                        if(hour==24)

                                        {

                                                hour=0;

                                        }

                                        write_time(4,hour);

                                        write_com(0x80+0x40+4);



                                }

                                if(key_count==4)

                                {

                                        week++;

                                        if(week==8)

                                        {

                                        week=1;

                                        }

                                        write_week(13,week);

                                        write_com(0x80+13);

                                }

                                if(key_count==5)

                                {

                                        day++;

                                        if(day==32)

                                        {

                                                day=1;

                                        }

                                        write_day(10,day);

                                        write_com(0x80+10);

                                }

                                if(key_count==6)

                                {

                                   mouth++;

                                   if(mouth==13)

                                   

                                   {

                                    mouth=1;

                                   }

                                   write_day(7,mouth);

                                   write_com(0x80+7);


                                }

                                if(key_count==7)

                                {

                                        year++;

                                        write_year(2,year);

                                        write_com(0x80+2);

                                }


                                

                        }

                 }

                 if(key_dec==0)

                 {

                        delay(5);

                        if(key_dec==0)

                        {

                                while(!key_dec);

                                if(key_count==1)

                                {

                                        second--;

                                        if(second==-1)

                                        {

                                                second=59;

                                        }

                                        write_time(10,second);

                                        write_com(0x80+0x40+10);


                                }

                                if(key_count==2)

                                {

                                        minute--;

                                        if(minute==-1)

                                        minute=59;

                                        write_time(7,minute);

                                        write_com(0x80+0x40+7);


                                }

                                if(key_count==3)

                                {

                                        hour--;

                                        if(hour==-1)

                                        hour=23;

                                        write_time(4,hour);

                                        write_com(0x80+0x40+4);


                                }

                                if(key_count==4)

                                {

                                        week--;

                                        if(week==0)

                                        {

                                          week=7;

                                        }

                                        write_week(13,week);

                                        write_com(0x80+13);

                                }

                                if(key_count==5)

                                {

                                        day--;

                                        if(day==0)

                                        {

                                         day=31;

                                        }

                                        write_day(10,day);

                                        write_com(0x80+10);


                                }

                                if(key_count==6)

                                {

                                        mouth--;

                                        if(mouth==0)

                                        {

                                          mouth=12;

                                        }

                                        write_day(7,mouth);

                                        write_com(0x80+7);

                                }

                                if(key_count==7)

                                {

                                        year--;

                                        if(year==2009)

                                        {

                                         year=2010;

                                        }

                                        write_year(2,year);

                                        write_com(0x80+2);

                                }


                        }

                 }


             }

}

void main()

{

 Init();

 while(1)

 {

      keyscan();   

 }

}


void clock_timer() interrupt 1

{

        TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

        time_count++;

       if(time_count==18)

        {

                time_count=0;

                second++;

                if(second==60)

                {

                        second=0;

                        minute++;

                        if(minute==60)

                        {

                                minute=0;

                                hour++;

                                if(hour==24)

                                {

                                  hour=0;

                                }

                                write_time(4,hour);

                        }

                        write_time(7,minute);

                }

                write_time(10,second);

        }


}
关键字:单片机  电子时钟 引用地址:我用单片机写的电子时钟

上一篇:详解基于51单片机的small rtos(1)
下一篇:基于DS1302的简易数码管电子钟

推荐阅读最新更新时间:2024-03-16 14:26

一种单片机控制的指令转换器的设计
1 引言 在某大型指挥控制系统中,由于指令发送装置与接收装置的指令格式有很大的区别,两者不能直接通信。而更换其中之一都会造成巨大的资金浪费,指令转换器的目的就是在不改变发送和接收装置的情况下对发送装置所产生的指令进行格式转换,使产生的指令格式与接收装置所能接收的指令格式一致,实现整个系统的顺利通信。 2 硬件设计 2.1 总体结构 指令转换器的硬件总体结构如图2-1所示。所有电路模块集中在一块印刷电路板上,主要有89C51单片机、串口扩展电路、中断扩展电路、监测电路、静态存贮器扩展电路、输出电路及分频电路等几个部分,下面将对各部分进行详细介绍。 2.2 中央控制单元 2.2.1时钟电路 89C51的内部有一个用
[单片机]
一种<font color='red'>单片机</font>控制的指令转换器的设计
这样学习STM32单片机,从菜鸟到牛人很简单!
我想说,为了学习单片机而去学习单片机的思路不对。 你问,如何系统地入门学习stm32呢?应该如何零基础学习电子产品设计呢? 这本身就是一个错误的问题。假如你会使用8051 , 会写C语言,那么STM32本身并不需要刻意的学习。 你要考虑的是, 我可以用STM32实现什么?创客学院带你走进stm32世界 为什么使用STM32而不是8051?是因为51的频率太低,无法满足计算需求?是51的管脚太少,无法满足众多外设的IO?是51的功耗太大,电池挺不住?是51的功能太弱,而你要使用SPI、I2C、ADC、DMA?是51的内存太小而你要存储的东西太多? 当你需要使用STM32某些功能,而51实现不了的时候, 那STM3
[单片机]
DDS芯片AD9850的工作原理及其与单片机的接口
1 AD9850简介 随着数字技术的飞速发展,用数字控制方法从一个参考频率源产生多种频率的技术,即直接数字频率合成(DDS)技术异军突起。美国AD公司推出的高集成度频率合成器AD9850便是采用DDS技术的典型产品之一。 AD9850 采用先地蝗CMOS工艺,其功耗在3.3V供电时仅为155mW,扩展工业级温度范围为-40~80℃,采用28脚SSOP表面封装形式。AD9850的引脚排列如图1所示,图2为其组成框图。图2中层虚线内是一个完整的可编程DDS系统,外层虚线内包含了AD9850的主要组成部分。 AD9850 内含可编程DDS系统和高速比较器,能实现全数字编程控制的频率合成。可编程DDS系统的核心是相位累加器
[单片机]
DDS芯片AD9850的工作原理及其与<font color='red'>单片机</font>的接口
基于51单片机的计算器 C语言程序
前些日子再博客上转载了一篇计算器的C程序,由于这些日子一直忙于考试,也抽不出时间来重写一下基于C51的计算器,昨晚考完信号处理,回来就着手写,一直弄到凌晨3点多,现面把代码帖出来和大家一起共免,由于时间仓促,代码部分可能还有不足,并且程序只是再我的实验板上调试,如有不足请多多执教,程序时C和汇编混合编程,汇编部分值用到延时的处理,其他代码都用C写的,希望哪为高人能够写出功能更为强大的计算器程序一起分享,对于我的程序,哪位博友增添了更多功能的话,希望发到回复里,以共同进步! 程序代码如下: #include reg51.h #define uchar unsigned char #define uint unsigne
[单片机]
基于Infineon单片机的CAN网关研究
 控制器局域网CAN(Controller Area Network)是德国Robert Bosch公司在20世纪80年代初为汽车业开发的一种车载专用串行数据通信总线,经过多年的发展,现在越来越多地被众多汽车厂商所认可。CAN不仅在汽车领域,而且在工业控制领域也得到了广泛的应用,如工业现场控制、小区安防、环境监控等。由于在具体工程应用中往往需要连接2路或者多路CAN子网,因此,CAN网关是必不可少的,是组网的关键设备之一。  在欧洲乃至世界上的很多汽车厂家,大部分的车内电子控制单元大量使用原德国西门子半导体部门英飞凌科技(Infineon Technologies)的微控制器,特别是C166系列MCU,其优良特性得到各大汽车厂家的公
[单片机]
基于Infineon<font color='red'>单片机</font>的CAN网关研究
MCU--几种常见通讯总线
在单片机的应用中,通信协议是其中必不可少的一部分,上位机与下位机,单片机与单片机,单片机与外设模块之间的通信都需要通信协议实现信息交换和资源共享。由于设备之间不同的传输速率、电气特性、可靠性要求的不同,也产生了许多类型的适用于不同情况的通信协议,并被广泛的接受和使用。 1、UART和USART 分别名为通用异步收发器和通用同步异步收发器,速率不快,可全双工,结构上一般由波特率产生器、UART/USART发送器、UART/USART接收器组成,硬件上两线,一收一发。 在UART和USART 有可以扩展为R232和RS485等总线类型。 (1)RS232 RS232(异步传输标准接口),是个人计算机上的通讯接口之一,也
[单片机]
<font color='red'>MCU</font>--几种常见通讯总线
ICC AVR单片机新手入门
AVR ICC 使用快速入门 菜单解释 下一页: 新手的第一个程序,实现红绿灯不断闪烁 。 ICC AVR是一款非常好用的AVR编译软件,官方网站: www.imagecraft.com 目前最新版为7.0,本站的所有例程都以ICC AVR为开发平台。如果你还没有配置好开发环境,请参看: AVR 开发环境ICC+AVRstudio配置 。 如果你有时间看很多理论的没有实际操作价值的说明,请下载 ICCavr中文使用说明 。如果你想快速进入使用,请参看本文档。 1、关于窗口设置: 如上图:这是ICC avr 6.31 版本的窗口,分为5大区。 菜单项 文件 新建,打开,打印文件等常规选项。很别扭的一件事关闭文件在菜单
[单片机]
ICC AVR<font color='red'>单片机</font>新手入门
D1005P单片机立体声放音机电路的应用
D1005P是一块性能较好的立体声 放音机 专用集成电路.电路内包含有两个通道的前置放大器,音量控制电路和耳机放大器,另外还有一个作为控制音量的电压/电流转换电路和能输出
[单片机]
D1005P<font color='red'>单片机</font>立体声放音机电路的应用
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

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