哪位朋友用過16C550的編程?

能教教我嗎? 我需要一個和ARM操作16C550的例子。

email:個人信息保護(hù),已隱藏

謝謝了。

原理圖到WWW.ARM88.COM下載 這個你改一下就能用在ARM上了 16C550在51系統(tǒng)中的應(yīng)用--C51例程

作者:adlion

下面這段程序是我在一個項(xiàng)目中驅(qū)動16C552使用的,其實(shí)16C552是兩個16C550和一個并 口合在一個芯片里,在實(shí)際的操作上和16c550并沒有什么不同,可以看成是對兩個獨(dú)立的 16C550操作。 在下面的程序中,采用的是中斷方式,同時使用了FIFO,具體的設(shè)置可以看看程序中相 關(guān)部分。 為節(jié)省篇幅,在中斷處理程序中,我省略了一個串口的處理,其實(shí)兩個串口的處理是相 同的。 或許有朋友在使用16C554,16C554其實(shí)也就是4個16C550的集合,不過由于單片機(jī)的中斷 有限,這4個串口往往共用一個中斷,在這是就要注意中斷的處理了,以后有時間我寫個 16C554的處理程序上來^_^ 以下程序本人不保證正確性和穩(wěn)定性(雖然在我的系統(tǒng)中很正常,不過這句話按照慣例 還是說一次^_^) 下面是我編寫的一個小程序(用JavaScript和表單編寫),用于計(jì)算DLL的裝載值。輸 入頻率和預(yù)期的波特率,點(diǎn)擊“計(jì)算”就可以了。

晶振頻率(MHz): (mhz) 波特率(bps): (bps)

裝載值(DLL)【十進(jìn)制,計(jì)算值出現(xiàn)小數(shù)表示在此晶振頻率下使用該波特率有誤差】

//------------------------------------------------------------------------------ --------------------- // 項(xiàng)目: // 文件: u550.c // 描述: 16c552的控制程序 // 編譯: adlion // 版本: 1.0 // 創(chuàng)建日期: 2001-12-10 // 最后修訂: 2002-04-01 // 編譯環(huán)境: Keil C51 V6.23 //------------------------------------------------------------------------------ ---------------------

#include "ftu.h"

#define adr_552_base 0xc000 //這里定義地址,具體的地址定義要看系統(tǒng)連接了 //串口1 #define uc_552a_thr XBYTE[adr_552_base+0x000] // Transmit Holding Register #define uc_552a_rhr XBYTE[adr_552_base+0x000] // Receive Holding Register #define uc_552a_ier XBYTE[adr_552_base+0x100] // Interrupt Enable Register #define uc_552a_isr XBYTE[adr_552_base+0x200] // Interrupt Status Register #define uc_552a_fcr XBYTE[adr_552_base+0x200] // FIFO control register #define uc_552a_lcr XBYTE[adr_552_base+0x300] // Line control Register #define uc_552a_mcr XBYTE[adr_552_base+0x400] // Modem Control Register #define uc_552a_lsr XBYTE[adr_552_base+0x500] // Line Status Register #define uc_552a_msr XBYTE[adr_552_base+0x600] // Modem Status Register #define uc_552a_spr XBYTE[adr_552_base+0x700] // Scratchpad Register

#define uc_552a_dll XBYTE[adr_552_base+0x000] #define uc_552a_dlm XBYTE[adr_552_base+0x100]

//串口2 #define uc_552b_thr XBYTE[adr_552_base+0x800] // Transmit Holding Register #define uc_552b_rhr XBYTE[adr_552_base+0x800] // Receive Holding Register #define uc_552b_ier XBYTE[adr_552_base+0x900] // Interrupt Enable Register #define uc_552b_isr XBYTE[adr_552_base+0xa00] // Interrupt Status Register #define uc_552b_fcr XBYTE[adr_552_base+0xa00] // FIFO control register #define uc_552b_lcr XBYTE[adr_552_base+0xb00] // Line control Register #define uc_552b_mcr XBYTE[adr_552_base+0xc00] // Modem Control Register #define uc_552b_lsr XBYTE[adr_552_base+0xd00] // Line Status Register #define uc_552b_msr XBYTE[adr_552_base+0xe00] // Modem Status Register #define uc_552b_spr XBYTE[adr_552_base+0xf00] // Scratchpad Register

#define uc_552b_dll XBYTE[adr_552_base+0x800] #define uc_552b_dlm XBYTE[adr_552_base+0x900]

//并口 #define uc_552_pr XBYTE[adr_552_base+0x1000] // Port Register #define uc_552_iosel XBYTE[adr_552_base+0x1100] // I/O Select Register #define uc_552_sr XBYTE[adr_552_base+0x1100] // Status Register #define uc_552_com XBYTE[adr_552_base+0x1200] // Command Register #define uc_552_con XBYTE[adr_552_base+0x1200] // Control Register

//緩沖區(qū) #define uc_552a_buf_len 64 xdata unsigned char uc_552atxd_buf[uc_552a_buf_len]; xdata unsigned char uc_552arxd_buf[uc_552a_buf_len]; idata unsigned char uc_552atxd_out,uc_552atxd_in; idata unsigned char uc_552arxd_out,uc_552arxd_in; bit b_552atxd_done; bit b_552arxd_full;

#define uc_552b_buf_len 32 xdata unsigned char uc_552btxd_buf[uc_552_buf_size*2]; xdata unsigned char uc_552brxd_buf[uc_552_buf_size]; idata unsigned char uc_552btxd_out,uc_552btxd_in; idata unsigned char uc_552brxd_out,uc_552brxd_in; bit b_552btxd_done; bit b_552brxd_full;

