久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6044|回復(fù): 2
收起左側(cè)

基于51單片機的有害氣體檢測程序(匯編)

[復(fù)制鏈接]
ID:70976 發(fā)表于 2014-12-26 22:35 | 顯示全部樓層 |閱讀模式


  1.           LCD_X  EQU   23H        ;LCD 地址變量(決定文字的在LCD上的顯示位置)
  2.           FSJCQ  EQU   33H        ;TMOD工作方式暫存寄存器
  3.           BJZC   EQU   34H        ;需要比較數(shù)據(jù)暫存寄存器,用于報警顯示
  4.           BJWX   EQU   35H        ;超標設(shè)定值暫存寄存器
  5.           BJJG   EQU   36H        ;偏高設(shè)定值暫存寄存器
  6.           JJCQ   EQU   37H        ;酒精顯示0%暫存寄存器
  7.           YYBZ   EQU   38H        ;語音播放標志
  8.           DJSJCQ EQU   39H        ;10S倒計時寄存器
  9.           JJCYCS EQU   4AH        ;酒精檢測采樣次數(shù)寄存器

  10.           XSYSSJ    DATA   5      ;正常時顯示延時時間

  11.           WXBJZ1  EQU   100       ;有害氣體危險報警設(shè)定值200PPM
  12.                                   ;實際設(shè)定值=200(顯示設(shè)定值)/2(修正倍率)
  13.           JGBJZ1  EQU   60        ;有害氣體警告報警設(shè)定值120PPM
  14.                                   ;實際設(shè)定值=120(顯示設(shè)定值)/2(修正倍率)
  15.           WXBJZ2  EQU   50        ;酒精危險報警設(shè)定值0.05% BAC
  16.                                   ;實際設(shè)定值=0.05%(顯示設(shè)定值)*1000(顯示位修正)/1(修正倍率)
  17.           JGBJZ2  EQU   20        ;酒精警告報警設(shè)定值0.02% BAC
  18.                                   ;實際設(shè)定值=0.02%(顯示設(shè)定值)*1000(顯示位修正)/1(修正倍率)
  19.           XIUZ1   EQU   10        ;有害氣體濃度顯示數(shù)據(jù)修正值,設(shè)置大時則顯示數(shù)值小,反之顯示大
  20.           XIUZ2   EQU   34        ;酒精濃度顯示數(shù)據(jù)修正值,設(shè)置大時則顯示數(shù)值小,反之顯示大

  21. ;-----------------------------------------------------------
  22.           LCD_RS    EQU   P4.0    ;LCD 數(shù)據(jù)/命令選擇端
  23.           LCD_RW    EQU   P4.1    ;LCD 讀/寫選擇端
  24.           LCD_EN    EQU   P4.2    ;LCD 使能信號
  25.           LCD_BG    EQU   P4.3    ;LCD 背光控制端
  26.           LCD_SJ    EQU   P0      ;LCD 數(shù)據(jù)

  27.           BITE      EQU   9       ;串口發(fā)送9位數(shù)據(jù)
  28.           FSSZ      EQU   40H     ;主機發(fā)送的數(shù)據(jù)塊首址
  29.           JSSZ      EQU   50H     ;主機接收的數(shù)據(jù)塊首址

  30.           YY_DAT    DATA  29H     ;語音段地址存放單元
  31.           YYRST     EQU   P3.3    ;語音模塊復(fù)位信號引腳
  32.           BUSY      EQU   P1.0    ;語音忙控制端,0為正在播放1為沒有播放空閑時
  33.           YYSDA     EQU   P1.1    ;語音模塊數(shù)據(jù)線引腳

  34. ;===========================================================
  35.           ORG  0000H
  36.           AJMP  MAIN
  37.           ORG  0003H       ;外中斷0中斷程序入口
  38.           RETI                ;中斷返回
  39.           ORG  000BH          ;定時器T0中斷程序入口
  40.           RETI                ;中斷返回
  41.           ORG  0013H       ;外中斷1中斷入口
  42.           RETI               ;中斷返回
  43.           ORG  001BH       ;定時器T1中斷程序入口
  44.           RETI             ;跳至INTT1中斷服務(wù)程序
  45.           ORG  0023H       ;串口中斷入口地址
  46.           RETI               ;中斷返回

  47.           ORG  0100H
  48. ;=========================================
  49. ;以下初始化程序
  50. ;=========================================
  51. MAIN:     MOV  SP,#60H
  52.           CLR  LCD_BG         ;打開LCD背光
  53.           LCALL  SET_LCD      ;初始化 LCD
  54.           MOV  R0,#20H        ;將20H-7FH 單元清零
  55.           MOV  R1,#95
  56. CLEAR:    MOV  @R0,A
  57.           INC  R0
  58.           DJNZ  R1,CLEAR

  59. ;=========================================
  60. ;以下為主程序
  61. ;=========================================
  62. ;以下為有害氣體濃度顯示和報警程序
  63. YHJCCX:   LCALL  MENU_3       ;顯示菜單1
  64.           MOV R2,#0AH         ;與10號從機串口通信,多功能板地址為0AH
  65.           MOV R3,#01H         ;主機要求從機發(fā)送數(shù)據(jù)塊
  66.           LCALL COM           ;主機與多功能檢測板串口通信,要求其發(fā)送9個字節(jié)數(shù)據(jù)塊

  67.           MOV A,JSSZ+1        ;取出傳感器檢測到的電壓讀數(shù)(原始數(shù)據(jù),16進制)
  68.           MOV B,#2            ;顯示修正倍率,原始數(shù)*倍率+修正值=LCD顯示值
  69.           SUBB A,#XIUZ1       ;顯示修正
  70.           JNC LBB1            ;軟件調(diào)整初值
  71.           MOV A,#0            ;使之正常時顯示0
  72. LBB1:     LCALL HEX2BCD1      ;調(diào)用數(shù)值轉(zhuǎn)換程序
  73.           LCALL CONV100       ;調(diào)用LCD顯示程序
  74.           MOV BJZC,JSSZ+1     ;取出傳感器檢測到的電壓讀數(shù)(原始數(shù)據(jù)),做報警比較
  75.           MOV BJWX,#WXBJZ1+XIUZ1 ;實際危險報警值=設(shè)定值/倍率+修正值
  76.           MOV BJJG,#JGBJZ1+XIUZ1 ;實際警告報警值=設(shè)定值/倍率+修正值
  77.           MOV YYBZ,#JSSZ+1    ;設(shè)有害氣體語音播放標志
  78.           LCALL BJBJ1         ;調(diào)用報警程序

  79.           JB P3.4,LBB5
  80.           LCALL DELAY2
  81.           JB P3.4,LBB5
  82.           LCALL JJJCCX

  83. LBB5:     LCALL DELAY3

  84.           SJMP YHJCCX

  85. ;以下為酒精濃度顯示和報警程序
  86. JJJCCX:   MOV JJCYCS,#5       ;設(shè)酒精檢測輪回采樣次數(shù)
  87.           LCALL JIUJJC        ;顯示準備進入酒精檢測程序的畫面
  88. JJJCCX1:  MOV R2,#0AH         ;與10號從機串口通信,多功能板地址為0AH
  89.           MOV R3,#01H         ;主機要求從機發(fā)送數(shù)據(jù)塊
  90.           LCALL COM           ;主機與多功能檢測板串口通信,要求其發(fā)送9個字節(jié)數(shù)據(jù)塊
  91.           LCALL  MENU_4       ;顯示菜單1
  92.           MOV A,JSSZ+2        ;取出傳感器檢測到的電壓讀數(shù)(原始數(shù)據(jù),16進制)
  93.           MOV B,#1            ;顯示修正倍率,原始數(shù)*倍率+修正值=LCD顯示值
  94.           SUBB A,#XIUZ2       ;顯示修正
  95.           JNC LBB2            ;軟件調(diào)整初值
  96.           MOV A,#0            ;使之正常時顯示0%
  97. LBB2:     LCALL HEX2BCD1      ;調(diào)用數(shù)值轉(zhuǎn)換程序
  98.           LCALL CONV200       ;調(diào)用LCD顯示程序
  99.           MOV BJZC,JSSZ+2     ;取出傳感器檢測到的電壓讀數(shù)(原始數(shù)據(jù)),做報警比較
  100.           MOV BJWX,#WXBJZ2+XIUZ2 ;實際危險報警值=設(shè)定值/倍率+修正值
  101.           MOV BJJG,#JGBJZ2+XIUZ2 ;實際警告報警值=設(shè)定值/倍率+修正值

  102.           LCALL DELAY3        ;延時,使其能看清楚看到檢測到的數(shù)值

  103.           DEC JJCYCS
  104.           MOV A,JJCYCS
  105.           JNZ JJJCCX1         ;連續(xù)采樣幾次(未到則返回)

  106.           JNB BUSY,$          ;如果語言正在播放,則等待
  107.           MOV YY_DAT,#6       ;報出“檢測完畢”
  108.           LCALL YUYIN         ;開始語音播放
  109.           LCALL DELAY
  110.           LCALL DELAY
  111.           MOV YYBZ,#JSSZ+2    ;設(shè)酒精報警語音播放標志
  112.           LCALL BJBJ1         ;調(diào)用報警程序
  113.           LCALL DELAY3        ;延時
  114.           RET

  115. ;***************************************************
  116. ;=========================================
  117. ;以下為兩個單字節(jié)十六進制相乘
  118. ;入口:A*B
  119. ;出口:16位低字節(jié)放A中,高字節(jié)放B中
  120. ;=========================================
  121. HEX2BCD1: MUL AB
  122.           MOV R6,B
  123.           MOV R7,A
  124.           MOV JJCQ,A        ;為顯示0%作準備
  125. ;=========================================
  126. ;以下為雙字節(jié)十六進制整數(shù)轉(zhuǎn)換成雙字節(jié)BCD碼整數(shù)
  127. ;入口條件:待轉(zhuǎn)換的雙字節(jié)十六進制整數(shù)在R6、R7中。
  128. ;出口信息:轉(zhuǎn)換后的三字節(jié)BCD碼整數(shù)在R3、R4、R5中。
  129. ;影響資源:PSW、A、R2~R7,堆棧需求:2字節(jié)
  130. ;=========================================         
  131.           CLR A             ;BCD碼初始化
  132.           MOV R3,A
  133.           MOV R4,A
  134.           MOV R5,A
  135.           MOV R2,#10H       ;轉(zhuǎn)換雙字節(jié)十六進制整數(shù)
  136. HB3:      MOV A,R7          ;從高端移出待轉(zhuǎn)換數(shù)的一位到CY中
  137.           RLC A
  138.           MOV R7,A
  139.           MOV A,R6
  140.           RLC A
  141.           MOV R6,A
  142.           MOV A,R5          ;BCD碼帶進位自身相加,相當于乘2
  143.           ADDC A,R5
  144.           DA A              ;十進制調(diào)整
  145.           MOV R5,A
  146.           MOV A,R4
  147.           ADDC A,R4
  148.           DA A
  149.           MOV R4,A
  150.           MOV A,R3
  151.           ADDC A,R3
  152.           MOV R3,A          ;雙字節(jié)十六進制數(shù)的萬位數(shù)不超過6,不用調(diào)整
  153.           DJNZ R2,HB3       ;處理完16bit

  154. ;=========================================
  155. ;以下為把BCD碼提取出并送顯示寄存器70H~73H
  156. ;入口:;三字節(jié)BCD碼整數(shù)在R3(高位為十萬低位為萬)、
  157. ;R4(高位為千低位為百)、R5(高位為十低位為個)中。
  158. ;出口:73H-70H(舍去十萬、萬位)
  159. ;=========================================
  160.           MOV A,R4
  161.           ANL A,#11110000B
  162.           SWAP A
  163.           MOV 73H,A
  164.           MOV A,R4
  165.           ANL A,#00001111B
  166.           MOV 72H,A
  167.           MOV A,R5
  168.           ANL A,#11110000B
  169.           SWAP A
  170.           MOV 71H,A
  171.           MOV A,R5
  172.           ANL A,#00001111B
  173.           MOV 70H,A

  174.           RET

  175. ;==============================================
  176. ;以下為LCD顯示有害氣體程序
  177. ;72H-70H 分別存放百位、十位、個位的數(shù)據(jù)
  178. ;==============================================
  179. CONV100:  MOV  A,73H         ;加載百位數(shù)據(jù)
  180.           MOV  LCD_X,#1      ;設(shè)置顯示位置
  181.           CJNE A,#00H,CONV110
  182.           MOV  A,#" "        ;百位數(shù)等于0顯示空格
  183.           MOV  B,LCD_X
  184.           CALL  LCDP2
  185.           MOV  A,72H         ;十位
  186.           CJNE A,#00H,CONV120
  187.           INC  LCD_X         ;調(diào)整顯示地址
  188.           MOV  A,#" "        ;十位數(shù)等于0顯示空格
  189.           MOV  B,LCD_X
  190.           CALL  LCDP2
  191.           MOV  A,71H         ;十位
  192.           CJNE A,#00H,CONV130
  193.           INC  LCD_X         ;調(diào)整顯示地址
  194.           MOV  A,#" "        ;十位數(shù)等于0顯示空格
  195.           MOV  B,LCD_X
  196.           CALL  LCDP2
  197.           JMP  CONV140

  198. CONV110:  CALL  SHOW_DIG2    ;顯示數(shù)據(jù)

  199. CONV120:  INC  LCD_X         ;調(diào)整顯示地址
  200.           MOV  A,72H         ;十位
  201.           CALL  SHOW_DIG2

  202. CONV130:  INC  LCD_X         ;調(diào)整顯示地址
  203.           MOV  A,71H         ;十位
  204.           CALL  SHOW_DIG2

  205. CONV140:  INC  LCD_X         ;調(diào)整顯示地址
  206.           MOV  A,70H         ;個位
  207.           CALL  SHOW_DIG2

  208.           RET
  209. ;=================================================
  210. ;以下為LCD顯示酒精濃度程序
  211. ;73H-70H 分別存放個位、小數(shù)后1位、后2位、后3位的數(shù)據(jù)
  212. ;=================================================
  213. CONV200:  MOV A,JJCQ
  214.           JNZ BBL1
  215.           MOV LCD_X,#0       ;當個位、十、百、千分位均為零時顯示0%
  216.           MOV R0,#00H
  217. BBL2:     MOV A,#' '
  218.           MOV B,LCD_X
  219.           CALL LCDP2
  220.           INC LCD_X
  221.           INC R0
  222.           CJNE R0,#4,BBL2
  223.           MOV R0,#00H
  224.           CLR A              ;個位
  225.           CALL SHOW_DIG2
  226.           RET

  227. BBL1:     MOV  A,73H         ;加載個位數(shù)據(jù)
  228.           MOV  LCD_X,#0      ;設(shè)置顯示位置
  229.           CALL  SHOW_DIG2    ;顯示數(shù)據(jù)

  230.           INC  LCD_X         ;調(diào)整顯示地址
  231.           MOV  A,#'.'
  232.           MOV  B,LCD_X
  233.           CALL  LCDP2

  234.           SJMP CONV120

  235. ;=========================================
  236. ;LCD 顯示菜單1
  237. ;=========================================
  238. MENU_3:   MOV  DPTR,#M_OK31  ;指針指到顯示信息區(qū)
  239.           MOV  A,#1          ;顯示在第一行
  240.           CALL  LCD_PRINT
  241.           MOV  DPTR,#M_OK32  ;指針指到顯示信息區(qū)
  242.           MOV  A,#2          ;顯示在第二行
  243.           CALL  LCD_PRINT
  244.           MOV  DPTR,#M_OK33  ;指針指到顯示信息區(qū)
  245.           MOV  A,#3          ;顯示在第二行
  246.           CALL  LCD_PRINT
  247.           MOV  DPTR,#M_OK34  ;指針指到顯示信息區(qū)
  248.           MOV  A,#4          ;顯示在第二行
  249.           CALL  LCD_PRINT
  250.           RET
  251. M_OK31:   DB"有害氣體濃度:  ",0
  252. M_OK32:   DB"           PPM  ",0
  253. M_OK33:   DB"檢測結(jié)果:      ",0
  254. M_OK34:   DB"                ",0

  255. ;=========================================
  256. ;LCD 顯示菜單2
  257. ;=========================================
  258. MENU_4:   MOV  DPTR,#M_OK41  ;指針指到顯示信息區(qū)
  259.           MOV  A,#1          ;顯示在第一行
  260.           CALL  LCD_PRINT
  261.           MOV  DPTR,#M_OK42  ;指針指到顯示信息區(qū)
  262.           MOV  A,#2          ;顯示在第二行
  263.           CALL  LCD_PRINT
  264.           MOV  DPTR,#M_OK43  ;指針指到顯示信息區(qū)
  265.           MOV  A,#3          ;顯示在第二行
  266.           CALL  LCD_PRINT
  267.           MOV  DPTR,#M_OK44  ;指針指到顯示信息區(qū)
  268.           MOV  A,#4          ;顯示在第二行
  269.           CALL  LCD_PRINT
  270.           RET
  271. M_OK41:   DB"酒精濃度:    ",0
  272. M_OK42:   DB"          % BAC ",0
  273. M_OK43:   DB"檢測結(jié)果:      ",0
  274. M_OK44:   DB"                ",0

  275. ;=========================================
  276. ;LCD 顯示菜單3
  277. ;=========================================
  278. MENU_5:   MOV  DPTR,#M_OK51  ;指針指到顯示信息區(qū)
  279.           MOV  A,#1          ;顯示在第一行
  280.           CALL  LCD_PRINT
  281.           MOV  DPTR,#M_OK52  ;指針指到顯示信息區(qū)
  282.           MOV  A,#2          ;顯示在第二行
  283.           CALL  LCD_PRINT
  284.           MOV  DPTR,#M_OK53  ;指針指到顯示信息區(qū)
  285.           MOV  A,#3          ;顯示在第二行
  286.           CALL  LCD_PRINT
  287.           MOV  DPTR,#M_OK54  ;指針指到顯示信息區(qū)
  288.           MOV  A,#4          ;顯示在第二行
  289.           CALL  LCD_PRINT
  290.           RET
  291. M_OK51:   DB"進入酒精檢測程序",0
  292. M_OK52:   DB"傳感器預(yù)熱請稍等",0
  293. M_OK53:   DB"...  ... ",0
  294. M_OK54:   DB"倒計時:    S  ",0

  295. ;=========================================
  296. ;LCD 顯示菜單4
  297. ;=========================================
  298. MENU_6:   MOV  DPTR,#M_OK61  ;指針指到顯示信息區(qū)
  299.           MOV  A,#1          ;顯示在第一行
  300.           CALL  LCD_PRINT
  301.           MOV  DPTR,#M_OK62  ;指針指到顯示信息區(qū)
  302.           MOV  A,#2          ;顯示在第二行
  303.           CALL  LCD_PRINT
  304.           MOV  DPTR,#M_OK63  ;指針指到顯示信息區(qū)
  305.           MOV  A,#3          ;顯示在第二行
  306.           CALL  LCD_PRINT
  307.           MOV  DPTR,#M_OK64  ;指針指到顯示信息區(qū)
  308.           MOV  A,#4          ;顯示在第二行
  309.           CALL  LCD_PRINT
  310.           RET
  311. M_OK61:   DB"現(xiàn)在開始酒精檢測",0
  312. M_OK62:   DB"注意:          ",0
  313. M_OK63:   DB"嘴巴要距離傳感器",0
  314. M_OK64:   DB"5---10cm輕輕吹氣",0
  315. ;=========================================
  316. ;以下為主機串行通信程序
  317. ;占用資源:R0~R4,A、40H、50H
  318. ;=========================================
  319. COM:   MOV A,TMOD           ;設(shè)置T1工作方式為方式2、T0工作方式保持不變
  320.        MOV FSJCQ,A
  321.        ORL A,#00101111B
  322.        MOV TMOD,A
  323.        MOV TH1,#0FDH        ;11.0592MHz 晶振,波特率=9600,時長0.6695
  324.        MOV TL1,#0FDH
  325.        MOV SCON,#0D8H       ;置串行模式3,SM2=1,允許接收
  326.        SETB TR1             ;啟動T1
  327.        LCALL COM1           ;調(diào)用一線發(fā)碼子程序
  328.        MOV TMOD,FSJCQ       ;恢復(fù)T1、T0原先的工作方式
  329.        RET

  330. COM1:   MOV A,R2            ;發(fā)送地址幀
  331.         MOV SBUF,A
  332.         JNB TI,$
  333.         CLR TI
  334.         JNB RI,$            ;等待從機應(yīng)答
  335.         CLR RI
  336.         MOV A,SBUF
  337.         XRL A,R2
  338.         JNZ MS104           ;判應(yīng)答地址是否相符
  339.         CLR TB8             ;地址符合,準備發(fā)送命令
  340.         MOV SBUF,R3         ;發(fā)送發(fā)送或接收數(shù)據(jù)命令
  341.         JNB TI,$
  342.         CLR TI
  343.         JNB RI,$            ;等待從機應(yīng)答
  344.         CLR RI
  345.         MOV A,SBUF          ;取應(yīng)答信息
  346.         JNB ACC.7,MS102     ;判斷是否出錯
  347. MS101:  SETB TB8
  348.         MOV SBUF,#0FFH      ;不相符重新聯(lián)絡(luò)
  349.         JNB TI,$
  350.         CLR TI
  351.         SJMP COM1           ;轉(zhuǎn)重發(fā)地址

  352. MS102:  CJNE R3,#00H,MS103  ;判是否要求從機接收數(shù)據(jù)
  353.         JNB ACC.0,MS101     ;從機接收數(shù)據(jù)準備就緒否?
  354.         MOV R0,#FSSZ        ;主機發(fā)送的數(shù)據(jù)塊首址
  355.         MOV R4,#BITE        ;設(shè)數(shù)據(jù)塊長度(9字節(jié))
  356. LPTX:   MOV SBUF,@R0        ;主機發(fā)送數(shù)據(jù)塊
  357.         JNB TI,$            ;等待發(fā)送完1幀
  358.         CLR TI
  359.         INC R0              ;修改地址指針
  360.         DJNZ R4,LPTX        ;判數(shù)據(jù)塊是否傳完
  361.         SJMP MS104          ;返回主程序

  362. MS103:  JNB ACC.1,MS101     ;從機發(fā)送數(shù)據(jù)準備就緒否?
  363.         MOV R1,#JSSZ        ;主機接收的數(shù)據(jù)塊首址
  364.         MOV R4,#BITE        ;設(shè)數(shù)據(jù)塊長度(9字節(jié))
  365. LPRX:   JNB RI,LPRX         ;等待接收完1幀
  366.         CLR RI
  367.         MOV A,SBUF          ;取出接收到的字符
  368.         MOV @R1,A
  369.         INC R1
  370.         DJNZ R4,LPRX        ;未接收完則繼續(xù)

  371. MS104:  CLR TR1             ;關(guān)閉T1
  372.         RET


  373. ;=========================================
  374. ;報警比較和顯示程序
  375. ;有害氣體濃度:≥200PPM→語音報警并 顯示"濃度超標,危險!"
  376. ;             ≥120PPM→語音報警并 顯示"濃度偏高,請注意!"
  377. ;             <120PPM→語音不報警 顯示"濃度未超標"
  378. ;酒精濃度:   ≥0.05% BCA→語音報警并 顯示"濃度超標,危險!"
  379. ;            ≥0.02% BCA→語音報警并 顯示"濃度偏高,請注意!"
  380. ;            <0.02% BCA→語音不報警 顯示"濃度未超標"
  381. ;=========================================
  382. BJBJ1:    MOV A,BJZC
  383.           SUBB A,BJWX          ;與超標設(shè)定值進行比較
  384.           JC BL2

  385.           LCALL WENZBJ1        ;顯示菜單1
  386.           LCALL DELAY          ;延時
  387.           LCALL DELAY          ;延時
  388.           LCALL WENZBJ4        ;顯示菜單1-4,形成閃爍效果
  389.           LCALL DELAY          ;延時
  390.           LCALL DELAY          ;延時
  391.           LCALL WENZBJ1        ;顯示菜單1

  392.           MOV A,YYBZ
  393.           CJNE A,#JSSZ+1,BL1   ;語音段播放識別
  394.           MOV YY_DAT,#2        ;有害氣體檢測時報出“車內(nèi)有害氣體濃度過高,請排除”
  395.           SJMP BL4
  396. BL1:      CJNE A,#JSSZ+2,BL6   ;語音段播放識別
  397.           MOV YY_DAT,#9        ;酒精檢測時報出“酒精濃度偏高,你是不是喝酒了,要小心開車哦”
  398.           SJMP BL4

  399. BL2:      MOV A,BJZC           ;取ACC讀數(shù)值(存在45H里)               ;
  400.           SUBB A,BJJG          ;與偏高設(shè)定值進行比較
  401.           JC BL5               ;
  402.           LCALL WENZBJ2        ;顯示菜單2

  403.           LCALL DELAY          ;延時
  404.           LCALL DELAY          ;延時
  405.           LCALL WENZBJ4        ;顯示菜單4,形成閃爍效果
  406.           LCALL DELAY          ;延時
  407.           LCALL DELAY          ;延時
  408.           LCALL WENZBJ2        ;顯示菜單2

  409.           MOV A,YYBZ
  410.           CJNE A,#JSSZ+1,BL3   ;語音段播放識別
  411.           JNB BUSY,$
  412.           MOV YY_DAT,#2        ;有害氣體檢測時報出“車內(nèi)有害氣體濃度過高,請排除”
  413.           SJMP BL4
  414. BL3:      CJNE A,#JSSZ+2,BL6   ;語音段播放識別
  415.           JNB BUSY,$
  416.           MOV YY_DAT,#8        ;酒精檢測時報出“酒精濃度過高,你喝多了,為了您的安全,請不要開車”
  417. BL4:      LCALL YUYIN          ;開始語音播放
  418.           SJMP BL6

  419. BL5:      LCALL WENZBJ3        ;顯示菜單1-3
  420.           MOV A,YYBZ
  421.           CJNE A,#JSSZ+2,BL6   ;語音段播放識別
  422.           JNB BUSY,$
  423.           MOV YY_DAT,#7        ;酒精檢測時報出“酒精濃度沒有超標”
  424.           LCALL YUYIN          ;開始語音播放

  425. BL6:      RET

  426. WENZBJ1:  MOV  DPTR,#BJ10      ;超標顯示的內(nèi)容
  427.           SJMP BL7
  428. WENZBJ2:  MOV  DPTR,#BJ20      ;偏高顯示的內(nèi)容
  429.           SJMP BL7
  430. WENZBJ3:  MOV  DPTR,#BJ30      ;未超標顯示的內(nèi)容
  431.           SJMP BL7
  432. WENZBJ4:  MOV  DPTR,#BJ40      ;未超標顯示的內(nèi)容
  433. BL7:      MOV  A,#98H          ;設(shè)置 LCD 顯示的地址(第四行)
  434.           CALL  WCOM           ;寫入指令
  435. BL8:      CLR  A               ;填入字符
  436.           MOVC  A,@A+DPTR      ;由信息區(qū)取出字符
  437.           CJNE  A,#0,BL9       ;判斷是否為結(jié)束碼
  438.           RET
  439. BL9:      CALL  WDATA          ;寫入數(shù)據(jù)
  440.           INC  DPTR            ;指針加1
  441.           JMP  BL8             ;繼續(xù)填入字符

  442. BJ10:     DB "濃度超標,危險!",0
  443. BJ20:     DB "濃度偏高,請注意",0
  444. BJ30:     DB "  濃度沒有超標  ",0
  445. BJ40:     DB "                ",0

  446. ;***********************************************************
  447. JIUJJC:   MOV FSSZ+1,#01H     ;命令10號從機打開有害氣體傳感器
  448.           MOV R2,#0AH         ;與10號從機串口通信,多功能板地址為0AH
  449.           MOV R3,#00H         ;主機要求從機接收數(shù)據(jù)塊
  450.           LCALL COM           ;主機與多功能檢測板串口通信,要求其接收9個字節(jié)數(shù)據(jù)塊
  451.           MOV YY_DAT,#3       ;報出“現(xiàn)在進入酒精檢測程序,請等待十秒鐘”
  452.           JNB BUSY,$
  453.           LCALL YUYIN         ;開始語音播放
  454.           ACALL MENU_5
  455.           JNB BUSY,$
  456.           MOV DJSJCQ,#10
  457.           MOV A,DJSJCQ
  458. K2:       MOV B,#1
  459.           LCALL HEX2BCD1      ;調(diào)用數(shù)值轉(zhuǎn)換程序
  460.           LCALL CONV300       ;調(diào)用LCD顯示程序
  461.           MOV A,#3            ;延時
  462. LBB23:    LCALL DELAY
  463.           DEC A
  464.           JNZ LBB23
  465.           DEC DJSJCQ
  466.           MOV A,DJSJCQ
  467.           CJNE A,#00H,K2
  468.           MOV YY_DAT,#4       ;報出“現(xiàn)在開始酒精檢測”
  469.           JNB BUSY,$
  470.           LCALL YUYIN         ;開始語音播放
  471.           ACALL MENU_6
  472.           MOV A,#10           ;延時
  473. LBB33:    LCALL DELAY
  474.           DEC A
  475.           JNZ LBB33
  476.           MOV YY_DAT,#5       ;報出“請把嘴巴對準探頭輕輕吹氣”
  477.           JNB BUSY,$
  478.           LCALL YUYIN         ;開始語音播放
  479.           RET

  480. CONV300:  MOV  A,71H          ;十位
  481.           CJNE A,#00H,K3
  482.           MOV A,#9CH          ;調(diào)整顯示地址
  483.           CALL  WCOM          ;寫入命令
  484.           MOV  A,#" "         ;百位數(shù)等于0顯示空格
  485.           CALL  WDATA         ;寫入數(shù)據(jù)
  486.           SJMP K4
  487. K3:       MOV A,#9CH          ;調(diào)整顯示地址
  488.           CALL  WCOM          ;寫入命令
  489.           MOV  A,71H
  490.           ADD  A,#30H         ;加30H,轉(zhuǎn)換為ASCII碼
  491.           CALL  WDATA         ;寫入數(shù)據(jù)

  492. K4:       MOV A,#9DH          ;調(diào)整顯示地址
  493.           CALL  WCOM          ;寫入命令
  494.           MOV  A,70H
  495.           ADD  A,#30H         ;加30H,轉(zhuǎn)換為ASCII碼
  496.           CALL  WDATA         ;寫入數(shù)據(jù)
  497.           RET
  498. ;-------------------------------------------------------







  499. ;以下程序通用

  500. ;=============================================
  501. ;在LCD的第二行顯示數(shù)據(jù)字符
  502. ;A=ASCII 數(shù)據(jù), B=位置變量
  503. ;==============================================
  504. LCDP2:    PUSH  ACC           ;在LCD的第二行顯示字符
  505.           MOV  A,B            ;設(shè)置顯示地址
  506.           ADD  A,#90H         ;設(shè)置LCD的第二行地址
  507.           CALL  WCOM          ;寫入命令
  508.           POP  ACC            ;由堆棧取出A
  509.           CALL  WDATA         ;寫入數(shù)據(jù)
  510.           RET
  511. ;-------------------------------------------------------
  512. SHOW_DIG2:                   ;在 LCD 的第二行顯示數(shù)字
  513.           ADD  A,#30H        ;加30H,轉(zhuǎn)換為ASCII碼
  514.           MOV  B,LCD_X       ;確定顯示位置
  515.           CALL  LCDP2        ;送顯示
  516.           RET

  517. ;=================================================
  518. ;對 LCD 做初始化設(shè)置
  519. ;=================================================
  520. SET_LCD:  MOV A,#34H      ;34H--擴充指令操作
  521.           CALL  WCOM         ;寫入命令
  522.    MOV A,#30H      ;30H--基本指令操作
  523.           CALL  WCOM         ;寫入命令
  524.    MOV A,#01H      ;清除顯示
  525.           CALL  WCOM         ;寫入命令
  526.           MOV A,#06H      ;指定在資料寫入或讀取時,光標的移動方向
  527.           CALL  WCOM         ;DDRAM 的地址計數(shù)器(AC)加1
  528.    MOV A,#0CH      ;開顯示,關(guān)光標,不閃爍
  529.           CALL  WCOM         ;寫入命令
  530.           RET

  531. ;===============================================
  532. ;命令寫入子程序
  533. ;RS=L,RW=L,D0-D7=指令碼,E=高脈沖
  534. ;以8位控制方式將命令寫至LCD
  535. ;===============================================
  536. WCOM:    LCALL CHK_BUSY       ;寫入指令
  537.   CLR LCD_RS
  538.   CLR LCD_RW
  539.   MOV LCD_SJ,A
  540.   SETB LCD_EN
  541.   NOP
  542.   NOP
  543.   CLR LCD_EN
  544.   RET
  545. ;===============================================
  546. ;數(shù)據(jù)寫入子程序
  547. ;RS=H,RW=L,D0-D7=指令碼,E=高脈沖
  548. ;以8位控制方式將數(shù)據(jù)寫至LCD
  549. ;===============================================
  550. WDATA:    MOV  LCD_SJ,A       ;寫入數(shù)據(jù)
  551.           SETB  LCD_RS
  552.           CLR  LCD_RW
  553.           SETB  LCD_EN
  554.           CALL  DE
  555.           CLR  LCD_EN
  556.           CALL  DE
  557.           RET
  558. ;===============================================
  559. ;測LCD忙碌子程序
  560. ;RS=0,RW=1,E=H,D0-D7=狀態(tài)字
  561. ;===============================================
  562. CHK_BUSY: MOV LCD_SJ,#0FFH   ;測忙碌子程序
  563.    CLR LCD_RS
  564.    SETB LCD_RW
  565.    SETB LCD_EN
  566.    JB LCD_SJ.7,$
  567.    CLR LCD_EN
  568.    RET

  569. ;==================================================
  570. ;在LCD的顯示字符串
  571. ;DPTR = 放字符串的地址
  572. ;==================================================
  573. LCD_PRINT:CJNE  A,#1,LINE2  ;判斷是否為第一行
  574. LINE1:    MOV  A,#80H       ;設(shè)置 LCD 的第一行地址
  575.           CALL  WCOM        ;寫入命令
  576.           CALL  CLR_LINE    ;清除該行字符數(shù)據(jù)
  577.           MOV  A,#80H       ;設(shè)置 LCD 的第一行地址
  578.           CALL  WCOM        ;寫入命令
  579.           JMP  FILL

  580. LINE2:    CJNE  A,#2,LINE3  ;判斷是否為第二行
  581.           MOV  A,#90H       ;設(shè)置 LCD 的第二行地址
  582.           CALL  WCOM        ;寫入命令
  583.           CALL  CLR_LINE    ;清除該行字符數(shù)據(jù)
  584.           MOV  A,#90H       ;設(shè)置 LCD 的第二行地址
  585.           CALL  WCOM
  586.           JMP  FILL

  587. LINE3:    CJNE  A,#3,LINE4  ;判斷是否為第三行
  588.           MOV  A,#88H       ;設(shè)置 LCD 的第三行地址
  589.           CALL  WCOM        ;寫入命令
  590.           CALL  CLR_LINE    ;清除該行字符數(shù)據(jù)
  591.           MOV  A,#88H       ;設(shè)置 LCD 的第三行地址
  592.           CALL  WCOM
  593.           JMP  FILL

  594. LINE4:    MOV  A,#98H       ;設(shè)置 LCD 的第四行地址
  595.           CALL  WCOM        ;寫入命令
  596.           CALL  CLR_LINE    ;清除該行字符數(shù)據(jù)
  597.           MOV  A,#98H       ;設(shè)置 LCD 的第四行地址
  598.           CALL  WCOM

  599. FILL:     CLR  A            ;填入字符
  600.           MOVC  A,@A+DPTR   ;由信息區(qū)取出字符
  601.           CJNE  A,#0,LC1    ;判斷是否為結(jié)束碼
  602.           RET

  603. LC1:      CALL  WDATA       ;寫入數(shù)據(jù)
  604.           INC  DPTR         ;指針加1
  605.           JMP  FILL         ;繼續(xù)填入字符
  606. ;===============================================
  607. ;清除一行 LCD 的字符
  608. ;輸入一行空格,來替代原顯示字符
  609. ;===============================================
  610. CLR_LINE: MOV  R0,#16       ;清除該行 LCD 的字符
  611. CL1:      MOV  A,#' '
  612.           CALL  WDATA
  613.           DJNZ  R0,CL1
  614.           RET
  615. ;**********************************************************
  616. ;延時子程序
  617. ;**********************************************************
  618. DE:      MOV  R7,#229        ;延時 500 微秒,此條2個機器周期
  619.          DJNZ  R7,$
  620.          RET    ;此條2個機器周期,總延時(229*2+2+2)*(12/11.0592)≈500uS

  621. DELAY:   MOV  R5,#20         ;延時200MS
  622. DELAY1:  MOV  R6,#96         ;100
  623. DL1:     MOV  R7,#96         ;100
  624.          DJNZ  R7,$
  625.          DJNZ  R6,DL1
  626.          DJNZ  R5,DELAY1     ;96*2*48*(12/11.0592)+2*(12/11.0592)≈10000uS=10mS
  627.          RET        

  628. DELAY2:  MOV  R6,#10         ;延時5MS
  629. DL2:     MOV  R7,#229        ;100微秒
  630.          DJNZ  R7,$
  631.          DJNZ  R6,DL2
  632.          DJNZ  R5,DELAY2
  633.          RET

  634. DELAY3:  MOV  R5,#20         ;延時200MS
  635. DELA:    MOV  R6,#96
  636. DL3:     MOV  R7,#96
  637.          DJNZ  R7,$
  638.          DJNZ  R6,DL3
  639.          DJNZ  R5,DELA
  640.          RET   
  641. ;**********************************************************
  642. ;語音驅(qū)動和播放程序
  643. ;**********************************************************
  644. ;50H為語音段地址暫存器,1到210段,實際用到40
  645. ;50H為E0H~E7H時分別代表自低往高的8級音量
  646. ;在語音播放過程中發(fā)送F2H至50H可循環(huán)播放當前地址語音
  647. ;發(fā)送FEH至50H停止播放語音
  648. ;****************************************************
  649. YUYIN: MOV A,TMOD          ;設(shè)置T1工作方式為方式1、T0工作方式保持不變
  650.        MOV FSJCQ,A
  651.        ORL A,#00011111B
  652.        MOV TMOD,A
  653.        MOV R6,#08H         ;發(fā)碼8位循環(huán)數(shù)據(jù)
  654.        LCALL ONE_LINE      ;調(diào)用一線發(fā)碼子程序
  655.        MOV TMOD,FSJCQ          ;恢復(fù)T1、T0原先的工作方式
  656.        RET

  657. ONE_LINE:                  ;////一線發(fā)碼子程序
  658.        SETB YYRST          ;復(fù)位
  659.        MOV R7,#2           ;延時2MS
  660.        LCALL DELAY1MS
  661.        CLR YYRST           ;延時使系統(tǒng)穩(wěn)定
  662.        MOV R7,#6           ;延時6MS
  663.        LCALL DELAY1MS
  664.        CLR YYSDA           ;喚醒語音芯片
  665.        MOV R7,#17          ;延時17MS
  666.        LCALL DELAY1MS
  667.        MOV A,YY_DAT

  668. LP1:   SETB YYSDA
  669.        RRC A               ;分辨50H內(nèi)的數(shù)據(jù)各位是高電平還是低電平
  670.        JNC DIDIANPIN       ;高電平用高:低=2:1的脈寬表示
  671.        LCALL DELAY200US
  672.        LCALL DELAY200US
  673.        LCALL DELAY200US
  674.        CLR YYSDA
  675.        LCALL DELAY200US
  676. LP2:   DJNZ R6,LP1         ;查看數(shù)據(jù)是否發(fā)完,未發(fā)完繼續(xù)發(fā)
  677.        MOV R6,#08H
  678.        SETB YYSDA
  679.        RET

  680. DIDIANPIN:                 ;低電平用高:低=1:2的脈寬表示
  681.        LCALL DELAY200US
  682.        CLR YYSDA
  683.        LCALL DELAY200US
  684.        LCALL DELAY200US
  685.        LCALL DELAY200US
  686.        SJMP LP2

  687. ;以下為延時子程序
  688. DELAY200US:                ;延時200US子程序,晶振11.0592MHz,方式1
  689.        MOV  TH1,#0FFH
  690.        MOV  TL1,#47H
  691.        SETB TR1
  692. LOP1:  JBC  TF1,NEXT1
  693.        SJMP LOP1
  694. NEXT1: CLR TR1
  695.        RET

  696. DELAY1MS:MOV  TH1,#0FCH    ;延時1ms子程序
  697.        MOV  TL1,#66H
  698.        SETB TR1
  699. LOP2:  JBC  TF1,NEXT2
  700.        SJMP LOP2
  701. NEXT2: DJNZ R7,DELAY1MS
  702.        CLR TR1
  703.        RET


  704. END
