温湿度传感器汇编代码
-
uint32_t DATA(){ __asm__( //主机准备触发信号 "lui a5,0x10012\n\t" //设置A1为输出模式 "addi a5,a5,8\n\t" "lw a4,0(a5)\n\t" "ori a4,a4,1024\n\t" "sw a4,0(a5)\n\t" "lui a5,0x10012\n\t"//设置A1输出值为0,即输出低电平 "addi a5,a5,12\n\t" "lw a4,0(a5)\n\t" "andi a4,a4,-1025\n\t" "sw a4,0(a5)\n\t" "li a5,160000\n\t"//延时20ms,cpu为16MHZ,即16条指令为1us,160000x2/16=20000us,即20ms "Delay_ms: addi a5,a5,-1\n\t" "bnez a5,Delay_ms\n\t" "lui a5,0x10012\n\t"//设置A1输出1,即输出高电平 "addi a5,a5,12\n\t" "lw a4,0(a5)\n\t" "ori a4,a4,1024\n\t" "sw a4,0(a5)\n\t" "li a5,240\n\t" //延时30us,240x2/16=30us,主机起始信号发送完毕 "Delay_us: addi a5,a5,-1\n\t" "bnez a5,Delay_us\n\t" "lui a5,0x10012\n\t"//设置A1为输入模式,准备接收DHT11发送的响应信号 "addi a5,a5,4\n\t" "lw a4,0(a5)\n\t" "ori a4,a4,1024\n\t" "sw a4,0(a5)\n\t" //DHT11发送响应信号,读取此时A1口电平 "Check:lui a5,0x10012\n\t"//判断低电平 "lw a5,0(a5)\n\t" "srli a5,a5,0xa\n\t" "andi a5,a5,1\n\t" "beqz a5,Check\n\t" "Check1:lui a5,0x10012\n\t"//判断高电平 "lw a5,0(a5)\n\t" "srli a5,a5,0xa\n\t" "andi a5,a5,1\n\t" "bnez a5,Check1\n\t" //读取数据阶段,DHT11发送的数据以一段50us的低电平和一段高电平表示 //数据0的高电平阶段为26-28us,数据1的高电平阶段为70us //因此等待低电平发送完毕后,再延时40us后读取A1口输入电平,若为高电平则是数据1,若为低电平则为数据0 "DQ: lui a5,0x10012\n\t" //首先读取低电平,并等待变为高电平 "lw a5,0(a5)\n\t" "srli a5,a5,0xa\n\t" "beqz a5,DQ\n\t" "li a5,320\n\t"//低电平结束后,延时40us "Delay_us1: addi a5,a5,-1\n\t" "bnez a5,Delay_us1\n\t" "li a4,1\n\t"//使用a3,a4寄存器来存储传感器数据 "li a3,1\n\t" "li a0,0\n\t" "li a6,0\n\t"//使用a6寄存器来存储计数次数 "li a2,31\n\t" "li a7,39\n\t" "DATA: lui a5,0x10012\n\t"//判断此时A1口电平,高电平则是数据1,低电平则是数据0 "lw a5,0(a5)\n\t" "srli a5,a5,0xa\n\t" "andi a5,a5,1\n\t" "addi a6,a6,1\n\t" "bnez a5,DATA1\n\t" "DATA0: slli a3,a3,1\n\t"//读取数据0并存入a3,a4寄存器中 "ble a6,a2,DATA\n\t" "slli a4,a4,1\n\t" "ble a6,a7,DATA\n\t" "j END\n\t" "DATA1: slli a3,a3,1\n\t"//读取数据1并存入a3,a4寄存器中 "ori a3,a3,1\n\t" "ble a6,a2,DATA\n\t" "slli a4,a4,1\n\t" "ori a4,a4,1\n\t" "ble a6,a7,DATA\n\t" "END: mv a0,a3\n\t" "ret\n\t" ); }
-
@si 这是完成了吗?