51单片机利用for语句嵌套实现简单的延时1s功能解说和视频教程
51单片机利用for语句嵌套实现简单的延时1s功能
名词解释:
(1)时钟周期。定义为时钟频率的倒数,本例使用12MHz的时钟频率,它的时钟周期大约就是1/12μs。
(2)机器周期。单片机的基本操作周期,STC89C51系列的单片机来说,一个机器周期由12个时钟周期组成,也就是1μs。
(3)指令周期。指的是单片机执行一条指令需要的时间,一个指令周期需要1~4个机器周期。一个for循环需要8个指令周期。
假设单片机采用了12MHz的时钟频率,利用for语句嵌套实现简单的延时1s功能。
unsigned int i;
Unsigned char j; //定义两个循环变量i、j
for (i = 1000; i > 0; i--) //外层循环1000次
for (j = 124; j > 0; j--) ; //内层循环124次
内层循环代码含义:
在12MHz的时钟频率下,for循环124次所消耗的时间ntime是:
ntime= 124次 × 8个指令周期 × 1μs = 992μs
也就是内循环延时大概为1ms。
外层循环代码含义:
外层循环又将内层循环重复1000次:
for (i = 1000; i > 0; i--) //外层循环1000次
那么,全部执行完成花费的总时间T大约是:
T = 1000 × ( ntime + 8 × 1 ) = 1000 ms=1s,基本上达到延时1s的功能。这个延时程序中外层循环的变量是多少,整个for嵌套语句就延时大约多少毫秒,在以后的应用当中,会经常用到这个程序进行不需要精确时间的延时。
比如,要实现2s的延时,就把i=1000修改为i=2000就可以了。
视频教程如下:
视频教程
数码管每秒间隔显示数字是怎么做出来的?看完秒懂
如何实现每秒间隔显示数字呢?利用单片机延时函数空耗时间,延时1s来实现,等学完单片机定时器中断,就可以设计精确计时程序。
1.程序设计
#include<reg52.h>//头文件
#defi ne uchar unsigned char //宏定义
#defi ne uint unsigned int
uchar code table []={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴数码管编码
void delay(uint a)//延时函数
{
uint j,i;
for(j=a;j>0;j--)
for(i=110;i>0;i--);
}
void main()//主函数
{
uint num;//定义变量
while(1)
{
delay(1000); //延时时间大约1s
P1=0xfe;
P0=table[num];
num++;
if(num>9)
num=0;
}
}
2.程序解释
①num++;即num=num+1。
②P1=0xfe;选通第一个数码管。
③if(num>9)
num=0;
以上是简写,写全如下:
if(num>9)
{
num=0;
}
如果num变量数字大于9,num重新赋值为“0”。
3.面包板制作展示
“显示数字”面包板制作展示
4.C语言基础知识
(1)if语句
格式一:
if(表达式){语句1;语句2;}
步骤:如果表达式为“真”,则执行语句1和语句2,如果为“假”,则跳过语句1与语句2,执行其他的程序。
格式二:
if(表达式){语句1;语句2;}
else{语句3;语句4;}
步骤:如果表达式为“真”,则执行语句1和语句2,如果为“假”,则执行语句3与语句4。
(2)运算符
常见运算符如表
运算符

上面的程序只是让“num”自加到9,如何显示大于“9”的数字呢?
当显示大于9的数值就需要用到数字的分解。
3)数字分解
以两位数字为例,一位数码管是无法显示两个数字,数字分解是必需的,分解后分别送到两个数码管显示。比如一个两位数字是num,分解十位(a表示),a=num/10(称之为求模);分解个位(b表示),b=num%10(称之为求余)。
相关问答
单片机 一秒是肿么计算得来的?-ZOL问答1S/机器周期(执行一次nop所需时间)=(定时器最大值-初始值)。定时器最大值根据你使用的定时器位宽而定,一般51系列的只有16位,如果按每个机器周期为1us时计算的...
如何在11.0592MHZ的频率下给 单片机 一个1US的 延时 ?1us?在11.0592MHZ晶振下,机器周期就是12/11.0592M约等于1us,用一条空操作指令就行噻。汇编:NOP;C语言:用_nop_();时记得加上#include1us?在11.0...
单片机 用中断和定时怎么 延时 ?1.软件延时利用多个指令的执行来延时,累加每个指令的运行时间,来计算出延时的总时间。一般写成一个延时函数。如,以下是10ms软件延时。delay_10ms(){int...
单片机 中的 延时 程序的 延时 时间怎样计算的?比如说:voiddelay(){intx;chary;for(x=1000;x>0;x--){for(y=100;y>0;y--)};}x每减一次,y减100次,x一共减...
有大佬知道 单片机延时 函数吗?1、stm32有HAL_delay()该功能使用滴嗒时钟完成的,默认参数1毫秒,可以查看下HAL_InitTick函数。2、其他平台,一般都会有,一般用定时器(滴嗒时钟)做的功能...
单片机 菜鸟求教,关于延迟和按键去抖的問題-ZOL问答4条回答:【推荐答案】数码管动态显示频率需要大于50Hz人眼才能看不到数码管闪,像你在按键中延时1s肯定会造成数码管闪,有两种解决方法:第一种:在延时中加入数码...
拜托了,提问里面没人理我。比如说这个:1、AT89C51 单片机 P...[最佳回答]51系列单片的机器周期算法是(12/晶振)us,你使用12MHz晶振,那么机器周期就是12/12Hz=1us,那么定时器是16位2^16=65536,65536-x,其中x代表你需要定时...
用 单片机 来写5S 延时 程序.怎么做?LOOP3:MOVR6,#4:LOOP2:MOVR5,#250:LOOP1:MOVR4,#250:DJNZR4,LOOP1DJNZR5,LOOP2DJNZR6,LOOP3RET...
51 单片机 采用定时器1的方式2实现周期为 1S 的程序!初值设为多少?我怎么求都不对!实现不了啊?求?定时器1的方式2是8位定时器,最大只能实现256US的定时(晶振12mhz)定时250us的话,需4000次才够1S定时250us初值为256-250=6TMOD=0X20;TH1=6;TL1=6;T...
单片机 怎么设置LED点阵亮的时间长度?要设置LED点阵亮的时间长度,可以通过控制单片机的IO口输出信号来实现。首先,需要确定所使用的单片机型号和开发环境,然后编写相应的程序代码。在程序中,可以...