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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機LCD1602時鐘溫度顯示匯編程序(注釋很全)仿真

[復制鏈接]
跳轉到指定樓層
樓主
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


帶有全面中文注釋的單片機源程序如下:
  1. ;**********************************************************************
  2. ;晶振為12MHZ,顯示實時時間,溫度
  3. ;測量溫度范圍為-55~+99攝氏度
  4. ;***********************************************************************
  5.                 T_RST                        EQU                P1.5                //DS1302復位線引腳
  6.                 T_CLK                        EQU                P1.6                //DS1302時鐘線引腳
  7.                 T_IO                        EQU                P1.7                //DS1302數據線引腳

  8.                 TEM_L                        EQU                40H                        //存放從DS18B20中讀出的高、低位溫度值
  9.                 TEM_H                        EQU                41H               
  10.                 TEM_NUM                        EQU                42H                        //存放溫度轉換后的整數部分
  11.                 FLAG0                        EQU                45H                        //FLAG0存放溫度的符號
  12.                 DQ                                EQU                P2.3                //DS18B20數據線

  13.                 RS                                BIT                P2.0                //LCD控制線定義
  14.                 RW                                BIT                P2.1               
  15.                 E                                BIT                P2.2

  16.                 SKIP_B20                EQU                0CCH                //DS18B20跳過ROM命令
  17.                 START_B20                EQU                44H                        //DS18B20溫度變換命令
  18.                 READDS                        EQU                0BEH                //DS18B20讀暫存器命令
  19.                
  20.                 ORG                0000H
  21.                 AJMP        MAIN
  22.                 ORG                0100H
  23. MAIN:        MOV                SP,#90H
  24.                 ACALL        LCD_INT                                          //進行LCD初始化
  25.                 MOV                A,#8BH                                                //在LCD第一行第12列顯示WEEK
  26.                 LCALL        W_COM
  27.                 MOV                A,#57H                                                //字母'W'的字符庫為01010111
  28.                 LCALL        W_DAT
  29.                 MOV                A,#45H                                                //字母'E'的字符庫為01000101
  30.                 LCALL        W_DAT
  31.                 MOV                A,#45H                                                
  32.                 LCALL        W_DAT
  33.                 MOV                A,#4BH                                                //字母'K’的字符庫為01001011
  34.                 LCALL        W_DAT
  35.                 MOV                A,#0C0H                                                //第二行第一列顯示TIME
  36.                 LCALL        W_COM
  37.                 MOV                A,#54H                                                //字母'T'的字符庫為01010100
  38.                 LCALL        W_DAT
  39.                 MOV                A,#49H                                                //字母'I'的字符庫為01001001
  40.                 LCALL        W_DAT
  41.                 MOV                A,#4DH                                                //字母'M'的字符庫為01001101
  42.                 LCALL        W_DAT
  43.                 MOV                A,#45H                                                //字母'E'的字符庫為01000101
  44.                 LCALL        W_DAT
  45.                
  46.         

  47.                  MOV                60H,#00H                                        //設置秒存儲單元
  48.                 MOV                61H,#00H                                        //設置分存儲單元
  49.                 MOV                62H,#16H                                        //設置時存儲單元
  50.                 MOV                63H,#05H                                        //設置日存儲單元
  51.                 MOV                64H,#01H                                        //設置月存儲單元
  52.                 MOV                65H,#03H                                        //設置星期存儲單元
  53.                 MOV                66H,#18H                                        //設置年存儲單元
  54.                 LCALL        SET1302                                                //向DS1302寫入時間

  55. REP:          LCALL        GET1302                                                //讀出時間
  56.             LCALL        GET_TEM                                                  //讀出轉換后的溫度值
  57.                   LCALL        TEM_COV

  58. ;;;;;;;;;;在LCD第一行顯示年月日和星期;;;;;;;;;;                        
  59.                  MOV            A,#80H                                                 //顯示在LCD第一行第一列
  60.                    LCALL        W_COM                                                 //調用LCD寫命令子程序
  61.                 MOV            A,#'2'
  62.                  ACALL        W_DAT                                                 //調用LCD寫數據子程序
  63.                  MOV            A,#'0'
  64.                  ACALL        W_DAT
  65.                  MOV            A,56H                                                //年拆分成十位與個位,轉換字符顯示
  66.                  MOV            B,#10H
  67.                  DIV            AB
  68.                  ADD            A,#30H                                                 //數字的字符庫從00110000B即30H開始
  69.                  ACALL        W_DAT
  70.                  MOV           A,B
  71.                  ADD            A,#30H
  72.                  ACALL        W_DAT
  73.                  MOV            A,#'-'
  74.                  ACALL        W_DAT
  75.                  MOV            A,54H                                                  //月拆分成十位與個位,轉換字符顯示
  76.                  MOV            B,#10H
  77.                  DIV            AB
  78.                  ADD            A,#30H
  79.                  ACALL        W_DAT
  80.                  MOV            A,B
  81.                  ADD            A,#30H
  82.                  ACALL        W_DAT
  83.                  MOV            A,#'-'
  84.                  ACALL        W_DAT
  85.                  MOV            A,53H                                                //日拆分成十位與個位,轉換字符顯示
  86.                  MOV            B,#10H
  87.                  DIV            AB
  88.                  ADD            A,#30H
  89.                  ACALL        W_DAT
  90.                  MOV            A,B
  91.                  ADD            A,#30H
  92.                  ACALL        W_DAT
  93.                 MOV          A,#8FH                                                //設置LCD顯示星期的位置為第一行第十六列
  94.                   LCALL        W_COM
  95.                  MOV            A,55H                                                 //顯示星期
  96.                  ADD            A,#30H
  97.                  LCALL        W_DAT

  98. ;;;;;;;;;;在LCD第二行顯示時分秒和溫度;;;;;;;;;;;;;
  99.                 MOV                A,#0C4H                                                //寫入顯示緩沖區的起始地址為第二行第五列開始
  100.                    LCALL        W_COM
  101.                    MOV            A,52H                                                  //小時拆分成十位與個位,轉換字符顯示
  102.                  MOV            B,#10H
  103.                  DIV            AB
  104.                  ADD            A,#30H
  105.                  LCALL        W_DAT
  106.                  MOV            A,B
  107.                  ADD            A,#30H
  108.                    LCALL        W_DAT
  109.                  MOV            A, #':'
  110.                  LCALL        W_DAT
  111.                  MOV            A,51H                                                  //分拆分成十位與個位,轉換字符顯示
  112.                  MOV            B,#10H
  113.                  DIV            AB
  114.                  ADD            A,#30H
  115.                  LCALL        W_DAT
  116.                  MOV            A,B
  117.                  ADD            A,#30H
  118.                  LCALL        W_DAT
  119.                  MOV            A, #':'
  120.                   LCALL        W_DAT
  121.                  MOV            A,50H                                                 //秒拆分成十位與個位,轉換字符顯示
  122.                  MOV            B,#10H
  123.                  DIV            AB
  124.                  ADD            A,#30H
  125.                  LCALL        W_DAT
  126.                  MOV            A,B
  127.                  ADD            A,#30H
  128.                   LCALL        W_DAT
  129.                   MOV                A,#0CDH                                                //溫度顯示在LCD第二行第十四列
  130.                 LCALL        W_COM
  131.                   MOV                A,FLAG0                                                //顯示溫度正負號
  132.                 ACALL        W_DAT
  133.                    MOV                A,TEM_NUM                                        //溫度整數拆分成十位和個位顯示
  134.                 MOV                B,#0AH                                       
  135.                 DIV                AB                                                        //商送給A,余數送給B
  136.                 ADD                A,#30H
  137.                 CJNE        A,#30H,REP1                                        //如果十位為0,則不顯示
  138.                 MOV                A,#20H                                                //字符庫中00100000B(20H)為空白
  139. REP1:        ACALL        W_DAT                                                //調用LCD寫數據子程序
  140.                 MOV                A,B                                                        //將求得的余數送給A
  141.                 ADD                A,#30H
  142.                 ACALL        W_DAT                                                //調用LCD寫數據子程序
  143.                 LJMP           REP

  144. /******************時間**************************/
  145. ;;;;;;;;累加器A寫一字節到DS1302;;;;;;;;;;;;;
  146. WE:                MOV                70H,#08H                                                //一個字節八位,移動八次
  147. INB1:        MOV                A,B                                                                //將命令字送給A
  148.                 RRC                A                                                                //通過A移入進位標志位C
  149.                 MOV                B,A
  150.                 MOV                T_IO,C                                                        //移入到芯片內
  151.                 SETB        T_CLK
  152.                 CLR                T_CLK
  153.                 DJNZ        70H,INB1
  154.                 RET

  155. ;;;;;;;;讀一字節到累加器A中;;;;;;;;;;;;;;;;;
  156. READ:        MOV                70H,#08H                                                //一個字節八位,移動八次
  157. OUTB1:        MOV                C,T_IO                                                        //從芯片內移動到進位標志位C
  158.                 RRC                A                                                                //通過C再移入累加器A中
  159.                 SETB        T_CLK
  160.                 CLR                T_CLK
  161.                 DJNZ        70H,OUTB1
  162.                 RET

  163. ;;;;;;;;;向DS1302寫入時間子程序;;;;;;;;;;;;;;
  164. SET1302:CLR          T_RST                                                           //RST引腳為低電平,數據傳送終止
  165.         CLR          T_CLK                                                        //清零時鐘總線
  166.                 SETB         T_RST                                                        //RST引腳為高電平,邏輯控制有效
  167.                 MOV          B,#8EH                                                        //控制命令字(10001110-進行存取時間,寫操作)
  168.                 LCALL          WE                                                                //調用寫字節命令
  169.                 MOV            B,#00H                                                        //寫操作前清寫保護位W
  170.                 LCALL          WE
  171.                 SETB           T_CLK
  172.                 CLR            T_RST
  173.         MOV            R0,#60H                                                 //秒 分 時  日 月 星期  年  數據存儲在60-66H單元
  174.             MOV            R7,#07H                                                        //共7個字節
  175.         MOV            R1,#80H                                                        //寫秒寄存器命令
  176. S1:                CLR                T_RST
  177.                 CLR                T_CLK
  178.                 SETB        T_RST
  179.                 MOV                B,R1                                                        //寫入寫秒指令
  180.                 LCALL        WE
  181.                 MOV                A,@R0                                                        //將秒存儲單元中的數值送給A
  182.                 MOV                B,A
  183.                 LCALL        WE
  184.                 INC                R0                                                                //R0加一,指向下一個寫入的日歷、時鐘數據
  185.                 INC                R1                                                                //指向下一個時間寄存器
  186.                 INC                R1
  187.                 SETB        T_CLK
  188.                 CLR                T_RST
  189.                 DJNZ        R7,S1
  190.                 CLR                T_RST
  191.                 CLR                T_CLK
  192.                 SETB        T_RST
  193.                 MOV                B,#8EH                                                        //控制命令字(10001110-進行存取時間,寫操作)
  194.                 LCALL        WE
  195.                 MOV                B,#80H                                                        //控制寄存器中WP置1
  196.                 LCALL        WE
  197.                 SETB        T_CLK
  198.                 CLR                T_RST                                                        //結束寫過程
  199.                 RET

  200. ;;;;;;;;;;;;;;;讀時間子程序;;;;;;;;;;;;;;;;;               
  201. GET1302:MOV           R0,#50H
  202.         MOV           R7,#7
  203.         MOV           R1,#81H                                                 //讀秒寄存器命令
  204. G1:                CLR            T_RST
  205.         CLR            T_CLK
  206.         SETB           T_RST
  207.         MOV            B,R1                                                          //寫入讀秒寄存器命令
  208.         LCALL          WE                                                               
  209.         LCALL          READ
  210.         MOV            @R0,A                                                          //存入讀出數據
  211.         INC            R0                                                          //指向下一個存放日歷、時鐘的存儲單元
  212.         INC            R1                                                          //指向下一個日歷、時鐘寄存器
  213.         INC            R1   
  214.         SETB           T_CLK
  215.         CLR            T_RST
  216.         DJNZ           R7,G1                                                         //未讀完,繼續讀下一個
  217.         RET        
  218.                
  219. /********************溫度************************/
  220. ;;;;;;;;;;;;;;DS18B20復位程序;;;;;;;;;;;;;;;;;
  221. B20_INT:SETB        DQ                                                                 //將數據線置高電平“1”
  222.                 NOP                                                                                  //延時        
  223.                 NOP
  224.                 CLR                DQ                                                                //數據線拉到低電平“1”
  225.                 MOV                R7,#0CH                                                        //延時60*12=720US
  226. INT_DEL:ACALL        DEL60US
  227.                 DJNZ        R7,INT_DEL
  228.                 SETB        DQ                                                                //數據線拉到高電平“1”
  229.                 ACALL        DEL60US                                                        //延時等待
  230.                 ACALL        DEL60US
  231.                 MOV                C,DQ                                                        //將數據線的狀態送給C,判斷初始化是否成功,是否產生一個低電平
  232.                 JC                ERROR                                                        //如果C等于1,則跳出,初始化失敗
  233.                 ACALL        DEL60US                                                        //初始化成功,CPU讀到數據線上的低電平,繼續延時
  234.                 ACALL        DEL60US
  235.                 ACALL        DEL60US
  236.                 ACALL        DEL60US
  237.                 RET
  238. ERROR:        CLR                DQ                                                                //初始化未成功,繼續進行初始化
  239.                 SJMP        B20_INT
  240.                 RET

  241. ;;;;;;;;;;;;;;;;;讀DS18B20一個字節到累加器A子程序;;;;;;;;;;;;
  242. R_BYTE:        MOV                R7,#08H                                                        //讀取8位為一字節
  243.                 SETB        DQ
  244.                 NOP
  245.                 NOP
  246. LOOP:        CLR                DQ                                                                //將數據線從高電平拉為低電平時,作為一個讀周期的開始
  247.                 NOP                                                                                //延時,保證低電平至少為1US
  248.                 NOP
  249.                 NOP
  250.                 SETB        DQ                                                               
  251.                 MOV                R6,#07H                                                        //循環到A的最高位
  252.                 DJNZ        R6,[        DISCUZ_CODE_1        ]nbsp;                                                         
  253.                 MOV                C,DQ                                                        //將數據線中的值送給進位標志位C
  254.                 ACALL        DEL60US
  255.                 RRC                A                                                                //累加器A帶進位右移
  256.                 SETB        DQ
  257.                 DJNZ        R7,LOOP                                                        //將一字節讀到累加器A
  258.                 ACALL        DEL60US
  259.                 ACALL        DEL60US
  260.                 RET
  261.                
  262. ;;;;;;;;;;;;;累加器A寫到DS18B20子程序;;;;;;;;;;
  263. W_BYTE:        MOV                R7,#08H                                                         //將8位連續數據(一字節)寫入A
  264.                 SETB        DQ                                                                //拉高數據線
  265.                 NOP
  266.                 NOP
  267. LOOP1:        CLR                DQ                                                                //將數據線拉到低電平,作為寫周期的開始
  268.                 MOV                R6,#07H                                                        //循環到累加器A的最高位Acc.7
  269.                 DJNZ        R6,$
  270.                 RRC                A                                                                //從累加器A的最高位開始寫入
  271.                 MOV                DQ,C                                                        //將進位C送給DS18B20(寫入時序,0或者1時序)
  272.                 ACALL        DEL60US                                                        //保持60US
  273.                 SETB        DQ                                                                //在15US內將數據線拉為高電平
  274.                 DJNZ        R7,LOOP1                                                //將一字節寫入A
  275.                 RET
  276. DEL60US:MOV                R6,#1EH                                                        //延時(30*2)us
  277.                 DJNZ        R6,$
  278.                 RET

  279. ;;;;;;;;;;;讀溫度子程序;;;;;;;;;;;;;;;;;;
  280. GET_TEM:ACALL        B20_INT                                                        //DS18B20復位程序
  281.                 MOV                A,#0CCH                                                        //DS18B20跳過ROM命令
  282.                 ACALL        W_BYTE                                                        //調用寫DS18B20子程序
  283.                 ACALL        DEL60US
  284.                 ACALL        DEL60US
  285.                 MOV                A,#44H                                                        //DS18B20溫度轉換命令,開始裝換溫度
  286.                 ACALL        W_BYTE                                                        //調用寫DS18B20子程序
  287.                 ACALL        DEL60US
  288.                 ACALL        B20_INT                                                        //寫完之后,將DS18B20復位
  289.                 MOV                A,#0CCH                                                        //DS18B20跳過ROM命令
  290.                 ACALL        W_BYTE                                                        //調用寫DS18B20子程序
  291.                 ACALL        DEL60US
  292.                 MOV                A,#0BEH                                                        //DS18B20讀暫存器命令
  293.                 ACALL        W_BYTE                                                        //調用寫DS18B20子程序
  294.                 ACALL        DEL60US
  295.                 ACALL        R_BYTE                                                        //讀溫度低字節
  296.                 MOV                TEM_L,A                                                        //將讀出的溫度低字節保存在40H
  297.                    ACALL        R_BYTE                                                        //讀溫度高字節
  298.                 MOV                TEM_H,A                                                        // 將讀出的溫度高字節保存在41H
  299.                 RET

  300. ;;;;;將從DS18B20中讀出的溫度轉換成整數顯示;;;;;;;;;;;;
  301. TEM_COV:MOV                FLAG0,#'+'                                                //設置當前溫度為正,并且存放在45H
  302.                 MOV                A,TEM_H                                                        //將讀取的溫度高字節送給A
  303.                 SUBB        A,#0F8H                                                        //判斷C的值是否為1,為1則為正,為0則為負
  304.                 JC                TEM0                                                        //看溫度值是否為負,不是(C=1),轉
  305.                 MOV                FLAG0,#'-'                                                //是,置FLAG0為負
  306.                 MOV                A,TEM_L                                                        //將讀取的溫度低字節送給A
  307.                 CPL                A                                                                //求此時負值溫度的補碼
  308.                 ADD                A,#01H
  309.                 MOV                TEM_L,A                                                        //將求得的補碼存放在40H
  310.                 MOV                A,TEM_H                                                         //將讀取的溫度高字節送給A
  311.                 CPL                A
  312.                 ADDC        A,#01H
  313.                 MOV                TEM_H,A                                                        //在將其補碼放在41H
  314. TEM0:        MOV                A,TEM_L                                                        //存放整數部分到TEMPER_NUM
  315.                 ANL                A,#0F0H                                                        //取出溫度低字節的高四位
  316.                 SWAP        A                                                                //將取出的高四位存放在A中低四位位置
  317.                 MOV                TEM_NUM,A                                                //將其存放在42H
  318.                 MOV                A,TEM_H
  319.                 SWAP        A
  320.                 ORL                A,TEM_NUM
  321.                 MOV                TEM_NUM,A
  322.                 RET

  323. /***************LCD顯示*******************/
  324. ;;;;;;LCD初始化子程序;;;;;;;;;;;;
  325. LCD_INT:MOV                A,#00000001H                                        //清屏
  326.                 ACALL        W_COM                                                        //調用讀命令子程序
  327.                 MOV                A,#00111000B                                        //傳輸8位數據,顯示兩行,使用5*7的字符
  328.                 LCALL        W_COM
  329.                 MOV                A,#00001100B                                        //顯示器開,光標關,字符不閃爍
  330.                 LCALL        W_COM
  331.                 MOV                A,#00000110B                                        //字符不動,光標自動右移一格
  332.                 LCALL        W_COM
  333.                 RET
  334. ;;;;;寫入命令子程序(RS=0,RW=0);;;;;;
  335. W_COM:        ACALL        F_BUSY
  336.                 CLR                E
  337.                 CLR                RS
  338.                 CLR                RW
  339.                 SETB        E
  340.                 MOV                P0,A
  341.                 CLR                E
  342.                 RET
  343. ;;;;;寫入數據子程序(RS=1,RW=0);;;;;
  344. W_DAT:        ACALL        F_BUSY
  345.                 CLR                E
  346.                 SETB        RS                                                   
  347.                 CLR                RW
  348.                 SETB        E
  349.                 MOV                P0,A
  350.                 CLR                E
  351.                 RET

  352. ;;;;;查忙子程序;;;;;;;;;;;;;
  353. F_BUSY:        PUSH        ACC
  354.                 MOV                P0,#0FFH
  355.                 CLR                RS                                                                //忙標志
  356.                 SETB        RW                                                
  357. WAIT:        CLR                E                                                                //給使能端有效信號(下降沿觸發)
  358.                 SETB        E
  359.                 JB                P0.7,WAIT                                                //直接尋址位P0.7是否為1,為1則忙,繼續等待
  360.                 POP                ACC
  361.                 RET
  362.                 END                                                
  363.                                                         
