導航:首頁 > 操作系統 > 單片機rg1

單片機rg1

發布時間:2022-08-25 03:36:34

❶ 求單片機課程設計實驗 用匯編語言,基於51單片機的定時鬧鍾

MODE_RG EQU40H ;模式選擇

MODE2 EQU 60H ;MODE值

MODE3 EQU61H

MODE4 EQU62H

MODE5 EQU63H

MODE6 EQU64H

MODE1 EQU65H

HOUR EQU41H ;小時緩沖區

MIN EQU42H ;分鍾緩沖區

SEC EQU 43H ;秒緩沖區

TEMP EQU4AH

;*********鬧鍾緩沖區********************

H_ALARM EQU 6AH ;鬧鍾緩沖區

M_ALARM EQU6BH

S_ALARM EQU6CH

F_ALARM EQU6DH

;***********秒錶緩沖區******************

M_SEC EQU76H

S_SEC EQU77H

;*********LED送顯示臨時變數*************

LED0 EQU51H

LED1 EQU52H

LED2EQU53H

LED3 EQU54H

MODE_KEYEQUP3.4

UP_KEY EQUP3.3

DOWN_KEY EQUP3.5

BUF EQU49H

ORG0000H

LJMPMAIN

ORG000BH

LJMPINT_0

ORG001BH

LJMPINT_1

ORG0080H

MAIN: MOVSP,#2FH ;堆棧初始化

MOVMODE_RG,#0 ;MODE_RG寄存器值初始化

MOVLED0,#0FEH ;初始化LED

MOVLED1,#0FDH

MOVLED2,#0FBH

MOVLED3,#0F7H

MOVMODE1,#1

MOVMODE2,#2

MOVMODE3,#3

MOVMODE4,#4

MOVMODE5,#5

MOVMODE6,#6

MOVF_ALARM,#0 ;錯誤2:一開始用CLRF_ALARM,這導致在後面的時候JZF_ALARM運行錯誤,

MOVBUF,#0 ;在於JZ指令是對累加器A全為0或者全為1進行判斷,CLR只能對一位操作

MOVTMOD,#11H ;定時器初始化:定時器0,方式1,定時器1,方式1

MOVIP,#00001000B ;定時器1優先順序高

MOVTH0,#3CH ;定時50MS

MOVTL0,#0B1H

MOVTH1,#0D8H ;定時10MS

MOVTL1,#0F0H

SETBEA

SETBET0

SETBET1

SETBTR0;啟動定時器

MOVHOUR,#0 ;fortest

MOVMIN,#0

MOVSEC,#0 ;定時器計數器,50MS中斷一次,200次則剛好1S

MOVM_SEC,#0

MOVS_SEC,#0

MOVH_ALARM,#0

MOVM_ALARM,#0

MAIN1: LCALLDISPLAY12

LCALLDISPLAY34

;CLRP1.4 TEST

JNBMODE_KEY,KEY_SCAN

MOVA,MODE_RG

CJNEA,MODE6,Y1 ;MODE6秒錶

JNBDOWN_KEY,DEALDOWN ;判斷秒錶開關

JNBUP_KEY,DEALUP

Y1: MOVA,F_ALARM ;判斷鬧鍾

JNZALARM

LJMPMAIN1

;-----------------------------------秒錶開關程序---------------------------

DEALDOWN: LCALLDELY10MS

JBDOWN_KEY,MAIN1

H1: JNBDOWN_KEY,H1

CPLTR1

LJMPMAIN1

DEALUP: LCALLDELY10MS

JBUP_KEY,MAIN1

H2: JNBUP_KEY,H2

MOVM_SEC,#0

MOVS_SEC,#0

CLRTR1

LJMPMAIN1

;-----------------------------------鬧鍾掃描程序---------------------------

ALARM: MOVA,H_ALARM

CPLP1.2

CJNEA,HOUR,EXIT3

MOVA,M_ALARM

CJNEA,MIN,EXIT3

LJMPSTARTALARM

EXIT3: SETBP3.6

LJMPMAIN1

STARTALARM:CPLP3.6

JNBDOWN_KEY,OFFALARM

LJMPS1

OFFALARM: LCALLDELY10MS

JBDOWN_KEY,MAIN1

