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

單片機RT01

發布時間:2022-06-08 21:29:53

『壹』 有沒有大神懂單片機,看圖片可以幫忙回答一下嗎

單片機61580組成1553b


數據傳輸作為匯流排網路的重要組成部分,是數據通訊網路和計算機網路的基礎。採用數據匯流排傳輸方案組建的測控網路,較好地解決傳統的測控系統過於復雜、笨重、可靠性低等缺點。數據匯流排作為飛機航電系統中首先運用的數字電子設備,其中MIL-STD-1553B是其典型代表,它是20世紀70年代美國公布的一種串列多路數據匯流排標准,利用一條屏蔽雙絞線進行帶有時鍾信息的數據傳輸。它最初是為飛機提出的內部電子系統連網標准。後來由於其可靠性高、傳輸率較高、技術成熟、易於擴展等優點得到廣泛應用,尤其在航空、航天測控網路中倍受關注。


1、 1553B匯流排簡介


1553B匯流排是一種廣播式分布處理的計算機網路,可掛接32個終端,所有終端共享一條消息通路,任一時刻網路中只有一個終端在發送消息,傳送中的消息可以被所有終端接收,實際接收的終端通過地址來識別。網路結構簡單、終端擴展方便,任一終端的故障都不會造成整個網路的故障,匯流排控制器則可以通過備份提高可靠性,但網路對匯流排本身的故障比較敏感,因此通常採用雙冗餘度匯流排。


1553B匯流排強調了整個系統的實時性,即傳輸一個固定消息所需的時間短。1553B匯流排按指令/響應的方式非同步操作,即匯流排上所有消息傳輸都由匯流排控制器發出的指令來控制,這種方式適合集中控制的分布式處理系統。1553B通信協議中反映了支持電子系統中同步/非同步通信的特性。


1553B匯流排為多冗餘度匯流排型拓撲結構,具有雙向傳輸特性,其傳輸速度為1

Mbit·s-1,傳輸方式為半雙工方式,採用曼徹斯特Ⅱ型碼。它採用指令/響應型通信協議,具有3種終端類型:(1)匯流排控制器(BC),是在匯流排上惟一被安排為執行建立和啟動數據傳輸任務的終端。(2)遠程終端(RT),是用戶子系統到數據匯流排上的介面,能在BC的控制下提取或吸收數據。(3)匯流排監視器(MT),是監控匯流排上的信息傳輸,以完成對匯流排上的數據源進行紀錄和分析,但其本身不參與匯流排通信。


2、 BU-61580簡介


BU-61580是美國DDC公司為MIL-STD-1553B標准設計的超大規模介面協議晶元,它是當前1553B匯流排應用系統中流行的器件,圖1是BU-61580的內部功能框圖。它內部功能強、介面靈活、便於控制,有各種封裝形式和供電電壓供用戶選擇,是1553B等匯流排標准應用中較常用的介面晶元。



該板卡的軟體主流程圖如圖3(a),板卡加電後,軟體首先對BU-61580進行初始化設置,在主循環里分別對RS232串口標志、50ms定時標志、外部中斷標志進行查詢,該板卡的對外介面為RS232串口,接收到外部RS232命令後,應根據命令做出不同的操作,如發送1553B輸入命令等;該板卡會50ms周期發出1553B輸出命令,讀取回傳數據,通過RS232板卡送出;當發出1553B命令後,BU-61580啟動命令傳輸,傳輸完畢後或回傳數據完畢,BU-61580會產生外部中斷,要求單片機讀取數據。圖3(b)為啟動發送1533B命令的流程圖。


4、 結束語


BU-61580的應用較為復雜,文中介紹了一部分的應用技術,但其他功能的軟體設計過程與之類似,僅供參考。

『貳』 基於51單片機和熱敏電阻的溫度控制系統

給你個網站
你可以去看一下
http://www.sinochip.net/TechSheet/67.htm

本程序工作過程如下:

;1、開機後首先進行初始化,初始化後顯示「P」1秒,提示系統進入測試工作狀態,顯

; 示完成後,進行溫度測試。

;2、溫度測試的過程是這樣的:

; * T0置為計數方式,對T0腳(即P3.5)的脈沖計數,工作方式2,初值為255

; * 將T1置為定時方式,工作方式2,初值為0

; * 從P3.4口送單穩觸發脈沖,使555輸出單穩脈沖(正脈沖),該脈沖寬度隨熱敏

