历史上的今天
返回首页

历史上的今天

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

正在发生

2020年03月09日 | 第一个单片机小程序

2020-03-09 来源:eefocus

上一次我们的程序实在是没什么用,要灯亮还要重写一下片子,下面我们要让灯持续地闪烁,这就有一定的实用价值了,比如能把它当成汽车上的一个信号灯用了。怎样才能让灯持续地闪烁呢?实际上就是要灯亮一段时间,再灭一段时间,也就是说要P10持续地输出高和低电平。怎样实现这个要求呢?请考虑用下面的指令是否可行:

SETB P1.0

CLR P1.0 ……


这是不行的,有两个问题,第一,计算机执行指令的时间很快,执行完SETB P1.0后,灯是灭了,但在极短时间(微秒级)后,计算机又执行了CLR P1.0指令,灯又亮了,所以根本分辨不出灯曾灭过。第二,在执行完CLR P10后,不会再去执行SETB P1.0指令,所以以后再也没有机会让灭了。


为了解决这两个问题,我们能做如下设想,第一,在执行完SETB P1.0后,延时一段时间(几秒或零点几秒)再执行第二条指令,就能分辨出灯曾灭过了。第二在执行完第二条指令后,让计算机再去执行第一条指令,持续地在原地兜圈,我们称之为"循环",这样就能完成任务了。


以下先给出程序(后面括号中的数字是为了便于讲解而写的,实际不用输入):

;主程序:
LOOP: SETB P1.0    ;(1)熄灭灯
LCALL DELAY        ;(2)延时一段时间
CLR P1.0           ;(3)点亮灯
LCALL DELAY        ;(4)延时一段时间
AJMP LOOP          ;(5)跳转到第一句LOOP处

;以下子程序
DELAY: MOV R7,#250 ;(6)
D1: MOV R6,#250    ;(7)
D2: DJNZ R6,D2     ;(8)
       DJNZ R7,D1  ;(9)
       RET         ;(10)
END                ;(11)



按上面的设想分析一下前面的五条指令。

第一条是让灯灭,第二条应当是延时,第三条是让灯亮,第四条和第二条一模一样,也是延时,第五条应当是转去执行第一条指令。第二和第四条实现的原理稍后谈,先看第五条,AJMP是一条指令,意思是转移,往什么地方转移呢?后面跟的是LOOP,看一下,什么地方还有LOOP,对了,在第一条指令的前面有一个LOOP,所以很直观地,我们能认识到,它要转到第一条指令处。这个第一条指令前面的LOOP被称之为标号,它的用途就是给这一行起一个名字,便于使用。是否一定要给它起名叫LOOP呢?当然不是,起什么名字,完全由编程序的人决定,能称它为A,X等等,当然,这个时候,第五条指令AJMP后面的名字也得跟着改了。


第二条和第四条指令的用途是延时,它是怎样实现的呢?指令的形式是LCALL,这条指令称为调用子程序指令,看一下指令后面跟的是什么,DELAY,找一下DELAY,在第六条指令的前面,显然,这也是一个标号。这条指令的作用是这样的:当执行LCALL指令时,程序就转到LCALL后面的标号所标定的程序处执行,如果在执行指令的过程中遇到RET指令,则程序就返回到LCALL指令的下面的一条指令继续执行,从第六行开始的指令中,能看到确实有RET指令。在执行第二条指令后,将转去执行第6条指令,而在执行完6,7,8,9条指令后将遇到第10条令:RET,执行该条指令后,程序将回来执行第三条指令,即将P10清零,使灯亮,然后又是第四条指令,执行第四条指令就是转去执行第6,7,8,9,10条指令,然后回来执行第5条指令,第5条指令就是让程序回到第1条开始执行,如此周而复始,灯就在持续地亮、灭了。


在标号DELAY标志的这一行到RET这一行中的所有程序,这是一段延时程序,大概延时零点几秒,至于具体的时间,以后我们再学习如何计算。 程序的最后一行是END,这不是一条指令,它只是告诉我们程序到此结束,它被称为"伪指令"。


