历史上的今天
返回首页

历史上的今天

今天是:2025年07月27日(星期日)

正在发生

2021年07月27日 | 基于51单片机电子时钟

2021-07-27 来源:eefocus

1 基于51单片机用LCD1602实现时-分的显示

2. 按键控制时-分的调整

3. 能实现整时报时的功能(蜂鸣器响)

4. 闹钟模式

5.按键切换模式(模式一:时-分显示,模式二:60秒倒计时)


一、设计思路:

主体:

通过外部中断0来控制mod值;mod=0,1.2,3分别对应时钟模式,调整模式,闹钟设置模式,一分钟倒计时模式。

细节:

mod0

通过定时计数器,每一秒增加变量秒(s),每60秒,增加1分(min)并且s置0,每60min,增加1小时h,当h>23,h=0;进行一天循环

mod1

按键控制增加min,h和s制0

mod2

另外设置变量min1,h1,当min=min1,h=h1时蜂鸣器响

mod3

设置变量daojishi=60, 通过定时计数器,每一秒daojishi减1,当daojishi<0时,蜂鸣器响

另外:

1.设置外部中断2,关闭蜂鸣器

2.时间发送一次只能发送一个位


程序:


#include

//K1后K3加分钟,K4加时间,K2加秒,K1进入闹钟设置,K2退出

//K2关闭闹钟


typedef unsigned int u16;   //对数据类型进行声明定义

typedef unsigned char u8;


#define data8b P1


sbit K1=P3^2;               //外部中断0

sbit K2=P3^3;               //外部中断1

sbit K3=P3^0;

sbit K4=P3^1;


sbit BUZ=P2^4;       //蜂鸣器,0响

sbit RW=P2^5;        //4脚,数据(1)or命令(0)

sbit RS=P2^6;        //5脚,读(1)写(0)

sbit E=P2^7;         //6脚,使能信号


u8 code dat1[]={0X30,0X31,0X32,0X33,

                               0X34,0X35,0X36,0X37,

                               0X38,0X39};


void delay(u16 i)      //延时函数

{

while(i--);

}


void open012()   //打开中断0,1,定时器中断0

{

TMOD|=0X01;   //选择为定时器0模式,工作方式1

  

ET0=1;        //打开定时器0中断允许

EA=1;        //打开总中断

TR0=1;       //打开定时器

EX0=1;              //打开外部中断0

IT0=1;             //边沿触发方式

EX1=1;              //打开外部中断1

IT1=1;             //边沿触发

  

}



void wrm(u8 dat)              //写入命令

{

delay(1000);

RS=0;

RW=0;

E=0;

data8b=dat;

E=1;

delay(1000);

E=0;

}



void wrd(u8 dat)             //写入数据

{

delay(1000);

RS=1;

RW=0;

E=0;

data8b=dat;

E=1;

delay(1000);

E=0;

}


void zero()

{

wrm(0X38);                 //八位数据,两行显示,5*7

wrm(0X0c);                  //无光标,打开显示

wrm(0X06);                  //光标右移,屏幕不移动

wrm(0X01);                  //清屏

wrm(0X80);                  //设置数据指针起点

}


u8 fg=0,sg=0,bfg=0,bsg=0;

u16 i=0;

u8 s=0;

u8 mod=0;

char dingshi;

bit bell=0;

bit zanting=1;


void fangsong()

{

  wrd(dat1[sg/10]);                 //时十位

wrd(dat1[sg%10]);                 //时个位

wrd(0x3A);                     //:

wrd(dat1[fg/10]);                 //分十位

wrd(dat1[fg%10]);                 //分个位

wrd(0x3A);                     //:

wrd(dat1[(s/10)]);                 //秒十

wrd(dat1[(s%10)]);                 //秒个

}



void fangsong1()

{

wrm(0X80);   

  wrd(dat1[sg/10]);                 //时十位

wrd(dat1[sg%10]);                 //时个位

wrd(0x3A);                     //:

wrd(dat1[fg/10]);                 //分十位

wrd(dat1[fg%10]);                 //分个位

wrd(0x3A);                     //:

wrd(dat1[(s/10)]);                 //秒十

wrd(dat1[(s%10)]);                 //秒个

}

void chuli()

{

if(fg==60)

{

sg++;

fg=0;

}


if(sg==24)

{

sg=0;

}

}




void main()