S2: JNBDOWN_KEY,S2

MOVF_ALARM,#0

SETBP3.6

LJMPMAIN1

S1: LCALLDELAY

LJMPMAIN1

;-----------------------------------鍵盤掃描程序---------------------------

KEY_SCAN: LCALLDELY10MS

JBMODE_KEY,MAIN1

INCMODE_RG

;SETBP1.4 測試

K1: JNBMODE_KEY,K1 ;按鍵直到用戶松開按鍵

K2: MOVA,MODE_RG

CJNEA,#0,DEALMODE;不是在正常顯示模式下則跳轉到模式處理程序

LJMPMAIN1 ;返回主程序

;*******************模式處理程序部分

DEALMODE: MOVTEMP,#0 ;凡轉入MODE處理,則首先清除TEMP

MOVA,MODE_RG ;有MODE_RG值不為5、0

CJNEA,MODE2,M0 ;判斷MODE_RG值,不為1跳轉

LJMPH_GLINT ;模式1,小時位閃爍

M0: CJNEA,MODE3,M1 ;不是模式2,跳轉

LJMPM_GLINT ;模式2,分鍾位閃爍

M1: CJNEA,MODE4,M2 ;不是模式3,跳轉

LJMPH_GLINT

M2: CJNEA,MODE5,M3

LJMPM_GLINT

M3: CJNEA,MODE6,M4

MOVM_SEC,#0

MOVS_SEC,#0

LJMPMAIN1

M4: CJNEA,MODE1,M5

;CLRTR1

LJMPMAIN1

M5: MOVMODE_RG,#0

LJMPMAIN1

;*****************************MODE為1,3,小時位閃爍

//MOVTEMP,HOUR ;將TEMP賦值,防止在加的時候是在隨機值的基礎上增加

H_GLINT: ;CPLP1.0

MOVR0,#28

MOVR1,#28

K4: LCALLDISPLAY12 ;分開顯示

LCALLDISPLAY34

E1: JNBMODE_KEY,K21 ;檢測是否有按鍵按下,有按下則跳轉到分鍾位閃爍

JBUP_KEY,E9 ;判斷加位有無按鍵按下

LJMPUP

E9: DJNZR0,K4

K6: LCALLDISPLAY34

JNBMODE_KEY,K21 ;檢測是否有按鍵按下,有按下則跳轉延時後進行模式判斷

LJMPG1

K21: LCALLDELY10MS ;延時後確定有MODE按鍵按下,將

JBMODE_KEY,H_GLINT

W: JNBMODE_KEY,W

INCMODE_RG

CPLP1.4

LJMPDEALMODE ;確定有按下,MODE+1後返回MODE處理程序

JNBUP_KEY,UP ;判斷加位有無按鍵按下

G1: DJNZR1,K6

LJMPH_GLINT ;調用完畢返回,實現閃爍

K3: LJMPMAIN1 ;可省略

;******************************MODE為2,4,分鍾位閃爍

M_GLINT: MOVR0,#28

MOVR1,#28

K23: CPLP1.7

LCALLDISPLAY12

LCALLDISPLAY34

JNBMODE_KEY,KK ;跳轉,確定是否有按鍵按下

JNBUP_KEY,UP ;判斷加位有無按鍵按下

MOVA,MODE_RG

CJNEA,MODE3,E2 ;在MODE5的情況下要判斷鬧鍾確認鍵有沒按下

LJMPE5

E2: JNBDOWN_KEY,F2

LJMPE5

F2: LJMPONALARM2

E5: DJNZR0,K23

K24: LCALLDISPLAY12

JNBMODE_KEY,KK ;檢測是否有按鍵按下,有按下則跳轉

JNBUP_KEY,UP ;判斷加位有無按鍵按下

MOVA,MODE_RG ;掃描鬧鍾確認鍵

CJNEA,MODE3,E7 ;在MODE5的情況下要判斷鬧鍾確認鍵有沒按下

LJMPG2

E7: JBDOWN_KEY,E8

CPLP1.3

LJMPONALARM2

E8: LJMPG2

KK: LCALLDELY10MS ;去抖

JBMODE_KEY,M_GLINT

W1: JNBMODE_KEY,W1

