娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2024年11月04日(星期一)

正在發生

2021年11月04日 | 為指針加上緊箍咒const,避免意外修改了只做輸入接口的數據

發布者:Blissful444 來源: eefocus關鍵字:指針  輸入接口 手機看文章 掃描二維碼
隨時隨地手機看文章

一、使用proteus繪制簡單的電路圖,用于后續仿真

二、編寫程序


/********************************************************************************************************************

---- @Project: Pointer

---- @File: main.c

---- @Edit: ZHQ

---- @Version: V1.0

---- @CreationTime: 20200809

---- @ModifiedTime: 20200809

---- @Description:

---- 波特率是:9600 。

---- 通訊協議:EB 00 55  XX YY  

---- 把5個隨機數據按從大到小排序,用冒泡法來排序。

---- 通過電腦串口調試助手,往單片機發送EB 00 55 08 06 09 05 07  指令,其中EB 00 55是數據頭,08 06 09 05 07 是參與排序的5個隨機原始數據。單片機收到指令后就會返回13個數據,最前面5個數據是第1種方法的排序結果,中間3個數據EE EE EE是第1種和第2種的分割線,為了方便觀察,沒實際意義。最后5個數據是第2種方法的排序結果.

----

---- 比如電腦發送:EB 00 55 08 06 09 05 07

---- 單片機就返回:09 08 07 06 05 EE EE EE 09 08 07 06 05 

---- 單片機: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  /* 參與排序的數組大小 */

 

#define const_voice_short 19 /*蜂鳴器短叫的持續時間*/

#define const_rc_size 10 /*接收串口中斷數據的緩沖區數組大小*/

 

#define const_receive_time 5 /*如果超過這個時間沒有串口數據過來,就認為一串數據已經全部接收完,這個時間根據實際情況來調整大小*/

 

/*——————變量函數定義及聲明——————*/

/*蜂鳴器的驅動IO口*/

sbit BEEP = P2^7;

/*LED*/

sbit LED = P3^5;

 

unsigned int uiSendCnt = 0; /*用來識別串口是否接收完一串數據的計時器*/

unsigned char ucSendLock = 1; /*串口服務程序的自鎖變量,每次接收完一串數據只處理一次*/

unsigned int uiRcregTotal = 0; /*代表當前緩沖區已經接收了多少個數據*/

unsigned char ucRcregBuf[const_rc_size]; /*接收串口中斷數據的緩沖區數組*/

unsigned int uiRcMoveIndex = 0; /*用來解析數據協議的中間變量*/

 

unsigned int uiVoiceCnt = 0; /*蜂鳴器鳴叫的持續時間計數器*/

 

unsigned char ucUsartBuffer[const_array_size]; /* 從串口接收到的需要排序的原始數據 */

unsigned char ucGlobalBuffer_3[const_array_size]; /* 第3種方法,參與具體排序算法的全局變量數組 */

unsigned char ucGlobalBuffer_4[const_array_size]; /* 第4種方法,用來接收輸出接口數據的全局變量數組 */

 

/**

* @brief  定時器0初始化函數

* @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  串口初始化函數

* @param  無

* @retval 初始化T0

**/

void Init_USART(void)

{

SCON = 0x50;

TMOD = 0x21;                    

TH1=TL1=-(FOSC/12/32/BAUD);

}

 

/**

* @brief  外圍初始化函數

* @param  無

* @retval 初始化外圍

* 讓數碼管顯示的內容轉移到以下幾個變量接口上,方便以后編寫更上一層的窗口程序。

* 只要更改以下對應變量的內容,就可以顯示你想顯示的數字。

**/

void Init_Peripheral(void)

{

ET0 = 1;/*允許定時中斷*/

TR0 = 1;/*啟動定時中斷*/

TR1 = 1;

ES = 1; /*允許串口中斷*/

EA = 1;/*開總中斷*/  

}

 

/**

* @brief  初始化函數

* @param  無

* @retval 初始化單片機

**/

void Init(void)

{

LED  = 0;

Init_T0();

Init_USART();

}

/**

* @brief  延時函數

* @param  無

* @retval 無

**/

void Delay_Long(unsigned int uiDelayLong)

