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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5452|回復: 1
打印 上一主題 下一主題
收起左側

智能溫度采集與控制系統源代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:71259 發表于 2014-12-30 23:24 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 daming 于 2014-12-30 23:28 編輯

電路圖和設計詳解見:http://www.zg4o1577.cn/bbs/dpj-29904-1.html
  1. 源程序代碼如下:
  2.        ;______________________________________________________________________________   
  3.              K273     EQU   8100H  ;加熱器開關控制273芯片片選地址
  4.              DEVAD    EQU   8302H  ; A/D的IN1入口地址
  5.              Z8279    EQU   0FF82H ;8279 狀態/命令口地址
  6.              D8279    EQU   0FF80H ;8279 數據口地址
  7.              LEDMOD   EQU   00H    ;8279工作方式設定:左邊輸入 八位字符顯示
  8.                                    ;外部譯碼鍵掃描方式,雙鍵互鎖
  9.              LEDFEQ   EQU   2FH    ;掃描速率
  10.              LEDCLS   EQU   0C1H   ;清除顯示 RAM
  11.              LEDWR0   EQU   80H    ;設定的將要寫入的顯示RAM地址
  12.       ;______________________________________________________________________________
  13.              ORG   0000H
  14.              AJMP  MAIN            ;上電,轉入主程序
  15.              ORG   000BH           ;T0溢出中斷入口地址
  16.              AJMP  CLRLED          ;轉入LED清零重裝初值中斷服務程序
  17.              ORG   0030H
  18.             
  19.    
  20.        MAIN:                       ;主程序
  21.              MOV   TMOD, #01H      ;將T0設定為定時模式1
  22.              MOV   TH0 , #4CH      ;送初值
  23.              MOV   TL0 , #00H
  24.              MOV   91H,  #100      ;計時次數為100次,總定時5s   
  25.              SETB  P1.0            ;將加熱指示燈打開顯示正在加熱
  26.              SETB  EA              ;CUP開中斷
  27.              SETB  ET0             ;T0中斷允許
  28.              SETB  TR0             ;啟動定時
  29.              MOV   90H  ,#0        ;送第一次比較溫度,存在90單元地址里,以供下               
  30.                                    ;次比較
  31.                                    ;(不能放在如01H里,這些被安排為R0—R7)
  32.              MOV   SP,  #60H       ;設置堆棧,防止其地址為07H和R7等混了
  33.              LCALL  INIT8279       ;初始化8279
  34.             
  35.     AGAIN:                         ;要反復循環的程序段
  36.              LCALL  H1             ;處理采進來的數據
  37.              LCALL  AD_TEMP        ;將處理的結果(電壓值)對應為相應的溫度
  38.              LCALL  COMP_50        ;先和50(控制溫度)比較
  39.              JC    NEXT0           ;大于50度就轉到相應的執行程序
  40.              AJMP  NEXT3
  41.       NEXT0: JB    P1.0 , NEXT1    ;正在加熱否?是就執行停止加熱程序
  42.              SJMP  NEXT2           ;否則直接顯示
  43.       NEXT1: LCALL STOP            ;停止加熱
  44.       NEXT2: LCALL DISP_LED        ;并用LED顯示出來溫度
  45.              LCALL LOADAG          ;再重裝初值進行計時
  46.              AJMP  AGAIN           ;再來采樣比較處理
  47.       NEXT3: LCALL COMP_TO_FOM     ;不大于50度就和前一次溫度比較大小
  48.              JB    P1.0 ,AGAIN     ;正在加熱否?是就又轉去重新開始采樣
  49.              LCALL START           ;沒有正在加熱就打開開關開始加熱
  50.              SJMP  AGAIN           ;回到采樣程序
  51.    
  52.      ADIN:                         ;A/D采樣子程序
  53.              MOV   DPTR,#DEVAD     ;送入A/D的通道1入口地址
  54.              MOVX  @DPTR, A        ;啟動A/D開始采樣
  55.              SETB  P1.7            ;將A/D的EOC接入P1.7口,查詢轉換完成否?
  56.              JB    P1.7,[        DISCUZ_CODE_1        ]nbsp;         ;等待A/D轉換完成
  57.              MOVX  A   ,@DPTR      ;讀轉換結果
  58.              RET                   ;返回主調程序往下執行
  59.             
  60.             
  61.     STOP:                          ;加熱器關子程序
  62.              CLR   P1.0            ;加熱指示燈滅
  63.              MOV   DPTR,#K273      ;送入273片選地址
  64.              MOV   A   ,#10H       ;將273的PO4口置1,關掉加熱器
  65.              MOVX  @DPTR,A         ;關閉加熱器
  66.              RET                   ;繼續往下執行
  67.             
  68.             
  69.    START:                          ;加熱器開子程序
  70.              SETB   P1.0           ;加熱指示燈亮
  71.              MOV   DPTR,#K273      ;送入273片選地址
  72.              MOV   A   ,#00H       ;將273的PO4口清零,打開加熱器
  73.              MOVX  @DPTR,A         ;打開加熱器
  74.              RET                   ;繼續往下執行
  75.             
  76.             
  77.             
  78.   LOADAG:                          ;重裝定時器初值子程序
  79.              CLR   TR0             ;先停止計時(防止有時未溢出又在重裝初值)
  80.              MOV   TH0 , #4CH      ;初值高8位
  81.              MOV   TL0 , #00H      ;低8位
  82.              SETB  TR0             ;再打開計時
  83.              RET                   ;返回主調往下執行
  84.             
  85.             
  86. COMP_TO_FOM:                       ;當前溫度和上一次比較子程序
  87.             MOV    A   , R6        ;當前溫度送A中待比
  88.             CJNE   A   , 90H ,NEXT4;不相等(即為差1度以上)轉NEXT4程序
  89.             SJMP   NEXT5
  90.      NEXT4: LCALL DISP_LED         ;顯示于LED上
  91.             LCALL LOADAG           ;重新裝計數器初值
  92.             MOV    90H  , A        ;將新的溫度存入90H單元地址中待和下次比較
  93.      NEXT5: RET                    ;返回繼續執行下面程序
  94.             
  95.             
  96. DISP_LED:                          ;LED顯示子程序
  97.              LCALL B_TO_BCD        ;將要顯示的數據先轉為BCD碼
  98.              MOV   A   , R6        
  99.              ANL   A   , #0FH      ;先顯示溫度的個位
  100.              MOV   R2  , A         ;送給R2暫存
  101.              MOV   R1  , #6        ;在第7個LED(即左起第二個)上顯示個位數
  102.              PUSH  DPH             ;保存現場
  103.              PUSH  DPL
  104.              PUSH  ACC
  105.              MOV   A   , #LEDWR0   ;置顯示起始地址
  106.              ADD   A   , R1        ;加上位置偏移量對應第7個LED
  107.              MOV   DPTR, #Z8279   
  108.              MOVX  @DPTR,A         ;顯示在第7個LED上
  109.              MOV   DPTR, #LEDSEG   ;LED段碼表
  110.              MOV   A   , R2        ;要查的數據個位數
  111.              MOVC  A   ,@A+DPTR    ;查表
  112.              MOV   DPTR,#D8279     ;8279數據口
  113.              MOVX  @DPTR,A         ;送出數據顯示
  114.              MOV   A   , R6        ;顯十位數字
  115.              SWAP  A
  116.              ANL   A   , #0FH      ;再顯示溫度的十位
  117.              MOV   R2  , A         ;送給R2暫存
  118.              MOV   R1  , #7        ;在第8個LED(即左起第一個)上顯示十位數
  119.              MOV   A   , #LEDWR0   ;置顯示起始地址
  120.              ADD   A   , R1        ;加上位置偏移量對應第8個LED
  121.              MOV   DPTR, #Z8279   
  122.              MOVX  @DPTR,A         ;顯示在第8個LED上
  123.              MOV   DPTR, #LEDSEG   ;LED段碼表
  124.              MOV   A   , R2        ;要查的數據十位數
  125.              MOVC  A   ,@A+DPTR    ;查表
  126.              MOV   DPTR,#D8279     ;8279數據口
  127.              MOVX  @DPTR,A         ;送出數據顯示
  128.              POP   ACC             ;恢復現場
  129.              POP   DPL
  130.              POP   DPH
  131.              RET
  132.             
  133.             
  134. INIT8279:                         ;8279初始化子程序
  135.              PUSH  DPH             ;保存現場
  136.              PUSH  DPL
  137.              PUSH  ACC
  138.              LCALL DELAY           ;延時
  139.              MOV   DPTR ,#Z8279
  140.              MOV   A,#LEDMOD       ;置8279工作方式
  141.              MOVX  @DPTR,A
  142.              MOV   A,#LEDFEQ       ;置鍵盤掃描速率
  143.              MOVX  @DPTR,A
  144.              MOV   A,#LEDCLS       ;清除 LED 顯示
  145.              MOVX  @DPTR,A
  146.              LCALL DELAY           ;延時
  147.              POP   ACC             ;恢復現場
  148.              POP   DPL
  149.              POP   DPH
  150.              RET
  151.             
  152.                           
  153.    
  154.        H1:                         ;A/D采入數據處理子程序,采入8次的數據再取平均
  155.              MOV   R6  , #0        ;初始化采入總和SUM
  156.              MOV   R5  , #0        ;初始化進位總和
  157.              MOV   R4  , #8        ;初始化采樣次數為8次
  158.              MOV   R3  , #3        ;初始化移位次數為3次,相當于除以8
  159.        H2:   LCALL ADIN            ;采入數據,準備處理
  160.              ADD   A   , R6        ;將采入數據加到總和里
  161.              MOV   R6  , A         ;仍送回R6中保存
  162.              JNC   H3              ;結果未溢出則轉入判斷采樣是否已完程序
  163.              INC   R5              ;溢出剛把溢出保存位R5加1
  164.        H3:   DJNZ  R4  , H2        ;采樣次數未到則繼續采樣
  165.        H4:                         ;采樣到了8次則進入取平均程序
  166.              CLR   C               ;將C清零
  167.              MOV   A   , R5        ;先將總和高8位R5內容右移1位,最高位用“0”填充
  168.                                    ;移出位存入C中
  169.              RRC   A              
  170.              MOV   R5  , A         ;移完后仍存入R5中
  171.              MOV   A   , R6        ;再將總和低8位向右移1位,最高位用總和高8位移出位填充
  172.                                    ;低位丟棄
  173.              RRC   A  
  174.              MOV   R6  , A         ;移完了仍存入R6中
  175.              DJNZ  R3  , H4        ;除法運算是否已完?未完繼續
  176.              RET                   ;完了返回主調程序繼續往下執行
  177.             
  178.             
  179.             
  180.   COMP_50:                         ;和50度比較子程序
  181.              CLR   C               ;將溢出位清零
  182.              MOV   A   ,#50        ;送比較溫度
  183.              SUBB  A   ,R6         ;將當前溫度減去50
  184.              RET                   ;返回往下執行
  185.             
  186.             
  187.   AD_TEMP:                         ;AD輸出數字量對查表對應為溫度子程序
  188.              ADD   A   ,#2         ;修正偏移地址,MOVC下兩條指令加起來為2字節
  189.              MOVC  A   ,@A+PC      ;查表
  190.              MOV   R6  ,A          ;查出的溫度送入R6中存
  191.              RET                  
  192.      TEMP:                                                       ;A/D采出來的數據對就的溫度表
  193.              DB  0  , 1  , 1  , 2  , 3  , 3  , 4  , 4  , 5  , 5  ;00H~09H對應的溫度
  194.              DB  6  , 6  , 7  , 8  , 8  , 9  , 9  , 10 , 10 , 10 ;0AH~13H對應的溫度
  195.              DB  11 , 11 , 12 , 12 , 13 , 13 , 14 , 14 , 14 , 15
  196.              DB  15 , 15 , 16 , 16 , 17 , 17 , 18 , 18 , 18 , 19
  197.              DB  19 , 20 , 20 , 20 , 21 , 21 , 21 , 22 , 22 , 22
  198.              DB  23 , 23 , 23 , 24 , 24 , 24 , 25 , 25 , 25 , 26
  199.              DB  26 , 26 , 27 , 27 , 27 , 28 , 28 , 28 , 29 , 29
  200.              DB  29 , 30 , 30 , 30 , 31 , 31 , 31 , 31 , 32 , 32
  201.              DB  32 , 32 , 33 , 33 , 33 , 34 , 34 , 34 , 35 , 35
  202.              DB  35 , 35 , 35 , 36 , 36 , 36 , 37 , 37 , 37 , 37
  203.              DB  38 , 38 , 38 , 39 , 39 , 39 , 39 , 40 , 40 , 40
  204.              DB  41 , 41 , 41 , 41 , 42 , 42 , 42 , 42 , 43 , 43
  205.              DB  43 , 43 , 44 , 44 , 44 , 44 , 45 , 45 , 45 , 45
  206.              DB  46 , 46 , 46 , 46 , 47 , 47 , 47 , 47 , 48 , 48
  207.              DB  48 , 48 , 49 , 49 , 49 , 49 , 49 , 50 , 50 , 50
  208.              DB  50 , 51 , 51 , 51 , 51 , 52 , 52 , 52 , 52 , 53
  209.              DB  53 , 53 , 53 , 54 , 54 , 54 , 54 , 55 , 55 , 55
  210.             
  211.             
  212.    CLRLED:                         ;中斷服務,清LED并重新計時
  213.              PUSH  DPH             ;保存現場
  214.              PUSH  DPL
  215.              PUSH  ACC
  216.              MOV   DPTR,#Z8279
  217.              DJNZ  91H, RETURN     ;計時到否?未到繼續
  218.              MOV   91H, #100       ;到了重新裝初值
  219.              MOV   A   ,#LEDCLS    ;清LED
  220.              MOVX  @DPTR,A  
  221.    RETURN:   LCALL LOADAG          ;重裝初值
  222.              POP   ACC             ;恢復現場
  223.              POP   DPL
  224.              POP   DPH
  225.              RETI                  ;返回中斷
  226.             
  227.             
  228.     DELAY:                         ;延時子程序
  229.              PUSH  0               ;保存現場
  230.              PUSH  1
  231.              MOV   0   ,#0H
  232.   DELAY1:    MOV   1   ,#0H
  233.              DJNZ  1   ,$
  234.              DJNZ  0   ,DELAY1
  235.              POP   1               ;恢復現場
  236.              POP   0
  237.              RET                  
  238.             
  239.             
  240. B_TO_BCD:                          ;二進制轉化BCD碼子程序
  241.              MOV   A   , R6        ;將要轉的數存入A中
  242.              MOV   B   , #10       ;溫度不超過100故從10開始除以
  243.              DIV   AB              ;A存入十位數,B存個位數
  244.              SWAP  A               ;將A高低4字節交換
  245.              ADD   A   , B         ;將B的個位加入A,A為BCD壓縮碼
  246.              MOV   R6  , A         ;仍存入R6中
  247.              RET                   ;返回調用程序往下執行
  248.             
  249.             
  250.             
  251.   LEDSEG:                          ;LED段碼表
  252.              DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H   ;'0,1,2,3,4,5,6,7'
  253.              DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H   ;'8,9,A,B,C,D,E,F'
  254.              DB 6DH,02H,08H,00H,59H,0FH,76H       ;'U,-,_, ,I,O,P, '              
  255.             
  256.              END                    ;程序結束