INCMODE_RG

CPLP1.4

LJMPDEALMODE ;確定有按下,MODE+1後返回MODE處理程序

G2: DJNZR1,K24

LJMPM_GLINT

;*************************位加,處理程序

;***************小時調整

UP: MOVR1,#20

UP11: INCTEMP

UP12: MOVA,MODE_RG ;判斷此時的MODE,根據MODE將臨時變數給對應的賦值

CJNEA,MODE2,AA0 ;不是在MODE2的情況下跳轉

MOVA,TEMP

CJNEA,#24,A_UP1

MOVTEMP,#0

A_UP1: MOVHOUR,TEMP ;為MODE2,將臨時變數賦給小時位

LJMPUP15

AA0: CJNEA,MODE4,UP13//UP13為分鍾調整入口

MOVA,TEMP

CJNEA,#24,A_UP

MOVTEMP,#0

A_UP: MOVH_ALARM,TEMP ;模式3,將臨時變數賦給鬧鍾的小時位

LJMPUP15 ;UP15為顯示入口

;****************分鍾調整入口

UP13: MOVA,MODE_RG

CJNEA,MODE3,UP14 ;不是模式2,跳轉

MOVA,TEMP

CJNEA,#60,DISOVER2

MOVTEMP,#0

DISOVER2: MOVMIN,TEMP

LJMPUP15

UP14: MOVA,TEMP ;上面判斷不是模式2,則必然是模式4

CJNEA,#60,DISOVER3

MOVTEMP,#0

DISOVER3: MOVM_ALARM,TEMP

LJMPUP15

UP15: LCALLDISPLAY12

LCALLDISPLAY34

DJNZR1,UP01

MOVR1,#1 ;

JNBUP_KEY,UP11

UP01: JNBUP_KEY,UP12

UP16: MOVA,MODE_RG ;松開鍵以後按照模式判斷該返回哪種狀態,不能返回DEALMODE函數

CJNEA,MODE2,UP17

LJMPH_GLINT

UP17: CJNEA,MODE3,UP18

MOVSEC,#0 ;每次設置完時間後將秒鍾位置零保證時間准確

LJMPM_GLINT

UP18: CJNEA,MODE4,UP19

LJMPH_GLINT

UP19: CJNEA,MODE5,UP20

LJMPM_GLINT

UP20: LJMPMAIN1

ONALARM2: LCALLDELY10MS ;延時10MS,去抖

JBDOWN_KEY,B2 ;抖動所致,返回分鍾位閃爍

LJMPK42

B2: LJMPM_GLINT

K42: JNBDOWN_KEY,K42

MOVF_ALARM,#0FFH

MOVMODE_RG,#0

LJMPMAIN1

;---------------------------------------中斷程序入口---------------------

;*******************時間中斷0*********************

;錯誤1:中斷程序EXIT處用了MAIN1,導致一直處於中斷狀態

INT_0: PUSHACC

PUSHPSW

MOVTH0,#3CH

MOVTL0,#0B1H

INCBUF

MOVA,BUF

CJNEA,#20,EXIT

TIME: MOVBUF,#0

INCSEC

MOVA,SEC

CJNEA,#60,EXIT

MOVSEC,#00H

INCMIN

MOVA,MIN

CJNEA,#60,EXIT

MOVMIN,#00H

INCHOUR

MOVA,HOUR

CJNEA,#24,EXIT

MOVHOUR,#0

RETI

EXIT: POPPSW

POPACC

RETI

;******************時間中斷1***********************

INT_1: MOVTH1,#0D8H ;定時10MS

MOVTL1,#0F0H

INCS_SEC

MOVA,S_SEC

CJNEA,#100,EXIT4

MOVS_SEC,#0

INCM_SEC

MOVA,M_SEC

CJNEA,#100,EXIT4

MOVM_SEC,#0

EXIT4: RETI

;---------------------------------------顯示-----------------------------

DISPLAY12: MOVA,MODE_RG ;判斷模式,決定是顯示鬧鍾時間還是顯示當前時間

CJNEA,MODE4,DIS0 ;模式四,顯示鬧鍾

LJMPDIS01 ;MODE4

DIS0: CJNEA,MODE5,DIS20

