久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 15709|回復(fù): 16
收起左側(cè)

STM32與Proteus的串口仿真詳細(xì)教程與源程序

  [復(fù)制鏈接]
ID:878474 發(fā)表于 2021-2-10 10:17 | 顯示全部樓層 |閱讀模式
包含LCD1602顯示,串口發(fā)送接收,完美實(shí)現(xiàn)。
文檔內(nèi)容齊全,包含使用說(shuō)明,相關(guān)驅(qū)動(dòng)等。
解決了STM32的Proteus串口收發(fā)問(wèn)題。    注意:每輸入一個(gè)字符后,要按一次“手動(dòng)發(fā)送”按鈕,才能收到正確字符。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)

串口收發(fā)

串口收發(fā)


Proteus的串口仿真
打開(kāi)串口調(diào)試助手,如圖11-30所示。進(jìn)入串口調(diào)試助手后,需要設(shè)置相關(guān)參數(shù),串口號(hào)為圖11-29所查到的端口號(hào),其他參數(shù)根據(jù)實(shí)際程序來(lái)確定。打開(kāi)串口后,按開(kāi)發(fā)板上的reset按鍵,顯示區(qū)就能接收到從開(kāi)發(fā)板發(fā)送過(guò)來(lái)的“Welcome to HBEU”,每按復(fù)位鍵一次,就會(huì)接收一次,如圖11-31所示;在發(fā)送區(qū)輸入字符,如圖11-32所示,點(diǎn)擊“手動(dòng)發(fā)送”,開(kāi)發(fā)板上就能收到對(duì)應(yīng)的字符,根據(jù)要求,不是以“x”結(jié)束的字符串,當(dāng)超過(guò)20個(gè)字符后也接收到字符串。
圖11-29 查看串口號(hào)
   在Proteus中仿真串口時(shí),先安裝“虛擬串口”驅(qū)動(dòng),如圖11-33所示,安裝完之后也可以查看虛擬串口的端口號(hào),查看方法與圖11-29一致。在串口助手中設(shè)置好串口參數(shù)后,按Proteus中運(yùn)行按鈕,也可以在串口助手收到信息,如圖11-34所示,注意串口波特率。
圖11-30 串口助手
圖11-31 STM32發(fā)送數(shù)據(jù)
圖11-32 STM32串口接收數(shù)據(jù)
圖11-33 虛擬串口驅(qū)動(dòng)文件
圖11-34  Proteus仿真串口接收數(shù)據(jù)
由于Proteus沒(méi)有對(duì)stm32的時(shí)鐘樹(shù)做仿真模型,只固定了一套時(shí)鐘值,可以用GETSYS/HCLK/PCLK函數(shù)看。Proteus不是實(shí)時(shí)仿真,所以串口速率不是硬件速率對(duì)應(yīng)的值,可能更高,可能更低,好在Proteus的虛擬終端是可以輸入非標(biāo)準(zhǔn)波特率的,推薦波特率設(shè)為9600bit/s。另外,在Proteus仿真的程序中加了一條語(yǔ)句:
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
若沒(méi)有該系統(tǒng)配置語(yǔ)句,則看不到仿真效果。仿真時(shí)鐘跟實(shí)際時(shí)鐘存在一定的延時(shí)誤差,在上位機(jī)發(fā)送數(shù)據(jù)時(shí),一次發(fā)送一個(gè)字符串時(shí),接收會(huì)出現(xiàn)亂碼,因此需要一個(gè)一個(gè)字符發(fā)送,如圖11-35所示,在發(fā)送區(qū)依次輸入“e1x”之后(注意:每輸入一個(gè)字符后,要按一次“手動(dòng)發(fā)送”按鈕),虛擬終端(Virtual Terminal)會(huì)顯示所發(fā)送的所有字符,當(dāng)STM32的串口接收到字符“x”后,表示結(jié)束,在LCD屏上顯示“e1”。
為了接收方便,將最多發(fā)送20個(gè)字符改為最多發(fā)送5個(gè)字符,當(dāng)我們依次輸入“123456”后(注意:每輸入一個(gè)字符后,要按一次“手動(dòng)發(fā)送”按鈕),LCD顯示收到的字符串“12345”,如圖11-36所示。
圖11-35  STM32串口遇到“x”結(jié)束接收   圖11-36  STM32串口收到6個(gè)字符自動(dòng)結(jié)束