復制代碼

所有資料51hei提供下載:
LCD1602時鐘溫度顯示+仿真.zip (77.69 KB, 下載次數: 99)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:765226 發表于 2020-5-30 20:30 | 只看該作者
DJNZ        R6,[        DISCUZ_CODE_1        ]nbsp;這一行為什么會報錯?
回復

使用道具 舉報

板凳
ID:61140 發表于 2022-3-30 08:52 | 只看該作者

DJNZ        R6,[        DISCUZ_CODE_1        ]nbsp;這一行為什么會報錯?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一级视频在线播放 | 久久久av | 日本爱爱 | 中文一区二区 | 成人精品一区二区三区中文字幕 | 亚洲成人av | 5060网一级毛片 | 亚洲视频不卡 | 久草在线| 天堂亚洲 | 国产aaaaav久久久一区二区 | 国产精品久久久久久久久久久久久 | 成人av片在线观看 | 国产精品爱久久久久久久 | 成人国产网站 | 91久久久久久久 | 国产精品精品视频一区二区三区 | 九九99九九精彩46 | 色男人天堂av | 欧美成人在线网站 | 亚洲国产aⅴ成人精品无吗 综合国产在线 | 成人a在线 | 欧美精品一区二区三区在线播放 | 国产伦精品一区二区三区高清 | 国产精品久久国产精品 | h漫在线观看 | 91精品国产一区二区三区动漫 | 日韩欧美中文 | 精品美女视频在免费观看 | 国产成人小视频 | 久久网站免费视频 | 婷婷激情五月网 | 亚洲精品国产成人 | 国产一区二区三区久久久久久久久 | www.亚洲 | 亚洲最大av网站 | 国产精品日日夜夜 | 91国在线高清视频 | 久久欧美高清二区三区 | 国产精品特级片 | 精品一区精品二区 |