单片机c语言延时函数中延时函数的问题

关于单片机延时程序的具体分析
前面我们介绍了延时程序,但这还不完善,因为,我们只知道DJNZ R6,D2这句话会被执行62500次,但是执行这么多次需要多长时间呢?是否满足我们的要求呢?我们还不知道,所以下面要来解决这个问题。
先提一个问题:我们学校里什么是最重要的。(铃声)校长可以出差,老师可以休息,但学校一日无铃声必定大乱。整个学校就是在铃声的统一指挥下,步调一致,统一协调地工作着。这个铃是按一定的时间安排来响的,我们可以称之为&时序��时间的顺序&。一个由人组成的单位尚且要有一定的时序,计算机当然更要有严格的时序。事实上,计算机更象一个大钟,什么时候分针动,什么时候秒针动,什么时候时针动,都有严格的规定,一点也不能乱。计算机要完成的事更复杂,所以它的时序也更复杂。
我们已知,计算机工作时,是一条一条地从ROM中取指令,然后一步一步地执行,我们规定:计算机访问一次存储器的时间,称之为一个机器周期。这是一个时间基准,好象我们人用&秒&作为我们的时间基准一样,为什么不干脆用&秒&,多好,很习惯,学下去我们就会知道用&秒&反而不习惯。
一个机器周期包括12个时钟周期。下面让我们算一下一个机器周期是多长时间吧。设一个单片机工作于12M晶振,它的时钟周期是1/12(微秒)。它的一个机器周期是12*(1/12)也就是1微秒。(请计算一个工作于6M晶振的单片机,它的机器周期是多少)。
MCS-51单片机的所有指令中,有一些完成得比较快,只要一个机器周期就行了,有一些完成得比较慢,得要2个机器周期,还有两条指令要4个机器周期才行。这也不难再解,不是吗?我让你扫地的执行要完成总得比要你完成擦黑板的指令时间要长。为了恒量指令执行时间的长短,又引入一个新的概念:指令周期。所谓指令周期就是指执行一条指令的时间。INTEL对每一条指令都给出了它的指令周期数,这些数据,大部份不需要我们去记忆,但是有一些指令是需要记住的,如DJNZ指令是双周期指令。
下面让我们来计算刚才的延时。首先必须要知道晶振的频率,我们设所用晶振为12M,则一个机器周期就是1微秒。而DJNZ指令是双周期指令,所以执行一次要2个微秒。一共执行62500次,正好125000微秒,也就是125毫秒。
原文标题:单片机时序分析
文章出处:【微信号:wujianying_danpianji,微信公众号:单片机精讲吴鉴鹰】欢迎添加关注!文章转载请注明出处。
发布评论请先
8051是MCS-51系列单片机的典型产品,其特性与我们实验的STC89C52RC完全相同,这里以8....
MCS-51单片机是一种集成的电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CP....
K9F5608A的MCS-51单片机驱动程序主要包括函数声明管脚定义部分、命令操作函数以及数据输出函....
电路,与人们熟识的“看门狗”电路不同,其间没有振荡电路。图中门c、C3起隔离作用,门c的输入端可以与....
下面几个是单片机的延时程序(包括asm和C程序,都是我在学单片机的过程中用到的),在单片机延时程序中....
MCS-51的存储器有片内RAM、片外RAM 和 ROM 三个空间。
MCS-51单片机在物理....
机器人在军事侦察、扫雷排险、防核化污染等危险与恶劣环境中以及工业自动化生产的物料搬运上应用很广,随着....
  计时功能:要实现计时功能则需要使用定时器来计时,通过设置定时器的初始值来控制溢出中断的时间间隔,....
标准51单片机是12T的,就是说12个时钟周期而现在很多51核的单片机工艺质量上去后,频率大大提高,....
MCS-51单片机是一种集成的电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CP....
HMOS制造工艺的MCS-51单片机都采用40引脚的直插封装(DIP方式),制造工艺为CHMOS的8....
基于单片机的激光测距系统设计
MCS-51单片机与无线调制器的综合应用,下来看看
MCS-51系列单片机的结构和原理
MCS-51系列单片机的特点及应用
MCS-51 数字信号输入输出接口电路
单片机(Microcontrollers)学习,MCS-51串行接口,感兴趣的小伙伴可以瞧一瞧。
电子设计研发部分的研发人员常用资料,MCS-51指令系统,感兴趣的可以瞧一瞧。
电子专业,单片机、DSP、ARM相关知识学习资料与教材
电子专业,单片机、DSP、ARM相关知识学习资料与教材
电子专业,单片机、DSP、ARM相关知识学习资料与教材
单片机教程学习、电子技术学习培训学习资料。
单片机教程学习、电子技术学习培训学习资料。
基础的电子类资料,电子工程师必备文档,快来下载学习吧
基础的电子类资料,电子工程师必备文档,快来下载学习吧。
基础的电子类资料,电子工程师必备文档,快来下载学习吧。
基础的电子类资料,电子工程师必备文档,快来下载学习吧。
MCS-51指令。包括汇编格式、机器码、操作码、机器周期数、振荡周期、字节数。
单片机设计资料电子类资料材料,有兴趣的同学可以下载学习
单片机设计资料电子类资料材料,有兴趣的同学可以下载学习
 从本质上说,PLC其实就是一套已经做好的单片机(单片机范围很广的)系统。
