历史上的今天
返回首页

历史上的今天

今天是:2024年09月20日(星期五)

正在发生

2019年09月20日 | 51单片机学习笔记(三)

2019-09-20 来源:eefocus

感觉现在每一天写的程序都在增加难度,或者是因为我太心急,书中的一些过渡程序我觉得太简单就只看书上的例程,理解后没有亲自在电脑上调试,结果编写进阶的程序就感觉很困难了。所以以后要一个一个程序慢慢递进,不能太心急了。


今天这个程序是在昨天按键控制led灯的基础上改为按键控制数码管了,要实现按一个键数码管显示的数字加一,按另一个键数码管的数字减一。虽然这个功能简单,但实现起来却很复杂。我调试了一个小时还找不出错误,最后还是打开书本参考了一下例程才豁然开朗。


调试记录:


(1)程序中的,inc count语句我第一次写的时候把它调到去process子程序中,结果是没有任何操作的时候,数码管不断自加,debug的时候程序卡住了,连keil软件都无反应,只好用Ctrl+alt+del强制关闭。原因是按照我的主程序,无论按键处理后收到高电平还是低电平,都会执行放在process中的inc count。也就是不断自加。实验失败。所以以后收集到信息后要第一时间处理,或用内存空间来记录,否则错了还找不出来。


(2)书中已指出的可能会出现的错误,即自加的数据超过99,和为负数的时候会溢出,我设置了一个判断,对数据为99时再加1已不再处理,为0时再减1也不再理会,停在99或0的位置。


(3)如果按照之前控制led灯的程序照抄的话会出现按下键不释放的话数码管会熄灭,于是在不断循环检测按键释放的指令之前,也循环call display,即数码管循环输出原来的数字,保证看起来数码管没有熄灭。


最大的收获:


写这个程序我最大的收获不只是调试的经验,还有一点模块化编程的意识,最后算是比较深刻地区分sjmp和ret的关系吧,感觉汇编的跳转很容易让人头痛,c语言的逻辑性似乎看起来要清晰很多。


附代码如下 :

COUNT EQU 30H

    SHIWEI EQU 31H

    GEWEI EQU 32H


ORG 0000H

SJMP START

ORG 0030H


START:

MOV SP,#060H

MOV P2,#0FFH

MOV P0,#0FFH

MOV P1,#0FFH

MOV DPTR,#TAB

MOV COUNT,#00H


MAIN:

   CALL KEY   ;检测按键子程序

   CALL PROCESS   ;除法,分开个位和十位

   CALL DISPLAY       ;显示处理后的数字

   SJMP MAIN


KEY:

JNB P2.0,K1   ;低电平(按下)跳到k1处理

JNB P2.7,K2    ;另一个按键,同上

RET    ;若都是高电平(没有按下)返回主程序


K1:

CALL DELAY    ;延时去抖

JB P2.0,MAIN  ;若高电平(没有按下)则是干扰信号,返回主程序

;***************确认为低电平(按下),等待按键释放,同时不断显示原来字样 ********

WAIT: CALL DISPLAY ;在等待过程中显示原来的数字,防止数码管灭

JNB P2.0,WAIT  ;等待按键释放,

MOV R2,COUNT ;按键已释放,把count中的数据给r2,进行下一步比较

CJNE R2,#99,TIAOZHUAN ;若count不等于99则上加  

RET ;等于99直接返回,不操作

TIAOZHUAN: INC COUNT     ;count加1

RET




 K2:

  CALL DELAY

JB P2.7,MAIN


WAIT2: CALL DISPLAY

JNB P2.7,WAIT2

MOV R2,COUNT

CJNE R2,#0,TIAOZHUAN2 ;

RET

TIAOZHUAN2: DEC COUNT

RET




DELAY: ;延时子程序

MOV R0,#25

D1: MOV R1,#100

D2: DJNZ R1,D2

DJNZ R0,D1

RET



PROCESS: ;除法处理数据

MOV A,COUNT ;r把count的值给累加器a

MOV B,#10 ;给b赋值

DIV AB ;a除以b,十位数存在a,个位数存在b

MOV GEWEI,B

MOV SHIWEI,A

RET



DISPLAY:

MOV A,SHIWEI

MOVC A,@A+DPTR   ;查表

MOV P0,A   ;数据总线输出数据显示信号

CLR P1.0   ;控制总线控制数码管的亮与灭

CALL DELAY

SETB P1.0


MOV A,GEWEI

MOVC A,@A+DPTR

MOV P0,A

CLR P1.1

CALL DELAY

SETB P1.1

RET



TAB:

DB 03FH,006H,05BH,04FH,066H

DB 06DH,07DH,007H,07FH,06FH


END


推荐阅读

史海拾趣

Elpac公司的发展小趣事

在电子行业的激烈竞争中,Elpac公司凭借其在电源管理领域的技术革新,逐渐崭露头角。公司创始人李明在创办之初就坚信,只有不断创新才能在市场中立足。他带领团队深入研究市场需求,不断推出具有创新性的电源管理产品。其中,一款高效节能的电源转换器在市场上引起了广泛关注,其出色的性能和稳定性赢得了客户的青睐。随着产品的热销,Elpac公司逐渐在电子行业中建立了自己的品牌地位。

Bay Linear Inc公司的发展小趣事