单片机内部结构分析:为了知道延时程序是如何工作的,我们必需首先了解延时程序中出现的一些符号,就从R1开始,R1被称之为工作寄存器。什么是工作寄存器呢?让我们从现实生活中来找找答案。如果出一道数学题:123+567,让你回答结果是多少,你会马上答出是690,再看下面一道题:123+567+562,要让你要上回答,就不这么不难了吧?我们会怎样做呢?如果有张纸,就不难了,我们先算出123+567=690,把690写在纸上,然后再算690+562得到结果是1252。这其中1252是我们想要的结果,而690并非我们所要的结果,但是为了得到最终结果,我们又不得不先算出690,并记下来,这其实是一个中间结果,计算机中做运算和这个类似,为了要得到最终结果,一般要做很多步的中间结果,这些中间结果要有个地方放才行,把它们放哪呢?放在前面提到过的ROM中能吗?显然不行,因为计算机要将结果写进去,而ROM是不能写的,所以在单片机中另有一个区域称为RAM区(RAM是随机存取存储器的英文缩写),它能将数据写进去。 特别地,在MCS-51单片机中,将RAM中分出一块区域,称为工作寄存器区,上面程序用到的R6,R7就是在这个区里面,这我们会在第7课有详细的介绍。其实如果我们用C语言来写程序的话用根本不用了解工作寄存器这个概念了因为C编译器会自动处理.看上面的程序如果用c来写就是

#include

void DELAY()   //延时函数
{ unsigned char i,j;
    for(i=0;i<250;i++)
    {
        for(j=0;j<200;j++);
    } 
}

void main() //程序从这里开始执行
{
while(1) //这句的作用就是反复的执行下面这个{}中包含的4句
    {
     P1_0=1;  //(1)熄灭灯
     DELAY(); //(2)延时一段时间
     P1_0=0;  //(3)点亮灯
     DELAY(); //(4)延时一段时间
    }
}


在汇编例子中程序是从第一条语句开始执行的,而c不同在c语言里程序是从main() 这里开始执行的,关于(1)(2)(3)(4) 这几句的解释和上面的汇编一样,不再敖述。循环部分这里是用了一个while(1) 语句下面打了一个大括号,这样大括号中的这4条语句就会按(1)->(2)->(3)->(4) ->(1)->(2)->(3)->(4) ->(1)->(2)->(3)->(4)……永远不停的执行下去。这样灯就会持续的亮灭再亮再灭实现了闪烁效果,关于延时函数下节课再叙。

推荐阅读

史海拾趣

ETC公司的发展小趣事

北京速通科技有限公司(以下简称速通科技)作为ETC行业的领军企业,其创立之初就专注于电子不停车收费系统(ETC)的研发与应用。随着国内交通拥堵问题的日益严重,速通科技看到了ETC系统在未来交通管理中的重要地位。公司组建了一支由行业专家和技术精英组成的团队,开始了ETC技术的探索之路。

API Delevan公司的发展小趣事

1947年,API Delevan公司在电子行业的浪潮中应运而生。创立初期,公司面临着资金短缺、市场竞争激烈等诸多挑战。然而,凭借创始团队对电感技术的深刻理解和坚定信念,API Delevan迎难而上,积极研发新产品,逐步在市场中站稳脚跟。初创期的奋斗历程为公司的长远发展奠定了坚实的基础。

Display Engineering Services公司的发展小趣事

为了进一步扩大市场份额,API Delevan公司积极寻求与国内外合作伙伴的合作,共同开拓市场。通过参加国际电子展会、举办技术研讨会等方式,公司不断提升品牌知名度和影响力。同时,API Delevan还注重客户关系管理,为客户提供优质的产品和服务,赢得了客户的信任和忠诚。

High Tech Chips Inc公司的发展小趣事

为了进一步扩大市场份额,API Delevan公司积极寻求与国内外合作伙伴的合作,共同开拓市场。通过参加国际电子展会、举办技术研讨会等方式,公司不断提升品牌知名度和影响力。同时,API Delevan还注重客户关系管理,为客户提供优质的产品和服务,赢得了客户的信任和忠诚。

爱普特半导体(APTSEMI)公司的发展小趣事