; 電阻阻值而變化。

; * 開T0、T1中斷,啟動T0、T1。此時T1自動對內部機器周期計數,當TL1溢

; 出時,產生T1中斷。在T1中斷處理程序中,將RAM 21H單元加1(即21H單

; 元存放脈沖寬計數值高位)後返回主程序。

; * 當來自P3.5的單穩脈沖結束(即下降沿到來)時,TL0計數器加1並溢出,產

; 生T0中斷。在T0中斷處理程序中,關T0、T1中斷,並將TL1中的的內容讀

; 到RAM 20H單元(20H單元存放脈寬計數值的低位)。

; * 查表求溫度值

; NTTAB是脈寬計數值與溫度的對照表,按低溫到高溫的次序存放,即第一、第

; 二單元存放-100C時的脈寬計數值,依此類推,第121和122單元則存放+500C

; 時的脈寬計數值。

; 將20H、21H中的計數值與NTTAB中的計數值依次進行比較,直至20H、21H

; 中的值小於NTTAB中的計數值為止。而比較的次數就對應溫度的整數值,二計

; 數值之差與對照表相鄰兩計數值的商即為小數位。

;3、程序中除了對-100C到+500C進行測試外,還有開路(計數值過大)、短路檢測(計

; 數值過小)、負超溫檢測、正超溫檢測,並有相應的顯示。

;4、將檢測值(溫度值或其他結果)顯示1秒,然後再重復溫度檢測。

;需要說明的是:本程序雖包括了測溫的全過程,但未考慮軟硬體的自檢,軟體濾波等部

;分。

;電容C4、熱敏電阻RT的參數決定單穩脈沖的寬度,而最終的計數值除了與單穩

; 脈沖的寬度有關外,還與晶振頻率有關,因而在RT的型號確定後要根據系統對精

; 度和解析度等的要求選擇C4的值。本程序中NTTAB脈寬計數值與溫度對照表是在

; 熱敏電阻為MF53-1型負溫熱敏電阻加12K精密電阻與之並聯,C4為1μ,晶振為

; 4MHz的條件下得到的。數據不十分准,僅做參考。你可以在元件參數定了後,可在

; 調試程序時用可變電阻箱代替熱敏電阻,在程序測出計數值處設斷點,讀出每個標

; 准阻值所對應的計數值(即20H、21H中的內容),自己將NTTAB建立起來。

; * * * * * * * * * * * * * * * * * * * * * * * * * *

; * 用89C2051控制的數字測溫儀 *

; * 源程序清單 *

; * * * * * * * * * * * * * * * * * * * * * * * * * *

ORG 0000H

AJMP MAIN ;轉主程序

ORG 000BH

AJMP WT0 ;T0中斷入口

ORG 001BH

AJMP WT1 ;T1中斷入口

;主程序

ORG 030H

MAIN: MOV IE,#00H ;關中斷

MOV SP,#40H ;設堆棧指針SP為40H

SETB P3.5 ;將P3.5口置」1」

MOV 30H,#0CH ;「P3 」送顯示緩沖區30H~33H

MOV 31H,#0EH

MOV 32H,#0EH

MOV 33H,#0EH

MAIN0: ACALL D1S ;調顯示1秒子程序

MOV P1,#0FFH ;關顯示

CLR 20H ;清脈寬計數值存放區20H~21H

CLR 21H

CLR 22H ;清單穩脈沖結束標志22H

MOV TH0,#0FFH ;置T0計數初值255

MOV TL0,#0FFH

MOV TH1,#00H ;置T1的計數初值0

MOV TL1,#00H

MOV TMOD,#26H ;置T0為計數方式,方式2;T1為定時方式。方式2

SETB EA ;允許T0、T1中斷

SETB ET0

SETB ET1

SETB TR0 ;開T0中斷

CLR P3.5 ;送單穩觸發脈沖

NOP

NOP

NOP

NOP

SETB P3.5

SETB TR1 ;開T1中斷

MAIN1: CJNE 22H,#01H,MAIN2 ;單穩脈沖未結束,轉檢查是否超時

AJMP MAIN3 ;單穩脈沖結束,轉取脈寬計數值

MAIN2: CJINE 21H,#08H,MAIN1 ;未超時,轉等待單穩脈沖結束

CLR EA

CLR ET0

