一、使用proteus繪制簡單的電路圖,用于后續(xù)仿真
二、編寫程序
/********************************************************************************************************************
---- @Project: Pointer
---- @File: main.c
---- @Edit: ZHQ
---- @Version: V1.0
---- @CreationTime: 20200809
---- @ModifiedTime: 20200809
---- @Description:
---- 波特率是:9600 。
---- 通訊協(xié)議:EB 00 55 XX
---- 通過上位機來調用下位機對應的數(shù)組數(shù)據(jù) 。
---- 通過電腦串口調試助手,往單片機發(fā)送EB 00 55 XX 指令,其中EB 00 55是數(shù)據(jù)頭,XX的取值范圍是0x01 至 0x05,每個不同的值代表調用下位機不同的數(shù)組數(shù)據(jù)。0x01調用第1組數(shù)據(jù),0x02調用第2組數(shù)據(jù),0x05調用第5組數(shù)據(jù)。
---- 第1組:11 12 13 14 15
---- 第2組:21 22 23 24 25
---- 第3組:31 32 33 34 35
---- 第4組:41 42 43 44 45
---- 第5組:51 52 53 54 55
----
---- 下位機返回21個數(shù)據(jù),前面5個是第1種不帶指針函數(shù)返回的數(shù)據(jù)。中間5個是第2種不帶指針函數(shù)返回的數(shù)據(jù)。最后5個是第3種帶指針函數(shù)返回的數(shù)據(jù)。期間2組EE EE EE是各函數(shù)返回的數(shù)據(jù)分割線,為了方便觀察,沒實際意義。
---- 比如電腦發(fā)送:EB 00 55 02
---- 單片機就返回:21 22 23 24 25 EE EE EE 21 22 23 24 25 EE EE EE 21 22 23 24 25
---- 單片機:AT89C52
********************************************************************************************************************/
#include "reg52.h"
/*——————宏定義——————*/
#define FOSC 11059200L
#define BAUD 9600
#define T1MS (65536-FOSC/12/500) /*0.5ms timer calculation method in 12Tmode*/
#define const_array_size 5 /* 參與排序的數(shù)組大小 */
#define const_voice_short 19 /*蜂鳴器短叫的持續(xù)時間*/
#define const_rc_size 10 /*接收串口中斷數(shù)據(jù)的緩沖區(qū)數(shù)組大小*/
#define const_receive_time 5 /*如果超過這個時間沒有串口數(shù)據(jù)過來,就認為一串數(shù)據(jù)已經全部接收完,這個時間根據(jù)實際情況來調整大小*/
/*——————變量函數(shù)定義及聲明——————*/
/*蜂鳴器的驅動IO口*/
sbit BEEP = P2^7;
/*LED*/
sbit LED = P3^5;
unsigned int uiSendCnt = 0; /*用來識別串口是否接收完一串數(shù)據(jù)的計時器*/
unsigned char ucSendLock = 1; /*串口服務程序的自鎖變量,每次接收完一串數(shù)據(jù)只處理一次*/
unsigned int uiRcregTotal = 0; /*代表當前緩沖區(qū)已經接收了多少個數(shù)據(jù)*/
unsigned char ucRcregBuf[const_rc_size]; /*接收串口中斷數(shù)據(jù)的緩沖區(qū)數(shù)組*/
unsigned int uiRcMoveIndex = 0; /*用來解析數(shù)據(jù)協(xié)議的中間變量*/
unsigned int uiVoiceCnt = 0; /*蜂鳴器鳴叫的持續(xù)時間計數(shù)器*/
const unsigned char array_0x01[] = {0x11, 0x12, 0x13, 0x14, 0x15};
const unsigned char array_0x02[] = {0x21, 0x22, 0x23, 0x24, 0x25};
const unsigned char array_0x03[] = {0x31, 0x32, 0x33, 0x34, 0x35};
const unsigned char array_0x04[] = {0x41, 0x42, 0x43, 0x44, 0x45};
const unsigned char array_0x05[] = {0x51, 0x52, 0x53, 0x54, 0x55};
/**
* @brief 定時器0初始化函數(shù)
* @param 無
* @retval 初始化T0
**/
void Init_T0(void)
{
TMOD = 0x01; /*set timer0 as mode1 (16-bit)*/
TL0 = T1MS; /*initial timer0 low byte*/
TH0 = T1MS >> 8; /*initial timer0 high byte*/
}
/**
* @brief 串口初始化函數(shù)
* @param 無
* @retval 初始化T0
**/
void Init_USART(void)
{
SCON = 0x50;
TMOD = 0x21;
TH1=TL1=-(FOSC/12/32/BAUD);
}
/**
* @brief 外圍初始化函數(shù)
* @param 無
* @retval 初始化外圍
* 讓數(shù)碼管顯示的內容轉移到以下幾個變量接口上,方便以后編寫更上一層的窗口程序。
* 只要更改以下對應變量的內容,就可以顯示你想顯示的數(shù)字。
**/
void Init_Peripheral(void)
{
ET0 = 1;/*允許定時中斷*/
TR0 = 1;/*啟動定時中斷*/
TR1 = 1;
ES = 1; /*允許串口中斷*/
EA = 1;/*開總中斷*/
}
/**
* @brief 初始化函數(shù)
* @param 無
* @retval 初始化單片機
**/
void Init(void)
{
LED = 0;
Init_T0();
Init_USART();
}
/**
* @brief 延時函數(shù)
* @param 無
* @retval 無
**/
void Delay_Long(unsigned int uiDelayLong)
{
unsigned int i;
unsigned int j;
for(i=0;i for(j=0;j<500;j++) /*內嵌循環(huán)的空指令數(shù)量*/ { ; /*一個分號相當于執(zhí)行一條空語句*/ } } } /** * @brief 延時函數(shù) * @param 無 * @retval 無 **/ void Delay_Short(unsigned int uiDelayShort) { unsigned int i; for(i=0;i ; /*一個分號相當于執(zhí)行一條空語句*/ } } /** * @brief 串口發(fā)送函數(shù) * @param unsigned char ucSendData * @retval 往上位機發(fā)送一個字節(jié)的函數(shù) **/ void eusart_send(unsigned char ucSendData) { ES = 0; /* 關串口中斷 */ TI = 0; /* 清零串口發(fā)送完成中斷請求標志 */ SBUF = ucSendData; /* 發(fā)送一個字節(jié) */ Delay_Short(400); /* 每個字節(jié)之間的延時,這里非常關鍵,也是最容易出錯的地方。延時的大小請根據(jù)實際項目來調整 */ TI = 0; /* 清零串口發(fā)送完成中斷請求標志 */ ES = 1; /* 允許串口中斷 */ } /** * @brief 第1種函數(shù) * @param ucArraySec * @retval * 第1種函數(shù),內部不帶指針,根據(jù)上位機相關的指令, * 直接返回對應的數(shù)組。由于不帶指針,因此多用了5個for循環(huán)來搬運數(shù)組。 * 比較耗程序ROM容量,也不夠簡潔清晰。 **/ void send_array_1(unsigned char ucArraySec) { unsigned char i; switch (ucArraySec) { case 1: /* 直接返回第1個常量數(shù)組 */ for(i = 0; i < 5; i ++) { eusart_send(array_0x01[i]); } break; case 2: /* 直接返回第2個常量數(shù)組 */ for(i = 0; i < 5; i ++) { eusart_send(array_0x02[i]); } break; case 3: /* 直接返回第3個常量數(shù)組 */ for(i = 0; i < 5; i ++) { eusart_send(array_0x03[i]); } break; case 4: /* 直接返回第4個常量數(shù)組 */ for(i = 0; i < 5; i ++) { eusart_send(array_0x04[i]); } break; case 5: /* 直接返回第5個常量數(shù)組 */ for(i = 0; i < 5; i ++) { eusart_send(array_0x05[i]); } break; } } /** * @brief 第2種函數(shù) * @param ucArraySec * @retval * 第2種函數(shù),內部不帶指針,根據(jù)上位機相關的指令, * 先轉移對應的數(shù)組放到一個中間變量數(shù)組,然后發(fā)送數(shù)組。 * 由于不帶指針,因此多用了6個for循環(huán)來搬運數(shù)組。 * 跟第1種函數(shù)一樣,比較耗程序ROM容量,也不夠簡潔清晰。 **/ void send_array_2(unsigned char ucArraySec) { unsigned char i; unsigned char array_temp[5]; /* 臨時中間數(shù)組 */ switch (ucArraySec) { case 1: /* 直接返回第1個常量數(shù)組 */ for(i = 0; i < 5; i ++) { array_temp[i] = array_0x01[i]; /* 先挨個把對應的數(shù)組數(shù)據(jù)轉移到中間數(shù)組里 */ } break; case 2: /* 直接返回第2個常量數(shù)組 */ for(i = 0; i < 5; i ++) { array_temp[i] = array_0x02[i]; /* 先挨個把對應的數(shù)組數(shù)據(jù)轉移到中間數(shù)組里 */ } break; case 3: /* 直接返回第3個常量數(shù)組 */ for(i = 0; i < 5; i ++) { array_temp[i] = array_0x03[i]; /* 先挨個把對應的數(shù)組數(shù)據(jù)轉移到中間數(shù)組里 */ } break; case 4: /* 直接返回第4個常量數(shù)組 */ for(i = 0; i < 5; i ++) { array_temp[i] = array_0x04[i]; /* 先挨個把對應的數(shù)組數(shù)據(jù)轉移到中間數(shù)組里 */ } break; case 5: /* 直接返回第5個常量數(shù)組 */ for(i = 0; i < 5; i ++) { array_temp[i] = array_0x05[i]; /* 先挨個把對應的數(shù)組數(shù)據(jù)轉移到中間數(shù)組里 */ } break; } for(i = 0; i < 5; i ++) { eusart_send(array_temp[i]); /* 把臨時存放在中間數(shù)組的數(shù)據(jù)全部發(fā)送出去 */ } } /** * @brief 第3種函數(shù) * @param ucArraySec * @retval * 第3種函數(shù),內部帶指針,根據(jù)上位機相關的指令, * 先把對應的數(shù)組首地址傳遞給一個中間指針,然后再通過 * 指針把整個數(shù)組的數(shù)據(jù)發(fā)送出去,由于帶指針,切換轉移數(shù)組的數(shù)據(jù)非常快, * 只需傳遞一下首地址給指針就可以,非常高效,整個函數(shù)只用了1個for循環(huán)。 * 跟前面第1,2種函數(shù)相比,更加節(jié)省程序容量,處理速度更加快,更加簡潔。 **/ void send_array_3(unsigned char ucArraySec) { unsigned char i; unsigned char *p_array; /* 臨時中間指針,作為數(shù)組的中轉站,非常高效 */ switch (ucArraySec) { case 1: /* 直接返回第1個常量數(shù)組 */ p_array = array_0x01; /* 把數(shù)組的首地址傳遞給指針,一個指令就可以,不用for來挨個搬移數(shù)據(jù),高效 */ break; case 2: /* 直接返回第2個常量數(shù)組 */ p_array = array_0x02; /* 把數(shù)組的首地址傳遞給指針,一個指令就可以,不用for來挨個搬移數(shù)據(jù),高效 */ break; case 3: /* 直接返回第3個常量數(shù)組 */ p_array = array_0x03; /* 把數(shù)組的首地址傳遞給指針,一個指令就可以,不用for來挨個搬移數(shù)據(jù),高效 */ break; case 4: /* 直接返回第4個常量數(shù)組 */ p_array = array_0x04; /* 把數(shù)組的首地址傳遞給指針,一個指令就可以,不用for來挨個搬移數(shù)據(jù),高效 */ break; case 5: /* 直接返回第5個常量數(shù)組 */ p_array = array_0x05; /* 把數(shù)組的首地址傳遞給指針,一個指令就可以,不用for來挨個搬移數(shù)據(jù),高效 */ break;
上一篇:用關中斷和互斥量來保護多線程共享的全局變量
下一篇:為指針加上緊箍咒const,避免意外修改了只做輸入接口的數(shù)據(jù)
推薦閱讀
史海拾趣
機頂盒,全稱為數(shù)字視頻變換盒,是現(xiàn)代家庭娛樂中不可或缺的重要設備。從廣義上講,任何與電視機連接的網絡終端設備均可視為機頂盒,它們不僅限于接收和轉換電視信號,還具備豐富的網絡交互功能。
機頂盒的核心功能在于接收并解碼來自有線電纜、衛(wèi)星天線、寬帶網絡及地面廣播的數(shù)字電視信號,將其轉換成適合在電視機上播放的格式。這一過程包括接收、解碼和顯示三個主要步驟,確保了用戶能夠享受到高清乃至4K的超高清畫質和震撼音效。此外,機頂盒還提供了諸如電子節(jié)目指南、因特網網頁瀏覽等增值服務,極大地豐富了用戶的觀看體驗。
隨著技術的不斷進步,機頂盒正朝著智能化、多功能化方向發(fā)展。例如,智能推薦算法能夠根據(jù)用戶的觀看歷史和偏好,提供個性化的節(jié)目推薦;語音識別技術則讓用戶能夠通過語音指令控制機頂盒,實現(xiàn)更加便捷的操作體驗。同時,機頂盒還支持家庭影院功能,讓用戶在家中就能享受到電影院般的視聽效果。
總的來說,機頂盒作為連接電視與外部信號源的橋梁,不僅提升了電視節(jié)目的觀看體驗,還通過豐富的網絡交互功能為用戶提供了更加廣泛的內容和娛樂選擇。隨著技術的不斷發(fā)展和用戶需求的日益多樣化,機頂盒將繼續(xù)在家庭娛樂領域發(fā)揮重要作用。
隨著技術的不斷進步和市場的不斷變化,CR Magnetics意識到只有不斷創(chuàng)新才能在競爭中立于不敗之地。因此,公司加大了研發(fā)投入,積極引進新技術和新材料,不斷推出具有創(chuàng)新性和競爭力的新產品。例如,公司研發(fā)的直流傳感器在行業(yè)內享有很高的聲譽,廣泛應用于電池充電等領域。此外,公司還推出了一系列模擬量傳感器、ANSI和商業(yè)級電流互感器等,滿足了不同客戶的需求。
為了支持公司的快速發(fā)展和技術創(chuàng)新,Array Microsystems Inc高度重視人才引進和團隊建設。公司積極招聘業(yè)內優(yōu)秀的技術人才和管理人才,為他們提供良好的工作環(huán)境和福利待遇。同時,公司還注重員工的培訓和晉升機制,鼓勵員工不斷學習和成長。這些措施使得Array Microsystems Inc擁有了一支高素質、專業(yè)化的團隊,為公司的發(fā)展提供了有力的人才保障。
作為一家專注于商用車零部件的公司,Accuride始終致力于技術創(chuàng)新和產品升級。其產品線涵蓋了商用車車輪、卡車車身和底盤部件等多種零部件,且擁有多個知名品牌,如Accuride?、Gunite?、ImperialTM和BrillionTM等。通過不斷研發(fā)和創(chuàng)新,Accuride成功提升了產品的質量和性能,贏得了客戶的廣泛認可。
在快速發(fā)展的過程中,Cofan Usa Inc公司意識到供應鏈管理的重要性。為了確保產品質量和交貨期的穩(wěn)定性,公司開始優(yōu)化供應鏈管理流程,與優(yōu)質供應商建立長期合作關系,并引入先進的供應鏈管理系統(tǒng)。這些舉措有效提升了公司的運營效率和市場競爭力。
隨著市場的不斷發(fā)展,AVA電子意識到只有不斷創(chuàng)新才能在競爭中保持領先。于是,公司加大了在研發(fā)方面的投入,引進了一批高素質的研發(fā)人才,并與多所高校和研究機構建立了合作關系。經過數(shù)年的努力,AVA電子成功研發(fā)出了一系列具有自主知識產權的電子產品,這些產品在性能、穩(wěn)定性和用戶體驗等方面都達到了行業(yè)領先水平。這些創(chuàng)新產品的推出,不僅提升了公司的市場地位,也為公司帶來了可觀的利潤。
“春運”這個中國特有的名詞,1989年,伴隨著農民工潮,中國媒體第一次大量使用“春運”字眼。以春節(jié)為界,節(jié)前15天,節(jié)后25天,共40天,為此由國家經貿委統(tǒng)一發(fā)布,鐵道部、交通部、民航總局按此進行專門運輸安排的全國性交通運輸高峰叫做春運。 ...… 查看全部問答∨ |
|
Nand Flash結構與讀寫分析 NAND Flash 的數(shù)據(jù)是以bit 的方式保存在memory cell,一般來說,一個cell 中只能存儲一個bit。這些cell 以8 個或者16 個為單位,連成bit line,形成所謂的byte(x8)/word(x16),這就是NAND Device 的位寬。這些Line 會再 ...… 查看全部問答∨ |
Atmega64 加明基M22gsm模塊,如何實現(xiàn)彩信收發(fā)。也就是說與gprs連接需要發(fā)送那些數(shù)據(jù)?!!!。。。… 查看全部問答∨ |
Vxworks中的守護任務(daemon task)與一般的任務有什么區(qū)別?編寫守護任務需要注意什么?最好能夠舉個實例。小女子初學vxworks,還請各位大俠不嗇賜教,在此感激不盡。… 查看全部問答∨ |
我剛開始打開 PB工程,彈出如下對話框。 注銷電腦還是這樣 但是打開別的工程不會請問是咋回事?大家有遇到過嗎? 我暈,我把以前的同名工程拷貝進來還是一樣,難道是對這個名字起了封殺令! 呵呵,先回家,明年看看還會不會, ...… 查看全部問答∨ |
volatile MyLong32T counter = 0; SIGNAL (SIG_OVERFLOW0) { counter = counter + 1; PollApplication(counter);//輸出counter的數(shù)值 ...… 查看全部問答∨ |
我明明在MSDN查到在wince中存在Application.StartupPath,MessageBoxIcon.Information,MessageBoxIcon.Error等的用法。但在實際編wince的程序的時候,卻出現(xiàn)如下錯誤: ------ 已啟動生成: 項目: 相片管理器CE, 配置: Debug Any CPU ------ C:\\WI ...… 查看全部問答∨ |
我的應用程序用HEX30轉換INTEL格式后,再把它轉成2進制文件 FOR.BIN,請問在我的匯編編寫的“寫FLASH程序”--writhflash.asm中怎樣把這個文件作為數(shù)據(jù)連接到我的COFF文件中? … 查看全部問答∨ |
設計資源 培訓 開發(fā)板 精華推薦
- ELEXCON 2022 深圳國際電子展11月6日(新檔期)開幕,速領門票!更有N重好禮等你拿!
- 今天上午10:00有獎直播【TI MSPM0 MCU新品】(9:45開始入場)
- 手機觀看TI視頻教程,隨時隨地充電學習
- Maxim 利用nanoPower創(chuàng)新技術,致力于降低系統(tǒng)的靜態(tài)功耗 看視頻答題贏好禮! 還有免費開發(fā)板等你拿
- 逛東芝電子在線展會,上百份禮品等您拿!
- 有獎直播:低功耗、小尺寸&高溫環(huán)境、帶觸摸功能——瑞薩電子最新16位RL78/G系列單片機介紹
- 【EEWORLD第四十二屆】2012年09月社區(qū)明星人物揭曉!
- 2020年全球工程師調查