在电子行业发展的浪潮中,爱普特半导体(APTSEMI)始终坚持自主创新的发展道路。公司自创立之初,就致力于研发具有自主知识产权的微处理器芯片。面对国外技术封锁和市场垄断的困境,爱普特团队不畏艰难,投入大量研发资源,成功突破了多项技术难关,研发出了全国产、高可靠性的32位MCU产品。这些产品性能卓越,可与国际先进水平相媲美,为我国电子行业的自主可控发展贡献了重要力量。

Greatbatch-Sierra Inc公司的发展小趣事

在电子行业发展的浪潮中,爱普特半导体(APTSEMI)始终坚持自主创新的发展道路。公司自创立之初,就致力于研发具有自主知识产权的微处理器芯片。面对国外技术封锁和市场垄断的困境,爱普特团队不畏艰难,投入大量研发资源,成功突破了多项技术难关,研发出了全国产、高可靠性的32位MCU产品。这些产品性能卓越,可与国际先进水平相媲美,为我国电子行业的自主可控发展贡献了重要力量。

问答坊 | AI 解惑

电子设计竞赛高频方向

本帖最后由 paulhyde 于 2014-9-15 09:07 编辑 有谁有高频方向的资料能够提供一些吗??  …

查看全部问答>

万分着急,,高人可以帮我写个拨码开关输入 ,,然后脉冲分频的程序不??

8位拨码开关   从0000 0000 到1111 1111 00000000不分频,,,00000001  就是2分频,,然后依次类推一直到11111111..哪个帮我写下,,,十万着急,,非常…

查看全部问答>

关于K型热电偶输出端混入40KHZ左右杂波的滤除

我现在要做一个温度保护,用K型热电偶检测设备的温度,然后经由MAX6675转换给MCU显示.今天调试的时候发现,K型热电偶输出端混入40KHZ左右的杂波,导致读取的温度不正确,干扰很严重.但比较取样电压(TLC1549处理)显示正常,说明MCU并不受干扰.哪位大侠能帮 ...…

查看全部问答>

机子经常定时黑屏

我有一台HP台式机,不知道为什么,用一段时间后(大概90分钟)就黑屏,象断电一样,重起又正常,请各位高手帮忙一下,万分感谢 …

查看全部问答>

求助:VC中单击按钮更新指定目录下的dll文件

请问各位大虾,建立一个对话框,单击其中的命令按钮,如何实现更新到指定目录下的dll文件。 希望大家不吝赐教,谢谢了!…

查看全部问答>

Windows mobile Camera驱动

这几天调camera的驱动,烦死了。 现在连亮都不亮。追踪打印消息。现在连打印消息都没有提示。 在开始调的时候,也许没有设置好电源,打印消息说I2C不能传输,写失败。 通过正常操作GPIO口控制camera的power up和reset,现在就没有了那个I2C传输 ...…

查看全部问答>

为什么PB6没有这些dll文件却能编译通过

原来一直用PB5做CE开发. 现在想常识下CE6开发. 安装了vs2005等一大堆软件后. 在VS2005下编译一个PB5 DEMO工程OK. 发现一个问题. 在common.bib中: ; @CESYSGEN IF CE_MODULES_USBD ; USB IF BSP_NOUSB !    usbd.dll   &nb ...…

查看全部问答>

win ce5.0如何实现一个简单的背光驱动,假设一个GPIO的高低电平控制为LCD的背光控制。

暂且不说I2C方式对LCD背光的控制。我发现开发板的串口在空闲的状态下(没有任何操作)每隔1分钟(根据系统的设定)就打印“SetDevicePower: Wrong Return Value from \'dsk1:\', returning ERROR_GEN_FAILURE”感觉内核是通过SetDevicePower控制LCD ...…

查看全部问答>

如何进行Linux内核升级

如何进行Linux内核升级,我需要把Linux2.18.20升级到2.18.35,网上一收一大堆,但是不知道是否能真正实现,哪位大虾有成功操作的例子,分享一下!!!…

查看全部问答>

想用TIM1的PWM实现DA输出,应该使用哪个中断?

我使用了例程中的TIM1,并将PWM周期更改为8KHz,成功输出了duty50%的方波。但我想输出语音,需要在8KHz每个时刻点,更新CCR1_Val,通过更改占空比实现DA输出。我想用Timer1产生8KHz的中断,我在中断子程序中实现值更新,但不知道应该使用TIM1中哪 ...…

查看全部问答>