BUF1 EQU 60H ;缓冲单元1
BUF2 EQU 46H ;缓冲单元2
SBF EQU 47H ;秒存储单元
MBF EQU 48H ;分存储单元
HBF EQU 49H ;时存储单元
TMCOUNT EQU 50H
VMAX EQU 55H ;设定的最大压力存储单元
VMIN EQU 56H ;设定的最小压力存储单元
CCOUNT EQU 57H ;来车次数记录单元
ST BIT P3.5 ;传感器启动信号线
EOC BIT P3.4 ;传感器转化信号线
OE BIT P3.3 ;传感器输出使能信号线
SOUND BIT P3.2 ;扬声器
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP INTM0 ;中断0入口地址
ORG 001BH
LJMP INTM1 ;中断1入口地址
ORG 1000H
MAIN:
MOV TMOD,#11H
MOV TH1,#3CH ;定时器1定时50ms
MOV TL1,#0B0H
MOV TH0,#3CH ;定时器0定时50ms
MOV TL0,#0B0H
SETB EA
SETB ET1
SETB ET0
MOV P2,#00H
MOV BUF2,#00H
MOV BUF1,#00H
MOV CCOUNT,#00H
SETB P3.0
CLR P3.1
CLR P3.4
CLR P3.3
CLR P3.6
CLR P3.7
CLR PSW.5
CLR PSW.1
MOV VMAX,#180 ;对应的显示为3.6
MOV VMIN,#101 ;对应的现实为2
;程序开始部分
START: LCALL INPUT_TIME ;首先调用时间输入子程序
NEXT1: LCALL KEY_SCAN ;键盘扫描以判断下一次案件是时间重设还是确定按键
CJNE A,#0FH,NEXT2
JMP START
NEXT2: CJNE A,#0EH, NEXT3 ;时间设定是否确定,如果按的是=则表示时间确定,同时要开始计时时间运行。
SETB TR1 ;启动定时器1开始计时
LCALL ADC_START ;调用传感器数据采集程序
JMP $
NEXT3: JMP NEXT1
INPUT_TIME: ;时间输入子程序
LCALL KEY_SCAN
MOV 40H,A
LCALL KEY_SCAN
MOV 41H,A
LCALL KEY_SCAN
MOV 42H,A
LCALL KEY_SCAN
MOV 43H,A ;输入时和分时间,因为时和分都是2位数故要按键4次
TIME_SAVE: ;时间保存部分
MOV SBF,1
MOV A,42H
SWAP A
ORL A,43H
MOV MBF,A
MOV A,40H
SWAP A
ORL A,41H
MOV HBF,A ;输入的时间要进行数据整合然后放到对应的存储单元里
MOV DPTR,#LEDSEG
MOV TMCOUNT,#180
TIME_SHOW: ;时间显示部分,通过这部分可以看看所设的时间格式是否正确
SETB P2.5 ;在时间显示这部分总体思路时先选定位码,然后在输出段码
MOV A,#1 ;从而可做到时间显示
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAYDIS
CLR P2.5
SETB P2.4
MOV A,#0
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAYDIS
CLR P2.4
SETB P2.3
MOV A,43H
MOVC A,@A+DPTR
XRL A,#80H
MOV P0,A
LCALL DELAYDIS
CLR P2.3
SETB P2.2
MOV A,42H
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAYDIS
CLR P2.2
SETB P2.1
MOV A,41H
MOVC A,@A+DPTR
XRL A,#80H
MOV P0,A
LCALL DELAYDIS
CLR P2.1
SETB P2.0
MOV A,40H
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAYDIS
CLR P2.0
DJNZ TMCOUNT,TIME_SHOW
RET
ADC_START : ;传感器数据采集部分,通过对外部的模拟量转化为数字量,从而判断外部
CLR ST ;状态,
SETB ST ;思路是这样的。由于传感器采用的是5v电源。所以量程是0~5v
CLR ST ;由于传感器的位数是8位所以采集的最大数值为255,所以一个单位对应的
HERE: SETB EOC ;模拟量位5/255即1/51.所以在这里设模拟量为3.6表示车来,模拟量为
JNB EOC,HERE ;2.0表示车离开,总体思路就是这样。
SETB OE
MOV P0,#0FFH
MOV A,P0
CLR OE
MOV 51H,A ;采集的模拟值保存到51H这个单元里
MOV A,51H ;将二进制数值转化为对应量程的十进制表示
MOV B ,#51
DIV AB
MOV 52H, A
MOV A, #5
XCH A, B
DIV AB
MOV 53H, A
MOV A, B
MOV 54H, A
CLR C
;下面进行数值比较。当显示高于3.8时表示列车开来。
;当显示小于1.0且列车已来过即出现过数值大于3.8时表明列车已离开
JNB PSW.5,BJMAX
CLR C
MOV A,51H
SUBB A,VMIN
JNC TIME_DELAY ;若大于最小值则跳到采集的数据显示部分,如果小于则
;表明车已经离开,这是进行复原以等待下一辆车到来。
CLR PSW.5
MOV P2,#00H
SETB P3.0
CLR P3.1
SETB PSW.1
; CLR TR0
LJMP QUIT
BJMAX: MOV A,51H ;与设定的最大值进行比较
SUBB A,VMAX
JC SHOW_CJ ;若小于最大值则跳到数值显示部分,若大于最大值,此时便显示当前时间和车来次数
SETB PSW.5
INC 57H
SETB TR0
CLR P3.0
SETB P3.1
SETB P3.6 ;使电动机开始正向转动
CLR P3.7
TIME_DELAY:LCALL TIME_DISP ;不仅要显示当前时间此时还要报警和警告灯显示即黄灯亮。
LJMP QUIT
SHOW_CJ: MOV DPTR,#LEDSEG
SETB P2.2
MOV A,54H
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAYDIS
CLR P2.2
SETB P2.1
MOV A,53H
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAYDIS
CLR P2.1
SETB P2.0
MOV A,52H
MOVC A,@A+DPTR
XRL A,#80H
MOV P0,A
LCALL DELAYDIS
CLR P2.0
QUIT: LJMP ADC_START
RET
TIME_DISP: ;车来时当前时间显示
MOV A,SBF
ANL A,#0FH
MOV 45H,A
MOV A,SBF
SWAP A
ANL A,#0FH
MOV 44H,A
MOV A,MBF
ANL A,#0FH
MOV 43H,A
MOV A,MBF
SWAP A
ANL A,#0FH
MOV 42H,A
MOV A,HBF
ANL A,#0FH
MOV 41H,A
MOV A,HBF
SWAP A
ANL A,#0FH
MOV 40H,A
MOV DPTR,#LEDSEG
SETB P2.7
MOV A,CCOUNT
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAYDIS
CLR P2.7
SETB P2.5
MOV A,45H
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAYDIS
CLR P2.5
SETB P2.4
MOV A,44H
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAYDIS
CLR P2.4
SETB P2.3
MOV A,43H
MOVC A,@A+DPTR
XRL A,#80H
MOV P0,A
LCALL DELAYDIS
CLR P2.3
SETB P2.2
MOV A,42H
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAYDIS
CLR P2.2
SETB P2.1
MOV A,41H
MOVC A,@A+DPTR
XRL A,#80H
MOV P0,A
LCALL DELAYDIS
CLR P2.1
SETB P2.0
MOV A,40H
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAYDIS
CLR P2.0
RET
LEDSEG: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0BFH ;0,1,2,3,4,5,6,7,8,9
DELAYDIS:MOV R6,#4 ;延时程序1
D1: MOV R7,#250
DJNZ R7,$
DJNZ R6,D1
RET
INTM1: MOV TH1,#3CH ;中断1程序
MOV TL1,#0B0H
INC BUF2
MOV A,BUF2
CJNE A,#20,QUITINTM1 ;如果等于20则正好1秒到
MOV BUF2,#00H
MOV A,SBF
ADD A,#1
DA A
MOV SBF,A
CJNE A,#60H,QUITINTM1
MOV SBF,#00H
MOV A,MBF
ADD A,#1
DA A
MOV MBF,A
CJNE A,#60H,QUITINTM1
MOV MBF,#00H
MOV A,HBF
ADD A,#1
DA A
MOV HBF,A
CJNE A,#24H,QUITINTM1
MOV HBF,#00H
QUITINTM1:
RETI
INTM0: ;中断0程序
MOV TH0,#3CH ;定时器0定时50ms
MOV TL0,#0B0H
JB PSW.1 ,MOTOR
CPL P3.2
JMP ENDINTM0
MOTOR: SETB P3.7
CLR P3.6
INC BUF1
MOV A,BUF1
CJNE A,#150,ENDINTM0 ;如果等于则正好1秒到
MOV BUF1,#00H
CLR P3.6
CLR P3.7
CLR PSW.1
CLR TR0
ENDINTM0:RETI
KEY_SCAN:MOV R0,#0F7H ;键盘扫描程序
MOV R1,#00H
WC1: MOV A,R0
MOV P1,A
MOV A,P1
MOV R2,A
SETB C
MOV R3,#04H
WC2:RLC A
JNC KEY
WC3:INC R1
DJNZ R3,WC2
MOV A,R0
SETB C
RRC A
MOV R0,A
JC WC1
LJMP KEY_SCAN
KEY:LCALL DTENMS
MOV A,P1
XRL A,R2
JNZ WC3
WC4:MOV A,P1
XRL A,R2
JZ WC4
MOV A,R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
RET
DTENMS:MOV R6,#6
DD1:MOV R7,#248
DJNZ R7,$
DJNZ R6,DD1
RET
TAB:DB 07H,08H,09H,09H,04H,05H,06H,06H,01H,02H,03H,03H,00H,00H,0EH,0FH ;对应位置的数据
END
上一篇:8051单片机抢答器C程序
下一篇:C51中精确的延时与计算的实现
推荐阅读最新更新时间:2024-03-16 15:05
设计资源 培训 开发板 精华推荐
- Murata旗舰店1周年淘宝直播
- 下载《TI MCU与无线连接技术研讨会讲座实录》更多惊喜等着你!
- 【泰有聊】第二期:泰克CEO为你解读低噪声背后的科学
- 泰克直播:带您了解您所不知道的示波器使用技巧
- 论坛小程序上线!扫码解锁逛坛新姿势啦!!
- 【TI.com线上采购专场——智能楼宇篇】畅聊火爆的智能电子锁、可视化门铃、智能传感器和网络摄像头方案
- 有奖活动|NI 助您设计更靠谱的数据采集系统
- 电子工程师,如何更好地拥抱GaN?参与问卷有好礼!
- MPS商城小程序上线 注册、分享、下载干货都可赢好礼——下单还返现!
- Follow me第3期来袭,与得捷一起解锁Seeed Studio XIAO ESP32C3!