復(fù)制代碼


回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产精品久久 | 成人国产精品久久久 | 国产一级电影在线 | 日日干夜夜操天天操 | 国产精品夜夜春夜夜爽久久电影 | 欧美综合国产精品久久丁香 | 国产我和子的乱视频网站 | 国产一级视频在线 | 日韩精品一区在线 | 成人免费黄色片 | 中文字幕一区二区三区在线视频 | 91麻豆精品国产91久久久久久久久 | 亚洲高清视频一区二区 | 91免费在线看 | 一区二区三区中文字幕 | 91视频免费| 国产精品久久久久久婷婷天堂 | 中文字幕精品一区二区三区精品 | 日本精品久久久久久久 | 久久精品一区二区 | 欧美一区二区在线播放 | 国产日产精品一区二区三区四区 | 国产精品美女久久久久久免费 | 中文字幕精品一区 | 欧美一级毛片久久99精品蜜桃 | 久久丁香 | 久久久久久久av麻豆果冻 | 久久精品一区二区 | 亚洲狠狠爱 | 国产高清精品在线 | 婷婷久久精品一区二区 | h视频免费观看 | 综合久久99 | 99福利视频| 久久69精品久久久久久久电影好 | www.av在线| 亚洲精品久久久久久久久久久 | 波波电影院一区二区三区 | 欧美激情久久久 | 91看国产| 亚洲精品1区2区3区 91免费看片 |