單片機(jī)main文件源代碼:
  1. #include "stm32f10x.h"
  2. #include "stdio.h"
  3. //#include "led.h"
  4. #include "delay.h"
  5. #include "lcd1602.h"


  6. uint8_t USART_RXBUF[5];
  7. extern uint8_t RXOVER;
  8. /* Private function prototypes -----------------------------------------------*/
  9. void NVIC_Configuration(void);
  10. //void Delay_Ms(uint32_t nTime);
  11. void USART_Config(void);
  12. //void USART_SendString(int8_t *str);
  13. void USART_SendString(unsigned char *buf);

  14. int main(void)
  15. {
  16.          uint8_t i;

  17.         RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);

  18.         //SysTick_Init();
  19.         SysTick_Config(SystemCoreClock/100000);
  20.    GPIO_Configuration();
  21.    LCD1602_Init();
  22.                
  23.         LCD1602_Show_Str(0,0,"Receive:");        
  24.         USART_Config();
  25.                 //USART_SendString(Tx_Buf);//發(fā)送字符串
  26.                 USART_SendString("Welcome to HBEU\r\n");//發(fā)送字符串
  27.         while(1)
  28.         {
  29.                 if(RXOVER == 1){

  30.                         LCD1602_Show_Str(0,2,USART_RXBUF);               
  31.                                 
  32.                         for(i=0;i<5;i++){
  33.                                 USART_RXBUF[i] =' ';  //清空接收區(qū)
  34.                         }
  35.                         RXOVER = 0;
  36.                         USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);/////////////////////////////////////////////////////////////
  37.                 }
  38.                
  39.                 /*if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET)
  40.                 {
  41.                         USART_SendData(USART1,USART_ReceiveData(USART1));
  42.                         delay_ms(1000);
  43.                 }*/
  44.                                 
  45.         }
  46. }

  47. /*void USART_Config(void)
  48. {
  49.     GPIO_InitTypeDef  GPIO_InitStructure;
  50.     USART_InitTypeDef USART_InitStructure;

  51.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);
  52.         //RCC_APB1PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  53.         
  54.         //NVIC_Configuration();
  55.     //配置USART2 TX引腳工作模式
  56.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  57.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  58.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  59.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  60.     //配置USART2 RX引腳工作模式
  61.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  62.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  63.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  64.     //串口2工作模式配置
  65.     USART_InitStructure.USART_BaudRate = 9600;
  66.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  67.     USART_InitStructure.USART_StopBits = USART_StopBits_1;
  68.     USART_InitStructure.USART_Parity = USART_Parity_No ;
  69.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  70.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  71.     USART_Init(USART1, &USART_InitStructure);
  72.         
  73.         //USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
  74.     USART_Cmd(USART1, ENABLE);
  75. }*/

  76. void USART_Config(void)
  77. {
  78.         GPIO_InitTypeDef GPIO_InitStructure;
  79.         USART_InitTypeDef USART_InitStructure;

  80.         // 打開(kāi)串口GPIO的時(shí)鐘
  81.         //DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
  82.         
  83.         // 打開(kāi)串口外設(shè)的時(shí)鐘
  84.         //DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);
  85.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  86.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
  87.         NVIC_Configuration();
  88.         // 將USART Tx的GPIO配置為推挽復(fù)用模式
  89.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  90.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  91.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  92.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  93.   // 將USART Rx的GPIO配置為浮空輸入模式
  94.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  95.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  96.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  97.         
  98.         // 配置串口的工作參數(shù)
  99.         // 配置波特率
  100.         USART_InitStructure.USART_BaudRate = 9600;
  101.         // 配置 針數(shù)據(jù)字長(zhǎng)
  102.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  103.         // 配置停止位
  104.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  105.         // 配置校驗(yàn)位
  106.         USART_InitStructure.USART_Parity = USART_Parity_No ;
  107.         // 配置硬件流控制
  108.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  109.         // 配置工作模式,收發(fā)一起
  110.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  111.         // 完成串口的初始化配置
  112.         USART_Init(USART1, &USART_InitStructure);

  113.         // 使能串口
  114.         USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
  115.         USART_Cmd(USART1, ENABLE);            
  116. }

  117. /**
  118.   * @說(shuō)明     USART2字符串發(fā)送函數(shù)
  119.   * @參數(shù)     str: 指向字符串的指針
  120.   * @返回值   None
  121.   */
  122. /*void USART_SendString(int8_t *str)
  123. {
  124.     uint8_t index = 0;

  125.     do
  126.     {
  127.         USART_SendData(USART1,str[index]);
  128.         while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
  129.         index++;        
  130.     }
  131.     while(str[index] != 0);  //檢查字符串結(jié)束標(biāo)志

  132. }*/

  133. void USART_SendString(unsigned char *buf)
  134. {
  135.         while (*buf != '\0')
  136.         {
  137.                 while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
  138.                 USART_SendData(USART1, *buf++);

  139.         }
  140. }

  141. /**
  142.   * @說(shuō)明     配置中斷向量控制器
  143.   * @參數(shù)     None
  144.   * @返回值   None
  145.   */
  146. void NVIC_Configuration(void)
  147. {
  148.         NVIC_InitTypeDef NVIC_InitStructure;

  149.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  150.         /* Enable the RTC Interrupt */
  151.         NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  152.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  153.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  154.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  155.         NVIC_Init(&NVIC_InitStructure);
  156. }