CLR ET1

CLR TR0

CLR TR1

MOV 30H,#0DH ;開路提示「E1」送顯示緩沖區,轉顯示

MOV 31H,#01H

MOV 32H,#0EH

MOV 33H,#0EH

AJMP MAIN0

MAIN3: CJNE 21H,#00H,MAIN4 ;單穩脈沖結束,先判斷是否短路。不是,轉查表程序。

MOV 30H,#0DH ;短路,短路提示「E2」送顯示緩沖區,轉顯示

MOV 31H,#02H

MOV 32H,#0EH

MOV 33H,#0EH

AJMP MAIN0

MAIN4: ACALL NTTR ;調查表子程序

AJMP MAIN0

;查表求溫度值子程序

NTTR: MOV R2,#00H ;清計數與溫度對照表偏移量寄存器R2

MOV DPTR,NTTAB ;DPTR指向計數與溫度對照表首址

NTTR1: CLR C ;20H、21H中的內容與NTTRB相減,並將差值存23H、24H

MOV R3,#02H

MOV R0,#20H

MOV R1,#23H

NTTR2: MOV A,R2

MOVC A,@A+DPTR

SUBB A,@R0

MOV @R1,A

INC R0

INC R1

INC R2

CJNE R2,#122,NTTR3 ;若未到NTAB表尾,繼續比較

POVER:JC NTTR30 ;到表尾,查到對應溫度,轉求溫度值

MOV 30,#0EH ;到表尾,查到對應溫度,正超溫提示「UUU」送顯緩區

MOV 31H,#0BH

MOV 32H,#0BH

MOV 33H,#0BH

RET ;返回主程序

NTTR3: DJNZ R3,NTTR2

JNC NTTR1 ;未查到對應溫度值,繼續查表

NTTR30:MOV A,R2 ;已查到對應溫度,由偏移量求出整數部分,暫存R4

CLR C

SUBB A,#02H

RR A

MOV R4,A

MOV R1,#23H ;求溫度值的小數部分:+X/2送B

MOV A,@R1

CPL A

INC A

RR A

MOV B,A

NTTR4: DEC R2 ;Ni+1送20H、21H

MOV R0,#21H

MOV A,R2

MOVC A,@A+DPTR

MOV @R0, A

DEC R0

DEC R2

MOV A, R2

MOVC A,@A+DPTR

MOV @R0, A

DEC R2 ;求+i/2從A

DEC R2

MOV R3,#02H

CLR C

NTTR5: MOV A,R2

MOVC A,@A+DPTR

SUBB A,@R0

JNC NTTR50

CLP A

INC A

NTTR50:RR A

MOV R5,A

MOV A,B ;+x/2*10/+i得到溫度值的小數部分

JZ NTTR6

MOV B, #05H

MUL AB

MOV B,R5

DIV AB

MOV 20H,A ;小數部分送20H

AJMP NTTR7

NTTR6: MOV 20H,#00H

NTTR7: MOV A,#0AH ;判整數部分為正還是負

CLR C

SUBB A,R4

JC PTEMP

NTEMP:CJNE A,#0AH,NTEMP1 ;為負

MOV 30H,#0EH ;「-X」送顯示緩沖區高三位

MOV 31H,#0AH

MOV 32H,A

AJMP NTEMP2

NTEMP1:MOV 30H,#0AH ;「-10」 送顯示緩沖區高三位

MOV 31H,#01H

MOV 32H,#00H

NTEMP2:MOV A,#0AH ;修正小數部分後,將小數部分送顯緩低三位

CLR C

SUBB A,20H

MOV 33H,A

RET ;返回主程序

PTEMP: MOV 30H,#0EH ;為正。「 」送顯緩最高位

MOV A,R4 ;溫度值整數部分送顯緩中間兩位

MOV B,#0AH

DIV AB

JNZ PTEMP1

] MOV 31H,#0EH

JMP PTEMP2

PTEMP1:MOV 31H,A

PTEMP2:MOV 32H,B

MOV 33H,20H ;小數部分送顯緩最低位

RET ;返回主程序

;顯示子程序(將顯緩區的內容循環顯示一遍,每位顯示1ms後,關顯示返回主程序)

DSP: MOV R2,#01H

MOV R0,#30H

MOV DPTR,#TAB

DSP1: MOV A,@R0

MOVC A,@A+DPTR

