你好,欢迎来到经管之家 [登录] [注册]

设为首页 | 经管之家首页 | 收藏本站

单片机电子秤设计软件程序清单_电子信息工程毕业论文

发布时间:2015-03-16 来源:人大经济论坛
单片机电子秤设计软件程序清单_电子信息工程毕业论文 程序清单 ;定义 中文LCD液晶 128X64 的地址 W_C_GLCD XDATA 0E000H W_D_GLCD XDATA 0E001H R_B_GLCD XDATA 0E002H R_D_GLCD XDATA 0E003H ;------------------------------------------------------- TIMER0 DATA 30H ;延时时间的初值 TIMER1 DATA 31H ;调用延时子程序的次数 DATA1 DATA 32H ;点阵显示的变量1 DATA2 DATA 33H ;点阵显示的变量2 X DATA 34H ;X方向的位置 Y DATA 35H ;Y方向的位置 COUNTER DATA 36H ;计数器 N DATA 37H ;行数变量 D1 DATA 38H ;点变量1 D2 DATA 39H ;点变量1 ADDR DATA 3AH ;起始的显示位置 ADDR1 DATA 3BH ;起始的显示位置临时变量 N1 DATA 3CH ;行数的临时变量 ;******************************************************* ;* 主程序开始 ;******************************************************* ORG 0000H AJMP START ORG 0030H START: CLR P1.0 SETB P1.1 MOV SP,#60H LCALL INITIAL_GLCD ; 调用LCD初始化 LCALL KAIJI ; 显示开机画面 LCALL DELAY500 LCALL DELAY500 LCALL DELAY500 LCALL TISHI ; 显示主界面 LCALL INI_8279 ;------------------------------------------ ;判断是否继续 ;------------------------------------------ KEY_A: MOV DPTR,#8101H ; 8101H为8279命令 MOVX A,@DPTR ; 读状态字 ANL A,#07H ; 判断低三位是否为0 CJNE A,#00H,LP1 ; 不为0(有键按下)则跳转 SJMP KEY_A ; 为0(没键按下)则继续查询 LP1: MOV DPTR,#8100H ; 8100H为8279数据口 MOVX A,@DPTR ; 读键值 CJNE A,#0DBH,KEY_A ; 判断是否按D键 AJMP K1 K1: LCALL YUZHI ; 阈值设定 LCALL celianjieguo ; 结果显示界面 LCALL CELIANGJIEGUO ; 结果显示 AJMP $ ;******************************************************* ;* 主程序开始 ;******************************************************* ;======================================================= ;各界面显示内容 ;======================================================= DHTABLE1: DB " 欢 迎 使 用 " DHTABLE2: DB " 半桥电子秤 " DHTABLE3: DB " 设计人: x x x " DHTABLE4: DB " 时间:xxxx " DHTABLE5: DB "****************" DHTABLE6: DB " 设置报警上限 " DHTABLE7: DB " 确定 " DHTABLE8: DB " 请按D 键 " DHTABLE9: DB " " DHTABLE10: DB " 报警上限重量: " DHTABLE11: DB " . g " DHTABLE12: DB " 确定(E) " CELIANG1: DB " 电子秤 " CELIANG2: DB " 重量是: " CELIANG3: DB " . g " CELIANG4:DB " 返回 (F) " ;======================================================= ;开机界面子程序 ;======================================================= KAIJI: MOV ADDR1,#00H ; 第一行显示 MOV N1,#08H ; 数量 8 个 MOV DPTR,#DHTABLE1 ; 需要显示的汉字位置 CALL DHZ ; 调用汉字子序 MOV ADDR1,#10H ; 第二行显示 MOV N1,#08H MOV DPTR,#DHTABLE2 CALL DHZ MOV ADDR1,#08H ; 第三行显示 MOV N1,#08H MOV DPTR,#DHTABLE3 CALL DHZ MOV ADDR1,#18H ; 第四行显示 MOV N1,#08H MOV DPTR,#DHTABLE4 CALL DHZ RET ;======================================================= ;提示界面子程序 ;======================================================= TISHI: LCALL CLEAR_GLCD ; 清除LCD显示屏幕 MOV ADDR1,#00H MOV N1,#08H MOV DPTR,#DHTABLE5 CALL DHZ MOV ADDR1,#10H MOV N1,#08H MOV DPTR,#DHTABLE6 CALL DHZ MOV ADDR1,#08H MOV N1,#08H MOV DPTR,#DHTABLE7 CALL DHZ MOV ADDR1,#18H MOV N1,#08H MOV DPTR,#DHTABLE8 CALL DHZ RET ;======================================================= ;阈值设定界面子程序 ;======================================================= SHEDING: LCALL CLEAR_GLCD MOV ADDR1,#00H MOV N1,#08H MOV DPTR,#DHTABLE9 CALL DHZ MOV ADDR1,#10H MOV N1,#08H MOV DPTR,#DHTABLE10 CALL DHZ MOV ADDR1,#08H MOV N1,#08H MOV DPTR,#DHTABLE11 CALL DHZ MOV ADDR1,#18H MOV N1,#08H MOV DPTR,#DHTABLE12 CALL DHZ RET ;======================================================= ;测量界面子程序 ;======================================================= celianjieguo: LCALL CLEAR_GLCD MOV ADDR1,#00H MOV N1,#08H MOV DPTR,#CELIANG1 CALL DHZ MOV ADDR1,#10H MOV N1,#08H MOV DPTR,#CELIANG2 CALL DHZ MOV ADDR1,#08H MOV N1,#08 MOV DPTR,#CELIANG3 CALL DHZ MOV ADDR1,#18H MOV N1,#08 MOV DPTR,#CELIANG4 CALL DHZ RET ;======================================================= ;8279初始化子程序 ;======================================================= INI_8279: MOV DPTR,#8101H MOV A,#00H MOVX @DPTR,A MOV A,#32H MOVX @DPTR,A MOV A,#0DFH MOVX @DPTR,A RET ;======================================================= ;键盘设定阈值子程序 ;======================================================= YUZHI: LCALL SHEDING MOV 44H,#00H ; 44H单元存按键次数,先清0 ;******************键盘按键存储空间 ******* MOV 55H,#00H ;存入四次按键值 MOV 56H,#00H MOV 57H,#00H MOV 58H,#00H MOV 50H,#00H ; 存阈值百位 MOV 51H,#00H ; 存阈值十位和个位 MOV 52H,#00H ; 存阈值小数位 ;************************************************************* KEY_09: MOV DPTR,#8101H ; 判断是否有键按下 MOVX A,@DPTR ANL A,#07H CJNE A,#00H,LPP1 AJMP KEY_09 ;------------------------------------------- ;各个键的处理 ;------------------------------------------ LPP1: MOV DPTR,#8100H MOVX A,@DPTR B0: CJNE A,#0D8H,B1 AJMP KK0 B1: CJNE A,#0D0H,B2 AJMP KK1 B2: CJNE A,#0D1H,B3 AJMP KK2 B3: CJNE A,#0D2H,B4 AJMP KK3 B4: CJNE A,#0C8H,B5 AJMP KK4 B5: CJNE A,#0C9H,B6 AJMP KK5 B6: CJNE A,#0CAH,B7 AJMP KK6 B7: CJNE A,#0C0H,B8 AJMP KK7 B8: CJNE A,#0C1H,B9 AJMP KK8 B9: CJNE A,#0C2H,BE AJMP KK9 BE: CJNE A,#0DAH,YUZHI AJMP KKE KK0: MOV 5BH,#00H ; 5BH存键值 AJMP COUNT_1 KK1: MOV 5BH,#01H AJMP COUNT_1 KK2: MOV 5BH,#02H AJMP COUNT_1 KK3: MOV 5BH,#03H AJMP COUNT_1 KK4: MOV 5BH,#04H AJMP COUNT_1 KK5: MOV 5BH,#05H AJMP COUNT_1 KK6: MOV 5BH,#06H AJMP COUNT_1 KK7: MOV 5BH,#07H AJMP COUNT_1 KK8: MOV 5BH,#08H AJMP COUNT_1 KK9: MOV 5BH,#09H AJMP COUNT_1 KKE: AJMP END_P COUNT_1: MOV A,44H ; 44H存按键次数 INC A MOV 44H,A CJNE A,#05H ,CW1 ; 按键次数是否达到4次 AJMP YUZHI ; 五次按键则重设阈值 CW1: ADD A,#54H ; 键盘按键存储空间 MOV R0,A CW2: CLR A MOV A,5BH MOV @R0,A LCALL PRO_SHOW AJMP KEY_09 RET ;========================================= ;各次报警值按键处理子程序 ;========================================= PRO_SHOW: NOP PR_1: CLR A ; 一次按键 MOV A,44H CJNE A,#01H,PR_2 MOV R0,#55H MOV A,@R0 SUBB A,#05H JNC SS MOV 51H,55H MOV A,55H MOV ADDR1,#0AH LCALL SHUZIXIANSHI SJMP END_P PR_2: CLR A ; 二次按键 MOV A,44H CJNE A,#02H,PR_3 CLR A MOV A,55H SWAP A ADD A,56H MOV 51H,A MOV A,55H MOV ADDR1,#09H LCALL SHUZIXIANSHI MOV A,56H MOV ADDR1,#0AH LCALL SHUZIXIANSHI AJMP END_P PR_3: CLR A ; 三次按键 MOV A,44H CJNE A,#03H,PR_4 CLR A MOV 50H,55H MOV A,56H SWAP A ADD A,57H MOV 51H,A MOV A,55H MOV ADDR1,#08H LCALL SHUZIXIANSHI MOV A,56H MOV ADDR1,#09H LCALL SHUZIXIANSHI MOV A,57H MOV ADDR1,#0AH LCALL SHUZIXIANSHI SJMP END_P PR_4: CLR A ; 四次按键 MOV A,58H SWAP A MOV 52H,A SWAP A MOV ADDR1,#0CH LCALL SHUZIXIANSHI SJMP END_P END_P: RET SS: LJMP YUZHI ;============================================================= ;结果显示子程序 ;============================================================= CELIANGJIEGUO: LCALLADC0809 ; 调用0809采样程序 LCALLZHH ; 调用转换程序 MOVADDR1,#08H ; 采数据送LCD显示 MOVA,40H LCALL SHUZIXIANSHI MOVADDR1,#09H MOV A,41H SWAP A LCALL SHUZIXIANSHI MOVADDR1,#0AH MOVA,41H LCALL SHUZIXIANSHI MOVADDR1,#0CH MOV A,43H SWAP A LCALL SHUZIXIANSHI CALL DELAY500 ; 调用延时 CALL BJ ; 判断是否超过阈值,超过则报警 ;------------------------------------------ ;F键判断是否返回提示界面 ;------------------------------------------ KEY_F: MOV DPTR,#8101H MOVX A,@DPTR ANL A,#07H CJNE A,#00H,LP2 SJMP CELIANGJIEGUO LP2: MOV DPTR,#8100H MOVX A,@DPTR CJNE A,#0D9H,CELIANGJIEGUO ;判断是否按F键 SETB P1.1 CLR P1.0 AJMP K1 ;======================================================= ;报警子程序 ;======================================================= BJ: MOV R1,#50H MOV A,@R1 CLR C SUBB A,40H JC WARNING JZ COMP1 SETB P1.1 CLR P1.0 RET COMP1: INC R1 MOV A,@R1 CLR C SUBB A,41H JC WARNING JZ COMP2 SETB P1.1 CLR P1.0 RET COMP2: INC R1 MOV A,@R1 CLR C SUBB A,43H JC WARNING SETB P1.1 CLR P1.0 RET WARNING: CLR P1.1 SETB P1.0 RET ;======================================================= ;0809采样程序 ADC0809: PUSH DPL PUSH DPH PUSH ACC MOV DPTR,#W_D_0809 ; AD0809的启动地址 MOV A,#00H MOVX @DPTR,A ; 0 通道 LCALL DELAY01 ; 延时100US MOVX A,@DPTR ; 读出A/D的结果 MOV 3FH,A ; 暂存 POP ACC POP DPH POP DPL RET ;======================================================= ;转换子程序 : 3FH的内容(A/D采样的结果)*(5V/256(FFH))=十进制结果;40H,41H.例如:3FH=0FFH, 那么程序执行后:40H=04H , 41H=99H 既4.99V ;======================================================= ZHH: PUSH PSW PUSH ACC SETB RS0 MOV A,#4eH MOV B,3FH MUL AB MOV R6,B MOV R7,A HB2: CLR A MOV R3,A MOV R4,A MOV R5,A MOV R2,#10H HB3: MOV A,R7 RLC A MOV R7,A MOV A,R6 RLC A MOV R6,A MOV A,R5 ADDC A,R5 DA A MOV R5,A MOV A,R4 ADDC A,R4 DA A MOV R4,A MOV A,R3 ADDC A,R3 MOV R3,A DJNZ R2,HB3 MOV 40H,R3 MOV 41H,R4 MOV 43H,R5 POP ACC POP PSW RET ;======================================================= ;点阵式 LCD(128X64)模块显示部分子程序 ;以下是公共的程序: ;======================================================= ;LCD 初始化子程序 ;========================================= INITIAL_GLCD: PUSH ACC MOV A,#30H ; 功能设定 CALL COMMAND_GLCD MOV A,#30H ; 功能设定 CALL COMMAND_GLCD MOV A,#30H ; 功能设定 CALL COMMAND_GLCD MOV A,#06H ; 显示器控制:游标不显示; CALL COMMAND_GLCD MOV A,#01H ; 清除显示器 CALL COMMAND_GLCD MOV A,#0CH ; 进入模式设定 CALL COMMAND_GLCD POP ACC RET ;========================================= ;汉字显示子程序(16X16点阵) ;========================================= DHZ: MOV ADDR,ADDR1 ; 开始行位置 MOV B,N1 ; 显示数量 DHZ1: MOV A,ADDR; ORL A,#80H ; 送显示地址 LCALL COMMAND_GLCD ; 调写命令子程序 DHZ2: CLR A MOVC A,@A+DPTR ; 查找汉字的高位码 INC DPTR LCALL WRITE_GLCD ; 送显示 CLR A MOVC A,@A+DPTR ; 查找汉字的低位码 INC DPTR LCALL WRITE_GLCD ; 送显示 DJNZ B,DHZ2 RET ;========================================= ;数字显示子程序 ;========================================= SHUZIXIANSHI: MOV 42H,A MOV ADDR,ADDR1 ; 开始行位置 MOV A,ADDR; ORL A,#80H ; 送显示地址 LCALL COMMAND_GLCD MOV A,42H ;------------------------------------------ ;将 ACC 内容,以十六进制值显示 ;------------------------------------------ HEX_LCD: PUSH DPH PUSH DPL PUSH ACC ANL A,#0FH MOV DPTR,#ASCII_CODE ; DPTR 指到 ASCII_CODE MOVC A,@A+DPTR ; 取得 ASCII 码 CALL WRITE_GLCD ; 写到 LCD POP ACC POP DPL POP DPH RET ASCII_CODE: DB '0123456789ABCDEF' ;========================================= ;检查LCD 忙碌标志 ;========================================= CHKBUSY_GLCD: PUSH DPH PUSH DPL PUSH ACC MOV DPTR,#R_B_GLCD CHK: MOVX A,@DPTR JB ACC.7,CHK ; 判别是不是忙? POP ACC POP DPL POP DPH RET ;========================================= ;写命令到 GLCD ;========================================= COMMAND_GLCD: PUSH DPH PUSH DPL CALL CHKBUSY_GLCD ; 判别是不是忙? MOV DPTR,#W_C_GLCD MOVX @DPTR,A ; 写入命令 POP DPL POP DPH RET ;========================================= ;写资料到 GLCD ;========================================= WRITE_GLCD: PUSH DPH PUSH DPL CALL CHKBUSY_GLCD ; 判别是不是忙? MOV DPTR,#W_D_GLCD ; 写入数据 MOVX @DPTR,A POP DPL POP DPH RET ;========================================= ;清除 LCD 的显示幕 ;========================================= CLEAR_GLCD: PUSH ACC MOV A,#01H ; 清除显示器 CALL COMMAND_GLCD POP ACC RET ;======================================================= ;延时子程序 ;======================================================= DELAY: PUSH TIMER1 ; 延时TIMER1*1 ms for 12MHz PUSH TIMER0 DELAY1: MOV TIMER0,#250 ;时间为4*1μS DELAY2: NOP ; 1个周期 NOP ; 1个周期 DJNZ TIMER0,DELAY2 ; 2个周期 DJNZ TIMER1,DELAY1 POP TIMER0 POP TIMER1 RET NOP ;------------------------------------------ ;延时 1 ms ;------------------------------------------ DELAY01: NOP PUSH TIMER1 MOV TIMER1,#01H LCALL DELAY POP TIMER1 RET NOP ;------------------------------------------ ;延时500ms ;------------------------------------------ DELAY500: NOP PUSH TIMER1 MOVTIMER1,#250 LCALLDELAY LCALL DELAY POP TIMER1 RET NOP
经管之家“学道会”小程序
  • 扫码加入“考研学习笔记群”
推荐阅读
经济学相关文章
标签云
经管之家精彩文章推荐