怎样在单片机C代码中加入汇编延时子程序?
程序在执行指令的时候是要占用时间的,DJNZ为双字节指令,晶振为12MHZ的单片机执行这一条指令为24个震荡周期,也就是2微秒,通过不断让它循环来达到延时的目的。
与晶振有关,假设采用12M晶振
MOV R2 ,#08H ;1微秒,8次
MOV R1 ,#9AH ;1微秒,9A=154
MOV R0 ,#7CH ;1微秒,7C=124
DT1: DJNZ R0, DT1 ;2微秒
DJNZ R1, DT1 ;2微秒
DJNZ R2, DT1 ;2微秒,8*154*124*2=152768*2=305536
RET ;2微秒
大约0.3秒
C51语言调用汇编语言程序要注意以下几点:
1:在文件栏选中File Group和C51程序原文件,在配置文件选项中激活“产生汇编(SRC)文件,“编译(SRC)文件”和“创建工程(目标)时包含”三个选项。
2:根据选择的编译模式,把相应的库文件(如SMALL模式,库文件为KEIL\C51\LIB\C51S.LIB)加入工程中。
3:在C51语言中必须声明需要调用的函数为外部函数。extern void DELAY(void);
4:在汇编语言程序中必须声明被调用子程序为公共子程序,在被调用的文件中还需要声明此文件是可从新定位的。
PUBLIC DELAY,DEL
DELAYY SEGMENT CODE
RSEG DELAYY
实例如下:
C51语言文件:
#include "reg51.h"
extern void DELAY(void);
extern void DEL(void);
void main(void)
{
P1=0x00;
DELAY();
DEL();
P1=0xff;
}
汇编语言文件:
PUBLIC DELAY,DEL
DELAYY SEGMENT CODE
RSEG DELAYY
DELAY: MOV R2,#3H
DJNZ R2,$
RET
DEL: MOV R3,#03H
DJNZ R3,$
RET
END
(2)、C51语言中嵌入汇编程序;
在C51语言中嵌套使用汇编语言编写程序要注意以下的几个问题:
1:在文件栏选中File Group和C51程序原文件,在配置文件选项中激活“产生汇编(SRC)文件,“编译(SRC)文件”和“创建工程(目标)时包含”三个选项。
2:根据选择的编译模式,把相应的库文件(如SMALL模式,库文件为KEIL\C51\LIB\C51S.LIB)加入工程中。
3:用#pragma asm,和#pragma endasm语句包含嵌入的汇编语言程序。
实例如下:
#include "reg51.h"
void delay(void);
void main(void)
{
void delay(void);
P1=0x00;
#pragma asm
MOV R3,#08H
DJNZ R3,$
#pragma endasm
P1=0xff;
}
void delay(void)
{
#pragma asm
MOV R4,#08H
DJNZ R4,$
#pragma endasm
}
在 C 文件中要嵌入汇编代码片以如下方式加入汇编代码:
#pragma ASM
; Assembler Code Here(汇编程序)
#pragma ENDASM
asm(" EI ");
asm("nop");
asm("ROR _send_dta ");
嵌入这样的语句就可以了!
单片机。用汇编语言编程。 设计一软件延时1s的子程序。设晶振频率为12M...
delay1000ms:(HT46R65的单片机)(注意不要开启计时中断允许位)mov a,10000111b (设置频率和记数方式)(上升记数还是下降记数)mov tmr0c,a (tmr0c 计数器的控制寄存器)mov a,low(65536-31250) (设置的频率就是1S上升31250)因此是DELAY1S mov TMR0L,a (计数器的赋予初始值的...
单片机C语言延时需要注意的问题
标准的C语言中没有空语句。但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果。这在汇编语言中很容易实现,写几个nop就行了。在keil C51中,直接调用库函数:include \/\/ 声明了void _nop_(void);_nop_(); \/\/ 产生一条NOP指令 作用:对于延时很短的,要求在us级的,采用“_nop_...
1、 已知单片机的晶振为12M,请以子函数形式写出10毫秒延时程序。该怎...
在单片机编程中,延时程序是常用的,特别是在需要控制执行时间的任务中。以12MHz晶振为例,这里提供了一些基于C语言的延时子程序。首先是10毫秒延时子程序,其代码如下:void delay10ms(void) { unsigned char i,j,k; for(i=5;i>0;i--) for(j=4;j>0;j--) for(k=248;k>0;k--); } ...
单片机。用汇编语言编程。 设计一软件延时1s的子程序。设晶振频率为12M...
delay1000ms:(HT46R65的单片机)(注意不要开启中断允许位)mov a,10000111b (设置频率和记数方式)(上升记数还是下降记数)mov tmr0c,a (tmr0c 计数器的控制寄存器)mov a,low(65536-31250)mov TMR0L,a (计数器的赋予初始值的低位寄存器)mov a,high(65536-31250)mov TMR0h,a...
单片机的程序怎么延时1s?
单片机常用的编程语言有汇编语言、C语言等。以下是使用汇编语言实现延时1s的程序:以上程序中,使用了一个8位计数器来实现延时功能。由于单片机晶振频率为12MHz,每个指令需要执行12\/4=3个机器周期(其中4代表指令周期),因此可以通过调整计数器初值来实现不同的延时时间。具体计算过程如下:每个指令需要执行...
C51写单片机程序如何插入汇编指令.
C51些单片机程序插入汇编指令的方法如下:1、以#pragma asm开始,以#pragma endasm结束,用pragma asm和#pragma endasm这两个伪指令将汇编代码包起来。比如:2、但是如果直接这样嵌入汇编代码的时候,编译时会报错,错误代码是:'asm\/endasm' requires src-control to be active 解决办法是:在工程中,...
单片机c语言编程怎么去延时?
在单片机的C语言编程中,可以使用循环结构来实现延时操作。具体而言,可以使用一个for循环来实现一段时间的延时。以下是一个简单的延时函数的示例代码:void delay_ms(unsigned int ms){ unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j<1000;j++);} 上述代码定义了一个名为delay_ms的函数,...
单片机C程序编程,10um的延时子程序
void delay10us(void) \/\/误差 0us { unsigned char a,b;for(b=1;b>0;b--)for(a=2;a>0;a--);} 或者 include <reg51.h> void InitTimer0(void){ TMOD = 0x01;TH0 = 0x0FF;TL0 = 0x0F6;EA = 1;ET0 = 1;TR0 = 1;} 给你一个单片机小精灵,挺好用的,迅速方便自动...
单片机延时c语言程序怎么写?
在C语言中,也可以嵌入汇编代码来实现更精确的延时。单片机通常会提供多个定时器选项,可以在定时器中断服务程序中实现延时。例如,使用定时器工作方式2,可以实现自动重新装载计数器,实现更精确的延时,甚至达到纳秒级的精度。尽管C语言可能不是实现精确延时的最佳选择,但通过使用定时器结合C语言编程,仍然...
简单单片机C51语言延时程序
其次,若在汇编语言程序中调用此延时函数,还需额外声明该子程序为公共子程序。公共子程序的声明有助于确保程序在不同编译单元间正确调用,通常在包含函数定义的源文件中进行声明。在实际开发中,实现延时功能的常见方法是使用循环结构,如以下示例所示:c void DELAY(void){ unsigned char i;for(i = 0...