復(fù)制代碼
Proteus仿真工程與代碼51hei下載:
資料.7z (7.93 MB, 下載次數(shù): 476)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:605142 發(fā)表于 2021-2-11 08:16 | 顯示全部樓層
keil 51hei圖片20210211081423.png

Proteus 51hei圖片20210211081454.png

我測(cè)試stm32 PWM仿真,Proteus仿真 跟keil軟件仿真 出來(lái)的結(jié)果不一樣
我也不知道信誰(shuí)了,改天搭個(gè)硬件試一下
回復(fù)

使用道具 舉報(bào)

ID:605142 發(fā)表于 2021-2-11 10:06 | 顯示全部樓層

找到原因了,keil的是正確的
proteus 的PWM 模式1跟模式2是反的,
回復(fù)

使用道具 舉報(bào)

ID:219983 發(fā)表于 2021-2-11 16:25 | 顯示全部樓層
proteus確實(shí)是好東西,剛開(kāi)始學(xué)習(xí)stm32,還在摸索中。
回復(fù)

使用道具 舉報(bào)

ID:89414 發(fā)表于 2021-3-4 14:27 | 顯示全部樓層
看著挺有用的
回復(fù)

使用道具 舉報(bào)

ID:304785 發(fā)表于 2022-4-17 12:48 | 顯示全部樓層
胡來(lái)一刀 發(fā)表于 2021-2-11 16:25
proteus確實(shí)是好東西,剛開(kāi)始學(xué)習(xí)stm32,還在摸索中。

剛開(kāi)始學(xué)習(xí)建議你直接上開(kāi)發(fā)板,別用proteus。就算實(shí)際程序?qū)懥撕枚嗄辏餐娌幻靼譸roteus的32仿真。
回復(fù)

使用道具 舉報(bào)

ID:1023206 發(fā)表于 2022-5-13 19:14 | 顯示全部樓層
太棒了,我要被實(shí)驗(yàn)愁死了
回復(fù)

使用道具 舉報(bào)