MOV P1,A

ORL P3,R2

ACALL D1MS

MOV A,R2

RL A

MOV R2,A

CJNE R2,#10H,DSP2

ANL P3,#0F0H

RET

DSP2: INC R0

AJMP DSP1

;延時1ms子程序

D1MS: MOV R7,#166

D1MS1: DJNZ R7,D1MS1

RET

;顯示1秒子程序

D1S: MOV R6,#04H

D1S1: MOV R5,#250

D1S2: ACALL DSP

DJNZ R5,D1S2

DJNZ R6,D1S1

RET

;段碼表

TAB: DB 40H,79H,24H,30H,19H :0.,1.,2.,3.,4.

DB 12H,02H,78H,00H,10H :5.,6.,7.,8.,9.

DB 3FH,41H,0CH,06H,0FFH :-.,U.,P.,E.,滅

;T0中斷處理程序

WT0: MOV A,TL1 ;將T1計數值送20H

MOV 20H,A

CLR EA ;關中斷

CLR TR0 ;T0停止計數

CLR TR1 ;T1停止計數

MOV 22H,#01H ;置單穩脈沖結束標志

RETI ;返回主程序

;T1中斷處理程序

WT1: INC 21H ;脈寬計數值高位加1

RETI ;返回主程序

;脈寬計數與溫度對照表

NTTBL: DB 0D0H,05H,0B2H,05H,96H,05H,72H,05H

DB 52H,05H,35H,05H,15H,05H,0F6H,04H

DB 0D8H,04H,0B9H,04H,9CH,04H,81H,04H

DB 65H,04H,4AH,04H,30H,04H,14H,04H

DB 0FAH,03H,0E0H,03H,0C6H,03H,0ADH,03H

DB 95H,03H,7CH,03H,64H,03H,4CH,03H

『叄』 單片機程序出錯

[","58","59",
};

]這里59後面多了個【,】。

『肆』 什麼是單片機的最小系統

單片機的最小系統是指單片機、晶振電路、復位電路。

單片機不是完成某一個邏輯功能的晶元,單片機把一個計算機系統集成到一個晶元上。相當於一個微型的計算機,和計算機相比,單片機只缺少了I/O設備。

概括地講:一塊晶元就成了一台計算機。它的體積小、質量輕、價格便宜、為學習、應用和開發提供了便利條件。同時,學習使用單片機是了解計算機原理與結構的最佳選擇。

(4)單片機RT01擴展閱讀:

單片機技術在節能控制中的應用主要分為以下幾個方面:智能電子設備在外出狀態下,大部分是處於輕負載的模式,這時候就需要通過節能控制,確保其基礎功能的前提下,進一步降低電量的消耗。

單片機通過對智能電子設備中數據的收集,可以大致推斷當前設備處於較低的負載,這時可以降低電壓及電流的輸出,達到節能的目的。

單片機可以控制能耗的節奏,例如:在小米手環中,睡眠和運動步數等數字,這些數字收集後會在本地進行存儲,然後以分鍾級的頻率進行上報。

『伍』 單片機串口 把單片機程序設置為接收到1時亮燈,燈不亮,為什麼把程序改成 接收到 '1' 就可以亮了

首先需要說明一點

你在電腦端利用串口助手發送的 1,是以字元形式發送的,並不是純數字

然而單片機中,接收的只能是字元或十六進制數,所以一般的串口助手上

同樣只能選擇字元或十六進制數,所以不能直接發送數值型數據

如果你想發送數字,那麼就要在單片機中進行格式轉換,或直接使用十六進制數表示

單片機中字元的表達方式就是用兩個單引號括起來 ' '

所以你的語句 if(myKEY == '1') 是可以成立的,但其表達的數值則是 31

你把數值31賦值給埠,就相當於把大於0的數值賦給埠,單片機中大於0的數值都屬於 1

所以你的整個程序時成立的

另外你的串口接收中斷函數中,寫的有些麻煩,可以簡化成下面這樣

void int_int0(void) interrupt 4 //串口中斷程序
{
myKEY = SBUF; //接收電腦發送過來的鍵盤值
while(!RI); //等待接收完成,最好是加入這個命令,以免出錯
RI = 0; //不用特意去判斷 RI,這是中斷,只有數據來的時候才會進入此函數
}

『陸』 單片機R1R2...R7什麼啊