DIS01: MOVR7,H_ALARM ;鬧鍾模式

LJMPDIS2

DIS20: CJNEA,MODE6,DIS21

MOVR7,M_SEC ;秒錶模式,顯示秒錶高位

LJMPDIS2

DIS21: CJNEA,MODE1,DIS1

LJMPDIS22

DIS22: MOVR7,MIN

LJMPDIS2

DIS1: MOVR7,HOUR ;DISPLAY12顯示高位

DIS2: LCALLBCTD ;判斷完畢,調用顯示

;將秒、分分別轉碼,放到R4,R3

MOVA,R4

MOVR3,A

LCALLDIVIDE

MOVDPTR,#NUMTAB

MOVP2,#0FH

MOVP2,LED0

MOVA,45H ;從拆字的出口獲取值

MOVCA,@A+DPTR

MOVP0,A

LCALLDELY10MS

MOVP2,LED1

MOVA,46H

MOVCA,@A+DPTR

MOVP0,A

LCALLDELY10MS

RET

DISPLAY34: MOVA,MODE_RG ;判斷模式,決定是顯示鬧鍾時間還是顯示當前時間

CJNEA,MODE4,DIS31

LJMPDIS32

DIS31: CJNEA,MODE5,DIS35

DIS32: MOVR7,M_ALARM

LJMPDIS34

DIS35: CJNEA,MODE6,DIS41

MOVR7,S_SEC ;秒錶模式,顯示秒錶低位

LJMPDIS34

DIS41: CJNEA,MODE1,DIS33

MOVR7,SEC

LJMPDIS34

DIS33: MOVR7,MIN ;DISPLAY34顯示低位

DIS34: LCALLBCTD

MOVA,R4

MOVR3,A

LCALLDIVIDE

MOVP2,LED2

MOVA,47H

MOVCA,@A+DPTR

MOVP0,A

LCALLDELY10MS

MOVP2,LED3

MOVA,48H

MOVCA,@A+DPTR

MOVP0,A

LCALLDELY10MS

SETBP2.3

RET

;--------------------二翻十:入口:R6R7出口:R2R3R4----------------------

BCTD: MOVR5,#16

CLRA

MOVR2,A

MOVR3,A

MOVR4,A

LOOP: CLRC

MOVA,R7

RLCA

MOVR7,A

MOVA,R6

RLCA

MOVR6,A

MOVA,R4

ADDCA,R4

DAA

MOVR4,A

MOVA,R3

ADDCA,R3

DAA

MOVR3,A

MOVA,R2

ADDCA,R2

DAA

MOVR2,A

DJNZR5,LOOP

RET

;-----------------------拆字:入口:R3R4出口:45H46H47H48H------------------

DIVIDE: MOVA,R3

ANLA,#0FH

MOV46H,A

MOVA,R3

ANLA,#0F0H

SWAPA

MOV45H,A;時拆字45H放時高位,46H放十低位

MOVA,R4

ANLA,#0FH

MOV48H,A

MOVA,R4

ANLA,#0F0H

SWAPA

MOV47H,A;分拆字47H放分高位,48H放分低位

RET

;------------------------------------延時----------------------------------

DELY10MS:MOVR6,#10

D1:MOVR7,#248

DJNZR7,$

DJNZR6,D1

RET

DELAY: MOV74H,#2;延時子程序,12M晶振延時1.002秒

L3: MOV72H,#10

L1: MOV73H,#249

L2: DJNZ73H,L2

LCALLDISPLAY12

LCALLDISPLAY34

JNBDOWN_KEY,OFFALARM1

LJMPS3

OFFALARM1: LCALLDELY10MS

JBDOWN_KEY,S3

S4: JNBDOWN_KEY,S4

MOVF_ALARM,#0

SETBP3.6

LJMPMAIN1

S3: DJNZ72H,L1

DJNZ74H,L3

RET

NUMTAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH;碼表

END

❷ 51單片機跑馬燈程序

不好意思,延時用了樓上的。keil下編譯OK。假設P1接燈。

ORG00H

SJMPSTART

ORG30H

START:

MOVA,#00

SETBC

MOVR0,#9

;從左到右

LOOP1:

RLCA

MOVP1,A

ACALLDELAY