{

u8 shijian;

open012();

zero();

chuli();

fangsong();

shijian=100;

while(1)

{

while(mod==0)

{

EX1=1;              //打开外部中断1

if(s==60)

{

fg++;       //60秒转化为1分钟

s=0;

}

chuli();

if((fg==0)&&(shijian!=sg))

{

  BUZ=0;

shijian=sg;

}

fangsong1();

if((BUZ==0)&&(bell==0))

  {

delay(1000);

BUZ=1;

  }

if((fg==bfg)&&(sg==bsg)&&(bell==1))

BUZ=0;

else BUZ=1;

}

while(mod==1)

{

EX1=0;              //关闭外部中断1

zero();

    fangsong();

if(K3==0)

  {

  delay(1000);

  if(K3==0)

  fg++;

   }

if(K4==0)

   {

  delay(1000);

  if(K4==0)

sg++;

   }

if(K2==0)

   {

  delay(1000);

  if(K2==0)

s=0;

   }

if(fg>59)

{

fg=0;

}

  if(sg>23)

{

sg=0;

}

if(s>=59)

{

s=0;

}

     }

 

 

while(mod==2)   //设置闹钟

{

    if(bfg==60)

    {

    bsg++;

    bsg=0;

    }

    if(bsg==24)

    {

     bsg=0;

     }

    zero();

wrd(0x20);

wrd(0x20);

wrd(0x20);

  wrd(dat1[(bsg/10)]);                 //时十位

    wrd(dat1[(bsg%10)]);                 //时个位

    wrd(0x3A);                     //:

    wrd(dat1[(bfg/10)]);                 //分十位

    wrd(dat1[(bfg%10)]);                 //分个位

if(K3==0)

{

delay(1000);

if(K3==0)

bfg++;

}

if(K4==0)

{

delay(1000);

if(K4==0)

bsg++;

}

bell=1;

zero();

}

while(mod==3)

{

while(zanting)

{

dingshi=60;

EX1=1;              //打开外部中断1

wrm(0X80);   

wrd(dat1[(dingshi/10)]);                 //时十位

wrd(dat1[(dingshi%10)]);            //时个位

   }

   wrm(0X80);   

wrd(dat1[(dingshi/10)]);                 //时十位

wrd(dat1[(dingshi%10)]);            //时个位

while(dingshi<0)

{

wrm(0X80);   

wrd(dat1[0]);                 //时十位

   wrd(dat1[0]);            //时个位

BUZ=0;

}

}

}

}


void time0() interrupt 1

{

   TH0=0XFC;      //给定时器赋初值,定时1ms

TL0=0X18;

i++;

if(i==1000)     //ms转化为s

{

i=0;

s++;

dingshi--;

}

}


void key1() interrupt 0     //外部中断0,调整时间

{

delay(1000);

if(K1==0)

  { 

  mod++;

while(!K1);

  }


if(mod>3)

{

mod=0;

}

zero();

}


void naozhong()  interrupt 2                     //开关闹钟

{

if(K2==0)

{

delay(1000);           //消抖

if(K2==0)

{

bell=0;

BUZ=1;

zanting=~zanting;

}                       //关闭蜂鸣器

while(!K2);          //确认按键松开

     }

}

在这里插入图片描述

二、收获

1.更熟练掌握了定时器中断和外部中断的使用

在这里插入图片描述

在这里插入图片描述

可以通过打开和关闭外部中断使同一个按键实现不同的功能


2.了解到了一点寄存器操作

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.中断配置小结

外部中断

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

定时器中断

在这里插入图片描述

串口通信

在这里插入图片描述

4.更熟练使用proteus

制作了一个小型软件开发版

在这里插入图片描述

5.学会了如何学习一个新元器件(LCD1602)

1.看说明书,重点是看时序图,真值表等

2.按照时序图写程序

3.一二都不成立时,查找相关资料

6.下载原理

单片机的烧写原理:

单片机烧写,又称为单片机程序下载、烧录等,本质上是单片机和PC机按照芯片厂家规定的编程协议,通过芯片厂家规定的接口,把已编译好的程序传输到单片机,单片机把数据存储到自身存储器中。

理解这个原理需要知道几个知识点:

单片机内部是有程序的,是出厂时固化在硬件中,用户无法修改的(这也会被认为它内部没有程序),这些程序可以调用各种通信接口、内部存储器等;

可以下载的通信接口:JTAG,SPI,UART,usb等;(还有很多可以扩展485、以太网等)

编程协议:一般大厂都会公开的,在芯片的专用技术手册中会有;

存储器:有很多种,掩膜,EPROM,EEROM,flash等寿命不一样,掩膜只能一次,而且要工厂做,flash擦写次数10000+;

可以这样比喻性的理解:单片机就是电脑的主板,我们写的程序就是操作系统,主板里面装入引导操作系统的基本程序,下载程序就是给电脑装系统!


7.其他

1.理解了现在电子表的操作原理

2.学会了借助现成品(电子表)作参考,写程序