寄存器的名字,他是單片機內部RAM一部分地址的別稱。例如ATM89S51的內部RAM的地址0x00的名字就叫R1,0x01就叫R2.當然你也可以把它叫做其它的名字,要在頭文件(例如reg51.h)中修改,但這是不必要的。
建議找一本入門的單片機書先看一下。

『柒』 單片機與計算機有什麼區別

簡單的從本質上來說單片機與計算機沒有區別,單片機的縮寫單片微型計算機,同樣有匯流排(南橋北橋),內存(內存條),外存(硬碟),系統電腦有windows、Linux、macOS(Linux、macOS一個祖宗的)),單片機同樣也可以嵌入操作系統,(Linux、ucos,RT.......巴啦巴拉的),麻雀雖小,但是五臟俱全,但是區別也是有的,例如計算機性能上的優勢不是單片機所能比擬的。

『捌』 求單片機 實時時鍾 電路 圖和配套代碼

實時的話肯定要用DS1302了,給你發個吧,用STC89c52寫的:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
//引腳定義
sbit TIMERCLK=P3^2; //DS1302同步串列時鍾引腳
sbit TIMERIO=P3^3; //DS1302數據輸入輸出引腳
sbit TIMERRST=P3^4; //DS1302RST引腳
sbit P2_0=P2^0;
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
sbit P2_7=P2^7;
sbit P3_5=P3^5;
sbit P3_6=P3^6;
sbit P3_7=P3^7;
//sbit SEC_7=SEC^7;
//sbit WDT=P1^3; //看門狗"喂狗"引腳
uchar code TABLE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//#define DIGPORT

//全局變數聲明
uchar bdata DS1302dat; //DS1302讀寫過程中的命令或數據
sbit ds1302datHbit=DS1302dat^7; //位定義,用於數據寫入
sbit ds1302datBit=DS1302dat^0; //位定義,用於數據讀出
uchar bdata DS1302adr; //DS1302讀寫過程中所訪問的單元地址
sbit ds1302adrBit=DS1302adr^0; //
uchar idata SEC;
uchar MIN;
uchar HR;
uchar DATE;
uchar MONTH;
uchar DAY;
uchar YEAR;
uchar disp1;
uchar disp2;
uchar disp3;
uchar disp4;
uchar disp5;
uchar disp6;
uchar disp7;
uchar disp8;
uchar tiao;
uchar tt;
uchar flag;

// sbit SEC_7=SEC^7;
void delay(uchar time)
{
uchar i,j;
for(i=0;i<time;i++)
{
for(j=0;j<time;j++)
{
// WDT=~WDT;

}
}
}

void writeDS1302(uchar dsRamAdr,uchar ds1302data)
{
uchar i;
TIMERCLK=0;
delay(2);
TIMERRST=1;
delay(2);
DS1302adr=dsRamAdr;
DS1302dat=ds1302data;
for(i=0;i<8;i++)
{
CY=0;
TIMERCLK=0;
CY=ds1302adrBit;
TIMERIO=CY;
delay(2);
TIMERCLK=1;
DS1302adr=DS1302adr>>1;
}
for(i=0;i<8;i++)
{
CY=0;
TIMERCLK=0;
CY=ds1302datBit;
TIMERIO=CY;
delay(2);
TIMERCLK=1;
DS1302dat=DS1302dat>>1;
}
TIMERRST=0;
delay(2);
TIMERRST=0;
}

uchar readDS1302(uchar DS1302Adr)
{
uchar i;
TIMERCLK=0;
delay(2);
TIMERRST=1;
delay(2);
DS1302adr=DS1302Adr;
for(i=0;i<8;i++)
{
TIMERCLK=0;
TIMERIO=ds1302adrBit;
delay(2);
TIMERCLK=1;
DS1302adr=DS1302adr>>1;
}
TIMERIO=1;
for(i=0;i<7;i++)
{
TIMERCLK=0;
ds1302datHbit=TIMERIO;
delay(2);
TIMERCLK=1;
DS1302dat=DS1302dat>>1;
TIMERCLK=0;
ds1302datHbit=TIMERIO;
}
TIMERRST=0;
delay(2);
TIMERCLK=0;
return DS1302dat;
}