DJNZR0,LOOP1

;從右到左

MOVR0,#9

LOOP2:

RRCA

MOVP1,A

ACALLDELAY

DJNZR0,LOOP2

SJMPSTART

DELAY:

MOVR6,#20

DELAY_0:MOVR5,#255

DJNZR5,$

DJNZR6,DELAY_0

RET

這個程序比較簡單了。再精簡,只能精簡一句,將MOVP1,A放在DELAY函數里。這樣減少一行。

簡單介紹一下:

首先就是你要輪流點亮,就是將1循環一圈,因為你要全滅一次,所以用到CY。

RG00H

SJMPSTART

ORG30H

START:

MOVA,#00;//清空A寄存器

SETBC;//將CY置1,然後帶進位左移就會進入將A的b0

MAINLOOP:;//大循環起始

MOVR0,#9;設置移位次數,要滅一次,所以設置為9

;從左到右

LOOP1:

RLCA;帶進位左移一次;第一次移位結果為01

MOVP1,A;將A中值放入P1點亮對應LED;該句可放在DELAY里,然後從右到左也去掉該句

ACALLDELAY;延時,保持燈亮一段時間,自己根據實際情況調整一下。

DJNZR0,LOOP1;循環,點亮下一個燈,最後一次,A為0,將全滅一次,CY為1

;從右到左

MOVR0,#9;設置循環次數

LOOP2:;循環起始表示

RRCA;帶進位右移,第一次結果為80H

MOVP1,A;更新P1點亮對應LED

ACALLDELAY;延時,保持燈亮一段時間

DJNZR0,LOOP2;循環,點亮下一個燈

SJMPMAINLOOP;循環,重新開始下一輪

如果你是管腳輸出低LED才亮,只需將MOVA,#00和SETBC改為MOVA,#0FFH和CLRC即可。

方案2:位定址區00做標志,為0從左到右,該標志為1從右到左

ORG00H

SJMPSTART

ORG30H

START:

MOVA,#00

SETBC

MOVR0,#9

CLR00H

LOOP1:

RLLED:

JB00H,RRLED

RLCA

AJMPDISP

RRLED:

RRCA

DISP:

MOVP1,A

ACALLDELAY

DJNZR0,LOOP1

CPL00H

AJMPSTART

DELAY:

MOVR6,#20

DELAY_0:MOVR5,#255

DJNZR5,$

DJNZR6,DELAY_0

RET

下面是方案1的流程圖,這種流程圖不知怎麼寫好,而且寫出來基本是對每行的代碼的解釋。

❸ 怎樣控制單片機引腳輸出電流大小,如果要做RGB三原色的led燈的話。。

單片機的IO埠的輸出狀態只有 通和斷

也就是 0 和 1

是沒有辦法控制你所說的電流大小的

至於三色LED的顏色控制

那是控制這三基色的三個發光二級管點亮時間

也是控制單片機對應的引腳通斷時間

發光二極體的點亮時間大小,用肉眼觀看的話,就是亮度的大小

所以就可以根據這三個二極體發亮的時間來調整 最終的輸出色彩

❹ 如何用51單片機通過溫度變化調節RGB燈珠的顏色(溫度高冷色,溫度低暖色)

分別按不同的序列組合點亮就可以顯示出:紅(R亮)、黃(RG亮)、綠(G亮)、青(GB亮)、藍(B亮)、紫(BR亮)、白(RGB都亮)、黑(RGB都不亮)。(黑不算,次序為由暖到冷)

❺ 超簡單的單片機模擬

org 0000h
ljmp start
org 0003h
ljmp intr
org 0030h
start:
mov p1,#0ffh
setb it0
setb ea
setb ex0
ljmp $
intr:
mov a,p1
swap a
orl p1,#0fh
clr ie0
reti
end
改成上面的就行了,原來存在的錯誤有:
1.「orl p1,#00f0h」 ,#00f0h書寫不規范,並且#0f0h會使按鍵無效;
2. 「mov p1,a」,中斷讀完按鍵後會使按鍵輸入口電平變化,改為「orl p1,#0fh 」;
3.沒有中斷標志復位「clr ie0」;

你的圖冗餘元件太多了。

❻ 單片機介面電路設計