{

   unsigned int i;

   unsigned int j;

   for(i=0;i   {

      for(j=0;j<500;j++)  /*內嵌循環的空指令數量*/

          {

             ; /*一個分號相當于執行一條空語句*/

          }

   }

}

/**

* @brief  延時函數

* @param  無

* @retval 無

**/

void Delay_Short(unsigned int uiDelayShort)

{

  unsigned int i;

  for(i=0;i  {

; /*一個分號相當于執行一條空語句*/

  }

}

 

/**

* @brief  串口發送函數

* @param  unsigned char ucSendData

* @retval 往上位機發送一個字節的函數

**/

void eusart_send(unsigned char ucSendData)

{

ES = 0; /* 關串口中斷 */

TI = 0; /* 清零串口發送完成中斷請求標志 */

SBUF = ucSendData; /* 發送一個字節 */

 

Delay_Short(400); /* 每個字節之間的延時,這里非常關鍵,也是最容易出錯的地方。延時的大小請根據實際項目來調整 */

TI = 0; /* 清零串口發送完成中斷請求標志 */

ES = 1; /* 允許串口中斷 */

}

 

 

/**

* @brief  第3種方法

* @param  p_ucInputBuffer p_ucOutputBuffer

* @retval 

* 第3種方法,為了改進第2種方法的用戶體驗,用指針為函數多增加一個數組輸出接口。

* 這樣,函數的數組既有輸入接口,又有輸出接口,已經堪稱完美了。

* 本程序中*p_ucInputBuffer輸入接口,*p_ucOutputBuffer是輸出接口。

* 凡是做輸入接口的指針,都應該加上const標簽來標識,它可以讓原來雙向性的接口變成了單向性接口,它有兩個好處:

* 第一個:如果你是用別人已經封裝好的函數,你發現接口指針帶了const標簽,就足以說明

* 這個指針只能做輸入接口,你用了它,不用擔心輸入數據被修改。

* 第二個:如果是你自己寫的函數,你在輸入接口處的指針加了const標簽,它可以預防你在寫函數內部代碼時

* 不小心修改了輸入接口的數據。比如,你試著在以下函數最后的地方加一條更改輸入接口數據的指令,

* 當你點擊編譯時,會編譯不過,出現錯誤提示:error C183: unmodifiable lvalue。

**/

void big_to_small_sort_3(const unsigned char *p_ucInputBuffer, unsigned char *p_ucOutputBuffer)

{

unsigned char i;

unsigned char k;

unsigned char ucTemp; /* 在兩兩交換數據的過程中,用于臨時存放交換的某個變量 */

    unsigned char ucBuffer_3[const_array_size]; /* 第3種方法,參與具體排序算法的局部變量數組 */

 

for(i = 0; i < const_array_size; i ++) /* 參與排序算法之前,先把輸入接口的數據全部搬移到局部變量數組中。 */

{

ucBuffer_3[i] = p_ucInputBuffer[i];

}

 

/* 冒泡法 */

for(i = 0; i < (const_array_size - 1); i ++) /* 冒泡的次數是(const_array_size-1)次 */

{

for(k = 0; k < (const_array_size - 1 - i); k ++)

{

if(ucBuffer_3[const_array_size - 1 - k] > ucBuffer_3[const_array_size - 1 - 1 - k])

{

ucTemp = ucBuffer_3[const_array_size - 1 - 1 - k];

ucBuffer_3[const_array_size - 1 - 1 - k] = ucBuffer_3[const_array_size  - 1 - k];

ucBuffer_3[const_array_size  - 1 - k] = ucTemp;

}

}

}

for(i = 0; i < const_array_size; i ++) /* 參與排序算法之后,把運算結果的數據全部搬移到輸出接口中,方便外面程序調用 */

{

p_ucOutputBuffer[i] = ucBuffer_3[i];

}

 

// /* 

// * 以下這條是企圖修改輸入接口數據的指令,如果不屏蔽,編譯的時候就會出錯提醒:error C183: unmodifiable lvalue?

// */

//     p_ucInputBuffer[0] = 0; /* 修改輸入接口數據的指令 */

}

 

/**

* @brief  第4種方法

* @param  p_ucInputAndOutputBuffer 

* @retval 

* 第4種方法.指針在函數的接口中,天生就是既可以做輸入,也可以是做輸出,它是雙向性的,類似全局變量的特點。

* 我們可以根據實際項目的情況,在必要的時候可以直接把輸入接口和輸出接口合并在一起,

* 這種方法的缺點是沒有把輸入和輸出分開,沒有那么直觀。但是優點也是很明顯的,就是比較

* 省程序ROM容量和數據RAM容量,而且運行效率也比較快。現在介紹給大家。

* 本程序的*p_ucInputAndOutputBuffer是輸入輸出接口。

**/

void big_to_small_sort_4(unsigned char *p_ucInputAndOutputBuffer)

{

unsigned char i;

unsigned char k;

unsigned char ucTemp; /* 在兩兩交換數據的過程中,用于臨時存放交換的某個變量 */

 

/* 冒泡法 */

for(i = 0; i < (const_array_size - 1); i ++) /* 冒泡的次數是(const_array_size-1)次 */

{

for(k = 0; k < (const_array_size - 1 - i); k ++)

{

if(p_ucInputAndOutputBuffer[const_array_size - 1 - k] > p_ucInputAndOutputBuffer[const_array_size - 1 - 1 - k])

{

ucTemp = p_ucInputAndOutputBuffer[const_array_size - 1 - 1 - k];

p_ucInputAndOutputBuffer[const_array_size - 1 - 1 - k] = p_ucInputAndOutputBuffer[const_array_size  - 1 - k];

p_ucInputAndOutputBuffer[const_array_size  - 1 - k] = ucTemp;

}

}

}

}

 

/**

* @brief  串口服務程序

* @param  無

* @retval 

* 以下函數說明了,在空函數里,可以插入很多個return語句。

* 用return語句非常便于后續程序的升級修改。

**/

void usart_service(void)

{

unsigned char i = 0;

// /*如果超過了一定的時間內,再也沒有新數據從串口來*/

// if(uiSendCnt >= const_receive_time && ucSendLock == 1)

// {

// 原來的語句,現在被兩個return語句替代了

if(uiSendCnt < const_receive_time) /* 延時還沒超過規定時間,直接退出本程序,不執行return后的任何語句。 */

{

return; /* 強行退出本子程序,不執行以下任何語句 */

}

if(ucSendLock == 0) /* 不是最新一次接收到串口數據,直接退出本程序,不執行return后的任何語句。 */

{

return; /* 強行退出本子程序,不執行以下任何語句 */

}

/*

 * 以上兩條return語句就相當于原來的一條if(uiSendCnt>=const_receive_time&&ucSendLock==1)語句。

 * 用了return語句后,就明顯減少了一個if嵌套。

 */

ucSendLock = 0; /*處理一次就鎖起來,不用每次都進來,除非有新接收的數據*/

/*下面的代碼進入數據協議解析和數據處理的階段*/

uiRcMoveIndex = 0; /*由于是判斷數據頭,所以下標移動變量從數組的0開始向最尾端移動*/

// /*

// * 判斷數據頭,進入循環解析數據協議必須滿足兩個條件:

// * 第一:最大接收緩沖數據必須大于一串數據的長度(這里是5。包括2個有效數據,3個數據頭)

// * 第二:游標uiRcMoveIndex必須小于等于最大接收緩沖數據減去一串數據的長度(這里是5。包括2個有效數據,3個數據頭)

// */

// while(uiRcregTotal >= 5 && uiRcMoveIndex <= (uiRcregTotal - 5))

// {

// 原來的語句,現在被兩個return語句替代了

while(1) /* 死循環可以被以下return或者break語句中斷,return本身已經包含了break語句功能。 */

{

if(uiRcregTotal < 5) /* 串口接收到的數據太少 */

{

uiRcregTotal = 0; /*清空緩沖的下標,方便下次重新從0下標開始接受新數據*/

return; /* 強行退出while(1)循環嵌套,直接退出本程序,不執行以下任何語句 */

}

if(uiRcMoveIndex > (uiRcregTotal - 5)) /* 數組緩沖區的數據已經處理完 */

{

uiRcregTotal = 0; /*清空緩沖的下標,方便下次重新從0下標開始接受新數據*/

return; /* 強行退出while(1)循環嵌套,直接退出本程序,不執行以下任何語句 */

}

/* 

 * 以上兩條return語句就相當于原來的一條while(uiRcregTotal>=5&&uiRcMoveIndex<=(uiRcregTotal-5))語句。

 * 以上兩個return語句的用法,同時說明了return本身已經包含了break語句功能,不管當前處于幾層的內部循環嵌套,

 * 都可以強行退出循環,并且直接退出本程序。

 */

if(ucRcregBuf[uiRcMoveIndex + 0] == 0xeb && ucRcregBuf[uiRcMoveIndex + 1] == 0x00 && ucRcregBuf[uiRcMoveIndex + 2] == 0x55)

{

for(i = 0; i < const_array_size; i ++) /* 從串口接收到的需要被排序的原始數據 */

{

ucUsartBuffer[i] = ucRcregBuf[uiRcMoveIndex+3+i];

}

 

/* 第3種運算方法,依靠指針為函數增加一個數組的輸出接口 */

/* 通過指針輸出接口,排序運算后的結果直接從這個輸出口中導出到ucGlobalBuffer_3數組中 */

big_to_small_sort_3(ucUsartBuffer, ucGlobalBuffer_3);   /* ucUsartBuffer是輸入的數組,ucGlobalBuffer_3是接收排序結果的數組 */

for(i = 0; i < const_array_size; i ++)

{

eusart_send(ucGlobalBuffer_3[i]); /* 把用第3種方法排序后的結果返回給上位機觀察 */

}

 

/* 為了方便上位機觀察,多發送3個字節ee ee ee作為第1種方法與第2種方法的分割線 */

eusart_send(0xee);

eusart_send(0xee);

eusart_send(0xee);

 

 

/* 第4種運算方法,依靠一個指針作為函數的輸入輸出接口。 */

/* 通過這個指針輸入輸出接口,ucGlobalBuffer_4數組既是輸入數組,也是輸出數組,排序運算后的結果直接存放在它本身,類似于全局變量的特點。 */

            for(i = 0; i < const_array_size; i ++) /* 從串口接收到的需要被排序的原始數據 */

{

ucGlobalBuffer_4[i] = ucUsartBuffer[i];

}

big_to_small_sort_4(ucGlobalBuffer_4);   /* ucUsartBuffer是輸入的數組,ucGlobalBuffer_3是接收排序結果的數組 */

for(i = 0; i < const_array_size; i ++)

{

eusart_send(ucGlobalBuffer_4[i]); /* 把用第3種方法排序后的結果返回給上位機觀察 */

}

 

break; /*退出while(1)循環*/

}

uiRcMoveIndex ++; /*因為是判斷數據頭,游標向著數組最尾端的方向移動*/

}

// }

uiRcregTotal = 0; /*清空緩沖的下標,方便下次重新從0下標開始接受新數據*/

// }

}

/**

* @brief  定時器0中斷函數

* @param  無

* @retval 無

**/

void ISR_T0(void) interrupt 1

{

TF0 = 0;  /*清除中斷標志*/

TR0 = 0; /*關中斷*/

 

if(uiSendCnt < const_receive_time) /*如果超過這個時間沒有串口數據過來,就認為一串數據已經全部接收完*/

{

uiSendCnt ++; /*表面上這個數據不斷累加,但是在串口中斷里,每接收一個字節它都會被清零,除非這個中間沒有串口數據過來*/

ucSendLock = 1; /*開自鎖標志*/

}

 

if(uiVoiceCnt != 0)

{

uiVoiceCnt --;

BEEP = 0;

}

else

{

;

BEEP = 1;

}

 

TL0 = T1MS;                     /*initial timer0 low byte*/

[1] [2]
關鍵字:指針  輸入接口 引用地址:為指針加上緊箍咒const,避免意外修改了只做輸入接口的數據

上一篇:指針的第五大好處,指針在眾多數組中的中轉站作用
下一篇:指針的第四大好處,指針作為數組在函數中的輸入輸出接口

推薦閱讀

? ? ? ? 聯電與晉華遭美國司法部起訴指控共謀竊取美光商業機密,震撼各界。半導體業者認為,聯電遭刑事起訴,應與美中貿易戰有關,當前環境復雜,臺灣廠商低調為宜。? ? ? ? 聯電今年7月公告,福州市中級人民法院裁定美光(Micron)大陸子公司美光半導體銷售(上海)、美光半導體(西安)立即停止銷售、進口美光Crucial多項產品,大陸地區法院初...
專注于引入新品并提供海量庫存的電子元器件分銷商貿澤電子 (Mouser Electronics) 即日起開售Qorvo? QPF4219前端模塊 (FEM)。這款2.4 GHz FEM面向采用Wi-Fi? 5 (802.11ac) 的物聯網 (IoT) 系統而設計,外型小巧,并且集成了匹配功能,能夠盡可能縮小無線路由器、家用網關和接入點等應用內的布局面積。 貿澤電子分銷的Qorvo QPF4219 FEM在單一器件內...
三星電子與設計服務提供商芯原微電子(上海)股份有限公司(VeriSilicon)合作,幫助AI邊緣計算初創公司Blaize產品按時上市。利用三星的14nm FinFET工藝技術和VeriSilicon的芯片設計和IP,Blaize成功推出了配備Blaize Graph Streaming Processor(GSP)的人工智能邊緣計算Pathfinder和Xplorer平臺。Blaize正在解決邊緣AI應用程序部署中的一個基本問題,...
MCU 控制寄存器包含了電源管理的控制位。? Bit 5 – SE: 睡眠使能為了使MCU 在執行SLEEP 指令后進入睡眠模式, SE 必須置位。為了確保進入睡眠模式是程序員的有意行為,建議僅在SLEEP 指令的前一條指令置位SE。一旦喚醒立即清除SE。? Bits 4..2 – SM2..0: 睡眠模式選擇位如Table 17 所示,這些位用于選擇具體的睡眠模式。 Note: 1....

史海拾趣

問答坊 | AI 解惑

超過2萬行的51程序用什么軟件編譯好?

data估計有500字節以上, code超過50k.用偉福編譯老是報: I/O ERROR ON INPUT FILE…

查看全部問答∨

號外!EAGLE出中文版了!!

EAGLE官方網站發布中文版本了,安裝后的手冊和用戶指南也是中文的,終于不用看讓人頭大的英文了。 這次出的是中文Beta版,下載地址http://www.cadsoft.de/betatest.htm。…

查看全部問答∨

請教Nand Flash問題(Wince 5.0 + Pxa310)

我在wince 5 + Pxa310下面用的是二合一的存儲芯片nand+sdram,Nand容量是256M的,進入系統之后,當我往Nand里面拷貝文件,快要把Nand塞滿的時候,系統就會死機,這個時候如果斷電重新開機或者復位開機,連Eboot也跑不起來了,查原因發現是Nand的rel ...…

查看全部問答∨

這些二極管參數是什么意思?

MODEL MR821 D ( + IS = 5.989e-09 + RS = 0.00477 + CJO = 1.139e-10 + VJ = 0.7174 + TT = 3.25e-08 + M = 0.2698 + BV = 100 + N = 2 + EG = 1.11 + XTI = 3 + KF = 0 + AF = 1 + FC = 0.5 + IBV = 0.0001 + TNOM ...…

查看全部問答∨

求救:在UP-NETARM2410-S實驗箱中燒寫WINCE內核為什么燒不進去?

各位大俠,我是個菜鳥,剛開始學習嵌入式,我用的是北京博創興業科技有限公司的實驗箱UP-NETARM2410-S,不過帶的資料書是關于LINUX的,有個PDF文件是關于WINCE的,不過寫的不詳細。我現在根據資料把2410loader.bin,tocblock1,eboot.nb0利用超級終端 ...…

查看全部問答∨

EXTI總是不能發生中斷,可能還是配置錯誤。。。

采用PC12作為外部中斷線輸入引腳,連接到EXTI_Line0,如下配置:1〉在RCC中使能了PC port2〉在NVIC中使能了EXTI_Line0中斷   //使能EXTI 0通道    NVIC_InitStructure.NVIC_IRQChannel &nb ...…

查看全部問答∨

Mindspeed推出基于多核ARM Cortex-A CPU的高性能通信處理器

本帖最后由 jameswangsynnex 于 2015-3-3 20:02 編輯 敏訊科技有限公司(Mindspeed Technologies, Inc.,NASDAQ股票市場代碼:MSPD)已宣布:推出基于多核ARM? Cortex?-A CPU的Comcerto?2000系列通信處理器。通過將軟件定義聯網(SDN)帶到網絡的 ...…

查看全部問答∨

收到 “富士通工業控制板”

東西是昨天收到的,因同時昨天也收到了剛買的相機,所以,沒有馬上打開這個包裹。   1、細心包裝,使寄給的零件免受委曲           可以看出,ltbytyn花了很大功夫       2、所寄 ...…

查看全部問答∨

2012年中國國際照明燈具設計大賽獲獎作品(實物)大家欣賞一下!

首屆中國國際照明燈具設計大賽獲獎作品評審在中山市古鎮進行,中國照明電器協會組織了7名相關行業專家,最終,評選出一等獎作品1件,二等獎作品3件,三等獎作品5件,優秀獎作品10件。對大賽入圍的45件實物作品進行了現場考察、集中討論和評價。評審 ...…

查看全部問答∨

孕婦胎動檢測儀

老婆懷孕了,到了32周了,醫生建議每天數胎動,我突然想到可以用這個來做個胎動監測,這樣就可以24小時監測了。因為平時孕婦都要做其它事情,不會一直在監視胎動,有了這個是不是就很方便了。而且手機隨時可以看,不過傳感器是個問題,還有就是無線 ...…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 五峰| 肇东市| 永新县| 隆安县| 塔城市| 漯河市| 洮南市| 定远县| 印江| 吉水县| 资中县| 舞阳县| 九寨沟县| 黑河市| 高安市| 乐陵市| 昌宁县| 天峻县| 北安市| 鄂伦春自治旗| 鸡泽县| 隆安县| 恩施市| 临泽县| 农安县| 珲春市| 成武县| 佛山市| 博白县| 彭州市| 城口县| 岳池县| 贵港市| 民县| 辽宁省| 彰化县| 靖州| 大邑县| 五大连池市| 宜黄县| 潞城市|