void DS1302Inital(void)
{
uchar ds1302st;
TIMERCLK=0;
TIMERRST=0;
ds1302st=readDS1302(0x0c1);
if(ds1302st!=0x55)
{

writeDS1302(0x8e,0x00);
//writeDS1302(0x80,0x00);
writeDS1302(0x82,0x00);
writeDS1302(0x84,0x16);
writeDS1302(0x86,0x19);

writeDS1302(0x88,0x09);
writeDS1302(0x8a,0x02);
writeDS1302(0x8c,0x00);

writeDS1302(0x90,0xa6);
writeDS1302(0x0c0,0x55);
writeDS1302(0x80,0x00);
}
}

void readRTC(void)
{
MONTH=readDS1302(0x89);
DATE=readDS1302(0x87);
HR=readDS1302(0x85);
MIN=readDS1302(0x83);
SEC=readDS1302(0x81);
}

void disp(void)
{
if(MIN==10)writeDS1302(0x82,0x10);
if(MIN==26)writeDS1302(0x82,0x20);
if(MIN==42)writeDS1302(0x82,0x30);
if(MIN==58)writeDS1302(0x82,0x40);
if(MIN==74)writeDS1302(0x82,0x50);
if(MIN==90)writeDS1302(0x82,0x00);
if(HR==10)writeDS1302(0x84,0x10);
if(HR==26)writeDS1302(0x84,0x20);
if(HR==36)writeDS1302(0x84,0x00);
//if(HR==58)writeDS1302(0x82,0x40);
//if(HR==74)writeDS1302(0x82,0x50);
//if(HR==90)writeDS1302(0x82,0x00);
if(DATE==10)writeDS1302(0x86,0x10);
if(DATE==26)writeDS1302(0x86,0x20);
if(DATE==42)writeDS1302(0x86,0x30);
if(DATE==50)writeDS1302(0x86,0x01);
//if(DATE==74)writeDS1302(0x82,0x50);
//if(DATE==90)writeDS1302(0x82,0x00);
disp2=SEC/16;
disp1=SEC%16;
//if(flag1==0)
//if(MIN==10||MIN==26||MIN==42||MIN==58||MIN==74){MIN=MIN+6;}

disp4=MIN/16;
disp3=MIN%16;//flag1=0;
disp6=HR/16;
disp5=HR%16;
disp8=DATE/16;
disp7=DATE%16;
P2_0=0;
P0=TABLE[disp1];
delay(12);
P2_0=1;
P2_1=0;
P0=TABLE[disp2];
delay(12);
P2_1=1;
P2_2=0;
P0=TABLE[disp3];
delay(12);
P2_2=1;
P2_3=0;
P0=TABLE[disp4];
delay(12);
P2_3=1;
P2_4=0;
P0=TABLE[disp5];
delay(12);
P2_4=1;
P2_5=0;
P0=TABLE[disp6];
delay(12);
P2_5=1;
P2_6=0;
P0=TABLE[disp7];
delay(12);
P2_6=1;
P2_7=0;
P0=TABLE[disp8];
delay(12);
P2_7=1;
}

void dispA(void)
{
if(SEC==10||SEC==26||SEC==42||SEC==58||SEC==74){SEC=SEC+6;}
//if(SEC==74||SEC==58||SEC==42||SEC==26||SEC==10){SEC=SEC+6;}
disp2=SEC/16;
disp1=SEC%16;
//disp4=MIN/16;
//disp3=MIN%16;
//disp6=HR/16;
//disp5=HR%16;
//disp8=DATE/16;
//disp7=DATE%16;
if(SEC==90)SEC=0;
P2_0=0;
P0=TABLE[disp1];
delay(12);
P2_0=1;
P2_1=0;
P0=TABLE[disp2];
delay(12);
P2_1=1;
P2_2=0;
P0=TABLE[disp3];
delay(5);
P2_2=1;
P2_3=0;
P0=TABLE[disp4];
delay(5);
P2_3=1;
P2_4=0;
P0=TABLE[disp5];
delay(5);
P2_4=1;
P2_5=0;
P0=TABLE[disp6];
delay(5);
P2_5=1;
P2_6=0;
P0=TABLE[disp7];
delay(5);
P2_6=1;
P2_7=0;
P0=TABLE[disp8];
delay(5);
P2_7=1;
}

