一、使用proteus繪制簡單的電路圖,用于后續(xù)仿真
二、編寫程序
/********************************************************************************************************************
---- @Project: USART
---- @File: main.c
---- @Edit: ZHQ
---- @Version: V1.0
---- @CreationTime: 20200713
---- @ModifiedTime: 20200713
---- @Description:
---- 波特率是:9600 。
---- 按一次按鍵S1,單片機就往上位機發(fā)送以下一串?dāng)?shù)據(jù):eb 00 55 01 00 00 00 00 41
---- 單片機: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_send_size 20 /*串口發(fā)送數(shù)據(jù)的緩沖區(qū)數(shù)組大小*/
#define const_voice_short 40 /*蜂鳴器短叫的持續(xù)時間*/
#define const_key_time1 20 /*按鍵去抖動延時的時間*/
/*——————變量函數(shù)定義及聲明——————*/
/*蜂鳴器的驅(qū)動IO口*/
sbit BEEP = P2^7;
/*LED*/
sbit LED = P3^5;
/*按鍵*/
sbit Key_S1 = P0^0;
sbit Key_Gnd = P0^4;
unsigned char ucSendregBuf[const_send_size]; /*接收串口中斷數(shù)據(jù)的緩沖區(qū)數(shù)組*/
/*為串口計時器多增加一個原子鎖,作為中斷與主函數(shù)共享數(shù)據(jù)的保護(hù)*/
unsigned char ucVoiceLock = 0; /*蜂鳴器鳴叫的原子鎖*/
unsigned int uiVoiceCnt = 0; /*蜂鳴器鳴叫的持續(xù)時間計數(shù)器*/
unsigned char ucKeySec = 0; /*被觸發(fā)的按鍵編號*/
unsigned int uiKeyTimeCnt1 = 0; /*按鍵去抖動延時計數(shù)器*/
unsigned char ucKeyLock1 = 0; /*按鍵觸發(fā)后自鎖的變量標(biāo)志*/
/**
* @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ù)碼管顯示的內(nèi)容轉(zhuǎn)移到以下幾個變量接口上,方便以后編寫更上一層的窗口程序。
* 只要更改以下對應(yīng)變量的內(nèi)容,就可以顯示你想顯示的數(shù)字。
**/
void Init_Peripheral(void)
{
ET0 = 1;/*允許定時中斷*/
TR0 = 1;/*啟動定時中斷*/
TR1 = 1;
ES = 1; /*允許串口中斷*/
EA = 1;/*開總中斷*/
}
/**
* @brief 初始化函數(shù)
* @param 無
* @retval 初始化單片機
**/
void Init(void)
{
LED = 0;
BEEP = 1;
Key_Gnd = 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++) /*內(nèi)嵌循環(huán)的空指令數(shù)量*/
{
; /*一個分號相當(dāng)于執(zhí)行一條空語句*/
}
}
}
/**
* @brief 延時函數(shù)
* @param 無
* @retval 無
**/
void Delay_Short(unsigned int uiDelayShort)
{
unsigned int i;
for(i=0;i
; /*一個分號相當(dāng)于執(zhí)行一條空語句*/
}
}
/**
* @brief 串口發(fā)送函數(shù)
* @param ucSendData
* @retval 在發(fā)送一串?dāng)?shù)據(jù)中,每個字節(jié)之間必須添加一個延時,用來等待串口發(fā)送完成。
* 不增加延時,單單靠發(fā)送完成標(biāo)志位來判斷還是容易出錯,在51,PIC單片機中都是這么做。
* 在stm32單片機中,可以不增加延時,直接靠單片機自帶的標(biāo)志位來判斷就很可靠。
**/
void eusart_send(unsigned char ucSendData)
{
ES = 0; /*關(guān)串口中斷*/
TI = 0; /*清零串口發(fā)送完成中斷請求標(biāo)志*/
SBUF = ucSendData; /*發(fā)送一個字節(jié)*/
Delay_Short(400); /*每個字節(jié)之間的延時。延時的大小請根據(jù)實際項目來調(diào)整*/
TI = 0; /*清零串口發(fā)送完成中斷請求標(biāo)志*/
ES = 1; /*允許串口中斷*/
}
/**
* @brief 按鍵掃描函數(shù)
* @param 無
* @retval 放在定時中斷里
**/
void key_scan(void)
{
if(Key_S1 == 1) /*IO是高電平,說明按鍵沒有被按下,這時要及時清零一些標(biāo)志位*/
{
ucKeyLock1 = 0; /*按鍵自鎖標(biāo)志清零*/
uiKeyTimeCnt1 = 0; /*按鍵去抖動延時計數(shù)器清零*/
}
else if(ucKeyLock1 == 0) /*有按鍵按下,且是第一次被按下*/
{
uiKeyTimeCnt1 ++; /*累加定時中斷次數(shù)*/
if(uiKeyTimeCnt1 > const_key_time1)
{
uiKeyTimeCnt1 = 0;
ucKeyLock1 = 1; /*自鎖按鍵置位,避免一直觸發(fā)*/
ucKeySec = 1;
}
}
}
/**
* @brief 按鍵服務(wù)的應(yīng)用程序
* @param 無
* @retval 無
**/
void key_service(void)
{
unsigned int i;
switch(ucKeySec) /*按鍵服務(wù)狀態(tài)切換*/
{
case 1:
ucSendregBuf[0] = 0xeb; /*把準(zhǔn)備發(fā)送的數(shù)據(jù)放入發(fā)送緩沖區(qū)*/
ucSendregBuf[1] = 0x00;
ucSendregBuf[2] = 0x55;
ucSendregBuf[3] = 0x01;
ucSendregBuf[4] = 0x00;
ucSendregBuf[5] = 0x00;
ucSendregBuf[6] = 0x00;
ucSendregBuf[7] = 0x00;
ucSendregBuf[8] = 0x41;
for(i = 0; i <= 8; i ++)
{
eusart_send(ucSendregBuf[i]); /*發(fā)送一串?dāng)?shù)據(jù)給上位機*/
}
ucVoiceLock = 1; /*原子鎖加鎖,保護(hù)中斷與主函數(shù)的共享數(shù)據(jù)*/
uiVoiceCnt = const_voice_short; /*按鍵聲音觸發(fā),滴一聲就停。*/
ucVoiceLock = 0; /*原子鎖解鎖*/
ucKeySec = 0; /*響應(yīng)按鍵服務(wù)處理程序后,按鍵編號清零,避免一致觸發(fā)*/
break;
}
}
/**
* @brief 定時器0中斷函數(shù)
* @param 無
* @retval 無
**/
void ISR_T0(void) interrupt 1
{
TF0 = 0; /*清除中斷標(biāo)志*/
TR0 = 0; /*關(guān)中斷*/
/*
* 此處多增加一個原子鎖,作為中斷與主函數(shù)共享數(shù)據(jù)的保護(hù)
*/
if(ucVoiceLock == 0) /*原子鎖判斷*/
{
if(uiVoiceCnt != 0)
{
uiVoiceCnt --;
BEEP = 0;
}
else
{
;
BEEP = 1;
}
}
key_scan();
TL0 = T1MS; /*initial timer0 low byte*/
TH0 = T1MS >> 8; /*initial timer0 high byte*/
TR0 = 1; /*開中斷*/
}
/**
* @brief 串口接收數(shù)據(jù)中斷
* @param 無
* @retval 無
**/
void usart_receive(void) interrupt 4
{
if(RI == 1)
{
RI = 0;
}
else
{
TI = 0;
}
}
/*————————————主函數(shù)————————————*/
/**
* @brief 主函數(shù)
* @param 無
* @retval 實現(xiàn)LED燈閃爍
**/
void main()
{
/*單片機初始化*/
Init();
/*延時,延時時間一般是0.3秒到2秒之間,等待外圍芯片和模塊上電穩(wěn)定*/
Delay_Long(100);
/*單片機外圍初始化*/
Init_Peripheral();
while(1)
{
key_service(); /*按鍵服務(wù)的應(yīng)用程序*/
}
}
三、仿真實現(xiàn)
上一篇:51單片機實現(xiàn)通過串口用計數(shù)延時方式發(fā)送一串?dāng)?shù)據(jù)
下一篇:51單片機實現(xiàn)在串口接收中斷里即時解析數(shù)據(jù)頭的特殊程序框架
推薦閱讀
史海拾趣
隨著業(yè)務(wù)的發(fā)展和市場的擴大,ETA-USA開始在全球范圍內(nèi)布局。公司先后在中國、歐洲等地設(shè)立了分公司或辦事處,以更好地服務(wù)當(dāng)?shù)乜蛻簟_@一全球擴張策略不僅增強了公司的市場競爭力,也為其帶來了更多的商業(yè)機會和合作伙伴。
為了拓展業(yè)務(wù)范圍和提升品牌影響力,CQR SECURITY公司開始實施國際化戰(zhàn)略。公司積極開拓海外市場,與多個國家的電子企業(yè)建立了合作關(guān)系。同時,CQR還加強了與國際安全組織的交流與合作,共同推動全球網(wǎng)絡(luò)安全水平的提升。通過國際化戰(zhàn)略的成功實施,CQR不僅拓展了業(yè)務(wù)版圖,還提升了自身的技術(shù)水平和國際競爭力。
隨著產(chǎn)品性能的不斷提升和市場需求的擴大,無錫友達(dá)開始積極拓展國內(nèi)外市場。公司的產(chǎn)品不僅覆蓋國內(nèi)二十多個省、市,還遠(yuǎn)銷歐美、中東、港澳臺等國家和地區(qū)。通過與國際知名企業(yè)的合作,無錫友達(dá)不斷提升自身的品牌影響力,逐漸在全球電子行業(yè)中占據(jù)一席之地。
隨著科技的不斷進(jìn)步,Elite始終將技術(shù)研發(fā)作為公司發(fā)展的核心驅(qū)動力。公司投入大量資金引進(jìn)先進(jìn)設(shè)備和技術(shù)人才,不斷提升產(chǎn)品性能和質(zhì)量。同時,Elite積極拓展國內(nèi)外市場,通過參加各類展會、建立合作伙伴關(guān)系等方式,提高品牌知名度和市場占有率。
隨著科技的不斷進(jìn)步,Elite始終將技術(shù)研發(fā)作為公司發(fā)展的核心驅(qū)動力。公司投入大量資金引進(jìn)先進(jìn)設(shè)備和技術(shù)人才,不斷提升產(chǎn)品性能和質(zhì)量。同時,Elite積極拓展國內(nèi)外市場,通過參加各類展會、建立合作伙伴關(guān)系等方式,提高品牌知名度和市場占有率。
關(guān)于可控硅在關(guān)閉時產(chǎn)生的沖擊 本人用單相可控硅做了一個直流電機調(diào)速板(有過零檢測),可是在關(guān)閉電源(或拔下電源插座)時電機總是要動一下。 不知道哪位高工能幫我一下。先謝謝了!luhechai@yahoo.com.cn… 查看全部問答∨ |
|
基于32位微處理器與實時操作系統(tǒng)(北京航空航天大學(xué)PPT) 本課程介紹了嵌入式系統(tǒng)的前沿技術(shù)和發(fā)展趨勢,重點講述了基于ARM微處理器的嵌入式硬件平臺、嵌入式操作系統(tǒng)(RTlinux)和嵌入式軟硬件系統(tǒng)開發(fā)技術(shù)。 采用理論學(xué)習(xí)和實踐并重的教學(xué)方法,著重培養(yǎng)學(xué)生的實際動手能力,通過熟悉開發(fā)環(huán)境與開發(fā)流程 ...… 查看全部問答∨ |
打印信息中出現(xiàn)WARN: OALIoCtlHalGetHWEntropy: Buffer too small 打印信息中出現(xiàn)WARN: OALIoCtlHalGetHWEntropy: Buffer too small 之后就是亂碼了 是怎么回事啊 該如何解決這個問題啊 ?… 查看全部問答∨ |
我定義了一個線程處理函數(shù): public: DWORD ThreadProc(LPVOID lpParameter); 這樣定義生成的時候報錯 error C3867: \'CThreadtestDlg::ThreadProc\': function call missing argument list; use \'&CThreadtestDlg::ThreadPro ...… 查看全部問答∨ |
CMMB 解封裝模式2 復(fù)用塊視頻數(shù)據(jù)的問題 我現(xiàn)在在做cmmb解復(fù)用的東西,cmmb視頻數(shù)據(jù)是用模式2封裝的,H264的nal單元被封裝在復(fù)用凈荷中,文檔中說復(fù)用凈荷和RTP凈荷一一對應(yīng),可是我照文檔中的說法做解出來的H264數(shù)據(jù)播放不了,現(xiàn)在只有北京530的605播放不了,這個臺是清流臺,希望高手能 ...… 查看全部問答∨ |
如何構(gòu)建一個IRP命令使U盤彈出? 我想在U盤已經(jīng)插入電腦上的情況下,構(gòu)建一個IRP命令將U盤彈出,但不知道怎么做? 向大家請教… 查看全部問答∨ |
本人在CAN節(jié)點,之前在BASI模式下,SJA1000是可以正常初始化的;但我現(xiàn)在要用到PELI模式下的自檢功能去檢測單個節(jié)點硬件電路是否正常,但是在PELI模式下SJA1000無法正常讀寫,導(dǎo)致初始化不成功,請高人指點 #define SJA_BaseAdr 0xFF00 //定義sja1 ...… 查看全部問答∨ |
如何在evc4.2中使用__FUNCTION__這個宏定義! 我想在運行的時候獲得當(dāng)前運行函數(shù)的函數(shù)名,本來有個宏定義__FUNCTION__可以實現(xiàn)的, 但現(xiàn)在編譯不過去,顯示: error C2065: \'__FUNCTION__\' : undeclared identifier 請幫忙,謝謝!… 查看全部問答∨ |
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- 英飛凌微控制器:以全新實惠套件和強大開發(fā)環(huán)境為開發(fā)者提供支持
- iTOP-i.MX6開發(fā)板設(shè)備數(shù)驅(qū)動Menuconfig的用法
- 迅為IMX6ULL開發(fā)板Qt for Android搭建開發(fā)環(huán)境
- 迅為i.MX8M mini開發(fā)板Windots QT系統(tǒng)開發(fā)環(huán)境搭建
- 迅為IMX8MM開發(fā)板Yocto系統(tǒng)使用Gstarwmra(一)
- 迅為IMX8M mini開發(fā)板Linix系統(tǒng)修改默認(rèn)屏幕
- iTOP-4412開發(fā)板支持4G以上文件系統(tǒng)擴展
- 迅為IMX8MM開發(fā)板Yocto系統(tǒng)設(shè)置開機自啟動
- 迅為IMX6Q開發(fā)板 Buildroot文件系統(tǒng)mqtt測試
- BOE(京東方)發(fā)布未來三年股東回報規(guī)劃 一攬子方案提升長期投資價值
- 車載以太網(wǎng)-SOME/IP簡介
- 圓柱電池市場“洗牌”醞釀,場景爭奪戰(zhàn)打響
- 4月15日德州儀器攜手庫卡發(fā)布新一代工業(yè)機器人控制器,定義安全與效率新標(biāo)桿
- 大眾汽車集團在中國推出全新AI驅(qū)動ADAS系統(tǒng) 面向下一代智能電動汽車
- 納微電半導(dǎo)體推出最新SiCPAK?電源模塊
- “鈉新”、“驍遙雙核”……寧德時代開啟多核時代
- 地平線發(fā)布HSD「全家桶」,城市NOA戰(zhàn)局迎來「新變量」
- 地平線輔助駕駛系統(tǒng)發(fā)布:軟硬一體
- TrendForce:預(yù)計中國市場2025年人形機器人本體產(chǎn)值將超過45億人民幣
- MSP430G2553測試程序(狀態(tài)機檢測按鍵)
- 聚積科技以mini-LED技術(shù)正面對決傳統(tǒng)背光源/傳統(tǒng)LED顯示技術(shù)
- 廣汽埃安新能源采用日本電產(chǎn)(尼得科/Nidec)驅(qū)動馬達(dá)系統(tǒng)
- 愛馳汽車攜手藍(lán)谷智慧能源探索換電新模式
- 如何將FPGA設(shè)計快速轉(zhuǎn)成ASIC?DARPA有新動作
- STM32開發(fā)何使用STVP后就無法正常工作了
- STM32開發(fā)設(shè)計中FSMC可能遇到問題應(yīng)對方案
- STM32程序之MAX6675熱電偶溫度讀取
- MSP-EXP430F5529LP開發(fā)板003-定時器庫函數(shù)
- msp430串口接收調(diào)試