历史上的今天
返回首页

历史上的今天

今天是:2024年12月08日(星期日)

正在发生

2020年12月08日 | 基于51单片机的可调数字时钟程序

2020-12-08 来源:51hei

使用51单片机内部定时器中断方式一计算时间,在LCD1602液晶显示小时、分钟、秒,并且可以使用按键调整小时和分钟,每次到整点时整点报时。


代码如下:


//=============================================================

//功能描述:液晶显示时钟,可调时间,准备整点时报时

//MCU:STC89C51,晶振频率:11.0592MHz

//=============================================================

#include  

#include  

#include  


sbit RS=P2^0;    //寄存器选择位,将RS位定义为P2.0引脚

sbit RW=P2^1;    //读写选择位,将RW位定义为P2.1引脚

sbit E=P2^2;     //使能信号位,将E位定义为P2.2引脚

sbit BF=P0^7;    //忙碌标志位,,将BF位定义为P0.7引脚

sbit k1=P1^0;    //按键调小时加

sbit k2=P1^1;    //按键调小时减

sbit k3=P1^2;    //按键调分钟加

sbit k4=P1^3;    //按键调分钟减

sbit beep=P1^4;  //蜂鸣器


unsigned char code digit[ ]={"0123456789"}; //定义字符数组显示数字

unsigned char code string[ ]={"Weather:Sunny"}; //定义字符数组显示提示信息

unsigned char count;   //定义变量统计中断累计次数

unsigned char s,m,h;   //定义变量储存秒、分钟和小时

/*==================================================

函数功能:延时

(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒

==================================================*/

void delay1ms()        //@11.0592MHz

{

   unsigned char i,j;        

         for(i=0;i<10;i++)

          for(j=0;j<33;j++);                 

}


void delay100ms()                //@11.0592MHz

{

        unsigned char i, j;

        i = 180;

        j = 73;

        do

        {

                while (--j);

        } while (--i);

}


/*==================================================

函数功能:延时若干毫秒

==================================================*/

void delay(unsigned char n)