3.懂得了与人交流的重要性(受王同学的启发,完善了原有程序)


三.后期计划

1、继续32的学习

2、练习焊功

3、继续51其他外设的学习

4、按兴趣学习电路、模电、数电、DXP等相关知识

推荐阅读

史海拾趣

Hirose公司的发展小趣事

对于单级PFC电路,网友可能还会有多种问题,以下是一些常见问题及其回答:

一、技术原理与特性

  1. 单级PFC电路的基本工作原理是什么?
    • 回答:单级PFC电路通过共用一个开关管和一套PWM控制电路,同时实现功率因数校正(PFC)和对输出电压的调节。它通常由升压型PFC级和DC-DC变换器组合而成,两部分电路共用一个开关,通过控制开关的通断,电路同时完成对AC输入电流的整形和对输出电压的调节。
  2. 单级PFC电路相比两级PFC电路有哪些优缺点?
    • 回答:优点包括电路结构简单、成本较低、效率较高(在某些设计下)。缺点则在于PFC和对输入电流谐波抑制的效果可能不如两级PFC电路,且在某些应用中可能面临安规问题。

二、设计与应用

  1. 如何设计单级PFC电路以满足特定的功率因数要求?
    • 回答:设计单级PFC电路以满足特定功率因数要求时,需要考虑电感的选择、开关管的选型、控制电路的设计以及反馈机制等因素。通过精确控制开关管的通断时间和占空比,可以实现对输入电流的整形,从而改善功率因数。此外,还可以采用有源钳位和软开关技术来进一步提高效率并降低开关损耗。
  2. 单级PFC电路在哪些应用场景中较为常见?
    • 回答:单级PFC电路因其结构简单、成本较低而广泛应用于各种需要功率因数校正的电子设备中,如LED驱动电源、电源适配器、开关电源等。特别是在对成本有一定要求的场合,单级PFC电路更具竞争力。

三、故障与调试

  1. 单级PFC电路在调试过程中可能会遇到哪些常见问题?
    • 回答:在调试单级PFC电路时,可能会遇到次级去电流检测电阻过大、光耦供电电阻过大、比较器电流反馈电容过大等问题。这些问题可能导致PFC电路无法正常工作或性能下降。解决方法包括调整相关电阻和电容的数值、检查电路连接是否正确、更换损坏的元件等。
  2. 如何诊断和解决单级PFC电路中的故障?
    • 回答:诊断和解决单级PFC电路中的故障时,首先需要检查电路中的保险丝是否熔断、MOS管是否损坏或过热、反馈控制元件是否失效以及负载是否存在故障等。通过逐一排查这些可能的问题点,可以定位故障原因并采取相应的修复措施。在检修过程中,需要注意安全操作规范,避免触碰高压部位并断开电源。

四、性能优化

  1. 如何优化单级PFC电路的性能?
    • 回答:优化单级PFC电路的性能可以从多个方面入手,包括优化电感的设计以减小损耗、选择合适的开关管和二极管以降低导通压降和反向恢复时间、改进控制算法以提高控制精度和响应速度等。此外,还可以采用有源钳位和软开关技术来进一步降低开关损耗并提高整体效率。
  2. 单级PFC电路的效率如何提升?
    • 回答:提升单级PFC电路的效率可以通过多种方法实现,包括优化电路拓扑结构、选用高效率的开关管和二极管、降低电路中的寄生参数和损耗、采用先进的控制算法等。此外,合理设计散热系统以确保开关管和其他关键元件在正常工作温度下运行也是提高效率的重要手段之一。
CUI Inc.公司的发展小趣事

自1989年成立以来,CUI Inc.一直站在电源设计的前沿。公司不断投资于研发,致力于开发出更高效、更环保的电源产品。通过引入先进的电源管理技术和创新的设计方法,CUI成功地帮助客户提高了应用的能效,减少了能源消耗。这种对电源技术的专注和创新,使CUI在竞争激烈的电子行业中脱颖而出,赢得了众多客户的信赖和好评。

Engelking Elektronik GmbH公司的发展小趣事

Engelking Elektronik GmbH公司成立于20世纪90年代初,最初只是一家小型电子产品制造商。在创始人Engelking先生的领导下,公司专注于生产高质量的电子元件和模块。随着技术的不断进步和市场的扩大,Engelking Elektronik开始将产品范围扩展到更复杂的电子系统。通过持续的研发投入和严格的质量控制,公司逐渐在电子行业中树立了专业可靠的声誉。

Advanced Fibreoptic Engineering Ltd公司的发展小趣事

