历史上的今天
返回首页

历史上的今天

今天是:2025年03月04日(星期二)

正在发生

2020年03月04日 | 用51单片机设计小时候带的简易电子表

2020-03-04 来源:51hei

学了51,模仿了小时候电子手表的基本功能,可以在时钟和秒表两个功能间切换,用的是郭天祥的板子。采用四个独立按键,通过对四个键按下的次数不同,实现不同的功能,程序详注。(第一次尝试很多地方未免复杂冗余,希望大神指点)


/*使用1602作为电子表的显示屏,单片机上电后,首先通过按键设定当前时间,完成初始化,同时该电子表还具有秒表功能,按下秒表键后,进入秒表界面。秒表界面有开始,取次,停止,复位,返回时间,可以记录三次取时,每个按钮按下都对应蜂鸣器短响一声进入秒表界面,时间继续运行,在时间界面,秒表处于复位状态。*/


单片机源程序如下:

/*......................................................................................*/

#include

sbit lcden=P3^4;              //使能端                                                   

sbit lcdrs=P3^5;              //RS                                                             

sbit dula=P2^6;               //定义锁存器的锁存端         

sbit wela=P2^7;

sbit s1=P3^0;                 //定义按键----功能键

sbit s2=P3^1;                                  //定义按键-----增加键

sbit s3=P3^2;                                  //定义按键------计次键

sbit s4=P3^3;                                  //定义按键------钟与秒表的切换键

sbit rd=P3^7;                                  //初始化函数中使它接地从而使第四列矩阵键盘成为独立键盘                                                      

sbit beep=P2^3;                                  //定义蜂鸣器

char count,count1,s1num,s2num,s3num,s4num,stop, miao,shi,                               //stop保证在秒表工作模式下,定时器0的数值不会被送去lcd显示。      count,count1是用到定时器里面,   *num是用来计按键次数,miao*,shi*,fen*

fen,miao1,shi1,fen1,miao3,fen3,shi3,miao4,fen4,shi4,miao5,                                   //是用来保持lcd上的显示的,结合下面应该可以看懂。

fen5,shi5,miao6,fen6,shi6,miao7,fen7,shi7,miao8,fen8,shi8,

miao9,fen9,shi9;                           //char表示的数据范围-127~128     

void delay(int z)             //延时子函数

{

        int x,y;

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

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

}

void xiang()                  //蜂鸣器发声函数

{

        beep=0;

        delay(20);

        beep=1;

}

void write_com(char com)      //写命令子函数

{

        lcdrs=0;

        P0=com;

        delay(5);

        lcden=1;

        delay(5);

        lcden=0;

}


void write_date(char date)    //写数据子函数

{

        lcdrs=1;

        P0=date;

        delay(5);

        lcden=1;

        delay(5);

        lcden=0;

}

void write_sfm(unsigned char add,unsigned char date)  //写时分秒函数

{

        unsigned char shi,ge;

        shi=date/10;              //分解一个2位数的十位和个位

        ge=date%10;

        write_com(0x80+0x40+add); //设置显示位置

        write_date(0x30+shi);     //送去液晶显示十位

        write_date(0x30+ge);      //送去液晶显示个位

}

void init()                   //初始化函数

{

        rd=0;                     //软件将矩阵按键第四列一端置低用来分离出独立按键

        dula=0;

        wela=0;                          //关闭锁存器,防止数码管分流,影响1602的显示

        lcden=0;

        fen=0;                    //初始化钟变量值

        miao=0;

        shi=0;

        count=0;

        count1=0;

        s1num=0;

        s2num=0;

        s3num=0;

        s4num=0;

        write_com(0x38);                 //设置16*2显示,5*7点阵,8位数据口

        write_com(0x0c);                 //开显示,不开光标  00001100

        write_com(0x06);                 //写字符后地址指针自动加一,不移动 00000110

        write_com(0x01);                 //清除屏幕上原有的乱码

        write_com(0x80+0x04);         //从第一行的第五个字符位开始显示

        write_com(0x80+0x40+6);  //在第二行第第七个字符处写入 “ :”

        write_date(':');

        delay(5);

        write_com(0x80+0x40+9);  //在第二行第第十个字符处写入 “ :”

        write_date(':');

        delay(5);

        write_sfm(10,miao);

        write_sfm(7,fen);

        write_sfm(4,shi);

        TMOD=0X11;                //设置定时器0的工作模式1;

        TH0=(65536-50000)/256;    //装初值

        TL0=(65536-50000)%256;

        EA=1;                     //打开总中断

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

        TR0=1;                    //启动定时器0

}

void init_stopwatch()                  //初始化秒表

{

        write_com(0x01);

        miao1=0;

        fen1=0;

        shi1=0;

        write_com(0x80+0x40+6);  //在第二行第第七个字符处写入 “ :”

        write_date(':');

        delay(5);

        write_com(0x80+0x40+9);  //在第二行第第十个字符处写入 “ :”

        write_date(':');

        delay(5);

        write_sfm(10,miao1);

        write_sfm(7,fen1);

        write_sfm(4,shi1);                           //TMOD=0x10;错误处:采用两个定时器时,一次设置工作模式就行                                                  

        TH1=(65536-50000)/256;

        TL1=(65536-50000)%256;

        EA=1;

        ET1=1;

        TR1=0;

}