{

   unsigned char i;

         for(i=0;i         delay1ms();

}


/*==================================================

函数功能:蜂鸣器发出声音

==================================================*/

void sound(){

         beep=0;

         delay100ms();

         beep=1;

         delay100ms();

}


/*==================================================

函数功能:判断液晶模块的忙碌状态

==================================================*/

unsigned char BusyTest(void)

  {

    bit result;

                RS=0;       //根据规定,RS为低电平,RW为高电平时,可以读状态

    RW=1;

    E=1;        //E=1,才允许读写

    _nop_();   //空操作

    _nop_();

    _nop_();

    _nop_();   //空操作四个机器周期,给硬件反应时间        

    result=BF;  //将忙碌标志电平赋给result

    E=0;         //将E恢复低电平

    return result;

  }

/*==================================================

函数功能:将模式设置指令或显示地址写入液晶模块

==================================================*/

void WriteInstruction (unsigned char dictate)

{   

   while(BusyTest()==1); //如果忙就等待

         RS=0;                  //根据规定,RS和R/W同时为低电平时,可以写入指令

         RW=0;   

         E=0;                   //E置低电平(根据表8-6,写指令时,E为高脉冲,

                          // 就是让E从0到1发生正跳变,所以应先置"0"

         _nop_();

         _nop_();             //空操作两个机器周期,给硬件反应时间

         P0=dictate;            //将数据送入P0口,即写入指令或地址

         _nop_();

         _nop_();

         _nop_();

         _nop_();               //空操作四个机器周期,给硬件反应时间

         E=1;                   //E置高电平

         _nop_();

         _nop_();

         _nop_();

         _nop_();               //空操作四个机器周期,给硬件反应时间

          E=0;                  //当E由高电平跳变成低电平时,液晶模块开始执行命令

}

/*==================================================

函数功能:指定字符显示的实际地址

==================================================*/

void WriteAddress(unsigned char x)

{

     WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"

}

/*==================================================

函数功能:将数据(字符的标准ASCII码)写入液晶模块

==================================================*/

void WriteData(unsigned char y)

{

    while(BusyTest()==1);  

          RS=1;           //RS为高电平,RW为低电平时,可以写入数据

          RW=0;

          E=0;            //E置低电平(根据表8-6,写指令时,E为高脉冲,

                       // 就是让E从0到1发生正跳变,所以应先置"0"

          P0=y;           //将数据送入P0口,即将数据写入液晶模块

          _nop_();

          _nop_();

           _nop_();

     _nop_();       //空操作四个机器周期,给硬件反应时间

          E=1;          //E置高电平

          _nop_();

          _nop_();

          _nop_();

          _nop_();        //空操作四个机器周期,给硬件反应时间

          E=0;            //当E由高电平跳变成低电平时,液晶模块开始执行命令

}

/*==================================================

函数功能:对LCD的显示模式进行初始化设置

==================================================*/

void LcdInitiate(void)

{

  delay(15);             //延时15ms,首次写指令时应给LCD一段较长的反应时间

  WriteInstruction(0x38);  //显示模式设置:16×2显示,5×7点阵,8位数据接口

        delay(5);               //延时5ms ,给硬件一点反应时间

  WriteInstruction(0x38);

        delay(5);

        WriteInstruction(0x38); //连续三次,确保初始化成功

        delay(5);

        WriteInstruction(0x0c);  //显示模式设置:显示开,无光标,光标不闪烁

        delay(5);

        WriteInstruction(0x06);  //显示模式设置:光标右移,字符不移

        delay(5);

        WriteInstruction(0x01);  //清屏幕指令,将以前的显示内容清除

        delay(5);


}

/*==================================================

函数功能:显示小时、调整小时时间                          

==================================================*/

void DisplayHour()

{

  unsigned char i,j;

        if(k1==0)           //按钮k1按下时

                delay(10);        //延时消抖

        if(k1==0)            //判断k1按下

        {

                while(!k1);         //k1状态取反

                h++;               //小时数增加

        }

        if(k2==0)            //按钮k2按下时

                delay(10);         //延时消抖

        if(k2==0)            //判断k1按下

        {

                while(!k2);        //k2状态取反

                if(h/10==0&&h%10==0)  //判断时间是否在24小时上

                {

                h=24;                 //当小时在24小时

                h--;                  //小时数减少为23

                }

                else

                        h--;                //小时数减少

        }

        i=h/10;                //取整运算,求得十位数字

        j=h%10;                //取余运算,求得各位数字

  WriteAddress(0x44);   //写显示地址,将十位数字显示在第2行第5列

        WriteData(digit[i]);  //将十位数字的字符常量写入LCD

        WriteData(digit[j]);  //将个位数字的字符常量写入LCD


}

/*==================================================

函数功能:显示分钟、调整分钟时间                           

==================================================*/

void DisplayMinute()

{

  unsigned char i,j;

  i=m/10;                //取整运算,求得十位数字

        j=m%10;                //取余运算,求得各位数字

                if(k3==0)             //按钮k3按下时

推荐阅读

史海拾趣

广州盛炬(GZSJ)公司的发展小趣事

机顶盒,全称为数字视频变换盒(Set Top Box,简称STB),是现代家庭娱乐系统中不可或缺的关键设备。它作为连接电视机与外部信号源的桥梁,能够将接收到的数字电视信号转换成适合电视播放的格式,极大地丰富了用户的视听体验。

机顶盒的起源可追溯至20世纪90年代初,最初是为了解决有线电视收视费问题而设计的解扰设备。随着数字电视技术的发展,机顶盒的功能不断扩展,现已成为集数字信号接收、解码、显示以及多种增值服务于一体的智能终端。

从技术层面看,机顶盒支持多种信号源,包括有线电缆、卫星天线、宽带网络及地面广播等。它不仅能够接收高清、超高清电视节目,还能提供电子节目指南(EPG)、因特网网页浏览、视频点播、游戏等多元化服务。此外,一些先进的机顶盒还集成了智能语音助手、云计算和边缘计算技术,实现了更为便捷、智能的用户交互和内容分发。

在内容创新方面,机顶盒通过与各大内容提供商合作,不断引入优质资源,如电影、电视剧、综艺节目等,并根据用户偏好提供个性化推荐服务。同时,其跨平台整合能力也使得用户可以在不同设备间无缝切换,享受高质量的视频内容。

综上所述,机顶盒作为数字电视技术的核心组成部分,以其强大的功能、丰富的内容和便捷的操作体验,成为了现代家庭娱乐的重要选择。随着技术的不断进步和市场的持续扩大,机顶盒将继续发展,为用户带来更加优质、便捷、智能的观影体验。

电连(ECT)公司的发展小趣事

随着汽车智能化的发展,ECT看到了车载连接器市场的巨大潜力。从2013年开始,公司开始布局车载连接器领域,并成功开发出多款适用于不同车型和场景的车载连接器产品。这一拓展不仅为ECT带来了新的增长点,也进一步巩固了公司在电子连接器行业的领先地位。

Ava Electronics Corp公司的发展小趣事

随着市场的不断发展,AVA电子意识到只有不断创新才能在竞争中保持领先。于是,公司加大了在研发方面的投入,引进了一批高素质的研发人才,并与多所高校和研究机构建立了合作关系。经过数年的努力,AVA电子成功研发出了一系列具有自主知识产权的电子产品,这些产品在性能、稳定性和用户体验等方面都达到了行业领先水平。这些创新产品的推出,不仅提升了公司的市场地位,也为公司带来了可观的利润。

Glow-Lite Corp公司的发展小趣事

随着国内市场的逐渐饱和,AVA电子开始将目光投向国际市场。公司制定了详细的国际化战略,包括拓展海外市场、建立海外销售渠道、加强与国际同行的合作等。AVA电子积极参加国际性的行业展会和论坛,与国际客户建立了广泛的联系;同时,公司还加大了对海外市场的宣传力度,提高了品牌在国际市场的知名度。这些举措不仅为公司带来了更多的商机,也提升了公司在国际市场的地位。

请注意,以上故事是基于AVA电子的公开信息和一般电子科技公司的发展规律进行创作的,并非真实事件。如果需要更具体、更详细的故事,建议直接查阅AVA电子的官方资料或相关新闻报道。

Electrocube Inc公司的发展小趣事

随着科技的不断进步,Electrocube Inc公司始终将技术创新作为发展的核心动力。公司投入大量研发资金,积极引进高端人才,不断推出具有领先水平的电子产品。其中,一款具有自主知识产权的高温电容器,以其卓越的性能和稳定性,在航空航天、汽车电子等高端领域得到了广泛应用,进一步提升了公司的市场竞争力。

ETRI公司的发展小趣事

自1976年成立以来,ETRI一直致力于打造高效便捷的智慧产业生态圈。在汽车制造、轨道交通等行业中,电气和机械设备是必不可少的。ETRI凭借其卓越的技术实力,为这些行业提供了在各种恶劣环境下都能保持稳定性的产品。无论是在电机马达、编码器、传感器,还是在泵、阀、流量计以及温度计压力表等广泛使用的设备中,ETRI都展现了其行业领先的解决方案。

问答坊 | AI 解惑

关于FPGA编译后结果能否转换为源代码的思考?

1. FPGA 编译后的. POF 和. SOF 文件  能否转换为 VHDL 或VERILOG ?  或者 XILINX 编译后的.JED 文件能否能否转换为 VHDL 或VERILOG ? 我想这个问题 如果能反推, 理论上应该可行的. 比如 单片机的. HEX 文件通过反汇编能够等到源文件, F ...…

查看全部问答>

请问探路者:是否有采购贴片LED的经验分享

我现在做的LED驱动 包括3*1W的 5-7W的E27结构;还有日光灯管的贴片LED; 目前我用的都是3.3V的LED做实验;有一点担心批量的时候,客户是否会采购 别的电压的LED情况; 是否真像我之前说的:为了方便采购,客户经常采购不同档次的:例如3V-3.2V, ...…

查看全部问答>

怎么通过OPEN AT用C语言编写GPRS拨号连接到服务器的程序?

怎么通过OPEN AT用C语言编写GPRS拨号连接到服务器的程序?如题 我是个新手,很多问题都不知道,比如GPRS的通信机制。 是不是首先初始化GPRS,然后怎么办 用什么WIP函数呢? 请高人指点 ,谢谢诶…

查看全部问答>

帮忙解决vhdl:quartus7.2 在运行if..genarate遇到的问题

本人在quartus7.2运行如下vhdl代码: library ieee; use ieee.std_logic_1164.all; entity shift is         generic (len:integer);   port(a,clk:in std_logic;          &n ...…

查看全部问答>

error C2061: syntax error : identifier 'IAuthenticate'(数据库)

C:\\Program Files\\Windows CE Tools\\wce500\\xg2410sdk\\include\\ARMV4I\\oledb.h(13773) : error C2061: syntax error : identifier \'IAuthenticate\' 如何解决这个错误呀,…

查看全部问答>

怎么用VS2005开发在winCE5.0上运行的应用程序

怎么用VS2005开发在winCE5.0上运行的应用程序…

查看全部问答>

textbox获得焦点时打开输入法出现的问题

我想在textbox获得焦点时,自动打开输入法 我在textbox的getfocus事件中时这样写的: inputMethod.setIME(true); inputPanel1.Enabled = true; inputMethod 是callInputMethod的一个实例 public class callInputMethod       ...…

查看全部问答>

STM32F103C8T6的SPI2问题,求救

在STM32F103C8T6,系统时钟72M,SPI时钟18M void SetupSPI(void) { GPIO_InitTypeDef  GPIO_InitStructure; SPI_InitTypeDef   SPI_InitStructure; SPI_I2S_DeInit(SPI2);//Reset SPI2 RCC_APB2PeriphClockCmd(RCC_ ...…

查看全部问答>

LM3S9B96中文数据手册

初来乍道,各位多关照 [ 本帖最后由 zhengweiqi 于 2011-5-5 17:37 编辑 ]…

查看全部问答>

msp430f149有关SPI通信问题

程序是 void SPI_init(void) {   open_xt2();   UCTL1=SWRST;//开启设置   UTCTL1=CKPH+SSEL1+STC;//选择SMCLK   UCTL1|=CHAR+SYNC+MM;//8为数据 SPI模式   UBR01=0x03;//波特率设置 ...…

查看全部问答>