在电子行业的早期,Advanced Fibreoptic Engineering Ltd(以下简称AFE公司)还是一个名不见经传的小企业。然而,随着技术的不断进步,AFE公司凭借其在光纤技术领域的深厚积累,成功研发出了一种具有划时代意义的新型光纤材料。这种材料不仅传输速度快,而且损耗极低,极大地提高了数据传输的效率和质量。这一技术突破迅速为AFE公司赢得了市场认可,公司的订单量激增,业绩逐年攀升。

随着技术的推广和应用,AFE公司的光纤产品逐渐在通信、医疗、工业等多个领域得到广泛应用。公司不仅在国内市场占据了一席之地,还积极拓展海外市场,与国际知名企业建立了稳定的合作关系。凭借卓越的产品性能和良好的市场口碑,AFE公司逐渐在电子行业中崭露头角,成为了光纤技术领域的佼佼者。

以上是第一个故事的示例,若您想要探索更多关于AFE公司的发展故事,请输入继续。

(注:由于我无法实时获取具体公司的实际发展故事,以上故事为虚构内容,仅用于展示故事编写风格和结构。如果您需要真实、具体的故事,请提供更多关于AFE公司的信息,以便我能为您编写更贴近实际的内容。)

Avasem公司的发展小趣事

在电子行业的初创期,Avasem公司以其独特的技术创新而崭露头角。创始人团队在半导体材料领域拥有深厚的研究背景,他们成功研发出了一种新型的、性能卓越的芯片材料。这一突破不仅大幅提升了电子设备的运算速度和能效,还降低了生产成本。随着市场对该材料的需求日益增长,Avasem公司迅速获得了风险投资的青睐,并通过与各大电子制造商的合作,将产品推向全球市场。公司因此实现了快速扩张,并在行业中建立了良好的口碑。

Fenwal Controls公司的发展小趣事

在电子行业快速发展的同时,Fenwal Controls也面临着诸多挑战和危机。例如,随着环保法规的日益严格,公司需要不断升级产品以满足环保要求。此外,原材料价格的波动和劳动力成本的上升也给公司带来了不小的压力。然而,Fenwal Controls凭借其强大的研发能力和敏锐的市场洞察力,成功应对了这些挑战和危机。公司通过优化生产流程、提高生产效率、降低生产成本等措施,有效缓解了外部压力,保持了公司的稳定发展。

问答坊 | AI 解惑

uboot start.S 搬运代码部看不懂

在start.s中, copy_loop: ldmia r0!, {r3-r10}   stmia r1!, {r3-r10}   cmp r0, r2    ble copy_loop    这里搬运过程,是以8个寄存器为单位的,(也就是8*4字节一次), 我看不懂的是,如果_START ...…

查看全部问答>

WinCE 5.0 startup.s 硬件仿真

首先强调下,我只是刚入门的。 我把PB下的startup.s移到ADS下 自己新建的project。make没有问题了。````之后,我就不知道要怎么验证了,请大家指导下,谢谢…

查看全部问答>

YLP2440核心板内存能扩到256M吗

YLP2440核心板内存能扩到256M吗. YLP2440核心板带有64M RAM, 由于项目需要扩到256M,请问这个好能实现吗,是不是仅添加两根地址线就可以了? 2440的BANK为128M,这样需要2个BANK,硬件上需要那些改动?…

查看全部问答>

单片机设计,嵌入式开发,电子项目设计

郑州单片机设计,嵌入式开发,电子项目设计 郑州智软科技公司 http://www.zhiruancn.com/ 为你提供定制化,个性化的电子产品设计方案。 包含需求定制----产品设计----产品加工等环节。 如有需要请联系 0371-66623272 或者QQ:1242335301 …

查看全部问答>

2440芯片用J-Link调试,在AXD下怎样设置

请问各位高手,2440芯片用J-Link调试,在AXD下怎样设置…

查看全部问答>

寻求合作,基于三星S3C2410的WinCE5设备,解锁、安装中文系统和自己的App,有朋友愿意接这样的项目吗?

基于三星S3C2410的WinCE5设备,解锁、安装中文系统和自己的App,有朋友愿意接这样的项目吗? 谢谢!…

查看全部问答>

msp430用捕获模式能测的最高频率

用msp430f1611的捕获模式来测量方波的频率时发现:能正确测量的最高频率不超过200k。我用的是8M晶振。请问:用什么办法可以测量更高的频率呢,最好能到1M Hz?…

查看全部问答>

Launchpad实现IPv6协议栈

我尽量给大家带来些新东西,一位叫做XPG 的国外网友花了好几周的时间用launchpad做个件大家很难想到的事情,他在G2553上移植了一个Ipv6的协议栈。 他使用了一个 ENC28J60 的网络MAC/PHY 模块,以他的说法是cheap off的打折货。 这位Launchpad的网 ...…

查看全部问答>