在80C51单片机中,已知时钟频率为 6MHz,请编程使 P1.0 和 P1.1 分别输出周期为 2s 和 0.5s 的方波。
求答案,过程。
;=====================================
最佳答案:
;-------------------------------------
;下列程序,经过编译、仿真,符合要求:
;-------------------------------------
ORG 0000H
SJMP START
ORG 000BH
SJMP T0_INT
;-------------------------------------
START:
MOV TMOD, #01H
MOV TH0, #9EH
MOV TL0, #58H ;50ms@6MHz
SETB TR0
SETB ET0
SETB EA
MOV R2, #5
MOV A, #0
CLR P1.0
CLR P1.1
SJMP $ ;原地转移,假死,等待中断
;-------------------------------------
T0_INT: ;50ms执行一次
MOV TH0, #9EH ;重新赋初始值
MOV TL0, #58H ;50ms@6MHz
DJNZ R2, T0_END ;不到5次,转到退出
; ;下列指令都是每隔250ms执行一次
MOV R2, #5 ;重新设置
INC A ;计数器加一
MOV C, ACC.0
MOV P1.1, C ;P1.1,每隔250ms,变化一次
MOV C, ACC.2
MOV P1.0, C ;P1.0,每隔1s,变化一次
T0_END:
RETI
;-------------------------------------
END
;-------------------------------------
;-------------------------------------
后记:
题目要求输出两个波形的周期是个4倍的关系,这一点,被做而论道发现并巧妙的利用了。
程序中只使用了一个计数器ACC,它的相邻两位之间的变化时间,是呈2倍的关系;
而其第0位和第2位,就是4倍的关系,把它们输出,即可得到所需的周期波形。
呵呵,做而论道的程序,所使用的资源,是最低的;执行效率也最高,不知网友们认为如何?
关键字:单片机编程 周期为 方波
引用地址:
单片机编程,输出周期为2S和0.5S的方波
推荐阅读最新更新时间:2024-03-16 16:02
单片机编程中的时钟中断
本文以6MHz时钟的 单片机 AT89C51系统为例,说明时钟中断的应用: 定时器初值与中断周期 时钟中断无需过于频繁,一般取20mS(50Hz)即可。如需要百分之一秒的时基信号,可取10mS(100Hz)。这里取20mS,用定时器T0工作于16位定时器方式(方式1)。T0的工作方式为:每过一个机器周期自动加1,当计满0FFFFh,要溢出时,便会产生中断,并由硬件设置相应的标志位供软件查询。即中断时比启动时经过了N+1个机器周期。所以,我们只要在T0中预先存入一个比满值0FFFFh小N的数,然后启动定时器,便会在N个机器周期后产生中断。这个值便是所谓的“初值”。下面计算我们需要的初值:时钟为6MHz,12个时钟周期为一个
[单片机]
分时操作系统思想在单片机编程中的实现
前言 作为嵌入式系统主控单元——单片机,其软件往往是一个微观的实时操作系统,且大部分是为某种应用而专门设计的。系统程序有实时过程控制或实时信息处理的能力,要求能够及时响应随机发生的外部事件并对该事件做出快速处理。而分时操作系统却是把CPU的时间划分成长短基本相同的时间区间,即“时间片”,通过操作系统的管理,把这些时间片依次轮流地分配给各个用户使用。如果某个作业在时间片结束之前,整个任务还没有完成,那么该作业就被暂停下来,放弃CPU,等待下一轮循环再继续做。此时CPU又分配给另一个作业去使用。由于计算机的处理速度很快,只要时间片的间隔取得适当,那么一个用户作业从用完分配给它的一个时间片到获得下一个CPU时间片,中间有所“停
[单片机]
单片机编程小问题总结
1、时间太长,记不清在哪个项目里遇到的,指向code区数组的指针也要加 code 关键字声明。 比如 unsigned char code arr ; 数组,要用指针指向它,要把指针也声明成 unsigned charcode*p; 后来使用发现其它很多地方使用是不需要这样声明的,只要 unsigned char *p;就行了,但是清楚地记得那次确实是要加 code 关键字声明才可以的。 2、在51里面,位变量貌似是有限的。 如果要用一个布尔型作为标识变量,为了节省控件可以用 bit 型变量,但是在DRS1000项目中遇到过一次用 bit 型变量出错,改为 unsigned char 型就OK了,那时定义的变量
[单片机]
【STM32电机方波】记录4——PWM输出配置
PWM生成原理: 通用定时器可以利用GPIO引脚进行脉冲输出,在配置为比较输出、PWM输出功能时,捕获/比较寄存器通用定时器可以利用GPIO引脚进行脉冲输出,在配置为比较输出、PWM输出功能时,捕获/比较寄存器TIMx_CCR被用作比较功能,下面把它简称为比较寄存器。 这里直接举例说明定时器的PWM输出工作过程:若配置脉冲计数器TIMx_CNT为向上计数,而重载寄存器TIMx_ARR被配置为N,即TIMx_CNT的当前计数值数值X在TIMxCLK时钟源的驱动下不断累加,当TIMx_CNT的数值X大于N时,会重置TIMx_CNT数值为0重新计数。 而在TIMxCNT计数的同时,TIMxCNT的计数值X会与比较寄存器TIMx_CCR
[单片机]
稳定的宽频方波发生器
稳定的宽频方波发生器
[模拟电子]
单片机编程中的时钟中断应用
本文以6MHz时钟的单片机AT89C51系统为例,说明时钟中断的应用: 定时器初值与中断周期 时钟中断无需过于频繁,一般取20mS(50Hz)即可。如需要百分之一秒的时基信号,可取10mS(100Hz)。这里取20mS,用定时器T0工作于16位定时器方式(方式1)。T0的工作方式为:每过一个机器周期自动加1,当计满0FFFFh,要溢出时,便会产生中断,并由硬件设置相应的标志位供软件查询。即中断时比启动时经过了N+1个机器周期。所以,我们只要在T0中预先存入一个比满值0FFFFh小N的数,然后启动定时器,便会在N个机器周期后产生中断。这个值便是所谓的“初值”。下面计算我们需要的初值:时钟为6MHz,12个时钟周期为一个机器周期,
[单片机]
学习单片机编程入门方法
我写这篇文章,是我在百度看到很多想接触单片机或者已经接触单片机的人,不知道怎么入门,或者不知道第一步怎么走。我也是把我的经验写出来,这次的只不过针对的是想接触单片机的,刚接触单片机的,一开始都会存在几个疑问。 1.学习单片机的需要什么基础。 2.开始怎么入手 3.需不需要买开发板。 主要就存在这几个疑问,我也在这里为大家说说,大家只不过在交流,小弟在这里献丑啦,如有什么说的不周到的,或者不全面的,也请高手多多指教。我写这个目的是希望给更多的想学习单片机,热爱电子设计的人提供一些帮助。闲话少说,进入正题。 学习单片机一开始首要认为是通读一遍书,这个很重要了解它是什么原理,还有能实现那些功能,例如外部中断,定时器等等吧~!这些都是理
[单片机]
用CD4046组成的方波信号发生器
用CD4046组成的方波信号发生器
[模拟电子]