完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
$NOMOD51 $include(c8051f360.inc) SDA EQU P1.3 SCL EQU P1.6 JISHUEQU 30H ORG0000h LJMPMAIN ORG000BH LJMPT0_INT MAIN: LCALLCHUSHI // 调用初始化程序 // //******************************数码管初始值设定********************************// MOV40H,#00 //(千分位) MOV41H,#00 //(百分位) MOV42H,#00 //(十分位) MOV43H,#00 // MOV44H,#0AH MOV45H,#01H //(户号) MOV20H,#00H //******************计数区域清零*****************************************// MOV R7,#10H MOV R0,#JISHU LOOP: // 3 0---3F区域清零 // MOV @R0,#00H INC R0 DJNZ R7,LOOP LCALL READ // 调用断电保护 // //******************定时采样10ms一次**************************// MOV TMOD,#01H MOV TH0,#0D8H ; MOVTL0,#0F0H SETBET0 SETBEA SETBTR0 DY: LCALLDIS // 调用显示 // SJMPDY //******************************************************************************************************** //----------初始化子程序------------------- CHUSHI: MOV SFRPAGE,#0FH MOV P1MDIN,#0FFH ;数字输入 MOV P1MDOUT,#0EFH ;推挽输出 MOV XBR1,#40H ;交叉开关使能 MOV PCA0MD,#00H ;关闭看门狗 MOV PSCTL,#13H MOV OSCICN,#83H ;内部振荡器允许,不分频 MOV DPTR,#tab RET //**********************显示程序**************************// DIS: MOVR6,#08 MOVR0,#JISHU LOOP5: //显示子程序 LCALLDISP1 LCALLDELAY //户数转换延时 LCALLWRITE // 进行保护 INC45H //户数显示加一 INCR0 DJNZR6,LOOP5 MOV45H,#01H //户数从一加到八,在变为一,循环 RET DISP1: //实现一个脉冲,0.001度电 MOVR3,#8 MOVR1,#40H MOVA,@R0 //脉冲数给A MOVB,#10 //B==10 DIVAB //A除以B,余数给B,商给A MOV40H,B //把B值送到40H中,即数码管最右边一位 MOVB,#10 DIVAB //商再除B MOV41H,B //余数送41H MOV 42H,A //商送42H LOOP2: MOV A,@R1 CJNE R1,#43H,NEXT2 //将第43H为设为带小数点为, MOV DPTR,#TAB1 //带小数点为的表 MOVC A,@A+DPTR SJMP NEXT3 NEXT2: MOV DPTR,#TAB //不带小数点为的表 MOVC A,@A+DPTR NEXT3: MOV R4,#8 LOOP3: JNB ACC.0,A1 //若ACC.0=0,则跳动A1 CLRP1.1 //********** p1.1 时钟脉冲,上升沿工作************8// SETBP1.0 //p1.0为1时,工作,输入一个脉冲,移位一次// SETBP1.1 SJMPA2 A1: CLRP1.1 CLRP1.0 SETBP1.1 A2: RRA DJNZR4,LOOP3 // 8位循环 // INCR1 DJNZR3,LOOP2 // 8位循环 // RET //*************************中断采样程序*****************************// T0_INT: MOV51H,R3 //将R0---R7存储,保护起来// MOV 52H,R5 // MOV 53H,R7 // MOV 50H,R1 // MOV 26H,R6 // MOV 21H,R0 // MOV 54H,R2 // MOV 55H,R4 // MOV TH0,#0D8H ;写入初值,10ms MOV TL0,#0F0H LCALL CLEAR MOV A,P2 CJNE A,20H,NEXT4 //与脉冲原始状态比较 SJMP NEXT NEXT4: JNC NEXT // 判断是上升沿还是下降沿 XRL A,20H //异或,读入码值 MOV R0,#JISHU MOV R6,#8 LOOP1: // 8位数循环读入// JNB ACC.0,NEXT1 //将读入的码值加到对应的计数区 INC @R0 //电度数 NEXT1: RR A INC R0 DJNZ R6,LOOP1 NEXT: MOV 20H,P2 MOV R2,54H MOV R4,55H MOV R0,21H MOV R6,26H MOV R1,50H MOV R3,51H MOV R5,52H MOV R7,53H REti //***************************************************************************// //------写2416程序--- WRITE : MOV 2FH,R0 LCALL STR;调开始子程序 MOVA,#0A0H;控制字,2416的物理地址和写控制位 LCALLI2C_W1W;调向2416写一字节并接收信号子程序 JBF0,WRITE;若写失败,从头开始 MOV A,#00H;选择地址 LCALLI2C_W1W JBF0,WRITE;至此,地址写完 MOVR0,#30H MOV R7,#8 II1: MOVA,@R0;将30h-3FH的内容写到2416中 LCALLI2C_W1W JB F0,WRITE INC R0 DJNZ R7,II1 LCALL STP;调停止子程 //LCALL DELAY1 MOVR0,2FH RET //------读2416程序--- READ: LCALL STR MOV A,#0A0H;控制字,2416的物理地址和写控制位 LCALL I2C_W1W;调向2416写一字节并接收信号子程序 JB F0,READ;若写失败,从头开始 MOV A,#00H;选择地址 LCALL I2C_W1W JB F0,READ;至此,地址写完 lcall STR MOV A,#0A1H;控制字,2416的物理地址和读操作位 LCALL I2C_W1W JB F0,READ MOV R0,#30H MOV R7,#16 JJ3: LCALL I2C_R1W;调用从2416中读1字节子程序 MOV @R0,A;将从2416中读出的内容存储到30h-37h中 INCR0 DJNZ R7,JJ3 SETB F0 LCALLI2C_R1W LCALL STP RET //--------启动2416子程序---- STR: SETB SDA NOP SETB SCL NOP NOP NOP NOP NOP CLR SDA NOP NOP NOP NOP NOP CLR SCL RET //--------停止2416子程序---- STP: CLR SDA NOP SETB SCL NOP NOP NOP NOP NOP SETB SDA NOP NOP NOP NOP NOP RET //--------向2416中写一字节并接收2416返回的信号------- I2C_W1W: MOV R5,#8 CLR SCL AR_LP1: NOP NOP NOP NOP NOP RLC A MOVSDA,C NOP NOP SETB SCL NOP NOP NOP NOP NOP CLR SCL DJNZ R5,AR_LP1 NOP NOP SETB SDA NOP NOP NOP SETB SCL NOP NOP NOP NOP CLR F0 JNB SDA,ACKEND SETB F0 ACKEND: NOP CLR SCL NOP NOP RET //------从2416中读出1字节,并发送应答或非应答信号 I2C_R1W: MOV R5,#08H RCV: SETB SDA NOP CLR SCL NOP NOP NOP NOP NOP SETB SCL NOP NOP NOP NOP NOP CLR C JNB SDA,RCV0 SETB C RCV0: RLC A NOP NOP DJNZ R5,RCV CLR SCL NOP NOP NOP NOP CLR SDA JNB F0,SENDACK SETB SDA SENDACK:NOP NOP SETB SCL NOP NOP NOP NOP NOP CLR SCL CLR F0 RET //*************************************延时程序****************************** DELAY: MOVR2,#10H DY1: MOVR3,#200 DY2: MOVR4,#0FFH DY3: NOP NOP DJNZR4,DY3 DJNZR3,DY2 DJNZR2,DY1 RET DELAY1: MOV R3,#30H MOV R5,#0FFH loop9: NOP DJNZ R5,LOOP9 DJNZ R3,loop9 RET //*************************清零子程序***************************// CLEAR:MOVR7,#08H MOV R1,#3FH CLR P1.2 NOP NOP NOP SETB P1.2 LOOPC1:CLR P1.5 NOP NOP NOP SETB P1.5 JB P1.4,CNT MOV @R1,#00H DEC R1 MOV @R1,#00H SJMP CNT1 CNT:DEC R1 CNT1:DEC R1 DJNZ R7,LOOPC1 RET TAB:DB88H,0ebh,4ch,49h,2bh,19h,18h,0cbh,8h,09h,07fh ;0,1,2,3,4,5,6,7,8,9,- TAB1:DB80H,0E3H,44H,41H,23H,11H,10H,0C3H,0H,3H;0,1,2,3,4,5,6,7,8,9 END |
|
相关推荐
1 个讨论
|
|
表示很久没看过单片机的汇编了!
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-3 02:37 , Processed in 0.725910 second(s), Total 65, Slave 48 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号