51单片机汇编语言教程:5课单片机延时程序分析
对MCS-51的硬件结构的初步介绍,希望大家能够通过它学习mcs-51的基本知识。
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司
电信与信息服务业务经营许可证:粤B2-单片机中延时算法和nop函数的使用_百度文库
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
单片机中延时算法和nop函数的使用
&&单片机中延时算法和nop函数的使用
你可能喜欢最高效率使用单片机放弃程序中的延时函数 - 单片机/MCU论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
最高效率使用单片机放弃程序中的延时函数
11:07:08  
在论坛上看到的,分享给大家一、最高效率使用单片机,放弃程序中的延时函数 第一发: 我是PC机底层编程转过来的,以前从来没接触过单片机,五个月前学习AVR,在这里学到很多东西。但也意识到电子工程师们的硬件编程思想与PC机底层编程思想上的很多不同,引发了一些思考。我说一说,供大家参考,只为学习,无意争论。 我第一次看到教程里Delay()函数的代码时我吓了一跳,竟然让单片机空转以实现和外界同步,这怎么可能? 试想,如果PC机CPU空转一秒,那么音乐会断一秒、画面会停顿一秒、下载文件会断一秒,这怎么可行? 我看到很多单片机程序,它们的单片机99.9%的工作时间都在打空转,99.9%大家可能感到有些危言耸听,那就让我们算一算: 已内部8M频的AVR单片机来说,单指令周期仅为1/8 = 0.125us,那一毫秒可以执行多少个单周期指令? 1%0.125*1000 = 8000个 而我看到论坛里下到的绝大多数程序,两个延时函数之间代码的执行时间要远远小于8000个指令周期。 说实话,很多16K以上的程序,把所有延时函数去掉,总体能执行几毫秒就不错了。 换句话说,我说单片机的利用率小于0.01%还是口下留情了。 要说怎么解决问题,就要先找到问题,我问问大家,程序中,我们为什么延时? 原因很多,可能是外设速度太慢,也可能是为了躲过人眼视觉停留时间,等等。 总之就是与外界不同步,而我们想要同步。 所以说这些延时应该是很有道理的,我不否定这一点,但问题的关键这些延时空转,我们为什么不能把这些时间回收起来做一些别的事呢? 试想,如果把这99.9%的时间回收,那可以一笔相当巨大的资源。 有很多人有些特殊方法回收过这些空转时间,比如说在延时函数中做点事。 但这些往往都不通用,下面我说一些我的两种方法: 1、前后台模式下延时时间回收的方法: 前后台模式就是大家最常用的主程序大循环 + 中断的模式。 首先解决外设太慢问题,像串口、键盘、LCD、SD卡等IO,这些收发可以建立外部缓冲区。比如串口收发在中断中完成保存到缓冲区,而主程序操作缓冲区而不直接操纵串口,这已经看到很多人这样用了。但像矩阵键盘的缓冲区,我很少看到有人这么用,在中断中接收按键信息保存到缓冲区。 还有像LCD,我们一个个往显存中写数据是很浪费的,也应该建立缓冲,统一处理。 建立缓冲区这类方式中间有一些技术难点,比如像串口接收,无法判断对发是否全部发完,怎么办?可以设立定时,如果一个字节接收之后1ms之内没收到下一个,则认为接收完毕。这只是一个思想,具体应用大家掌握。 可能有人会说,除了外设太慢,还有像视觉停留的问题怎么解决,总不能让流水灯快到人眼都看不清吧。 这就我下面要说的问题,这些延时的时间怎么回收?就是全部放到定时中断中! 可能又有些人会说,书里、教程都说了,中断处理东西的时间要尽量短,你这样整个中断有太多判断、很长,时间很长,这不行。 这是一种教条的思想,把书读死了。可以在中断中这样处理,比如: void (*Task)(void); ISR { (*Task)(void); } 中断里用的内容通过函数指针来调用,这样可以在主程序根据需要时任意改变要执行的任务,还可以改任务的周期。所用的判断都是在主程序需中执行,然后改变指针的指向,来确定中断中下一步的任务。 这样,在前后台系统中主程序将任务分配完,还有很多余力处理很多事。 比如有很多个键盘、LED点阵、数码管等,它们都需要实时响应,很容造成编程困难、响应迟钝,其实只要把延时的时间回收,处理这些就非常从容了。 可能还有人会说,有些项目用不了这么苛刻的时间,你回收的时间用不了,要那么多干嘛? 其实这时,你就可以用死循环扫描事件,可以实时响应。你的系统跟原来空循环延时比,实时性要高了不知多少倍。 2、变异的协作式内核 先说说嵌入式操作系统的内核,简单的说,它就是个任务调度器,让多个任务在同一个CPU上同时执行,所谓同时也是相对的,无非就第一个任务执行几毫秒、第二个任务在执行几毫秒。。。外表看起来就是同时执行。 至于可剥夺式内核和协作式内核的区别,大家可以百度一下。 说道能在单片机上用的嵌入式操作系统,大家会说出一些如uCosII、FreeOS等操作系统。 还有很多人对这些操作系统十分抗拒、十分反对,他们的理由是什么? 1、这些操作系统占用大量RAM、ROM 2、这些实时操作系统所谓的实时是相对非实时操作系统的,跟裸机比实际上是慢了 这些理由不是没道理,因为这些商用操作系统都是可剥夺式内核,它们的原则是保证最高优先级任务在可确定的时间内响应。 它们的有优点是任务切换时间是确定的,不会随任务的多少而改变。 有了这些确定性,让它们在商用产品大放光彩。因为其时间稳定性。 但它们的缺点也很明显,中断级节拍浪费很多时间。任务间同时调用时引发同步问题而引入许多如信号量、邮箱等机制浪费大量RAM、ROM。 综上,可剥夺式内核稳定可定量,在越高级的单片机上越有优势,在8位机上可用,但需要大量裁剪,并不一定合适。 而协作式内核的核心思想是什么?它不像剥夺式内核保证最高级任务速度最快,而是保证所有任务的平均速度最快! 正如我前面的说法,我连续两个延时函数之间的代码很难超过1ms,甚至很难超过100us,我们可以将其忽略。这样10个任务,第一个执行完主动放弃单片机控制权,交给第二个任务,第二个任务执行完主动放弃控制权,交给第三个任务。10个任务之间无间隙,每一个任务需要延时时,就主动放弃控制权。 基于这种思想,我们的就达到了回收空转延时的目的,而且应为每个任务是执行完后主动放弃,所以不存在剥夺式内核的同步问题,基本不需要邮箱、信号量等机制,对RAM、ROM的要求就非常低了。 这样来看,协作式内核非常适合8位机。但可能有太多嵌入式系统的书中对剥夺式内核不分场合的认可,造成很多人误解。而且uCos等系统的权威,也让很多RTOS作者争相效仿,没用对8位机的场合做合理分析。 商用系统中没有协作式内核,而民用的,还少有优秀的协作式内核,都是基于传统节拍。 传统协作式内核需要定时中断为时钟基准,也会间歇性打断任务,造成不必要的损失,这并不是我们想要的。 我们其实可以仅仅是让定时器以大分频系数开着, 而不给其产生中断的机会。当任务将要放弃使用权时,读取定时器,作为时钟基准,然后清零。 做法一句两句说不清,而效果是什么?可以做到任务是以不受干扰,与裸机相同的工作状态,这是传统协作式内核做不到的,而仅当它需要延时了,才放弃使用权,将延时的时间给其它任务。这正符合我全文的目的 -- 回收空转延时时间 这样的内核体积会非常小,运行方式与裸机无异,仅仅是把空转延时时间干些其它事。对使用者还没什么要求,不想以往系统那么复杂。 可惜市面上并没有基于这种方式的内核,我已经写了一个,非常精简,运行稳定。但作为一个想应用实际的内核,还需要检验。
资源分享达人,加分鼓励!
13:47:03  
以前也这样想过,不知怎么解决比较好
01:03:58  
不错。。值得学习!!
14:33:25  
说得很好,工作了做产品需要性价比,往往用一片价格很便宜资源很少的单片机做好几个任务,任务里还需要定时延时好几个不同的时间,某些任务还需要比较紧急的处理,这样做起来就不好做了,我的做法也是跟你差不多,但并没做成一个内核。一起好好交流吧
19:56:34  
表示不懂。。。。
20:02:17  
说得很好,工作了做产品需要性价比,往往用一片价格很便宜资源很少的单片机做好几个任务,任务里还需要定时延时好几个不同的时间,某些任务还需要比较紧急的处理,这样做起来就不好做了,我的做法也是跟你差不多,但并没做成一个内核。一起好好交流吧
17:32:47  
《时间触发嵌入式系统设计模式》
Powered by
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司51单片机延时1s的程序,汇编,c分别写一个,要求使用中断(共10篇)
51单片机延时1s的程序,汇编,c分别写一个,要求使用中断(共10篇)
【开封作文】 池锝网
本文已影响 人
篇一:C及汇编延时程序 有个好帖,从精度考虑,它得研究结果是: void delay2(unsigned char i) { while(--i); } 为最佳方法。
分析:假设外挂12M(之后都是在这基础上讨论) 我编译了下,传了些参数,并看了汇编代码,观察记录了下面的数据: delay2(0):延时518us518-2*256=6 delay2(1):延时7us(原帖写“5us”是错的,^_^) delay2(10):延时25us
25-20=5 delay2(20):延时45us
45-40=5 delay2(100):延时205us205-200=5 delay2(200):延时405us405-400=5
见上可得可调度为2us,而最大误差为6us。 精度是很高了!
但这个程序的最大延时是为518us 显然不 能满足实际需要,因为很多时候需要延迟比较长的时间。
那么,接下来讨论将t分配为两个字节,即uint型的时候,会出现什么情况。 void delay8(uint t) { while(--t); } 我编译了下,传了些参数,并看了汇编代码,观察记录了下面的数据: delay8(0):延时36=263 delay8(1):延时15us delay8(10):延时85us85-80=5 delay8(100):延时806us 806-800=6 delay8(1000):延时8009us
delay8(10000):延时8-8000=45 delay8(65535):延时524542us
如果把这个程序的可调度看为8us,那么最大误差为263us,但这个延时程序还是不能满足要求的,因为延时最大为524.551ms。
那么用ulong t呢? 一定很恐怖,不用看编译后的汇编代码了。。。 那么如何得到比较小的可调度,可调范围大,并占用比较少得RAM呢?请看下面的程序:
/*-------------------------------------------------------------------- 程序名称:50us 延时 注意事项:基于1MIPS,AT89系列对应12M晶振,W77、W78系列对应3M晶振 例子提示:调用delay_50us(20),得到1ms延时 全局变量:无 返回: 无 --------------------------------------------------------------------*/ void delay_50us(uint t) {
for(;t&0;t--) for(j=19;j&0;j--) ;(来自:WWw.CdfDs.Com 池 锝 范 文网:[标签:biaoti]) }
我编译了下,传了些参数,并看了汇编代码,观察记录了下面的数据: delay_50us(1):延时63us 63-50=13 delay_50us(10):延时513us
503-500=13 delay_50us(100):延时-5000=13 delay_50us(1000):延时50022us =22
赫赫,延时50ms,误差仅仅22us,作为C语言已经是可以接受了。再说要求再精确的话,就算是用汇编也得改用定时器了。
/*-------------------------------------------------------------------- 程序名称:50ms 延时 注意事项:基于1MIPS,AT89系列对应12M晶振,W77、W78系列对应3M晶振 例子提示:调用delay_50ms(20),得到1s延时 全局变量:无 返回: 无 --------------------------------------------------------------------*/ void delay_50ms(uint t) { /**** 可以在此加少许延时补偿,以祢补大数值传递时(如delay_50ms(1000))造成的误差, 但付出的代价是造成传递小数值(delay_50ms(1))造成更大的误差。 因为实际应用更多时候是传递小数值,所以补建议加补偿! ****/ for(;t&0;t--) for(j=6245;j&0;j--) ; } 我编译了下,传了些参数,并看了汇编代码,观察记录了下面的数据: delay_50ms(1):延时50 010
10us delay_50ms(10):延时499 98317us delay_50ms(100):延时4 999 713287us delay_50ms(1000):延时4 997 022
赫赫,延时50s,误差仅仅2.978ms,可以接受!
上面程序没有才用long,也没采用3层以上的循环,而是将延时分拆为两个程序以提高精度。应该是比较好的做法了
楼上的说得很对,用C语言编写单片机程序时,一般开发界面(如科尔KEILE)都提供了C - 汇编的代码转换,参照转换后的汇编语言就可以精确延时了 ---------------------------------------------------------------
你可以数指令,然后按着MCU的MIPS算时间,结果应该比较精确:) ---------------------------------------------------------------
void mDelay(unsigned int Delay) //Delay = 1000 时间为1S
for(;Delay&0;Delay--) { for(i=0;i&124;i++) {;}
} } ---------------------------------------------------------------
数 一次循环的汇编指令,再乘以指令周期就知道一次循环的时间了啊,然后用1秒一除,不就知道循环次数了么 ---------------------------------------------------------------
秒级的本身精度要求就不高嘛 很容易控制啊
多套用几个for语句 或者在for语句里引用n个更低量级的(如100ms级)的延时函数即可 要精确就计算汇编代码执行长度
---------------------------------------------------------------
to flowercity(Love Program,Love Living):
你的函数没有什么参考价值 延时时间和指令周期以及编译出来的代码类型有关系的
不是所谓 //Delay = 1000 时间为1S 就是一定的. 那只是针对你现在的系统. 用的晶振不同,执行CPU指令周期和时钟周期比率不同结果都不同 ---------------------------------------------------------------
秒级的,用定时器比较好吧。 ---------------------------------------------------------------
void waitms(int i) {
for( ;i--) { for(m = 203; m--) { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } } } 延时1ms的函数 时钟频率12MHz ---------------------------------------------------------------
空操作,不过不好做到很准确 ---------------------------------------------------------------
秒级延时,用指令的话,你要求延时的精确度是多少,高的话最好用定时器,而且你延时这么长,你的CPU不是就一直占用了,浪费呀。。。 ---------------------------------------------------------------
与定时器中断服务程序配合实现延时。
unsigned int sleepT unsinged char inSleep = 0;
void sleepService(void) { if (inSleep) sleepTime--;篇二:大工15春《单片机原理及应用》大作业题目及要求【答案】
网络教育学院 《单片机原理及应用》大作业
题 目: 学习中心: 层 次: 专 业: 年 级:
年春/秋 季 学 号: 学生姓名:大工16春《单片机原理及应用》大作业具体要求: 1 作业内容 从以下五个题目中任选其一作答。 2 正文格式 作业正文内容统一采用宋体,字号为小四,字数在2000字以上。 3. 作业提交 学生需要以附件形式上交离线作业(附件的大小限制在10M以内),选择已完成的作业,点“上交”即可。如下图所示。 4. 截止时间 日。在此之前,学生可随时提交离线作业,如需修改,可直接上传新文件,平台会自动覆盖原有文件。 5. 注意事项 请同学独立完成作业,不准抄袭其他人或者请人代做,如有雷同作业,成绩以零分计! 题目一:单片机电子时钟设计 准 则:设计一个基于51单片机或STM单片机的电子时钟,并且能够实现时分 秒的显示和调节 撰写要求:(1)首先介绍课题背景,并进行需求分析及可行性分析,包括软硬件 功能分配、核心器件的选型等; (2)对系统硬件进行设计,包括硬件功能模块划分、电路原理图设计等; (3)对系统软件进行设计,选用汇编语言或C语言编写程序,给出软件 开发流程; (4)总结:需要说明的问题以及设计的心得体会。 一、课题背景 1957年,Ventura发明了世界上第一个电子表,从而奠定了电子时钟的基础,电子时钟开始迅速发展起来。现代的电子时钟是基于单片机的一种计时工具,采用延时程序产生一定的时间中断,用于一秒的定义,通过计数方式进行满六十秒分钟进一,满六十分小时进一,满二十四小时小时清零。从而达到计时的功能,是人们日常生活不可缺少的工具。现在高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟、石英钟、石英表都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调试,数字式电子钟用集成电路计时时,译码代替机械式传动,用LED显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时、分、秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。 单片机电子时钟设计
二、时钟的基本原理分析 利用单片机定时器完成计时功能,定时器0计时中断程序每隔0.01s中断一次并当作一个计数,设定定时1秒的中断计数初值为100,每中断一次中断计数初值减1,当减到0时,则表示1s到了,秒变量加1,同理再判断是否1min钟到了,再判断是否1h到了。 为了将时间在LED数码管上显示,可采用静态显示法和动态显示法,由于静态显示法需要译码器,数据锁存器等较多硬件,可采用动态显示法实现LED显示,通过对每位数码管的依次扫描,使对应数码管亮,同时向该数码管送对应的字码,使其显示数字。由于数码管扫描周期很短,由于人眼的视觉暂留效应,使数码管看起来总是亮的,从而实现了各种显示。 三、时钟设计分析针对要实现的功能,采用AT89S51单片机进行设计,AT89S51 单片机是一款低功耗,高性能CMOS8位单片机,片内含4KB在线可编程(ISP)的可反复擦写1000次的Flash只读程序存储器,器件采用高密度、非易失性存储技术制造,兼容标准MCS- 51指令系统及80C51引脚结构。这样,既能做到经济合理又能实现预期的功能。 在程序方面,采用分块设计的方法,这样既减小了编程难度、使程序易于理解,又能便于添加各项功能。程序可分为闹钟的声音程序、时间显示程序、日期显示程序,秒表显示程序,时间调整程序、闹钟调整程序、定时调整程序,延时程序等。运用这种方法,关键在于各模块的兼容和配合,若各模块不匹配会出现意想不到的错误。 首先,在编程之前必须了解硬件结构尤其是各引脚的用法,以及内部寄存器、存储单元的用法,否则,编程无从下手,电路也无法设计。这是前期准备工作。第二部分是硬件部分:依据想要的功能分块设计设计,比如输入需要开关电路,输出需要显示驱动电路和数码管电路等。第三部分是软件部分:先学习理解汇编语言的编程方法再根据设计的硬件电路进行分块的编程调试,最终完成程序设计。第四部分是软件画图部分:设计好电路后进行画图,包括电路图和仿真图的绘制。第五部分是软件仿真部分:软硬件设计好后将软件载入芯片中进行仿真,仿真无法完成时检查软件程序和硬件电路并进行修改直到仿真成功。第六部分是硬件实现部分:连接电路并导入程序检查电路,若与设计的完全一样一般能实现想要的功能。最后进行功能扩展,在已经正确的设计基础上,添加额外的功能! 四、时钟的实现 A.电路设计 1. 整体设计 此次设计主要是应用单片机来设计电子时钟,硬件部分主要分以下电路模块:显示电路用8个共阴数码管分别显示,星期(年份),小时、分钟(月份)和秒(日),通过动态扫描进行显示,从而避免了译码器的使用,同时节约了I/0端口,使电路更加简单。单片机采用AT89S51系列,这种单片机应用简单,适合电子钟设计。 电路的总体设计框架如下:
2.1 输入部分 输入信号主要是各种模式选择和调整信号,由按键开关提供。 以下为输入部分样例: 在本实验中主要用用P3口输入按键信号,还用到了特殊的P0口。对于P0口,由于其存在高阻状态,为了实现开关功能,给其添加上拉电阻,具体如下图所示: 2.2 输出部分 本电路的输出信号为7段数码管的位选和段选信号,闹铃脉冲信号,提示灯信号。 本实验的数码管是共阴的,为了防止段选信号不能驱动数码管,故在P1口连接上拉电阻后,再送段选信号,以提高驱动,位选信号直接从P2口接入,如下图:篇三:51单片机定时汇编程序 ;******************; ; 定时器程序 ; ; 采用89c51; ; 2001.10 ; ;******************; ; ;****************** ;伪定义 ;****************** SL
EQU30H SH EQU31H ML EQU32H MH EQU33H HL
EQU34H HH EQU35H ; L0
EQU36H L1 EQU37H L2
EQU38H L3 EQU39H DSPLYP EQU3AH PLYTS
EQU3BH ; LPLMODBIT39H HPLMODBIT3AH BRIGHT BIT3BH ; TCOUNTEQU3CH ; ADDRES
EQU3DH MAX
EQU3EH IFDEC BIT20H ; R_MOD
EQU3FH ; LED4
BIT30H BELL
BITP1.7 SWITCH
BITP3.7 FKEY
BITP3.0 MKEY BITP3.1 ; WORKIN BIT38H ; ;SL存放秒的个位数SH存放秒的十位数 ;ML存放分的个位数MH存放分的十位数HL存放时的个位数HH存放时的十位数L0~L3:显示数据存储器显示数据指针(DISPLAY-POINT)显示次数计数器(DISPLAY-TIMES)低两位显示方式(LOW-PLAY-MOD) ;高两位显示方式(HIGH-PLAY-MOD) ;DISPLAY子程序参数:亮灭指示位时间计数器(TIME-COUNT);加1子程序参数加1子程序参数BCD加法子程序参数 ;响铃方式参数发光管状态位蜂鸣器 ;继电器功能键 (S1)修改键 (S2) ;工作状态指示位;****************** ;
中断入口 ; ;****************** ORG 0000H START:
MAIN 0000H
引向主程序 LJMP
ERR; 0003H NOP NOP LJMP
ERR; 引向出错处理程序 LJMP
PGT0 000BH
引向中断处理程序PGT0 NOP NOP LJMP
ERR; 引向出错处理程序 LJMP
ERR; 0013H
INT1 NOP NOP LJMP
ERR; 001BH
T1 NOP NOP LJMP
ERR; 0023H NOP NOP LJMP
ERR; 002BH NOP NOP ; ;************ ;主程序 ;************ MAIN:MOVIE,
#00H;关中断 MOVSP,
#57H;设置堆栈指针 MOVPSW,
#00H ;选用寄存器组0 MOVTMOD, #11H ;设定中断工作方式为T0和T1 ; MOVA, 56H CJNE
A, #0AAH, CSTART判上电复位标志,无标志转冷启动MOVA, 57H CJNE
CSTART; 无标志转冷启动 AJMP
HSTART;有上电复位标志转热启动NOP NOPLJMP
ERR;软件陷阱,引向出错处理程序 CSTART: MOVP1, #0FFH ;冷启动,全面初始化 MOVP3, #0FFH MOVTCON,
#00H ;计时停止 MOVTL0, #0B0H;赋中断T0初值 MOVTH0, #3CH MOVTCOUNT, #0AH ;赋定时器初值 MOVR5, #00HR5为一空单元(备用) MOVR4, #00H R4 为工作模式选择寄存器 MOVSL, #00H定时单元清零 MOVSH, #00H秒 MOVML, #00H ; MOVMH, #00H ;分 MOVHL, #00H ; MOVHH, #00H ;时 MOVPLYTS,
#64H;赋显示次数初值为100次 MOVDSPLYP,
#L0显示指针指向显存单元 MOVL0,
#0AH送显示数据&-----& MOVL1,
#0AH MOVL2,
#0AH MOVL3,
#04H SETBLED4LED4为数码管之间的发光二极管 SETBLPLMOD设定显示方式为闪烁SETBHPLMOD SETBBRIGHT;允许显示 CLR WORKIN清工作标志 , 待命 AJMP
SETUP ;转开始工作 NOP NOP LJMP
ERR ;软件陷阱 HSTART: MOVSCON, #00H ; 有上电标志,热启动,清串行口控制寄存器 MOVIP,
#00H; 清中断优先控制寄存器 SETBFKEY重设按键 SETBMKEY SETBEA开中断 AJMP
BEGIN转向继续工作 NOP NOP LJMPERR;软件陷阱 SETUP:
EA;开中断 ; MAIN1:ACALL
DISPLY ;调用显示JB FKEY,
JUDGE ;按键扫描 ACALL
KEYDLY延时消抖动 JB FKEY,
JUDGE ;无键按下转向判断是否到点
CLRET0功能键被按下,则 CLRTR0 ;暂停计时 ACALL MENU 调用菜单设置程序 BEGIN:
WORKIN ;置工作标志位,开始工作SETB
ET0开中断 SETB
TR0开始计时 MOVA, R4;移入工作模式选择 RL A指针放大 MOVDPTR,
#M_TAB JMP@A+DPTR根据工作模式跳转到相应程序段
WORK1 AJMP
WORK2 AJMP
WORK3 AJMP
WORK4 NOP NOP LJMP
ERR;软件陷阱 WORK1: WORK2:
CLRSWITCH;工作方式1和2:开继电器
MAIN2 NOP NOP LJMP
ERR ;软件陷阱 WORK3: WORK4:
SWITCH ;工作方式3和4:不开继电器 MAIN2:
CLRBELL蜂鸣器短鸣一声,以示开始工作ACALL
DL05S SETB
BELL JUDGE:
JNB WORKIN, MAIN1判断是否在定时之中 MOVA, SL;判断秒是否为零 JNZMAIN1 MOVA, SH ;判断秒是否为零 JNZMAIN1 MOVA, ML ;判断分是否为零 JNZMAIN1 MOVA, MH ;判断分是否为零 JNZMAIN1 MOVA, HL ;判断时是否为零 JNZMAIN1 MOVA, HH ;判断时是否为零 JNZMAIN1 ;若时分秒全为零则CLRET0; 停止计时 CLRTR0; ACALL ACTION 调用到点工作子程序 AJMP
MAIN ; 返回 NOP NOP LJMP ERR ;软件陷阱 ; ;****************** ; 倒计时程序; ;****************** PGT0:CLREA PUSH
DPH MOVPSW, #08H CLRTR0 MOVA,#0B7H ADDA,TL0 MOVTL0,A MOVA,#3CH ADDA,TH0 MOVTH0,A SETB
TR0 DECTCOUNT 一次,则 MOVA,
TCOUNT JNZOUTT0 MOVTCOUNT, #0AH CPLLED4 JNBLED4, OUTT0 MOVR0, #SH SETB
IFDEC ACALL ADDBCD CJNE
R3, #99H, OUTT0 MOVSH, #05H MOVSL, #09H MOVR0, #MH ACALL ADDBCD CJNE
R3, #99H, OUTT0 MOVMH, #05H MOVML, #09H MOVR0, #HH;关中断 ;保护现场选用寄存器组1暂停计时中断同步修正 ;恢复计时;定时器T0每50 000毫秒溢出; 溢出10次为0.5秒;判断是否到半秒 ;; 若到半秒LED取反 ;LED每闪烁一次是一秒 ;移入秒位的地址BCD子程序参数,使其做减法 ;调用BCD子程序, 秒减1判断秒要否借位;要借位则; 送数据59(否则显示99)移入分位的地址 ;分减1 ;判断分要否借位篇四:大工15春《单片机原理及应用》大作业题目及要求【答案】
网络教育学院 《单片机原理及应用》大作业
题 目: 单片机电子时钟设计 学习中心:
厦门电子职业中专学校奥鹏学习中心层 次:高起专 专 业: 电气工程极其自动化 年 级: 15
年春/秋 季 学 号: 学生姓名: 单片机电子时钟设计
一、 引言 单片机技术在计算机中作为独立的分支,有着性价比高、集成度高、体积少、可靠性高、控制功能强大、低功耗、低电压、便于生产、便于携带等特点,越来越广泛的被应用于实际生活中。单片机全称,单片机微型计算机,从应用领域来看,单片机主要用来控制系统运行,所以又称微控制器或嵌入式控制器,单片机是将计算机的基本部件微型化并集成在一块芯片上的微型计算机。 二、时钟的基本原理分析 利用单片机定时器完成计时功能,定时器0计时中断程序每隔0.01s中断一次并当作一个计数,设定定时1秒的中断计数初值为100,每中断一次中断计数初值减1,当减到0时,则表示1s到了,秒变量加1,同理再判断是否1min钟到了,再判断是否1h到了。 为了将时间在LED数码管上显示,可采用静态显示法和动态显示法,由于静态显示法需要译码器,数据锁存器等较多硬件,可采用动态显示法实现LED显示,通过对每位数码管的依次扫描,使对应数码管亮,同时向该数码管送对应的字码,使其显示数字。由于数码管扫描周期很短,由于人眼的视觉暂留效应,使数码管看起来总是亮的,从而实现了各种显示。 三、时钟设计分析 针对要实现的功能,采用AT89S51单片机进行设计,AT89S51 单片机是一款低功耗,高性能CMOS8位单片机,片内含4KB在线可编程(ISP)的可反复擦写1000次的Flash只读程序存储器,器件采用高密度、非易失性存储技术制造,兼容标准MCS- 51指令系统及80C51引脚结构。这样,既能做到经济合理又能实现预期的功能。 在程序方面,采用分块设计的方法,这样既减小了编程难度、使程序易于理解,又能便于添加各项功能。程序可分为闹钟的声音程序、时间显示程序、日期显示程序,秒表显示程序,时间调整程序、闹钟调整程序、定时调整程序,延时程序等。运用这种方法,关键在于各模块的兼容和配合,若各模块不匹配会出现意想不到的错误。 首先,在编程之前必须了解硬件结构尤其是各引脚的用法,以及内部寄存器、存储单元的用法,否则,编程无从下手,电路也无法设计。这是前期准备工作。第二部分是硬件部分:依据想要的功能分块设计设计,比如输入需要开关电路,输出需要显示驱动电路和数码管电路等。第三部分是软件部分:先学习理解汇编语言的编程方法再根据设计的硬件电路进行分块的编程调试,最终完成程序设计。第四部分是软件画图部分:设计好电路后进行画图,包括电路图和仿真图的绘制。第五部分是软件仿真部分:软硬件设计好后将软件载入芯片中进行仿真,仿真无法完成时检查软件程序和硬件电路并进行修改直到仿真成功。第六部分是硬件实现部分:连接电路并导入程序检查电路,若与设计的完全一样一般能实现想要的功能。最后进行功能扩展,在已经正确的设计基础上,添加额外的功能! 四、时钟的实现 A.电路设计 1. 整体设计 此次设计主要是应用单片机来设计电子时钟,硬件部分主要分以下电路模块:显示电路用8个共阴数码管分别显示,星期(年份),小时、分钟(月份)和秒(日),通过动态扫描进行显示,从而避免了译码器的使用,同时节约了I/0端口,使电路更加简单。单片机采用AT89S51系列,这种单片机应用简单,适合电子钟设计。 电路的总体设计框架如下: 2. 分块设计 模块电路主要分为:输入部分、输出部分、复位和晶振电路。 2.1 输入部分 输入信号主要是各种模式选择和调整信号,由按键开关提供。 以下为输入部分样例: 在本实验中主要用用P3口输入按键信号,还用到了特殊的P0口。对于P0口,由于其存在高阻状态,为了实现开关功能,给其添加上拉电阻,具体如下图所示: 2.2 输出部分本电路的输出信号为7段数码管的位选和段选信号,闹铃脉冲信号,提示灯信号。 本实验的数码管是共阴的,为了防止段选信号不能驱动数码管,故在P1口连接上拉电阻后,再送段选信号,以提高驱动,位选信号直接从P2口接入,如下图: 闹铃由P2.6端输出,模块如下: 2.3 晶振与复位电路 本实验单片机时钟用内部时钟,模块如下: 复位电路为手动复位构成,模块如下:篇五:单片机原理及应用作业答案 作业答案0-1 绪论 1.单片机是把组成微型计算机的各功能部件即(微处理器(CPU))、(存储器(ROM和RAM))、(总线)、(定时器/计数器)、(输入/输出接口(I/O口))及(中断系统)等部件集成在一块芯片上的微型计算机。 2.什么叫单片机?其主要特点有哪些? 解: 将微处理器(CPU)、存储器(存放程序或数据的ROM和RAM)、总线、定时器/计数器、输入/输出接口(I/O口)、中断系统和其他多种功能器件集成在一块芯片上的微型计机,称为单片微型计算机,简称单片机。 单片机的特点:可靠性高、便于扩展、控制功能强、具有丰富的控制指令、低电压、低功耗、片内存储容量较小、集成度高、体积小、性价比高、应用广泛、易于产品化等。
MCS-51单片机的结构与原理 15. MCS-51系列单片机的引脚中有多少根I/O线?它们与单片机对外的地址总线和数据总线之间有什么关系?其地址总线和数据总线各有多少位?对外可寻址的地址空间有多大? 解: MCS-51系列单片机有4个I/O端口,每个端口都是8位双向口,共占32根引脚。每个端口都包括一个锁存器(即专用寄存器P0~P3)、一个输入驱动器和输入缓冲器。通常把4个端口称为P0~P3。在无片外扩展的存储器的系统中,这4个端口的每一位都可以作为双向通用I/O端口使用。在具有片外扩展存储器的系统中,P2口作为高8位地址线,P0口分时作为低8位地址线和双向数据总线。 MCS-51系列单片机数据总线为8位,地址总线为18位,对外可寻址空间为64KB。 25. 开机复位后,CPU使用的是哪组工作寄存器(R0-Rn)?它们的地址是什么?CPU如何确定和改变当前工作寄存器组(R0-Rn)? 解: 开机复位后,CPU使用的是第0组工作寄存器。它们的地址是00H-07H。CPU通过对程序状态字PSW中RS1和RS0的设置来确定和改变当前工作寄存器组。 27. MCS-51单片机的时钟周期、机器周期、指令周期是如何定义的?当主频为12MHz的时候,一个机器周期是多长时间?执行一条最长的指令需要多长时间? 解: 时钟周期又称为振荡周期,由单片机内部振荡电路OSC产生,定义为OSC时钟频率的倒数。时钟周期又称为节拍(用P表示)。时钟周期是时序中的最小单位。一个状态有两个节拍, 机器周期定义为实现特定功能所需的时间。MCS-51的机器周期由12个时钟周期构成。 执行一条指令所需要的时间称为指令周期,指令周期是时序中的最大单位。由于机器执行不同指令所需的时间不同,因此不同指令所包含的机器周期数也不尽相同。MCS-51的指令可能包括1~4个不等的机器周期。 当MCS-51的主频为12MHz时,一个机器周期为1?s。执行一条指令需要的最长时间为4?s。 第2章
MCS-51单片机指令系统与汇编语言程序设计 4. 假定累加器A中的内容为30H,执行指令1000H:MOVCA,@A+PC后,把程序存储器(
)单元的内容送入累加器A中。 7. 指出下列各指令在程序存储器中所占的字节数 (1)MOV
DPTR,#1234H
3字节 (2)MOVX
A, @DPTR1字节 (3)LJMP
LOOP 3字节 (4)MOV
R0,A 1字节 (5)AJMP
LOOP 2字节 1(6)MOV
A,30H2字节 (7)SJMP
2字节 (8)MOV
2字节 15.设堆栈指针(SP)=60H,片内RAM中的(30H)=24H,(31H)=10H。执行下列程序段后,61H, 62H, 30H, 31H, DPTR及SP中的内容将有何变化? PUSH 30H PUSH 31H POP
30H, #00H MOV
31H, #0FFH 解: 结果为: 61H、62H单元为堆栈单元,其内容已被弹出栈。 (31H)=0FFH
(DPTR)=2410H
(SP)=60H 17.完成以下的数据传送过程 (1)R1的内容传送到R0。 (2)片外RAM 20H单元的内容送R0。 (3)片外 RAM 20H单元的内容送片内RAM 20H单元。 (4)片外RAM 1000H单元的内容送片内 RAM 20H单元。 (5)ROM 2000H单元的内容送R0。 (6)ROM 2000H单元的内容送片内RAM 20H单元。 (7)ROM 2000H单元的内容送片外RAM 20H单元。 解: (1)R1的内容传送到R0 ; MOV
R0,A (2)片外RAM 20H单元内容送R0 ; MOVR1,
#20H MOVX A, @R1 MOVR0, A (3)片外 RAM 20H单元的内容送片内RAM 20H单元; MOV R0,
A, @R0 MOV 20H, A (4)片外RAM 1000H单元的内容送片内 RAM 20H 单元; MOV DPTR,
#1000H MOVX
A, @DPTR MOV 20H, A (5)ROM 2000H单元的内容送R0单元; CLR A MOV DPTR,#2000H MOVC
A, @A+DPTR MOV
R0, A (6)ROM 2000H 单元的内容送片内RAM 20H单元; CLRA MOVDPTR,#2000H MOVC
A, @A+DPTR MOV 20H, A (7)ROM 2000H单元的内容送片外RAM 20H单元。 CLRA MOVDPTR,#2000H MOVC
A, @A+DPTR MOVR0,#20H MOVX @R0,
(30H)=00H19.编程将片内RAM的40H~60H单元中内容送到片外RAM以3000H开始的单元中。并将原片内RAM数据块区域全部清0。 解: ORG 0000H LJMP MAIN ORG 0030H MAIN: MOV SP, #60H MOV R7,#21H MOV R1,#40H MOV DPTR,#3000H LOOP: MOV A,@R1 MOVX
@DPTR,A MOV @R1, #00H INC R1 INC DPTR DJNZ R7,LOOP SJMP $ END 23.设有100个有符号数,连续存放在片外RAM以2000H为首地址的存储区中,试编程统计其中正数、负数、零的个数。 解:
ORG 0000H LJMP MAIN ORG 0030H MAIN: MOV R2,#100 MOV R3,#00H MOV R4,#00H MOV R5,#00H MOV DPTR,#2000H LOOP: MOVX A,@DPTR CJNE A,#00H,NET1 INC R3 SJMP NET3 NET1: JB ACC.7
NET2 INC R4 SJMP NET3 NET2: INC R5 NET3: INC DPTR DJNZ R2,LOOP SJMP $ END 24.试编一查找程序,从外部RAM首地址为2000H、长度为9FH的数据块中找出第一个ASCII码A,将其地址送到20A0H和20A1H单元中。 解:ORG 0000H LJMP MAIN ORG 0030H MAIN:
MOV SP, #60H MOV DPTR,#2000H MOV R7,#9FH LP0: MOVX
A,@DPTR CJNE
A, #41H, LP1 MOV R2,DPL MOV R3,DPH MOV DPTR,#20A0H MOV
A, R2 MOVX @DPTR,A 3INC
A, R3 MOVX @DPTR,A SJMP LP2 LP1: INC
DPTR DJNZ R7, LP0 LP2: RET END 27.编程实现将片外RAM中2400H~2450H单元中的数传送到2500H~2550H单元中。
解: ORG 0000H MAIN:MOV 30H,#24H LJMP MAIN
MOV 31H,#00H ORG 0030H
MOV 32H,#25H MAIN:MOV R7,#51H
MOV 33H,#00H MOV DPTR, #2400HMOV R2,#51H LOOP:
MOVX A,@DPTR LOOP:
MOV DPH,30H MOV DPH,
MOV DPL,31H MOVX @DPTR,A
MOVX A,@DPTR MOV DPH,
MOV DPH,32H INC DPTR
MOV DPL,33H DJNZ R7 ,LOOP
MOVX @DPTR,A SJMP $
INC 31H END
INC 33H DJNZ R2,LOOP 另一种方法: SJMP $ ORG 0000H
LJMP MAIN ORG 0030H 第三章作业答案 6. 设(TMOD)=0A5H,则定时器T0的状态是( 方式1计数),定时器T1的状态是( 方式2 定时)。 27.请写出INT1为低电平触发的中断系统初始化程序。 解: INT1为低电平触发的中断系统初始化程序如下: ORG
0000H LJMP
MAIN ORG0013H LJMP
INTN1 ORG0100H MAIN: MOV
SP,#60H SETBEA SETBEX1 ; 开INT1中断 CLRPX1; 令INT1为低优先级 CLRIT1; 令INT1为电平触发 SJMP
$ END 28.说明MCS-51单片机响应中断后,中断服务的入口地址。 解:436解: 设定好定时器的定时时间,采用中断方式用软件设置计数次数,进行溢出次数累计,从而得到较长的时间。 37.利用定时器输出周期为2 ms的方波, 设单片机晶振频率为 6 MHz。试编程实现之。 解: 选用定时器/计数器T0 作定时器, 工作在方式1,输出为P1.0 引脚, 2 ms 的方波可由 1 ms的高低电平相间隔而成, 因而只要每隔1 ms对 P1.0 取反一次即可得到这个方波。初值的计算如下:ST0=12/(6×106)= 2×10-6S TC=M-T/T0=216-1×10-3/2×10-6=6036=FE0CH 当定时器/计数器采用方式0时,初值为: TC=M-T/T0=213-1×10-3/2×10-6=92=1E0CH, 则真正的16位计数初值为:F00CH(高8位,低5位)
程序如下:ORG
T0INT; T0中断入口 START: MOV
; 初始化程序 MOV
TL0, #0CH ; T0赋初值 MOV
TMOD, #01H
; 定时器/计数器0工作于方式1 SETB
TR0; 启动T0 SETB
; 开T0中断 SETB
EA; 开总允许中断 SJMP
$ T0INT:PUSH
ACC PUSHPSW
TH0, #0FEH SETB
TR0; 启动T0 POP
ACC RETI END 当采用查询方式时: 兰色字部分应该为: LP1: JBC TF0, LP2 SJMP LP1 LP2:
CPL P1.0 MOV
TL0, #0CH MOV
TH0, SETB TR0 SJMP LP1 END 48.某异步通信接口按方式3传送,已知其每分钟传送3600个字符,计算其传送波特率。解:11(位)×3600(字符/分钟)=39600b/分钟=660b/s (方式3为每个字符11位)。 5 篇六:单片机汇编延时系统 51单片机延时程序
分类: 技术|字号 订阅 延时程序在单片机编程中使用非常广泛,但一些读者在学习中不知道延时程序怎么编程,不知道机器 周期和指令周期的区别,不知道延时程序指令的用法, ,本文就此问题从延时程序的基本概念、机器周期和指 令周期的区别和联系、相关指令的用法等用图解法的形式详尽的回答读者 我们知道程序设计是单片机开发最重要的工作,而程序在执行过程中常常需要完成延时的功能。例如 在交通灯的控制程序中,需要控制红灯亮的时间持续30秒,就可以通过延时程序来完成。延时程序是如何 实现的呢?下面让我们先来了解一些相关的概念。 一、机器周期和指令周期 1.机器周期是指单片机完成一个基本操作所花费的时间,一般使用微秒来计量单片机的运行速度, 51 单片机的一个机器周期包括12 个时钟振荡周期,也就是说如果51 单片机采用12MHz 晶振,那么执行 一个机器周期就只需要1μs;如果采用的是6MHz 的晶振,那么执行一个机器周期就需要2 μs。 2 .指令周期是指单片机执行一条指令所需要的时间,一般利用单片机的机器周期来计量指令周期。 在51 单片机里有单周期指令(执行这条指令只需一个机器周期),双周期指令(执行这条指令只需要两个 机器周期),四周期指令(执行这条指令需要四个机器周期)。除了乘、除两条指令是四周期指令,其余均为单周期或双周期指令。也就是说,如果51 单片机采用的是12MHz 晶振,那么它执行一条指令一般只需 1~2 微秒的时间;如果采用的是6MH 晶振,执行一条指令一般就需2~4 微秒的时间。 现在的单片机有很多种型号,但在每个型号的单片机器件手册中都会详细说明执行各种指令所需的机 器周期,了解以上概念后,那么可以依据单片机器件手册中的指令执行周期和单片机所用晶振频率来完成 需要精确延时时间的延时程序。 二、延时指令 在单片机编程里面并没有真正的延时指令,从上面的概念中我们知道单片机每执行一条指令都需要一 定的时间,所以要达到延时的效果,只须让单片机不断地执行没有具体实际意义的指令,从而达到了延时 的效果。 1.数据传送指令 MOV 数据传送指令功能是将数据从一个地方复制、拷贝到另一个地方。 如:MOV R7,#80H;将数据80H 送到寄存器R7,这时寄存器R7 里面存放着80H,就单这条 指令而言并没有任何实际意义,而执行该指令则需要一个机器周期。 2.空操作指令 NOP 空操作指令功能只是让单片机执行没有意义的操作,消耗一个机器周期。 3.循环转移指令 DJNZ 循环转移指令功能是将第一个数进行减1 并判断是否为0,不为0 则转移到指定地点;为0 则往下执行。 如:DJNZ R7,KK ;将寄存器R7 的内容减1 并判断寄存器R7 里的内容减完1 后是否为0,如果不为0 则转移到地址标号为KK 的地方;如果为0 则执行下一条指令。这条指令需要2 个机器周期。 利用以上三条指令的组合就可以比较精确地编写出所需要的延时程序。 三、1 秒延时子程序、流程图及时间计算 (以单片机晶振为12MHz 为例,1 个机器周期需要1μs) 了解了以上的内容,现在让我们来看看 程序总共所需时间:1+10++0+20+2=998433 μs≈1S 在这里运行这段程序共需998433 μs,还差1567μs 才达到1S 的,所以想要达到完美的1S 延时,需 要在返回指令RET 前再添加一些指令让它把1567μs 的延时完成。有兴趣的读者可以自己试着添加完成。 最后补充一点,编写程序时一般将延时程序编写成独立的子程序,而所谓子程序也就是一个实现某个功能 的小模块。这样在主程序中就可以方便地反复调用编写好的延时子程序。 小提示:循环转移指令(DJNZ )除了可以给定地址标号让其跳转外,还可以将地址标号改成$,这样 程序就跳回本指令执行。例如: DJNZ R7,$ ;R7 内容减1 不为0,则再次执行本指令;为0 则往下执行,当R7 的值改为10 时,则执行完该条程序所需的时间为2*10=20 μs。 51单片机汇编延时程序算法详解 将以12MHZ晶振为例,详细讲解MCS-51单片机中汇编程序延时的精确算法。 指令周期、机器周期与时钟周期 指令周期:CPU执行一条指令所需要的时间称为指令周期,它是以机器周期为单位的,指令不同,所需的机器周期也不同。 时钟周期:也称为振荡周期,一个时钟周期 =晶振的倒数。MCS-51单片机的一个机器周期=6个状态周期=12个时钟周期。 MCS-51单片机的指令有单字节、双字节和三字节的,它们的指令周期不尽相同,一个单周期指令包含一个机器周期,即12个时钟周期,所以一条单周期指令被执行所占时间为12*(1/)=1μs。 程序分析 例1 50ms 延时子程序: DEL:MOV R7,#200 ① DEL1:MOV R6,#125 ② DEL2:DJNZ R6,DEL2 ③ DJNZ R7,DEL1 ④ RET ⑤ 精确延时时间为:1+(1*200)+(2*125*200)+(2*200)+2 =(2*125+3)*200+3 ⑥ =50603μs ≈50ms 由⑥整理出公式(只限上述写法)延时时间=(2*内循环+3)*外循环+3 ⑦ 详解:DEL这个子程序共有五条指令,现在分别就 每一条指令 被执行的次数和所耗时间进行分析。 第一句:MOV R7,#200 在整个子程序中只被执行一次,且为单周期指令,所以耗时1μs 第二句:MOV R6,#125 从②看到④只要R7-1不为0,就会返回到这句,共执行了R7次,共耗时200μs 第三句:DJNZ R6,DEL2 只要R6-1不为0,就反复执行此句(内循环R6次),又受外循环R7控制,所以共执行R6*R7次,因是双周期指令,所以耗时2*R6*R7μs。 例2 1秒延时子程序:DEL:MOV R7,#10 ① DEL1:MOV R6,#200 ② DEL2:MOV R5,#248 ③ DJNZ R5,$ ④ DJNZ R6,DEL2 ⑤ DJNZ R7,DEL1 ⑥ RET ⑦ 对每条指令进行计算得出精确延时时间为: 1+(1*10)+(1*200*10)+(2*248*200*10)+(2*200*10)+(2*10)+2=[(2*248+3)*200+3]*10+3 ⑧ =998033μs≈1s 由⑧整理得:延时时间=[(2*第一层循环+3)*第二层循环+3]*第三层循环+3 ⑨此式适用三层循环以内的程序,也验证了例1中式⑦(第三层循环相当于1)的成立。 注意,要实现较长时间的延时,一般采用多重循环,有时会在程式序里加入NOP指令,这时公式⑨不再适用,下面举例分析。 例3仍以1秒延时为例 DEL:MOV R7,#10 1指令周期1 DEL1:MOV R6,#0FFH 1指令周期10 DEL2:MOV R5,#80H 1指令周期255*10=2550 KONG:NOP 1指令周期128*255*10=326400 DJNZ R5,$ 2指令周期2*128*255*10=652800 DJNZ R6,DEL2 2指令周期2*255*10=5110 DJNZ R7,DEL1 2指令周期2*10=20 RET 2篇七:大工15秋《单片机原理及应用》大作业答案
网络教育学院 《单片机原理及应用》大作业
题 目: 单片机电子时钟设计 学习中心:奥鹏远程教育福州学习中心 层 次:专升本 专 业:电气工程及其自动化 年 级:
09秋 季 学 号: 学生姓名:大工15秋《单片机原理及应用》大作业具体要求: 1 作业内容 从以下五个题目中任选其一作答。 2 正文格式 作业正文内容统一采用宋体,字号为小四,字数在2000字以上。 3. 作业提交 学生需要以附件形式上交离线作业(附件的大小限制在10M以内),选择已完成的作业,点“上交”即可。如下图所示。 4. 截止时间 日。在此之前,学生可随时提交离线作业,如需修改,可直接上传新文件,平台会自动覆盖原有文件。 5. 注意事项 请同学独立完成作业,不准抄袭其他人或者请人代做,如有雷同作业,成绩以零分计!
题目一:单片机电子时钟设计 准 则:设计一个基于51单片机或STM单片机的电子时钟,并且能够实现时分 秒的显示和调节 撰写要求:(1)首先介绍课题背景,并进行需求分析及可行性分析,包括软硬件 功能分配、核心器件的选型等; (2)对系统硬件进行设计,包括硬件功能模块划分、电路原理图设计等; (3)对系统软件进行设计,选用汇编语言或C语言编写程序,给出软件 开发流程; (4)总结:需要说明的问题以及设计的心得体会。 一、课题背景 1957年,Ventura发明了世界上第一个电子表,从而奠定了电子时钟的基础,电子时钟开始迅速发展起来。现代的电子时钟是基于单片机的一种计时工具,采用延时程序产生一定的时间中断,用于一秒的定义,通过计数方式进行满六十秒分钟进一,满六十分小时进一,满二十四小时小时清零。从而达到计时的功能,是人们日常生活不可缺少的工具。现在高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟、石英钟、石英表都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调试,数字式电子钟用集成电路计时时,译码代替机械式传动,用LED显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时、分、秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。 二、时钟的基本原理分析 利用单片机定时器完成计时功能,定时器0计时中断程序每隔0.01s中断一次并当作一个计数,设定定时1秒的中断计数初值为100,每中断一次中断计数初值减1,当减到0时,则表示1s到了,秒变量加1,同理再判断是否1min钟到了,再判断是否1h到了。 为了将时间在LED数码管上显示,可采用静态显示法和动态显示法,由于静态显示法需要译码器,数据储存器等较多硬件,可采用动态显示法实现LED显示,通过对每位数码管的依次扫描,使对应数码管亮,同时向该数码管送对应的字码,使其显示数字。由于数码管扫描周期很短,由于人眼的视觉暂留效应,使数码管看起来总是亮的,从而实现了各种显示。 三、51单片机介绍及时钟设计分析 针对要实现的功能,采用AT89S51单片机进行设计,AT89S51 单片机是一款低功耗,高性能CMOS8位单片机,片内含4KB在线可编程(ISP)的可反复擦写1000次的Flash只读程序存储器,器件采用高密度、非易失性存储技术制造,兼容标准MCS- 51指令系统及80C51引脚结构。这样,既能做到经济合理又能实现预期的功能。 在程序方面,采用分块设计的方法,这样既减小了编程难度、使程序易于理解,又能便于添加各项功能。程序可分为闹钟的声音程序、时间显示程序、日期显示程序,秒表显示程序,时间调整程序、闹钟调整程序、定时调整程序,延时程序等。运用这种方法,关键在于各模块的兼容和配合,若各模块不匹配会出现意想不到的错误。 首先,在编程之前必须了解硬件结构尤其是各引脚的用法,以及内部寄存器、存储单元的用法,否则,编程无从下手,电路也无法设计。这是前期准备工作。第二部分是硬件部分:依据想要的功能分块设计设计,比如输入需要开关电路,输出需要显示驱动电路和数码管电路等。第三部分是软件部分:先学习理解汇编语言的编程方法再根据设计的硬件电路进行分块的编程调试,最终完成程序设计。第四部分是软件画图部分:设计好电路后进行画图,包括电路图和仿真图的绘制。第五部分是软件仿真部分:软硬件设计好后将软件载入芯片中进行仿真,仿真无法完成时检查软件程序和硬件电路并进行修改直到仿真成功。第六部分是硬件实现部分:连接电路并导入程序检查电路,若与设计的完全一样一般能实现想要的功能。最后进行功能扩展,在已经正确的设计基础上,添加额外的功能! 四、时钟的设计 A.电路设计 1. 整体设计 此次设计主要是应用单片机来设计电子时钟,硬件部分主要分以下电路模块:显示电路用8个共阴数码管分别显示,星期(年份),小时、分钟(月份)和秒(日),通过动态扫描进行显示,从而避免了译码器的使用,同时节约了I/0端口,使电路更加简单。单片机采用AT89S51系列,这种单片机应用简单,适合电子钟设计。 电路的总体设计框架如下:
2.模块电路主要分为:输入部分、输出部分、复位和晶振电路。2.1 输入部分 输入信号主要是各种模式选择和调整信号,由按键开关提供。 以下为输入部分样例: 在本实验中主要用用P3口输入按键信号,还用到了特殊的P0口。对于P0口,由于其存在高阻状态,为了实现开关功能,给其添加上拉电阻,具体如下图所示: 2.2 输出部分 本电路的输出信号为7段数码管的位选和段选信号,闹铃脉冲信号,提示灯信号。 本实验的数码管是共阴的,为了防止段选信号不能驱动数码管,故在P1口连接上拉电阻后,再送段选信号,以提高驱动,位选信号直接从P2口接入,如下图:篇八:51单片机汇编延时程序算法详解 51单片机汇编延时程序算法详解 将以12MHZ晶振为例,详细讲解MCS-51单片机中汇编程序延时的精确算法。 指令周期、机器周期与时钟周期 指令周期:CPU执行一条指令所需要的时间称为指令周期,它是以机器周期为单位的,指令不同,所需的机器周期也不同。 时钟周期:也称为振荡周期,一个时钟周期 =晶振的倒数。 MCS-51单片机的一个机器周期=6个状态周期=12个时钟周期。 MCS-51单片机的指令有单字节、双字节和三字节的,它们的指令周期不尽相同,一个单周期指令包含一个机器周期,即12个时钟周期,所以一条单周期指令被执行所占时间为12*(1/)=1μs。 程序分析 例1 50ms 延时子程序: DEL:MOV R7,#200 ① DEL1:MOV R6,#125 ② DEL2:DJNZ R6,DEL2 ③ DJNZ R7,DEL1 ④ RET ⑤ 精确延时时间为:1+(1*200)+(2*125*200)+(2*200)+2 =(2*125+3)*200+3 ⑥ =50603μs ≈50ms 由⑥整理出公式(只限上述写法)延时时间=(2*内循环+3)*外循环+3 ⑦ 详解:DEL这个子程序共有五条指令,现在分别就 每一条指令 被执行的次数和所耗时间进行分析。 第一句:MOV R7,#200 在整个子程序中只被执行一次,且为单周期指令,所以耗时1μs 第二句:MOV R6,#125 从②看到④只要R7-1不为0,就会返回到这句,共执行了R7次,共耗时200μs 第三句:DJNZ R6,DEL2 只要R6-1不为0,就反复执行此句(内循环R6次),又受外循环R7控制,所以共执行R6*R7次,因是双周期指令,所以耗时2*R6*R7μs。例2 1秒延时子程序: DEL:MOV R7,#10 ① DEL1:MOV R6,#200 ② DEL2:MOV R5,#248 ③ DJNZ R5,$ ④ DJNZ R6,DEL2 ⑤ DJNZ R7,DEL1 ⑥ RET ⑦ 对每条指令进行计算得出精确延时时间为: 1+(1*10)+(1*200*10)+(2*248*200*10)+(2*200*10)+(2*10)+2=[(2*248+3)*200+3]*10+3 ⑧=998033μs≈1s 由⑧整理得:延时时间=[(2*第一层循环+3)*第二层循环+3]*第三层循环+3 ⑨ 此式适用三层循环以内的程序,也验证了例1中式⑦(第三层循环相当于1)的成立。注意,要实现较长时间的延时,一般采用多重循环,有时会在程式序里加入NOP指令,这时公式⑨不再适用,下面举例分析。 例3仍以1秒延时为例 DEL:MOV R7,#10 1指令周期1 DEL1:MOV R6,#0FFH 1指令周期10 DEL2:MOV R5,#80H 1指令周期255*10=2550 KONG:NOP 1指令周期128*255*10=326400 DJNZ R5,$ 2指令周期2*128*255*10=652800 DJNZ R6,DEL2 2指令周期2*255*10=5110 DJNZ R7,DEL1 2指令周期2*10=20 RET 2 延时时间=1+10++0+20+2 =986893μs约为1s 整理得:延时时间=[(3*第一层循环+3)*第二层循环+3]*第三层循环+3 ⑩ 结论:针对初学者的困惑,对汇编程序的延时算法进行了分步讲解,并就几种不同写法分别总结出相应的计算公式,只要仔细例1中的详解,并用例2、例3来加深理解,一定会掌握各种类型程序的算法并加以运用。篇九:单片机一些常用的延时与中断问题及解决方法 延时与中断出错,是单片机新手在单片机开发应用过程中,经常会遇到的问题,本文汇总整理了包含了MCS-51系列单片机、MSP430单片机、C51单片机、8051F的单片机、avr单片机、STC89C52、PIC单片机…..在内的各种单片机常见的延时与中断问题及解决方法,希望对单片机新手们,有所帮助!
一、单片机延时问题20问
1、单片机延时程序的延时时间怎么算的? 答:如果用循环语句实现的循环,没法计算,但是可以通过软件仿真看到具体时间,但是一般精精确延时是没法用循环语句实现的。 如果想精确延时,一般需要用到定时器,延时时间与晶振有关系,单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。本程序中假设使用频率为12 MHz的晶振。最长的延时时间可达216=65 536 μs。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。
2、求个单片机89S51 12M晶振 用定时器延时10分钟,控制1个灯就可以 答:可以设50ms中断一次,定时初值,TH0=0x3c、TL0=0xb0。中断20次为1S,10分钟的话,需中断12000次。计12000次后,给一IO口一个低电平(如功率不够,可再加扩展),就可控制灯了。
而且还要看你用什么语言计算了,汇编延时准确,知道单片机工作周期和循环次数即可算出,但不具有可移植性,在不同种类单片机中,汇编不通用。用c的话,由于各种软件执行效率不一样,不会太准,通常用定时器做延时或做一个不准确的延时,延时短的话,在c中使用汇编的nop做延时
3、51单片机C语言for循环延时程序时间计算 ,设晶振12MHz,即一个机器周期是1us。 for(i=0,i&100;i++) for(j=0,j&100;j++) 我觉得时间是100*100*1us=10ms,怎么会是100ms 答: 不可能的,是不是你的编译有错的啊 我改的晶振12M,在KEIL 4.0 里面编译的,为你得出的结果最大也就是40ms,这是软件的原因, 不可能出现100ms那么大的差距,是你的软件的原因。 不信你实际编写一个秒钟,利用原理计算编写一个烧进单片机和利用软件测试的秒程序烧进单片机,你会发现原理计算的程序是正确的 4 、51单片机c语言 _nop_()是一个空指令?短时间延时的?空几个机器周期? 答:这个_nop_()等效与汇编里面的,NOP指令,也就是空一个机器周期,如果是传统51单片机的话,等于空12个时钟周期【即一个机器周期】
5、51单片机 延时500ms 用机器周期叠加怎么算? 答:DELAY: MOV R7,#4 D2:MOV R6,#250 D1:MOV R5,#250 DJNZ R5,$ DJNZ R6,D1 DJNZ R7,D2 RET 假设晶振为12MHz 刚延时时间为: 250*250*4*2=500MS
6、51单片机C语言程序中延时函数delay的原理是什么? 现在找到两个函数 第一: void delay(void) {
unsigned int i,j; for(i=0;i&500;i++) { for(j=0;j&121;j++) {;} } }
第二: void delay(unsigned int k) {
unsigned int i,j; for(i=0;i&k;i++) {
for(j=0;j&121;j++) {;} } } 现有几个疑问: (1):延时函数的原理? (2):两个for循环的作用? (3):i、j的取值有什么规律和依据?是不是和单片机接的晶振频率有关?所能延时的最小单位时间是怎么计算的? 延时时间怎么计算啊!假如用的是AT89C51RC+11.0592M的晶振呢? 答: 1:原理:仅仅执行一些,没有实质性影响的所谓“无意义指令”,比如做比大小啊,做某个int的自加运算啊之类的 2:两重for的作用:简单的说,就像高中数学中的“乘法原理”一样,这样可以很轻易的迅速增加上述“无意义指令”的数目 3:关于取值大小:这个如果是在C下变成,这个值不仅仅与晶振、单片机本身运算速度有关,而且还与C的编译器有关,所以说,这个值虽说是可以精确计算的,但大多数情况下,程序员用的都是“经验值”――当然,如果用汇编编程,情况就不一样了,因为每一条指令所使用的机器周期是一定的,你当然可以根据所有指令使用的总时间,精确的算出具体延时的总时间
综合你的的问题,我给你一点,就是刚学单片机的时候,还是一定要老老实实的从汇编编程学起――这样,在你以后接触到C之后,你才能明白,这中间实际上经历了一个什么样的过程,只有这样你才能真正理解单片机。当然,等最终你完全拿下一种单片机之后,尽量使用C编程,无疑是历史所肯定的。
7、51单片机,晶振为6M,求一个10ms的延时程序 答:延时有很多种方法,有一种是让单片机去做无聊的循环,还有一种是用定时器。 第一种的算法是: 晶振的周期T1=1/f; 这里f=6MHz 所以T1=1/6(微秒) 单片机12个T1去执行一个指令, 所以一个机器周期等于12个晶振周期, T2=12*T1=2us 10ms=1000 0us 所以你要得到10ms的延时就要想办法让机器去做5000条“无聊的指令” 所以 DEL: MOV R5,#05H F1:MOV R6,#05H F2:MOV R7,#32H F3: DJNZ R7,F3 DJNZ R6,F2 DJNZ R5,F1 RET 这种方法是用于对要求不高的地方,我说的是其思想,程序中可能有错的地方 用定时器的方法我不太会就不误人了 (补充一下就是这个是用汇编写的,你在主程序中用ACALL DEL调用就延时了。
8、今天我用单片机做“眨眼的LED”实验时,程序运行,每次只令灯亮或灭都没问题,但是一开延时不能出现期盼的灯亮灯灭的现象,这是怎么回事? 实验的硬件条件是:STC89C52,编译环境:keil 3。
下面是我写的程序,请教高手!!!
#include &reg51.h&// 文件包含处理#define uchar unsigned char//宏定义,方便以后程序的书写 #define uint unsigned int sbit P1_0 = P1 ^ 0; //位变量定义 void Delay(uint t) {
while(--t) { for(i = 0; i & 125; i++)
//延时1MS,在这里我们用的晶振是是12M,根据机器周期的计算,我们 {;}//可算得本次循环延时约1MS } } void main(void) { while(1) { P1_0 = 0;//点亮 Delay(1000);//应单片执行程序的时间很快,所以必须延时,要不看不到实验现象
P1_0 = 1;//熄灭LED灯 }
补充提问:我是让P1.0先低然后延时之后再高,即灯先亮再灭,然后开始循环的 答:应该这样写 while(1) { P1_0 = 0;//点亮LED灯 Delay(1000);//应单片执行程序的时间很快,所以必须延时,要不看不到实验现象
P1_0 = 1;//熄灭LED灯 Delay(1000); 补充问题回复:问题恰恰就错在这了,循环完一遍之后灯由灭到亮根本没有时间延时,即第一次循环中灯还没来的机灭呢,就进入到第二轮循环中的亮了,所以原因就在这,这错误太低级了,以后引以为鉴吧
9、单片机延时函数的问题 void delay(uchar i) {
while(i--) { for(j=125;j&0;j--) ; }} 这个函数中的i,j的大小有**吗?
答:这个函数中j的大小和你定义的数据类型有关,因为你定义的为无符号字符型,为单字节数据,所以最大为255。. 如果你增大,可以改变j的数据类型定义,如unsigned int (2字节)可以到65535;无符号长整形unsigned long(4字节) 可以到。 而上面所所256是-1,而你定义的是无符号字符型。
10、请教一个AVR单片机延时的问题 外部晶振用的是8MHz,延时1微秒的程序如下: void delay_us(unsigned int delay_counter)//延时1us { do { delay_counter--; } while(delay_counter&1); } 请问,为什么能延时1微秒啊?
答:8MHZ表示单片机的运行周期为1/8us,也就是0.125us执行一步 你使用的是软件延时 那么包括程序的提取,执行等都要花费时间 比如,你提取这个函数可能花去一步,那现在就使用了0.125us啦 接着你执行这个函数,在单片机内部,运算是通过寄存器的移来移去实现的 这都需要时间,可能你看到的就一句counter--这个指令,可能会花费好几个时钟周期来实现 举个例子: c=a+,只有一句,但实际上花费的时间并不短 mov a,#data1;//数据data1放入a寄存器 mov b,#data2;//数据data2放入b寄存器 add a,b;//寄存器a的值与b相加,结果放入a mov c,a;//将a的值放入c 这样才是单片机内部真正执行的指令,这需要花费至少4个时钟周期,而不是1个 至于晶体管级的我就不解释了,你得好好学习汇编才能理解单片机的运作。 至于这个函数为什么能延时1ms,这个是靠经验来判断的,最直接的方法就是用示波器看,以上均为推。篇十:关于51单片机程序汇编的指令周期表
相关热词搜索:
[51单片机延时1s的程序,汇编,c分别写一个,要求使用中断(共10篇)]相关的文章
看过本文的人还看了
【开封作文】图文推荐
Copyright & 2006 - 2016 cdfds.com All Rights Reserved
池锝网 版权所有

我要回帖

更多关于 单片机延时函数原理 的文章

 

随机推荐