ID:72243 發(fā)表于 2022-5-22 17:48 | 顯示全部樓層
proteus的stm32單片機(jī)仿真非常的無(wú)語(yǔ),很多情況與實(shí)際根本就是兩回事。
千萬(wàn)不要想著51能仿真,32也沒(méi)問(wèn)題,那就大錯(cuò)特錯(cuò)了,正如樓上老兄所說(shuō),玩了N年32的也不一定能搞明白32的proteus仿真。
就拿串口仿真來(lái)說(shuō),同樣是用虛擬串口proteus仿真,51就可以字符串收發(fā)。到了stm32,就和樓主說(shuō)的一樣,字符串只能從單片機(jī)發(fā)到上位機(jī),單片機(jī)側(cè)不能成串接收字符串,只能一個(gè)一個(gè)接收,嘗試無(wú)數(shù)遍也沒(méi)找原因也沒(méi)有找到原因。
還有諸如系統(tǒng)滴答定時(shí)器,以及通用定時(shí)器設(shè)置,參數(shù)和實(shí)際設(shè)置差距不是一般的大,到現(xiàn)在我都不知道原因,真的是天、天、天、天壤之別。

評(píng)分

參與人數(shù) 1黑幣 +40 收起 理由
admin + 40 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:1048085 發(fā)表于 2022-12-9 19:57 | 顯示全部樓層
為什么我直接下載下來(lái)后運(yùn)行就是不行呢 不管是單個(gè)字符發(fā)送還是發(fā)送字符串 LCD上都是顯示亂碼 串口助手的波特率設(shè)置9600
回復(fù)

使用道具 舉報(bào)

ID:9932 發(fā)表于 2023-8-31 22:58 | 顯示全部樓層
proteus確實(shí)是好東西,剛開(kāi)始學(xué)習(xí)stm32
回復(fù)

使用道具 舉報(bào)

ID:108931 發(fā)表于 2023-11-5 14:10 | 顯示全部樓層
這個(gè)仿真真好。
回復(fù)

使用道具 舉報(bào)

ID:294858 發(fā)表于 2023-11-30 11:08 | 顯示全部樓層
我不能實(shí)現(xiàn)數(shù)據(jù)發(fā)送,能給了詳細(xì)的步驟嗎?
回復(fù)

使用道具 舉報(bào)

ID:389200 發(fā)表于 2024-5-19 22:27 | 顯示全部樓層
一直在找相關(guān)例程,不錯(cuò)
回復(fù)

使用道具 舉報(bào)

ID:1123146 發(fā)表于 2024-5-31 14:36 | 顯示全部樓層
一直在找關(guān)于stm32串口通信的Proteus仿真和源程序。能夠?qū)崿F(xiàn)點(diǎn)亮oled燈
回復(fù)

使用道具 舉報(bào)

ID:1123146 發(fā)表于 2024-5-31 15:15 | 顯示全部樓層
我想問(wèn)下這里的proteus用的是幾點(diǎn)幾版本的
回復(fù)

使用道具 舉報(bào)

ID:1123146 發(fā)表于 2024-5-31 16:42 | 顯示全部樓層
下載后仿真成功,我是過(guò)來(lái)感謝的。不過(guò)我想問(wèn)那個(gè)串口通信控制三個(gè)led燈的亮滅仿真好像沒(méi)有
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日本a视频 | 久草院线 | 天天宗合网 | 欧美一级二级视频 | 亚洲免费在线 | 粉嫩一区二区三区性色av | 国产污视频在线 | 国产高清在线视频 | 中文字幕亚洲一区二区三区 | 欧美片网站免费 | 日韩中文字幕在线观看 | av香港经典三级级 在线 | 久久国产精彩视频 | 91精品国产综合久久久密闭 | 日本a∨精品中文字幕在线 亚洲91视频 | 免费高潮视频95在线观看网站 | 91精品国产乱码久久久久久久久 | 亚洲国产一区二区三区四区 | 中文字幕精品一区二区三区精品 | av二区三区| 国产在线观看av | 午夜在线精品 | 91精品国产乱码久久久久久久久 | 亚洲国产欧美日韩 | 成人午夜免费福利视频 | 欧美精品一区二区在线观看 | 精产国产伦理一二三区 | 国产一级视频在线观看 | 一级做a爰片性色毛片 | 日韩成人在线电影 | 日韩精品一区二区三区免费视频 | 成人精品视频 | 日韩久久久久久 | 国产精品国产成人国产三级 | 在线欧美视频 | 亚洲精品无人区 | 国户精品久久久久久久久久久不卡 | 国产精品久久亚洲7777 | 毛片av免费看| 亚洲欧美精品在线 | 在线免费小视频 |