復制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:75749 發表于 2015-3-30 23:55 | 只看該作者
支持一下
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品九九 | 三级免费av | www久| 91久久久久久 | 国产精品久久久久久一区二区三区 | 黄色免费网址大全 | 蜜臀久久99精品久久久久久宅男 | 一区二区三区精品视频 | xxxxx黄色片 欧美一区免费 | 国产视频在线观看一区二区三区 | 中日韩毛片 | www.日本三级 | 精品久久久久久久 | 欧美一级做a爰片免费视频 国产美女特级嫩嫩嫩bbb片 | 欧美日韩精品免费 | jlzzjlzz国产精品久久 | 九九久久99| 日韩视频免费看 | 国产资源视频 | 欧美日韩综合 | 日韩一区二区三区在线视频 | 中文字幕高清 | 亚洲精品一区久久久久久 | 人人鲁人人莫人人爱精品 | 又黑又粗又长的欧美一区 | 波多野结衣一区二区三区 | 天天操人人干 | 人人澡人人射 | 9久久婷婷国产综合精品性色 | 久久综合伊人一区二区三 | 91精品久久久久久久久中文字幕 | 国产成人久久av免费高清密臂 | 天堂av在线影院 | 九九亚洲 | 亚洲精品一区中文字幕乱码 | 自拍偷拍亚洲欧美 | 日本一区二区高清视频 | 国产精品成av人在线视午夜片 | 91久久国产精品 | 人人人人人爽 | 男女黄网站|