void dispB(void)
{
if(MIN==10||MIN==26||MIN==42||MIN==58||MIN==74){MIN=MIN+6;}
//if(MIN==74||MIN==58||MIN==42||MIN==26||MIN==10){MIN=MIN+6;}
//disp2=SEC/16;
//disp1=SEC%16;
disp4=MIN/16;
disp3=MIN%16;
//disp6=HR/16;
//disp5=HR%16;
//disp8=DATE/16;
//disp7=DATE%16;
if(MIN==90)MIN=0;
P2_0=0;
P0=TABLE[disp1];
delay(5);
P2_0=1;
P2_1=0;
P0=TABLE[disp2];
delay(5);
P2_1=1;
P2_2=0;
P0=TABLE[disp3];
delay(12);
P2_2=1;
P2_3=0;
P0=TABLE[disp4];
delay(12);
P2_3=1;
P2_4=0;
P0=TABLE[disp5];
delay(5);
P2_4=1;
P2_5=0;
P0=TABLE[disp6];
delay(5);
P2_5=1;
P2_6=0;
P0=TABLE[disp7];
delay(5);
P2_6=1;
P2_7=0;
P0=TABLE[disp8];
delay(5);
P2_7=1;
}

void dispC(void)
{
if(HR==10||HR==26||HR==42||HR==58||HR==74){HR=HR+6;}
//if(HR==74||HR==58||HR==42||HR==26||HR==10){HR=HR+6;}
//disp2=SEC/16;
//disp1=SEC%16;
//disp4=MIN/16;
//disp3=MIN%16;
disp6=HR/16;
disp5=HR%16;
if(HR==36)HR=0;
//disp8=DATE/16;
//disp7=DATE%16;
P2_0=0;
P0=TABLE[disp1];
delay(5);
P2_0=1;
P2_1=0;
P0=TABLE[disp2];
delay(5);
P2_1=1;
P2_2=0;
P0=TABLE[disp3];
delay(5);
P2_2=1;
P2_3=0;
P0=TABLE[disp4];
delay(5);
P2_3=1;
P2_4=0;
P0=TABLE[disp5];
delay(12);
P2_4=1;
P2_5=0;
P0=TABLE[disp6];
delay(12);
P2_5=1;
P2_6=0;
P0=TABLE[disp7];
delay(5);
P2_6=1;
P2_7=0;
P0=TABLE[disp8];
delay(5);
P2_7=1;
}
void dispD(void)
{
if(DATE==10||DATE==26||DATE==42||DATE==58||DATE==74){DATE=DATE+6;}
//if(DATE==74||DATE==58||DATE==42||DATE==26||DATE==10){DATE=DATE+6;}
//disp2=SEC/16;
//disp1=SEC%16;
//disp4=MIN/16;
//disp3=MIN%16;
//disp6=HR/16;
//disp5=HR%16;
disp8=DATE/16;
disp7=DATE%16;
if(DATE==50)DATE=1;

P2_0=0;
P0=TABLE[disp1];
delay(5);
P2_0=1;
P2_1=0;
P0=TABLE[disp2];
delay(5);
P2_1=1;
P2_2=0;
P0=TABLE[disp3];
delay(5);
P2_2=1;
P2_3=0;
P0=TABLE[disp4];
delay(5);
P2_3=1;
P2_4=0;
P0=TABLE[disp5];
delay(5);
P2_4=1;
P2_5=0;
P0=TABLE[disp6];
delay(5);
P2_5=1;
P2_6=0;
P0=TABLE[disp7];
delay(12);
P2_6=1;
P2_7=0;
P0=TABLE[disp8];
delay(12);
P2_7=1;
}

void main(void)
{
DS1302Inital();
while(1)
{
readRTC();
disp();
tt=0;
flag=0;
tiao=0;
while(P3_7==0||tt==1)
{
tt=1;
if(flag==0)
{
tiao++;
flag=1;
}
if(tiao==1)
{
while(P3_7==0);
dispA();
if(P3_6==0)
{
while(P3_6==0);
writeDS1302(0x80,++SEC);
}
if(P3_5==0)
{
while(P3_5==0);
writeDS1302(0x80,--SEC);
}
if(P3_7==0)
flag=0;
}
if(tiao==2)
{
while(P3_7==0);
dispB();
if(P3_6==0)
{
while(P3_6==0);
writeDS1302(0x82,++MIN);
}
if(P3_5==0)
{
while(P3_5==0);
writeDS1302(0x82,--MIN);
}
if(P3_7==0)
flag=0;
}
if(tiao==3)
{
while(P3_7==0);
dispC();
if(P3_6==0)
{
while(P3_6==0);
writeDS1302(0x84,++HR);
}
if(P3_5==0)
{
while(P3_5==0);
writeDS1302(0x84,--HR);
}
if(P3_7==0)
flag=0;
}
if(tiao==4)
{
while(P3_7==0);
dispD();
if(P3_6==0)
{
while(P3_6==0);
writeDS1302(0x86,++DATE);
}
if(P3_5==0)
{
while(P3_5==0);
writeDS1302(0x86,--DATE);
}
if(P3_7==0)
flag=0;
}
if(tiao==5)
tt=0;
}
}
}
你自己用keil軟體調就行了!