微壓力感測器信號是控制器的前端,它在測試或控制系統中處於首位,對微壓力感測器獲取的信號能否進行准確地提取、處理是衡量一個系統可靠性的關鍵因素。後續介面電路主要指信號調節和轉換電路,即能把感測元件輸出的電信號轉換為便於顯示、記錄、處理和控制的有用電信號的電路。由於用集成電路工藝製造出的壓力感測器往往存在:零點輸出和零點溫漂,靈敏度溫漂,輸出信號非線性,輸出信號幅值低或不標准化等問題。

電橋放大電路

由於所測出的微壓力感測器兩端的電壓信號較弱,所以電壓在進行A/D 轉換之前必須經過放大電路的放大(見圖2)。INA118 由3 個運算放大器組成差分放大結構,內置輸入過壓保護,且可通過外置不同大小的電阻實現不同的增益(從1 到1 000),因而應用范圍很廣。圖2 電橋放大電路

通過在腳1 和腳8 之間外接一電阻Rg 來實現不同的增益,該增益可從1 到1 000 不等。電阻Rg 為式中G 為增益。由於Rg 的穩定性和溫度漂移對增益有影響,因此,在需要獲得高精度增益的應用中對Rg 的要求也比較高,應採用高精度、低雜訊的金屬膜電阻。此外,高增益的電路設計中的Rg 值較小,如G=100時的Rg 值為1.02 kΩ;G=1 000 時的Rg 值為50.5Ω。

AD7715 介面電路

為了實現對微壓力的實時測量,使用 16 位的AD7715 對輸出電壓進行采樣測量,其中AD780 提供2.5V 高精度基準電壓。P3.1 腳提供了AD 工作所需的時鍾,P1.4 和P1.5 腳接收和發送通訊數據,P1.6 是片選信號,P1.7 接DRDY ,AT89S52 可以通過查詢P1.7 的狀態來判斷是否可以讀取AD 轉換結果。A/D 介面電路如圖3所示。

❼ 單片機中SFG是什麼

各個單片機的資料 和IO口 還有就是系統系統寄存器的名稱都不一樣.
SFG 你所用的單片機製造商官網查詢

❽ 單片機8個流水燈從led8亮到led1每次亮一個並保存已亮燈狀態

摘要 這個流水燈是很普通的一種花樣,假設LED接P1口,程序如下:

❾ 單片機實現並行輸入轉串列輸出

