在51单片机程序中_nop_();的作用
时间: 2024-04-19 19:28:31 浏览: 239
在51单片机的程序中,_nop_();是一条空指令(No Operation),它的作用是在程序执行过程中插入一个空操作,用于延时或调整程序执行速度。这条指令不做任何实际的操作,只是消耗一个CPU周期的时间。在某些情况下,使用_nop_()可以控制程序的执行速度,实现一定的时间延迟或者协调不同部分的执行顺序。具体的作用和用法可以根据具体的应用场景来决定。
相关问题
51单片机_nop_函数等效的延时函数怎么写
你可以尝试使用以下代码来实现类似 _nop_ 函数的延时效果:
```
void delay(unsigned int n) {
while(n--) {
__asm("nop"); // 内联汇编指令
}
}
```
该函数使用了内联汇编指令 `__asm("nop")`,它会在程序中插入一个等效于汇编指令 `nop` 的代码,即无操作代码,从而实现短暂的延时效果。函数的参数 `n` 是一个无符号整数类型,用来指定延时的时钟周期数,可根据具体需求进行调整。
#include<reg51.h> #include<intrins.h> #define dm P0 #define uchar unsigned char #define uint unsigned int sbit DQ=P1^6; sbit w0=P2^0; sbit w1=P2^1; sbit w2=P2^2; sbit w3=P2^3; sbit beep=P3^7; int temp1=0; uint h; uint temp; uchar r; uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}; uchar code table_dm[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40}; uchar code table_dml[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; uchar data temp_data[2]={0x00,0x00}; uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; void delay(uint t) { for(;t>0;t--); } void xianshi() { int j; for(j=0;j<4;j++) { switch(j) { case 0: dm=table_dm[display[0]]; w0=0; delay(300); w0=1; case 1: dm=table_dml[display[1]]; w1=0; delay(300); w1=1; case 2: dm=table_dm[display[2]]; w2=0; delay(300); w2=1; case 3: dm=table_dm[display[3]]; w3=0; delay(300); w3=1; } } } ow_reset(void) { char presence=1; while(presence) { while(presence) { DQ=1;_nop_();_nop_(); DQ=0; delay(50); DQ=1; delay(6); presence=~DQ; } delay(45); presence=~DQ; } DQ=1; return presence; } void write_byte(uchar val) { uchar i; for(i=8;i>0;i--) { DQ=1;_nop_();_nop_(); DQ=0;_nop_();_nop_();_nop_();_nop_(); DQ=val&0x01; delay(6); val=val>>1; } DQ=1; delay(1); } uchar read_byte(void) { uchar i; uchar value=0; for(i=8;i>0;i--) { DQ=1;_nop_();_nop_(); value>>=1; DQ=0;_nop_();_nop_();_nop_();_nop_(); DQ=1;_nop_();_nop_();_nop_();_nop_(); if(DQ)value|=0x80; delay(6); } DQ=1; return value; } read_temp() { ow_reset(); delay(200); write_byte(0xcc); write_byte(0x44); ow_reset(); delay(1); write_byte(0xcc); write_byte(0xbe); temp_data[0]=read_byte(); temp_data[1]=read_byte(); temp=temp_data[1]; temp<<=8; temp=temp|temp_data[0]; return temp; } work_temp(uint tem) { uchar n=0; if(tem>6348) { tem=65536-tem; n=1; } display[4]=tem&0x0f; display[0]=ditab[display[4]]; display[4]=tem>>4; display[3]=display[4]/100; display[1]=display[4]%100; display[2]=display[1]/10; display[1]=display[1]%10; r=display[1]+display[2]*10+display[3]*100; if(!display[3]) { display[3]=0x0a; if(!display[2]) { display[2]=0x0a; } } if(n) { display[3]=0x0b; } return n; } void BEEP() { if((r>30)) { beep=!beep; } else { beep=0; } } void main() { beep=0; dm=0x00; w0=0; w1=0; w2=0; w3=0; for(h=0;h<4;h++) { display[h]=0; } ow_reset(); write_byte(0xcc); write_byte(0x44); for(h=0;h<50;h++) { xianshi(); } while(1) { if(temp1==0) { work_temp(read_temp()); xianshi(); BEEP(); } } }
这段代码是一个温度测量程序。使用了DS18B20温度传感器和单片机来实现温度的读取和显示。主要的流程如下:
1. 初始化IO口和变量。
2. 重置温度传感器,并发送温度转换命令。
3. 读取温度传感器的数据。
4. 将读取到的温度数据进行处理,计算出实际的温度值,并将其显示在数码管上。
5. 根据温度值,控制蜂鸣器的状态。
整个程序会循环执行,不断更新温度值并显示在数码管上,同时根据温度值控制蜂鸣器的状态。
需要注意的是,这段代码是针对特定硬件和引脚定义的,如果要在其他平台上运行,可能需要进行相应的修改和适配。
阅读全文