『玖』 單片機與pc機串口通信完整代碼

#include"reg51.h"
unsigned int rt=0,tt=0,dema,temp;
unsigned int re_buf[3]={0};初值
unsigned char send_buf[4]={'O','K','O','K'};//返回
unsigned char code leds_a[]={0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0-9共陽極
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3; //數碼管選位
bit L11;
void rs232_S(void);//串口初始化
void disp(void);//數碼管顯示

void main(void)
{
rs232_S();
while(1)
{
disp();
if(L11)
{
tt=0;
TI=1;//直接觸發中斷
L11=0;
}
}
}
void rs232_S(void)
{
TMOD=0X21;//T0用於定時作延時用 方式1
TH1=0XE6;
TL1=0XE6;//波特率2400
TH0=0Xf8;
TL0=0X30; //晶振12M初值2mS
TR0=1;
ET0=1;
SCON=0X50;
PCON=0X80;//smod加倍
TI=0;
RI=0;
L11=0;
ET1=1;
TR1=1;
ES=1;
EA=1;
}
void RS232(void) interrupt 4
{
if(RI)
{
RI=0;
rt++;
if(rt<5)
{
re_buf[rt-1]=SBUF;

if(rt>=4)
{
L11=1;
rt=0;
}
}
}

else if(TI)
{
TI=0;
if(tt<4)
{
SBUF=send_buf[tt];
tt++;
}
}
}
void timer0(void) interrupt 1 //中斷進程
{
TR0=0;
TH0=0Xf8;
TL0=0X30; //重裝初值
TR0=1;
if(dema)
{
dema--; //2mS延時,延時採用定時中斷初值2mS
}
}

void disp(void)
{
P23=0;
temp=re_buf[3];
temp=temp&0x0f;
P0=leds_a[temp];
dema=3; //延時6mS
while(dema!=0);
P23=1;

P22=0;
temp=re_buf[2];
temp=temp&0x0f;
P0=leds_a[temp];
dema=3;
while(dema!=0);
P22=1;

P21=0;
temp=re_buf[1];
temp=temp&0x0f;
P0=leds_a[temp]; //串口發送10進制數 通過轉換二進制 保留低4位形成10進制數 選擇0-9
dema=3;
while(dema!=0);
P21=1;

P20=0;
temp=re_buf[0];
temp=temp&0x0f;
P0=leds_a[temp];
dema=3;
while(dema!=0);
P20=1;
}
用串口調試助手發送0000-9999四位數(十進制),單片機接收顯示在4位數碼管上並返回OKOK
這是我剛調試完成的,希望對你有幫助。

閱讀全文

與單片機RT01相關的資料

熱點內容
陳天程序員 瀏覽:831
編譯原理如何運用到編程中 瀏覽:16
linux選擇資料庫 瀏覽:375
php兩個數組差集 瀏覽:978
迷你pdf閱讀器下載 瀏覽:433
做一個python小程序 瀏覽:655
pythonossystem和 瀏覽:644
win2008如何搭建ftp伺服器 瀏覽:53
安卓手機為什麼不翻牌 瀏覽:545
刪除pkpm及相關文件夾 瀏覽:480
房貸解壓銀行內部流程 瀏覽:734
安卓手機如何更改語音 瀏覽:599
android紅包實現 瀏覽:733
蘋果的nvme為什麼安卓不用 瀏覽:31
python輸入單詞統計個數 瀏覽:997
腳本軟體提取源碼 瀏覽:281
程序員能給自己的微信錢包刷錢么 瀏覽:72
怎麼讓小天才app查看寶貝的通訊錄 瀏覽:623
dxgpdf 瀏覽:258
哪個命令 瀏覽:51