74hc595是具有8位移位寄存器和一個存儲器,三態輸出功能。移位寄存器和存儲器是分別的時鍾。數據在sck的上升沿輸入,在rck的上升沿進入的存儲寄存器中去。如果兩個時鍾連在一起,則移位寄存器總是比存儲寄存器早一個脈沖。移位寄存器有一個串列移位輸入(si),和一個串列輸出(q7』),和一個非同步的低電平復位,存儲寄存器有一個並行8位的,具備三態的匯流排輸出,當使能
oe時(為低電平),存儲寄存器的數據輸出到匯流排。
qb--|1
16|--vcc
qc--|2
15|--qa
qd--|3
14|--si
qe--|4
13|--/g
qf--|5
12|--rck
qg--|6
11|--sck
qh--|7
10|--/sclr
gnd-|8
9|--qh'
74595的數據端:
qa--qh:
八位並行輸出端,可以直接控制數碼管的8個段。
qh':
級聯輸出端。我將它接下一個595的si端。
si:
串列數據輸入端。
74595的控制端說明:
/sclr(10腳):
低點平時將移位寄存器的數據清零。通常我將它接vcc。
sck(11腳):上升沿時數據寄存器的數據移位。qa-->qb-->qc-->...-->qh;下降沿移位寄存器數據不變。(脈沖寬度:5v時,大於幾十納秒就行了。我通常都選微秒級)
rck(12腳):上升沿時移位寄存器的數據進入數據存儲寄存器,下降沿時存儲寄存器數據不變。通常我將rck置為低電平,當移位結束後,在rck端產生一個正脈沖(5v時,大於幾十納秒就行了。我通常都選微秒級),更新顯示數據。
/g(13腳):
高電平時禁止輸出(高阻態)。如果單片機的引腳不緊張,用一個引腳控制它,可以方便地產生閃爍和熄滅效果。比通過數據端移位控制要省時省力。
74595的主要優點是具有數據存儲寄存器,在移位的過程中,輸出端的數據可以保持不變。這在串列速度慢的場合很有用處,數碼管沒有閃爍感。
應用如下:
以下是用c語言編寫的,採用動態掃描方式顯示0123這四個數字,此程序是經過模擬模擬的。
//#################################################################
//程序名稱:8位數碼管顯示程序
//程序功能:讓8位數碼管顯示display_7leds[8]中的內容
//程序說明:使用時改變display_7leds[8]中的內容,調用wr7leds()函數即可
//#################################################################
#include
<reg51.h>
#include
<intrins.h>
#define
uchar
unsigned
char
#define
uint
unsigned
int
//#############管腳定義#######################
#define
port_led
p0
//led位選信號輸入管腳
sbit
sclk=p2^0;
//595移位時鍾信號輸入端
sbit
st=p2^1;
//595鎖存信號輸入端
sbit
da=p2^2;
//595數據信號輸入端
//#############################################
//共陰極數碼管顯示代碼:7
6
5
4
3
2
1
0
//
a
b
c
d
e
f
uchar
code
led_7seg[16]={0xfc,0x60,0xda,0xf2,//0,1,2,3,
0x66,0xb6,0xbe,0xe0,
//4,5,6,7,
0xfe,0xe6,0xee,0x3e,
//8,9,a,b,
0x9c,0x7a,0x9e,0x8e};//c,d,e,f
//#####################################################
//名稱:wr595()向595發送一個位元組的數據
//功能:向595發送一個位元組的數據(先發低位)
//#####################################################
void
wr595(uchar
wrdat)
{
uchar
i;
sclk=0;
st=0;
for(i=8;i>0;i--)//循環八次,寫一個位元組
{
da=wrdat&0x01;
//發送bit0

wrdat>>=1;
//要發送的數據右移,准備發送下一位
sclk=0;
//移位時鍾上升沿
_nop_();
_nop_();
sclk=1;
_nop_();
_nop_();
sclk=0;
}
st=0;
//上升沿將數據送到輸出鎖存器
_nop_();
_nop_();
st=1;
_nop_();
_nop_();
st=0;
}
//##########################################################
//
延時函數
//##########################################################
void
delay(uint
del)
{
while(del--)
{
;
}
}
//##########################################################
//名稱:wr7leds()8個led顯示數字函數
//功能:向595發送一個位元組的數據,然後發送位選信號
//##########################################################
void
wr7leds(void)
{
uchar
i,wx;
wx=0x01;
//位選信號初始化
for(i=0;i<4;i++)
//循環4次寫4個數據
{
wr595(led_7seg[i]);
//傳送顯示數據
port_led=~wx;
//送位選信號
wx<<=1;
//位選信號左移,准備顯示下一個數字
delay(50);
//延時,(決定亮度,和閃爍)
}
}
//##########################################################
//主函數
//##########################################################
main(void)
{
while(1)
{
wr7leds();
//向74hc595發送數據並顯示
}
}

閱讀全文

與單片機rg1相關的資料

熱點內容
電影和電視播放器 瀏覽:112
櫻桃小說by小花喵 瀏覽:513
英國看片網站叫什麼名字 瀏覽:676
法蘭克plc編程軟體 瀏覽:359
怎麼看pdf的字體 瀏覽:634
和李采潭合作的女演員有哪些 瀏覽:430
日本那部電影病嬌男主要當女主的狗是校園電影 瀏覽:210
抗日戰爭片400部 瀏覽:730
編程可以賺錢嗎 瀏覽:729
eclipseandroid建立工程 瀏覽:732
大胸女友主演 瀏覽:276
佛教電影《解怨》國語 瀏覽:474
哪部電影男孩叫安東 瀏覽:13
有騎木驢的電影叫什麼感覺 瀏覽:265
windows重啟mysql命令 瀏覽:730
單片機輸入輸出口接收脈沖 瀏覽:121
控制電腦滑鼠的命令 瀏覽:213
男男強暴電影 瀏覽:604
便利店送貨上門app叫什麼 瀏覽:468
win8怎麼打開命令行 瀏覽:129