BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #95776同步于 2017/7/15
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

汇编语言单片机求助~(小学期饱受折磨的信通狗)

ys0928
2017/7/15镜像同步3 回复
刚自学Pic单片机,我用PIC16F877单片机,LCD1602液晶显示屏,DHT11温湿度传感器,做一个测量湿度,并显示湿度的程序,但是在运行时出现一直接受高电平信号的情况,不知道为什么,求助大神,我是用A1口作为数据传输口,D口连接液晶显示屏,代码如下 INCLUDE<P16F877.INC> #DEFINE DATA1 PORTA,1 ;数据口 #DEFINE DIR TRISA,1 ;方向口 #DEFINE RS PORTC,0 ;命令/数据选择 #DEFINE RW PORTC,1 ;读/写选择 #DEFINE E PORTC,2;使能信号 TATUS equ 03h ;状态寄存器在体0中的地址(状态寄存器中有8位,bit0为C,bit2为Z,bit5为rp0) RP0 equ 5h ;状态寄存器中的页选位rp0位地址为5(RAM数据存储器体选位,仅用于直接寻址) RP1 equ 6h C equ 0h ;进位/借位标志位C在STATUS中的位地址为0,执行加法:1=进位,0=不进位;执行减法:1=不借位,0=借位 ADCON1 EQU 9FH CBLOCK 20H COUNT COUNT1 VALUE DL1 DL2 SHI GE TEMP TEMP1 TEMP_CHAR BIN_L ENDC ORG 00H NOP GOTO MAIN ;入口地址 ;**************************主程序****************************** MAIN BSF STATUS,RP0 CLRF TRISA ;A口所有先设置为输出 CLRF TRISD MOVLW 01H MOVWF TRISB ;B0口为输入,其他为输出 MOVLW 07H MOVWF ADCON1 ;关闭所有A/D口 BCF STATUS,RP0 CLRF PORTA CLRF PORTB CLRF TEMP CALL RESET_DHT11 ;调用复位18B20子程序 MOVLW 1BH MOVWF COUNT DECFSZ COUNT,1 GOTO $-1 ;等待81us CALL READ_DHT11 MOVF TEMP,0 MOVWF BIN_L ;把高8位的低4位和低8位的高4位组合起来 CALL INITIAL CALL DISPLAY LOOP GOTO LOOP ;********************************初始化屏幕*********************************** INITIAL BSF STATUS,5 CLRF TRISC CLRF TRISD BCF STATUS,5 MOVLW B'00000001' ;清屏 CALL SEND_I MOVLW B'00000010' ;归位(home) CALL SEND_I MOVLW B'00000110' ;06H指定在写入或读取时,光标的移动方向 CALL SEND_I MOVLW B'00001111' ;0CH开显示,光标,闪烁 CALL SEND_I MOVLW B'00111000' ;8位字长,2行字符,5*7点位 CALL SEND_I ;*********************复位DHT11子程序************************** RESET_DHT11 BSF STATUS,RP0 BCF DIR BCF STATUS,RP0 BCF DATA1 CALL DELAY10MS CALL DELAY10MS BSF DATA1 ;释放总线 MOVLW 0AH MOVWF COUNT DECFSZ COUNT,1 GOTO $-1 ;等待30us BSF STATUS,RP0 BSF DIR ;DQ设置为输入 BCF STATUS,RP0 BTFSC DATA1 ;数据线是否为低 GOTO RESET_DHT11 ;否则继续复位 MOVLW 1BH MOVWF COUNT DECFSZ COUNT,1 GOTO $-1 ;等81us BTFSS DATA1 ;数据线是否为高 GOTO RESET_DHT11 RETURN ;**********************读DHT11子程序**************************** READ_DHT11 MOVLW 8H MOVWF COUNT BSF STATUS,RP0 BSF DIR BCF STATUS,RP0 BTFSS DATA1 GOTO $-1 BCF STATUS,C GOTO RE_1 BCF STATUS,C re_end RRF TEMP,1 DECFSZ COUNT,1 ;是否读完8位 GOTO READ_DHT11 RETURN RE_1 MOVLW 0AH MOVWF COUNT1 DECFSZ COUNT1,1 ;24us GOTO $-1 BTFSC DATA1 BSF STATUS,C BTFSC DATA1 GOTO $-1 GOTO re_end ;**********************显示程序**************************** DISPLAY MOVLW 80H CALL SEND_I CALL _BCD MOVF SHI,W ADDLW 30H MOVWF TEMP_CHAR ;把w寄存器中变量送入tempchar CALL SENDCHAR ;显示十位段码 MOVLW 81H CALL SEND_I MOVF GE,W ADDLW 30H MOVWF TEMP_CHAR CALL SENDCHAR ;显示个位段码 MOVLW 82H CALL SEND_I MOVLW 25H ;显示摄氏度符号 MOVWF TEMP_CHAR CALL SENDCHAR RETLW 00H ;******************************************** 输送命令************************************************* SEND_I MOVWF TEMP1 ;暂存命令 CALL CHK_BUSY ;判断总线是否忙 NOP NOP BCF RS NOP NOP BCF RW MOVFW TEMP1 MOVWF PORTD ;送命令 NOP NOP BSF E NOP NOP NOP NOP NOP NOP BCF E RETURN ;-----------------------判断总线是否忙-------------------- ;测忙碌子程序 ;RS=0,RW=1,E=H,D0-D7=状态字 ;--------------------------------------------------------- CHK_BUSY MOVLW 0FFH MOVWF PORTD BSF STATUS,5 MOVLW 0FFH MOVWF TRISD ;D口设置为输入 BCF STATUS,5 BCF RS BSF RW CHECK_BUSY_1 NOP NOP NOP BSF E NOP NOP NOP NOP BTFSS PORTD,7 ;D7为高表示总线忙,为低表示总线空闲 GOTO $+7 NOP NOP NOP NOP BCF E GOTO CHECK_BUSY_1 BCF E NOP NOP BSF STATUS,5 CLRF TRISD ;D口设置为输入 BCF STATUS,5 ;恢复D口为输出 RETURN ;-----------------------温度的二进制转BCD码------------------------------ _BCD CLRF SHI ;保存地址清零 CLRF GE MOVF BIN_L,F ;组合码自己给自己赋值,测试是否为0 SKPNZ ;不为0则跳到下一步 RETURN SHI_ MOVLW 0AH SUBWF BIN_L,W ;BIN_L减10,结果存到W寄存器 BTFSS STATUS,C ;执行减法后,如果无借位 GOTO GE_ MOVWF BIN_L INCF SHI,1 GOTO SHI_ GE_ MOVF BIN_L,W MOVWF GE RETURN ;*********************************************显示字符*************************************************7 SENDCHAR CALL CHK_BUSY BSF RS BCF RW MOVFW TEMP_CHAR MOVWF PORTD BSF E NOP NOP NOP NOP NOP NOP BCF E RETURN ;**************************延时1ms****************************** DELAY1MS MOVLW D'125' MOVWF DL1 LOOP4M nop nop nop nop nop DECFSZ DL1,F GOTO LOOP4M RETURN ;**************************延时9us****************************** DELAYS9US MOVLW D'3' MOVWF DL1 DECFSZ DL1,1 GOTO $-1 RETURN ;*****************10ms延时程序********************************** DELAY10MS MOVLW D'133' MOVWF DL1 LP2 MOVLW D'251' MOVWF DL2 LP3 DECFSZ DL2,F GOTO LP3 DECFSZ DL1,F GOTO LP2 RETURN END
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
Hallobo机器人#1 · 2017/7/15
中期验收不是都过了吗...
ys0928机器人#2 · 2017/7/15
【 在 Hallobo 的大作中提到: 】 : 中期验收不是都过了吗... 没有中期验收啊,中期只是看一下进度,直接最终验收
Hallobo机器人#3 · 2017/7/15
可能班级不同吧 我们这几个班是有中期验收的 【 在 ys0928 的大作中提到: 】 :