/***************************************************************
*模擬接收程序,這個程序的作用從模擬串口接收數據,然后將這些數據發送到實際串口
*在單片機上模擬了一個串口,使用P3.2作為發送和接收端
*以P3.2模擬串口接收端,從模擬串口接收數據發至串口
*本程序來源于《單片機IO口模擬串口程序(發送+接收)》
*硬件環境:11.0592MHz, RXD P3.2
***************************************************************/
#include #include #include typedef unsigned char uchar ; //這里用來切換晶振頻率,支持11.0592MHz和18.432MHz //#define F18_432 #define F11_0592 //用來作為模擬串口接收數據的緩存 uchar tmpbuf2[64]={0}; struct { uchar recv :6 ; //tmpbuf2數組下標,用來將模擬串口接收到的數據存放到tmpbuf2中 uchar send :6 ; //tmpbuf2數組下標,用來將tmpbuf2中的數據發送到串口 }tmpbuf2_point={0,0}; //模擬串口的接收端設為P3.2 sbit newRXD=P3^2 ; void UartInit() { SCON=0x50 ; // SCON: serail mode 1, 8-bit UART TMOD|=0x21 ; // TMOD: timer 1, mode 2, 8-bit reload,自動裝載預置數(自動將TH1送到TL1);T0工作在方式1,十六位定時 PCON|=0x80 ; // SMOD=1; #ifdef F11_0592 TH1=0xE8 ; // Baud:2400 fosc=11.0592MHz 2400bps為從串口接收數據的速率 TL1=0xE8 ; // 計數器初始值,fosc=11.0592MHz 因為TH1一直往TL1送,所以這個初值的意義不大 TH0=0xFF ; // 定時器0初始值,延時208us,目的是令模擬串口的波特率為9600bps fosc=11.0592MHz TL0=0xA0 ; // 定時器0初始值,延時208us,目的是令模擬串口的波特率為9600bps fosc=11.0592MHz #endif #ifdef F18_432 TH1=0xD8 ; // Baud:2400 fosc=18.432MHz 2400bps為從串口接收數據的速率 TL1=0xD8 ; // 計數器初始值,fosc=18.432MHz 因為TH1一直往TL1送,所以這個初值的意義不大 TH0=0xFF ; // 定時器0初始值,延時104us,目的是令模擬串口的波特率為9600bps fosc=18.432MHz TL0=0x60 ; // 定時器0初始值,延時104us,目的是令模擬串口的波特率為9600bps fosc=18.432MHz #endif IE|=0x81 ; // 中斷允許總控制位EA=1;使能外部中斷0 TF0=0 ; IT0=1 ; // 設置外部中斷0為邊沿觸發方式 TR1=1 ; // 啟動TIMER1,用于產生波特率 } void WaitTF0(void) { while(!TF0); TF0=0 ; #ifdef F11_0592 TH0=0xFF ; // 定時器重裝初值 模擬串口的波特率為9600bps fosc=11.0592MHz TL0=0xA0 ; // 定時器重裝初值 模擬串口的波特率為9600bps fosc=11.0592MHz #endif #ifdef F18_432 TH0=0xFF ; // 定時器重裝初值 fosc=18.432MHz TL0=0x60 ; // 定時器重裝初值 fosc=18.432MHz #endif } //接收一個字符 uchar RByte() { uchar Output=0 ; uchar i=8 ; TR0=1 ; //啟動Timer0 #ifdef F11_0592 TH0=0xFF ; // 定時器重裝初值 模擬串口的波特率為9600bps fosc=11.0592MHz TL0=0xA0 ; // 定時器重裝初值 模擬串口的波特率為9600bps fosc=11.0592MHz #endif #ifdef F18_432 TH0=0xFF ; // 定時器重裝初值 fosc=18.432MHz TL0=0x60 ; // 定時器重裝初值 fosc=18.432MHz #endif TF0=0 ; WaitTF0(); //等過起始位 //接收8位數據位 while(i--) { Output>>=1 ; if(newRXD) Output|=0x80 ; //先收低位 WaitTF0(); //位間延? } TR0=0 ; //停止Timer0 return Output ; } //向COM1發送一個字符 void SendChar(uchar byteToSend) { SBUF=byteToSend ; while(!TI); TI=0 ; } void main() { UartInit(); while(1) { if(tmpbuf2_point.recv!=tmpbuf2_point.send)//差值表示模擬串口接收數據緩存中還有多少個字節的數據未被處理(發送至串口) { SendChar(tmpbuf2[tmpbuf2_point.send++]); } } } //外部中斷0,說明模擬串口的起始位到來了 void Simulated_Serial_Start()interrupt 0 { EX0=0 ; //屏蔽外部中斷0 tmpbuf2[tmpbuf2_point.recv++]=RByte(); //從模擬串口讀取數據,存放到tmpbuf2數組中 IE0=0 ; //防止外部中斷響應2次,防止外部中斷函數執行2次 EX0=1 ; //打開外部中斷0 }
上一篇:51單片機的定時器T1的使用1-中斷法
下一篇:51單片機IO口模擬串口通訊5
推薦閱讀
史海拾趣
為了進一步增強自身實力,APDI積極尋求與其他公司的并購與合作機會。它成功收購了一家在半導體制造領域具有領先技術的公司,從而完善了自身的產品線和技術體系。同時,APDI還與多家行業巨頭建立了戰略合作關系,共同研發新技術和新產品,實現了資源共享和優勢互補。
為了進一步增強自身實力,APDI積極尋求與其他公司的并購與合作機會。它成功收購了一家在半導體制造領域具有領先技術的公司,從而完善了自身的產品線和技術體系。同時,APDI還與多家行業巨頭建立了戰略合作關系,共同研發新技術和新產品,實現了資源共享和優勢互補。
隨著科技的飛速發展,ATC公司始終保持著對技術創新的熱情與追求。公司不斷投入研發資源,引進先進設備和技術人才,致力于開發更具創新性和實用性的電子產品。經過多年的努力,ATC公司在多個技術領域取得了重要突破,推出了一系列具有行業影響力的創新產品,贏得了市場的廣泛認可。
近年來,隨著新能源產業的快速發展,北京人民電器緊跟時代步伐,在新能源領域取得了重要突破。公司推出的真安型零飛弧直流斷路器,解決了直流低壓系統中長期存在的外噴電弧問題,為新能源行業的發展提供了重要的技術支持。這一創新成果不僅得到了行業的廣泛認可,也為公司在新能源領域的發展打開了新的局面。
這五個故事只是北京人民電器在電子行業發展歷程中的一部分,但它們足以展現出公司在技術創新、產品應用、生產自動化、人才隊伍建設以及新能源領域發展等方面的努力和成就。這些故事不僅記錄了北京人民電器的成長軌跡,也見證了中國電子行業的蓬勃發展。
DB Lectro Inc公司自創立之初,就致力于氣體檢測技術的研發與創新。在公司總部的加利福尼亞州研發中心,一群充滿激情的工程師們夜以繼日地工作,成功研發出了首款高精度、高穩定性的氣體檢測儀器。這款產品憑借其卓越的性能和精準的檢測結果,迅速在污水處理、化工等領域打開了市場。隨著技術的不斷進步和產品的不斷升級,DB Lectro Inc逐漸在氣體檢測領域樹立了領先地位。
我們現在需要用ARM的CPU做兩款產品,一個是Netbook,一個是Barcode scanner,都需要加上CDMA2000/EVDO/HSxPA的3G模組,其中Netbook使用Android系統,Barcode scanner使用WM6.5系統,請問大家在開發類似產品的時候使用的都是哪家的3G模組呢? 我有 ...… 查看全部問答∨ |
|
Windows Mobile 5.0,Windows Mobile 60設備,如何在我的程序運行過程中禁用上面的Power電源按鈕 Windows Mobile 5.0,Windows Mobile 60設備,如何在我的程序運行過程中禁用上面的Power電源按鈕… 查看全部問答∨ |
|
無線通信模塊在M2M領域的應用(四) 傳統農業生產的物質技術手段落后,主要依靠人力、畜力和各種手工工具以及一些簡單機械。在現實中主要存在農業科技含量低,裝備水平低,農業污染和水資源浪費嚴重,農業產出少,農民收入低,農產品品種少等問題。 ...… 查看全部問答∨ |
|
大家好,最近在做一個比賽,需要使用SD卡來記錄工作狀態下的數據。但是對于文件系統和怎樣對于SD卡進行操作不是很了解,所以和大家商討一下。我先把我的兩個函數放上來,大家幫我看看。 了、我沒有使用FIFO功能,因為我覺得對于SD卡返回的信息的讀 ...… 查看全部問答∨ |
quartus ii 是不是不能像vc++那樣自動調整代碼格式啊? 我是新手,在用quartus ii 寫代碼的時候,沒有手動加空格,找了半天沒發現有自動調整格式的按鈕或者快捷鍵啥的。 quartus ii 是不是不能像vc++那樣自動調整代碼格式啊?必須得手動加空格縮進?… 查看全部問答∨ |