//有些中斷標(biāo)記在讀取中斷寄存器后會被自動清除,所以定義變量來暫存中斷向量 //ps:這幾個變量可以定義為局部變量,這里為了方便定義為全局變量^_^ unsigned char bdata uc_status_552aisr; sbit b_552aisr_id = uc_status_552aisr^0;

unsigned char bdata uc_status_552bisr; sbit b_552bisr_id = uc_status_552bisr^0;

#define xt_552_mhz 1.8432 #define bps_552a 1200 #define bps_552b 9600 #define dl_552a (unsigned int)(xt_552_mhz*1000000/16/bps_552a) //分頻系數(shù) 計(jì)算 #define dl_552B (unsigned int)(xt_552_mhz*1000000/16/bps_552b) /********************************************************************** * * 名稱: v_init_552uart * 說明: * 功能: 初始化552串口 * 調(diào)用: none * 輸入: none * 返回值: none * ***********************************************************************/

void v_init_552uart(void) { //串口1設(shè)置 uc_552a_lcr = 0x80; // 使能波特率設(shè)置 uc_552a_dll = dl_552a%256; // 設(shè)置通訊波特率為1200 uc_552a_dlm = dl_552a/256; uc_552a_fcr = 0x00; //禁止FIFO模式 uc_552a_lcr = 0x03; // 8 bit_data, 1 bit_stop, no parity uc_552a_ier = 0x00; // 使能接收和發(fā)送中斷03 uc_552a_mcr = 0x08; // 使能串口中斷

//緩沖區(qū)指針初始化 uc_552atxd_out=0;uc_552atxd_in=1; uc_552arxd_out=uc_552arxd_in=0;

//串口2設(shè)置 uc_552b_lcr = 0x80; // 使能波特率設(shè)置 uc_552b_dll = dl_552b%256; // 設(shè)置通訊波特率為9600 uc_552b_dlm = dl_552b/256; uc_552b_fcr = 0x8f; //FIFO模式 10001111 uc_552b_lcr = 0x03; // 8 bit_data, 1 bit_stop, no parity uc_552b_ier = 0x0b; // 使能接收和發(fā)送中斷03,mcr中斷 uc_552b_mcr = 0x08; // 使能串口中斷

//緩沖區(qū)指針初始化 uc_552btxd_out=0;uc_552btxd_in=1; uc_552brxd_out=uc_552brxd_in=0;

//并口設(shè)置 uc_552_iosel = 0x55; //全部設(shè)置為輸出 uc_552_con = 0x00; uc_552_pr = 0xff; //輸出全部為高電平

EX0=1; EA=1; }

/********************************************************************** * * 名稱: v_sent_552bstr * 說明: * 功能: 發(fā)送多個字節(jié) * 調(diào)用: none * 輸入: str 為要發(fā)送的字符串;str_len為字節(jié)數(shù); * 返回值: none * ***********************************************************************/

void v_sent_552bstr(unsigned char *str,unsigned char str_len) {

unsigned char i;

if(str_len==0) str_len=strlen(str); for(i=0;i{ uc_552btxd_buf[i]=*str; str++; } uc_552btxd_in=str_len; uc_552btxd_out=0; b_552btxd_done=0;

uc_552b_thr=uc_552btxd_buf[uc_552btxd_out]; uc_552btxd_out++; }

/********************************************************************** * * 名稱: ir_552_interrupt * 說明: * 功能: 552的中斷處理函數(shù) * 調(diào)用: none * 輸入: none * 返回值: none * ***********************************************************************/ /* ISR定義: 值 模式 優(yōu)先級 定義(中斷源) 01 16c450 x 沒有中斷 06 16c450 1 LSR(接收線路狀態(tài)寄存器) 04 16c450 2 RXRDY(接收中斷) 0C 16c450 2 RXRDY(接收超時中斷) 02 16c450 3 TXRDY(發(fā)送寄存器空) 00 16c450 4 MSR(Modem狀態(tài)寄存器)

C1 FIFO x 沒有中斷 C6 FIFO 1 LSR(接收線路狀態(tài)寄存器) C4 FIFO 2 RXRDY(接收中斷)FIFO超出 預(yù)定水平 CC FIFO 2 RXRDY(接收超時中斷) C2 FIFO 3 TXRDY(發(fā)送寄存器空) C0 FIFO 4 MSR(Modem狀態(tài)寄存器) */ void ir_552_interrupt(void) interrupt 0 { unsigned char i,j; uc_status_552aisr = uc_552a_isr; uc_status_552bisr = uc_552b_isr; if(b_552aisr_id && b_552bisr_id) return;

if(!b_552aisr_id) { //這里是串口a的中斷處理程序 }

if(b_552bisr_id) return; switch(uc_status_552bisr) { case 0x01: break; case 0x06: case 0xc6: i=uc_552b_lsr; //清除中斷 //處理代碼 break; case 0x04: case 0x0c: if(!b_552brxd_full) //緩沖區(qū)未滿 { while((uc_552b_lsr & 0x01) == 0 ); //【這里最好加一個超時跳出的條件,以 免因芯片原因陷入死循環(huán)】 //以下其他的循環(huán)檢測也同理需加上跳出條 件 uc_552brxd_buf[uc_552brxd_in] =uc_552b_rhr; uc_552brxd_in = ++ uc_55


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频