void keyscan()                //键盘扫描函数

{         

        if(s1==0)                                  //判断s1是否被按下

        {

                delay(5);

                if(s1==0)                          //确实被按下

                {


                        while(!s1);                  //按键抬起,

                        xiang();                  //蜂鸣器响

                        s1num++;                  //功能键被按下次数

                        if(s1num==1)          //第一次被按下时

                        {


                        }

                        if(s1num==2)          //第二次被按下时

                        {

                                TR0=0;                                           //关闭定时器

                                write_com(0x80+0x40+10);   //指针定到秒的地址  

推荐阅读

史海拾趣

ETL semiconductor公司的发展小趣事

AMD(Advanced Micro Devices)在半导体行业中的发展经历了一个从追赶到逆袭的过程。在英特尔的强大市场压力下,AMD通过不断创新和技术提升,逐渐在处理器市场上获得了一席之地。尤其是在游戏和高端计算领域,AMD的处理器凭借其出色的性能和性价比赢得了众多消费者的青睐。

ASM公司的发展小趣事

ASM公司的创始人阿瑟·德尔·普拉多(Arthur del Prado)在移居美国后,遇到了半导体产业的蓬勃发展。他敏锐地洞察到了这一行业的巨大潜力,并决定投身其中。起初,他只有有限的资源和500美元的资金,但他凭借着对市场的深刻理解和不懈的努力,成功地在欧洲市场打开了局面。1964年,他在荷兰创立了先进半导体材料公司(ASM),这标志着ASM公司的正式诞生。

CAMDENBOSS公司的发展小趣事

CAMDENBOSS公司深知人才是企业发展的核心动力。因此,公司注重人才培养和团队建设,通过提供丰富的培训和学习机会,不断提升员工的技能和素质。同时,公司还建立了完善的激励机制和晋升通道,鼓励员工积极创新、勇攀高峰。这些举措不仅增强了员工的归属感和凝聚力,也为公司的长远发展奠定了坚实的基础。

请注意,以上故事均基于虚构和假设,并非CAMDENBOSS公司的真实历史。如果您需要了解该公司的真实发展情况,建议查阅相关资料或联系该公司进行了解。

Ecera Comtek Corp公司的发展小趣事

Ecera Comtek Corp公司成立于XX世纪初,由几位热衷于电子通信技术的工程师共同创立。初创时期,公司面临着资金短缺、技术挑战和市场竞争等多重压力。然而,创始人们凭借对技术的热情和执着,不断研发创新产品,逐渐在行业内树立了口碑。他们经常通宵达旦地工作,试验新的设计方案,努力提升产品的性能和稳定性。经过数年的努力,Ecera Comtek Corp公司终于推出了首款具有竞争力的无线通信设备,为公司的发展奠定了坚实的基础。

富瀚(Fullhan)公司的发展小趣事
如果保护器上有故障指示灯或显示屏,应仔细查看其显示的故障信息,以便快速定位问题。
Bellin公司的发展小趣事
集成了过载保护、短路保护、缺相保护、逆相保护等多种功能于一体,满足不同场景下的保护需求。

问答坊 | AI 解惑

机动车尾号限行提示器

机动车尾号限行提示器…

查看全部问答>

WinCE中如何调用ARM汇编指令?

RT,我在做GBA模拟器,想直接调用ARM汇编指令,利用ARM9模拟ARM7-TDMI,但是如果可以直接调用ARM汇编指令模拟就很简单了,请问需要什么平台和设备?因为主要是在Windows Mobile上面用,所以希望能简单一点的…

查看全部问答>

请教 关于上层过滤器驱动程序的问题

请问如何在上层过滤驱动实现指定的IRP拦截,比如,禁止C:\\helloworld.exe以外的一切程序写G:\\盘? 我现在用DriverStudio生成了一个upper filter,那么应该如何修改代码呢?…

查看全部问答>

北桥坏了?

哪个兄弟知道北桥坏了 电脑是什么症状? …

查看全部问答>

pc的串口中断

最近搞单片机和pc通信    想问pc机的串口如果有接受中断 用c 在dos下怎么编呢? 比如说在keil中有 void serial(void) interrupt 4 这样有中断就可以进入中断服务程序 但是用c 在tubor c下如何实现其进入中断服务程序呢? 不啬赐教!…

查看全部问答>

求助:MSP430执行_EINT()命令进入中断函数

大家好,我用的MSP430F5X系列的芯片。在IAR中执行EINT()命令时,这应该是CPU寄存器打开全局中断,为什么我单步运行的时候走到这里后会进入中段函数?  困惑了多日了,望各位大侠们能帮帮我。不甚感激。。。…

查看全部问答>

51系列单片机驱动彩色液晶显示模块

51系列单片机驱动彩色液晶显示模块 关键字:51系列单片机,驱动,彩色液晶,显示,模块 其核心电路均采用大规模可编程逻辑器件设计,全硬件实现,性能稳定可靠,产品一致性好。采用简单的并行总线方式与51 单片机、AVR、DSP、PIC、ARM等CPU 直接 ...…

查看全部问答>

DSP应用系统设计

我帮老师扫描的第三本书…

查看全部问答>