作为一家有社会责任感的企业,Bay Linear Inc公司始终关注环境保护和可持续发展。公司在生产过程中积极采用环保材料和工艺,减少对环境的影响。同时,公司还积极参与公益事业和社会活动,为社会的发展贡献自己的力量。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。

以上五个故事是基于电子行业的一般发展情况和商业常识创作的,旨在展示一个电子企业可能的发展路径和关键节点。请注意,这些故事并非基于Bay Linear Inc公司的真实历史,读者在了解该公司时,应参考其官方资料和相关报道。

硕颉(BITEK)公司的发展小趣事

尽管硕颉科技在知识产权方面做出了积极努力,但仍难免面临专利诉讼的挑战。在某次与凹凸科技的专利侵权诉讼中,公司虽然一度面临败诉和永久禁制令的风险,但硕颉科技迅速应诉,积极应对。最终,美国联邦巡回上诉法院废除了原判决,公司得以自由销售被诉产品,不受任何限制。这次诉讼的胜利,不仅展示了硕颉科技在应对法律挑战方面的决心和能力,也为公司的长远发展奠定了坚实基础。

Curtis Electromusic Specialties Inc公司的发展小趣事

人才是企业发展的核心驱动力。CUI公司深知这一点,因此一直注重人才培养和引进。公司建立了完善的人才培养和激励机制,为员工提供了广阔的发展空间和良好的职业前景。同时,公司还积极与高校和研究机构合作,引进高层次人才和技术成果,为公司的创新发展提供了强大的智力支持。

以上五个故事框架只是基于电子行业CUI公司可能的发展路径和趋势的构想,并不特指任何具体的公司或事件。在实际情况中,每个公司的发展故事都是独一无二的,受到多种因素的影响和塑造。

台湾第一电阻(Firstohm)公司的发展小趣事
电冰箱节能省电的方法主要包括以下几点:一是合理设置温度,避免过低或过高的温度设置导致能耗增加;二是减少开门次数和时间,避免冷气流失;三是定期除霜,避免霜层过厚影响制冷效果;四是选择能效等级高的电冰箱产品,以降低能耗。
全鹏(CHAMPION)公司的发展小趣事

随着电子商务的快速发展,全鹏公司也积极拥抱这一趋势。自2010年起,全鹏公司成立了电子商务零售部门,并与国内知名电商平台建立了长期战略合作关系。通过线上销售过季产品和折扣商品,全鹏公司的电商业务迅速增长,成为其新的增长点。同时,全鹏公司还不断优化电商平台的运营和管理,提升客户服务质量,为客户提供更加便捷、高效的购物体验。

以上五个故事基于全鹏公司在电子行业的发展历程和成就进行虚构,旨在展示全鹏公司在市场拓展、品牌建设、质量管理、研发创新和电商业务等方面的努力和成果。

问答坊 | AI 解惑

MP3充电器原理与维修

MP3充电器是最易损坏的配件之一。笔者维修多款充电器后发现,它们基本上都是采用开关电源电路,电路结构大同小异。本文以市面上最常见的昕潮TJ-01型充电器为例,简述其工作原理与常见故障检修,电路见图1。工作原理 (1)开关振荡电路市电经D1~D4整 ...…

查看全部问答>

如何控制LCD,BACKLIGHT开关

如题, WINCE 下如何控制LCD和backlight的开关呢,系统有提供相关的API调用吗…

查看全部问答>

MSP430F1611的遗憾

我搞了一片,很好的东西,只是不能超频。给16M的时钟立即死悄悄了。 149给16M的时钟,跑得非常的好。就是内存小了才2K…

查看全部问答>

申请MSP430开发板,介绍好书

MSP430优势不用多说,用来做手持设备是不二选择。 介绍一本关于MSP430的书吧,难得国内务实的一本教材:《MSP430系列单片机系统工程设计与实践》,对大家设计低功耗设备很有帮助。 书内先讲解编程风格,大概描述下关键外设使用。最重要的是后面 ...…

查看全部问答>

紧急求助:MSP430G2553 液晶显示图像的问题

我们最近在用液晶显示特定的波形,但这需要回读,从液晶(ST7920控制器)资料上看到可以读取DDRAM和GDRAM中的数据,但是没有成功, 由于我们用的是绘图方式,所以需要读取GDRAM中的数据,小弟这里有个网上下的程序,但不太清楚具体的含义,并且回 ...…

查看全部问答>

控制直流电机的正转反转和PWM调速直流电机驱动,单片机与L298之间如何用光耦隔离?

控制直流电机的正转反转和PWM调速直流电机驱动,单片机与L298之间如何用光耦隔离?…

查看全部问答>

SBL 串口升级

各位大神好: 最近在做TI cc2540的SBL串口升级,用的是TI协议栈1.40自带的bootloader,工具用的是serial boot tool1.2的版本,用户程序用的是TI协议栈自带的hosttest工程。 升级过程中出现这样的问题:刚把bootloader烧入目标板后,通过boot tool ...…

查看全部问答>

DSPLIB库滤波器参数问题

我用matlab生成的希尔伯特变换器系数,用在DSPLIB的hilb16()函数中,输出的波形都不正确,请问TI有针对该DSPLIB库专门的工具可以生成滤波器系数吗? …

查看全部问答>