void Delay1ms(unsigned char xms) //@12.000MHz { while(xms--) { unsigned char i, j; i = 2; j = 239; do { while (--j); } while (--i); } }
时间: 2024-04-20 16:22:34 浏览: 24
这段代码是一个用于延时1毫秒的函数。函数的参数是一个无符号字符型变量xms,表示要延时的毫秒数。在函数的主体部分,使用了一个while循环来进行延时操作。循环的条件是xms递减至0。
在循环内部,定义了两个无符号字符型变量i和j,并初始化它们的值。然后使用一个do-while循环嵌套来进行具体的延时操作。
在内层循环中,先将j递减1,然后通过while循环等待j递减至0,实现一次较长的延时。
在外层循环中,先将i递减1,然后通过do-while循环等待i递减至0,实现一次较短的延时。这样,通过多次较短的延时和较长的延时的组合,实现了总体上1毫秒的延时。
需要注意的是,该函数是根据特定的时钟频率(12.000MHz)进行延时计算的,如果时钟频率有变化,需要相应地修改延时参数以保证延时的准确性。
相关问题
#include <REG52.H> void Delay100ms() //@11.0592MHz { unsigned char i, j, k; i = 5; j = 52; k = 195; do { do { while (--k); } while (--j); } while (--i); } void main() { while(1) { P1 = 0; Delay100ms(); P1=0xff; } }这串代码能实现单片机上的LED灯闪烁?
可以的,这段代码可以让单片机上的P1口的LED灯每100毫秒闪烁一次。具体实现是通过不断地让P1口的值在0x00和0xff之间切换,同时调用Delay100ms函数来控制LED灯的亮灭时间。需要注意的是,这段代码是基于11.0592MHz的晶振频率编写的,如果使用其他频率的晶振可能需要进行相应的修改。
sbit DQ = P2^0; uchar a,b,c,d; void Delay750us() //@11.0592MHz { unsigned char i, j; _nop_(); i = 2; j = 84; do { while (--j); } while (--i); } void Delay75us() //@11.0592MHz { unsigned char i; i = 32; while (--i); } void Delay8us() //@11.0592MHz { unsigned char i; i = 1; while (--i); } /*初始化*/ void DS18B20_init(void) { unsigned char x = 255; DQ = 1; DQ = 0; Delay750us(); //750us DQ = 1; while(DQ && x--); //等待应答 Delay750us(); } /*写数据*/ void write_DS18B20(unsigned char dat) { unsigned char i; for(i = 8; i > 0; i--) { DQ = 0; Delay8us(); DQ = dat & 0x01; Delay75us(); DQ = 1; dat >>= 1; } } /*读数据*/ unsigned char read_DS18B20(void) { unsigned char i,dat; for(i = 8; i > 0; i--) { DQ = 1; DQ = 0; dat >>= 1; DQ = 1; if(DQ)dat |= 0x80; Delay75us(); } return(dat); } unsigned char get_temp(void) { unsigned char t; DS18B20_init(); write_DS18B20(0xcc); write_DS18B20(0x44); DS18B20_init(); write_DS18B20(0xcc); write_DS18B20(0xbe); a = read_DS18B20(); b = read_DS18B20(); c = a & 0x0f; a >>= 4; b <<= 4; t = a | b; return(t); } 解释这段代码
这段代码是用于获取DS18B20温度传感器的温度值的。这个传感器使用单总线协议进行通信,所以需要使用单片机的IO口来模拟这个总线的通信。具体的实现过程如下:
1. 初始化DS18B20传感器,发送初始化序列,包括将总线拉低750us,然后拉高750us,等待DS18B20的应答信号。
2. 向DS18B20传感器发送写命令,包括发送跳过ROM码的指令0xcc和转换温度的指令0x44。
3. 初始化DS18B20传感器,发送初始化序列,等待DS18B20的应答信号。
4. 向DS18B20传感器发送读命令,包括发送跳过ROM码的指令0xcc和读取温度值的指令0xbe。
5. 读取DS18B20传感器返回的温度值,分为三个字节,a、b、c。其中a和b需要进行移位操作和按位或操作,得到最终的温度值t。
注意,这段代码中使用了一些延时函数,包括延时750us、延时75us和延时8us。这些延时函数的具体实现方式是通过循环来实现一定的延时时间。