红绿灯和摄象头的工作原理是什么?
1)开关键盘输入交通灯初始时间,通过单片机P1输入到系统
(2) 由单片机的源码z源定时器每秒钟通过P0口向的数据口送信息,由的源码z源PA 口显示红、绿、源码z源黄灯的源码z源燃亮情况;由的PC口显示每个灯的燃亮时间。
(3)通过 设置 各个信号等的源码z源ssh注册实现源码燃亮时间、通过设置,源码z源绿、源码z源红时间分别为秒、源码z源秒循环由的源码z源 P0口向的数据口输出。
(4) 通过单片机的源码z源P3.0位来控制系统是工作或设置初值,当.牌位0就对系统进行初始化,源码z源为1系统就开始工作。源码z源
(5)红灯倒计时时间,源码z源当有车辆闯红灯时,源码z源自动发卡源码出售启动蜂鸣器进行报警,3S后然后恢复正常。
(6)增加每次绿灯时间车流量检测的功能,并且通过查询P2.0端口的电平是否为低,开关按下为低电平,双位数码管显示车流量,直到下一次绿灯时间重新记入。
(7)绿灯时间倒计时完毕,重新循环。
5.控制器的软件设计
5.1每秒钟的设定
延时方法可以有两种一中是利用MCS-内部定时器才生溢出中断来确定1秒的时间,另一种是采用软延时的方法。
5.2计数器硬件延时
5.2.1 计数器初值计算
定时器工作时必须给计数器送计数器初值,这个值是送到TH和TL中的。他是老牛钓鱼理论源码以加法记数的,并能从全1到全0时自动产生溢出中断请求。因此,我们可以把计数器记满为零所需的计数值设定为C和计数初值设定为TC 可得到如下计算通式:
TC=M-C
式中,M为计数器摸值,该值和计数器工作方式有关。在方式0时M为 ;在方式1时M的值为;在方式2和3为
5.2.2 计算公式
T=(M-TC)T计数
或TC=M-T/T计数
T计数是单片机时钟周期TCLK的倍;TC为定时初值
如单片机的主脉冲频率为TCLKMHZ ,经过分频
方式0 TMAX= *1微秒=8.毫秒
方式1 TMAX= *1微秒=.毫秒
显然1秒钟已经超过了计数器的最大定时间,所以我们只有采用定时器和软件相结合的办法才能解决这个问题.
5.2.3 1秒的方法
我们采用在主程序中设定一个初值为的软件计数器和使T0定时毫秒.这样每当T0到毫秒时CPU就响应它的溢出中断请求,进入他的中断服务子程序。在中断服务子程序中,CPU先使软件计数器减1,然后判断它是否为零。为零表示1秒已到可以返回到输出时间显示程序。
5.2.4相应程序代码
(1)主程序
定时器需定时毫秒,小薇支付源码故T0工作于方式1。 初值:
TC=M-T/ T计数 = -ms/1us==3CBOH
ORG H
START: MOV TMOD, #H ; 令TO为定时器方式1
MOV TH0, #3CH ;装入定时器初值
MOV TL0, #BOH ;
MOV IE, #H ;开T0中断
SEBT TRO ;启动T0计数器
MOV RO, #H ;软件计数器赋初值
LOOP: SJMP $ ;等待中断
(2)中断服务子程序
ORG BH
AJMP BRT0
ORG BH
BRTO:DJNZ R0,NEXT
AJMP TIME ; 跳转到时间及信号灯显示子程序
DJNZ:MOV RO,#H ;恢复R0值
MOV TH0, #3CH ;重装入定时器初值
MOV TL0, #BOH ;
MOV IE, #H
RET1
END
5.3 软件延时
MCS-的工作频率为2-MHZ,我们选用的单片机的工作频率为6MHZ。机器周期与主频有关,机器周期是主频的倍,所以一个机器周期的时间为*(1/6M)=2us。我们可以知道具体每条指令的周期数,这样我们就可以通过指令的执行条数来确定1秒的时间。
具体的延时程序分析:
DELAY:MOV R4,#H 延时1秒子程序
DE2:LCALL DELAY1
DJNZ R4,DE2
RET
DELAY1:MOV R6,#0 延时ms 子程序
MOV R5,#0
DE1: DJNZ R5,$
DJNZ R6,DE1
RET
MOV RN,#DATA 字节数数为2 机器周期数为1
所以此指令的执行时间为2ms
DELAY1 为一个双重循坏 循环次数为*= 所以延时时间=*2=us 约为us
DELAY R4设置的初值为8 主延时程序循环8次,所以us*8= 1秒
由于单片机的运行速度很快其他的指令执行时间可以忽略不计。
5.4 时间及信号灯的筹码倍增公式源码显示
5.4.1 并行口的扩展
虽然有4个8位I/O端口,但真正能提供借用的只有P1口,因为P2和P0口通常用于传送外部传送地址和数据,P3口也有它的第二功能。因此, 通常需要扩展。由于我们用外部输入设定红绿灯倒计时初值、数码管的输出显示、红绿黄信号灯的显示都要用到一个I/O端口,显然的端口是不够,需要扩展。
扩展的方法有两种:(1)借用外部RAM地址来扩展I/O端口;(2)采用I/O接口新片来扩充。我们用并行接口信片来扩展I/O端口。
5.4.2显示原理:
当定时器定时为1秒,时程序跳转到时间显示及信号灯显示子程序,它将依次显示信号灯时间 ,同时一直显示信号灯的颜色,这时在返回定时子程序定时一秒,在显示黄灯的下一个时间,这样依次把所有的灯色的时间显示完后在重新给时间计数器赋初值 ,重新进入循环。
5.4.3 PA口输出信号接信号灯:
由于发光二极管为共阳极接法,输出端口为低电平,对应的二极管发光,所以可以用置位方法点亮红,绿,黄发光二极管。
5.4.4 输出信号与数码管的连接:
LED 灯的显示原理:通过同名管脚上所加电平的高低来控制发光二极管是否点量而显示不同的字形如 SP,g,f,e,d,c,b,a 管角上加上7FH所以 SP上为0伏,不亮其余为TTL高电平,全亮则显示为8
采用共阴级连接:
其中 PC0\PB0-a,
PC1\PB1-b,
PC2\PB2-c,
PC3\PB3-d,
PC4\PB4-e,
PC5\PB5-f,
PC6\PB6-g
PC7\PB7 -SP接地
显示数值 dop g f e d c b a 驱动代码(进制)
0 0 0 1 1 1 1 1 1 3FH
1 0 0 0 0 0 1 1 0 H
2 0 1 0 1 1 0 1 1 5BH
3 0 1 0 0 1 1 1 1 4FH
4 0 1 1 0 0 1 1 0 H
5 0 1 1 0 1 1 0 0 6DH
6 0 1 1 1 1 1 0 0 7DH
7 0 0 0 0 0 1 1 1 H
8 0 1 1 1 1 1 1 1 7FH
表 3 驱动代码表
5.4.5 与的连接:
用的P0 口的 p0.7 连接的片选信号cs 我们用的地址采用全译码方式,当p0.7 =0 时片选有效, 其他无效, p0.1 p0.1 用于选择端口
P0.7 p0.6 p0.5 p0.4 p0.3 p0.2 P0.1 P0.0
A7 A6 A5 A4 A3 A2 A1 A0
1 X X X X X 0 0 H为 的PA口
1 X X X X X 0 1 H 为的PB口
1 X X X X X 1 0 H 为的PC口
1 X X X X X 1 1 H 为的控制口
由于是分时对和储存器进行访问所以的P0口不会发生冲突
5.5 程序设计
5.5.1流程图如图所示
图8
图9 程序流程图
5.5.2 程序源代码
ORG H ;主程序的入口地址
LJMP MAIN ;跳转到主程序的开始处
ORG H ;外部中断0的中断程序入口地址
ORG BH ;定时器0的中断程序入口地址
LJMP T0_INT ;跳转到中断服务程序处
ORG H ;外部中断1的中断程序入口地址
MAIN : MOV SP,#H
MOV IE,#8EH ;CPU开中断,允许T0中断,T1中断和外部中断1中断
MOV TMOD,#H ;设置T1为计数方式,T0为定时方式,且都工作于模式1
MOV TH1,#H ;T1计数器清零
MOV TL1,#H
SETB TR1 ;启动T1计时器
SETB EX1 ;允许INT1中断
SETB IT1 ;选择边沿触发方式
MOV DPTR ,#H
MOV A, #H ;给赋初值,工作于方式0
MOVX @DPTR, A
AGAIN: JB P3.1,N0 ;判断是否要设定东西方向红绿灯时间的初值,若P3.1为1 则跳转
MOV A,P1
JB P1.7,RED ;判断P1.7是否为1,若为1则设定红灯时间,否则设定绿灯时间
MOV R0,#H ;R0清零
MOV R0,A ;存入东西方向绿灯初始时间
MOV R3,A
LCALL DISP1
LCALL DELAY
AJMP AGAIN
RED: MOV A,P1
ANL A,#7FH ;P1.7置0
MOV R7,#H ;R7清零
MOV R7,A ;存入东西方向红灯初始时间
MOV R3,A
LCALL DISP1
LCALL DELAY
AJMP AGAIN
;-------------------------------------------
N0: SETB TR0 ;启动T0计时器
MOV H,R7 ;红灯时间存入H
N: MOV A,H ;东西方向禁止,南北方向通行
MOV R3,A
MOV DPTR,#H ;置A口,东西方向红灯亮,南北方向绿灯亮
MOV A,#0DDH
MOVX @DPTR, A
N: JB P2.0,B0
N: SETB P3.0
CJNE R3,#H,N ;比较R3中的值是否为0,不为0转到当前指令处执行
;------黄灯闪烁5秒程序------
N1: SETB P3.0
MOV R3,#H
MOV DPTR,#H ;置A口,东西,南北方向黄灯亮
MOV A,#0D4H
MOVX @DPTR,A
N: MOV R4,#H
N: CJNE R4,#7DH,$ ;黄灯持续亮0.5秒
N: MOV DPTR,#H ; 置A口,南北方向黄灯灭
MOV A,#0DDH
MOVX @DPTR,A
N: MOV R4,#H
CJNE R4,#7DH,$ ;黄灯持续灭0.5秒
CJNE R3,#H,N1 ;闪烁时间达5秒则退出
;------------------------------------------------------------
N2: MOV R7,#H
MOV A,R0 ;东西通行,南北禁止
MOV R3,A
MOV DPTR,#H ; 置A口,东西方向绿灯亮,南北方向红灯亮
MOV A,#0EBH
MOVX @DPTR,A
N: JB P2.0,T
N: CJNE R3,#H,N
;------黄灯闪烁5秒程序------
N3: MOV R3,#H
MOV DPTR,#H ;置A口,东西,南北方向黄灯亮
MOV A,#0E2H
MOVX @DPTR,A
N: MOV R4,#H
CJNE R4,#7DH,$ ;黄灯持续亮0.5秒
N: MOV DPTR,#H ; 置A口,南北方向黄灯灭
MOV A,#0EBH
MOVX @DPTR,A
N: MOV R4,#H
CJNE R4,#7DH,$ ;黄灯持续灭0.5秒
CJNE R3,#H,N3 ;闪烁时间达5秒则退出
SJMP N
;------闯红灯报警程序------
B0: MOV R2,#H ;报警持续时间3秒
B: MOV A,R3
JZ N1 ;若倒计时完毕,不再报警
CLR P3.0 ;报警
CJNE R2,#H,B ;判断3秒是否结束
SJMP N
;------1秒延时子程序-------
N7: RETI
T0_INT:MOV TL0,#9AH ;给定时器T0送定时ms的初值
MOV TH0,#0F1H
INC R4
INC R5
CJNE R5,#0FAH,T ;判断延时是否够一秒,不够则调用显示子程序
MOV R5,#H ;R5清零
DEC R3 ;倒计时初值减一
DEC R2 ;报警初值减一
T: ACALL DISP ;调用显示子程序
RETI ;中断返回
;------显示子程序------
DISP: JNB P2.4,T
DISP1: MOV B,#0AH
MOV A,R3 ;R3中值二转十显示转换
DIV AB
MOV H,A
MOV 7AH,B
DIS: MOV A,H ;显示十位
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#H
MOVX @DPTR,A
MOV DPTR,#H
MOV A,#0F7H
MOVX @DPTR,A
LCALL DELAY
DS2: MOV A,7AH ;显示个位
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#H
MOVX @DPTR,A
MOV DPTR,#H
MOV A,#0FBH
MOVX @DPTR,A
RET
;------东西方向车流量检测程序------
T: MOV A,R3
SUBB A,#H ;若绿灯倒计时完毕,不再检测车流量
JZ N3
JB P2.0,T
INC R7
CJNE R7,#H,E1
MOV R7,#H ;中断到次则清零
E1: SJMP N
;------东西方向车流量显示程序------
T: MOV B,#0AH
MOV A,R7 ;R7中值二转十显示转换
DIV AB
MOV H,A
MOV 7AH,B
DIS3: MOV A,H ;显示十位
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#H
MOVX @DPTR,A
MOV DPTR,#H
MOV A,#0F7H
MOVX @DPTR,A
LCALL DELAY
DS4: MOV A,7AH ;显示个位
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#H
MOVX @DPTR,A
MOV DPTR,#H
MOV A,#0FBH
MOVX @DPTR,A
LJMP N7
;------延时4MS子程序----------
DELAY: MOV R1,#0AH
LOOP: MOV R6,#H
NOP
LOOP1: DJNZ R6,LOOP1
DJNZ R1,LOOP
RET
;------字符表------
TAB: DB 3FH,H,5BH,4FH,H,6DH,7DH,H,7FH,6FH
END
electron应用版本更新添加releaseNotes(更新日志)的N种方法
前言
目前electron应用一般是使用electron-builder进行打包,使用electron-updater进行版本更新,客户端检测到新版本后一般会弹窗提示用户有新版本+展示更新日志,这就需要我们打包的时候将版本更新日志(releaseNotes)添加到latest.yml或latest-mac.yml文件中,然后客户端检测到新版本后就能够获取到该更新日志并展示给用户。通过分析electron-builder源码,总结出几种添加releaseNotes的方法。
version:?1.0.0files:?-?url:?electron-start_setup_1.0.0.exesha:?+yJuqcWDdhWGLvuLiJFjFKM+uQfihiQ8FHE7RoyyFjOiFZeGugE7UPlceDHfm9qyQOYmUvuEzjq/u3zw==size:?path:?electron-start_setup_1.0.0.exesha:?+yJuqcWDdhWGLvuLiJFjFKM+uQfihiQ8FHE7RoyyFjOiFZeGugE7UPlceDHfm9qyQOYmUvuEzjq/u3zw==releaseNotes:?"修复断网时离开会议失败的问题\r\n修复会议中受开关麦影响听不到的问题\r\n新增动态转发功能\r\n修复Bug,优化UI"releaseDate:?'--T::.Z'适用范围项目使用Electron-builder打包
provider为generic
//package.json{ ?"build":?{ "publish":?[?{ "provider":?"generic","url":?"xxxxxx"?}]?}}方法一:在package.json文件build节点下添加releaseNotes信息示例:
//package.json{ ?"build":?{ "releaseInfo":{ ?"releaseNotes":"修复断网时离开会议失败的问题\r\n修复会议中受开关麦影响听不到的问题\r\n新增动态转发功能\r\n修复Bug,优化UI"}?}}方法二:在package.json文件build节点下添加releaseNotesFiles信息(推荐使用)示例:
//package.json{ ?"build":?{ "releaseInfo":{ ?"releaseNotesFile":"release-1.0.0.md"}?}}releaseNotesFile字段指定更新日志文件为release-1.0.0.md,其内容如下:
修复断网时离开会议失败的问题修复会议中受开关麦影响听不到的问题新增动态转发功能修复Bug,优化UI使用这种方法添加releaseNotes,可自定义更新日志文件名称,如每发布一个版本就添加一个更新日志文件(release-1.0.0.md,release-1.0.1.md...),便于以后查看每一个版本更新日志。
方法三:在打包输出目录下创建文件release-notes.md如指定了输出目录为build,则在build目录下创建名称为release-notes.md的文件。
可取的文件名为:
release-notes.md
release-notes-(mac|windows|linux).md
.....
方法四:直接修改打包生成的latest.yml或latest-mac.yml,添加releaseNotes字段(不建议使用)客户端实现使用electron-updater检查更新获取更新日志,弹窗提示用户有新版本
const?{ ?autoUpdater?}?=?require('electron-updater')//检测到新版本时触发autoUpdater.on('update-available',?function?(info)?{ //获取更新日志var?releaseNotes=info.releaseNotes//弹窗提示用户const?dialogOpts?=?{ type:?'info',buttons:?['立即下载','稍后'],title:?'版本更新',textWidth:?,message:?'发现新版本'+info.version+"("+(info.files[0].size//).toFixed(2)+"MB)"+"\r\n\r\n"+releaseNotes,cancelId:?1?}dialog.showMessageBox(dialogOpts).then((returnValue)?=>?{ if?(returnValue.response?===0)?{ autoUpdater.downloadUpdate();}})});实现效果如下:
macOS系统Windows系统相关源码分析electron-builder打包时获取releaseNotes对应的代码文件为packages/app-builder-lib/src/publish/updateInfoBuilder.ts,具体代码如下:
async?function?getReleaseInfo(packager:?PlatformPackager<any>)?{ ?const?releaseInfo:?ReleaseInfo?=?{ ?...(packager.platformSpecificBuildOptions.releaseInfo?||?packager.config.releaseInfo)?}?if?(releaseInfo.releaseNotes?==?null)?{ const?releaseNotesFile?=?await?packager.getResource(?releaseInfo.releaseNotesFile,?`release-notes-${ packager.platform.buildConfigurationKey}.md`,?`release-notes-${ packager.platform.name}.md`,?`release-notes-${ packager.platform.nodeName}.md`,?"release-notes.md")const?releaseNotes?=?releaseNotesFile?==?nullnull?:?await?readFile(releaseNotesFile,?"utf-8")//?to?avoid?undefined?in?the?file,?check?for?nullif?(releaseNotes?!=?null)?{ ?releaseInfo.releaseNotes?=?releaseNotes}?}?delete?releaseInfo.releaseNotesFile?return?releaseInfo}优先从releaseInfo.releaseNotes字段中取值(方法一)
如果releaseInfo.releaseNotes未定义,则从releaseInfo.releaseNotesFile取值(方法二)
如果releaseInfo.releaseNotesFile未定义,则从资源目录下的指定文件(如release-notes.md)中取值(方法三)
参考资源/post/
2024-11-30 18:21
2024-11-30 18:10
2024-11-30 17:24
2024-11-30 16:35
2024-11-30 16:28