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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3066|回復: 7
打印 上一主題 下一主題
收起左側

代碼高手看一下我的單片機代碼有些問題但不知道問題在哪

[復制鏈接]
跳轉到指定樓層
樓主
100黑幣
第一個算式正確第二個就在第一個的基礎上累加,輸入沒有優先級


單片機源程序如下:
  1. #include<reg52.h>
  2. #include<stdio.h>
  3. #include <stdlib.h>
  4. void send_int_to_serial_port(int c);
  5. unsigned char rec_data[32],bete;
  6. unsigned char op,flag, num[2],n=0;
  7. unsigned int i,ansi,j,nm;
  8. void send_data(char jieguo);
  9. void chuankou_chushihua()//串口初始化程序
  10. {
  11.    TMOD|=0X20; //設置計數器1為工作方式 2
  12.    SCON=0X50; //設置串行口為工作方式 1
  13.    PCON=0X80; //波特率加倍
  14.    TH1=0XFA; //計數器初始值設置9600baud
  15.    TL1=0XFA;
  16.    ES=1; //打開接收中斷
  17.    EA=1; //打開總中斷
  18.    TR1=1; //打開計數器
  19. }
  20. void uart() interrupt 4 //串口通信中斷函數
  21. {
  22.            if(RI == 1)
  23.         {
  24.                
  25.                 RI=0;//清除接收中斷標志位
  26.                 bete=SBUF;//存儲接收到的數據
  27.                 send_data(bete);
  28.                 rec_data[nm++]=bete;
  29.         }
  30.                 flag=1;
  31. }
  32. void send_data(char jieguo)
  33. {

  34.         SBUF=jieguo;
  35.         while(TI==0);
  36.   TI=0;
  37. }
  38. int panduan_jisuan()
  39. {
  40.         if('0'<=rec_data[0]&&rec_data[0]<='9')
  41.     num[0] = rec_data[0] - '0';   
  42.         // 將第一個數字存入num[0]  
  43.     for (i = 1; i < nm; i++)// 掃描整個字符數組,從第二個字符開始逐一處理
  44.     {
  45.         if (rec_data[i] == '+' || rec_data[i] == '-' || rec_data[i] == '*' ||rec_data[i] == '/')// 如果是運算符,則將其存儲到op中,并將下一個數字存入num[1]
  46.         {
  47.             op = rec_data[i];
  48.             num[1] = rec_data[i + 1] - '0';  // 將指針移位至下一個數  
  49.         }

  50.         else if (rec_data[i] == '=')  // 如果是等號,則運算結果即為第一個數字
  51.         {
  52.             ansi = num[0];
  53.         }      
  54.         else if('0'<=rec_data[0]&&rec_data[0]<='9') // 如果是數字,則根據之前的運算符進行運算
  55.         {
  56.             switch (op)
  57.             {
  58.                 case '+':
  59.                     num[0] = num[0] + (rec_data[i] - '0');
  60.                     break;
  61.                 case '-':
  62.                     num[0] = num[0] - (rec_data[i] - '0');
  63.                     break;
  64.                 case '*':
  65.                     num[0] = num[0] * (rec_data[i] - '0');
  66.                     break;
  67.                 case '/':
  68.                     num[0] = num[0] / (rec_data[i] - '0');
  69.                     break;
  70.             }
  71.                          ansi=num[0];        
  72.                                                 
  73.         }
  74.     }
  75.                 return ansi;
  76.                
  77.         }
  78. void send_int_to_serial_port(int c)
  79.         {
  80.                
  81.     char buffer[16];
  82.     sprintf(buffer, "%d", c);// 使用 sprintf() 函數將整型變量轉換為字符串

  83.     for (i = 0; buffer[i] != '\0'; i++) // 將字符串逐個發送到串口
  84.                 {
  85.         send_data(buffer[i]);
  86.     }
  87.         }

  88. void main()
  89. {         
  90.   int k;
  91.         chuankou_chushihua( );        

  92.         while(1)
  93.         {
  94.                 if(flag==1)
  95.                  {        
  96.                          k=panduan_jisuan();        
  97.                          send_int_to_serial_port(k);
  98.                          flag=0;        
  99.                    }   
  100.                                        
  101.         }
  102. }
復制代碼



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:235200 發表于 2023-6-22 13:12 | 只看該作者
接收中斷發生時,需一次把所有接收字符接收完(沒有做到),
send_int_to_serial_port這個函數想把接收表達式及結果發送出去,可buffer緩沖區中無內容
回復

使用道具 舉報

板凳
ID:1067540 發表于 2023-6-23 14:15 | 只看該作者
在計算結束后把存儲計算結果的變量清零
回復

使用道具 舉報

地板
ID:1063563 發表于 2023-6-25 09:47 | 只看該作者
buffer緩沖區不夠了,數據溢出了吧。
回復

使用道具 舉報

5#
ID:1086796 發表于 2023-7-2 15:55 | 只看該作者
這個程序有幾個問題:  在程序開頭引入的頭文件reg52.h是基于8051單片機的,而不是適用于大多數現代的開發平臺。你可以考慮移除這個頭文件。  頭文件stdio.h中的printf函數和stdlib.h中的sprintf函數不能直接使用,因為它們是針對標準輸入輸出流的,而不是嵌入式系統中的串口通信。你需要自己實現串口發送函數和接收函數。  rec_data數組沒有進行邊界檢查,可能導致越界訪問。在處理接收到的數據之前,應該先檢查接收到的數據長度是否超過了數組的長度。  沒有對變量nm進行初始化,可能導致未定義的行為。在使用或判斷nm之前,應該將其初始化為合適的值。  在函數panduan_jisuan中,判斷數字是否在正確的范圍內時,使用了錯誤的條件。應該是'0'<=rec_data[i]&&rec_data[i]<='9'而不是'0'<=rec_data[0]&&rec_data[0]<='9'。  在函數panduan_jisuan中,在執行完一個運算符后沒有重置op的值,可能導致后續運算出錯。在處理完一個運算符后,應該將op重置為空字符。  在函數send_int_to_serial_port中,沒有定義變量i的類型和初始值。應該在函數開頭定義并初始化變量i。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

6#
ID:844772 發表于 2023-7-3 08:01 | 只看該作者
1.累加的原因是沒清零,但我覺得連續累加這也是一個功能吧。
2.沒有優先級是程序問題,建議使用堆棧處理數據,同時解決只能一位運算的問題。
回復

使用道具 舉報

7#
ID:1053359 發表于 2023-7-3 12:57 | 只看該作者
在您提供的代碼中,存在以下問題:  chuankou_chushihua() 函數中缺少對串口引腳的配置。在8051單片機中,需要設置相應的引腳(如P3.0和P3.1)為串口通信功能。  在主函數 main() 中,調用 chuankou_chushihua() 函數時沒有傳入任何參數,但是函數定義中有一個參數。  在 uart() 中斷函數中,nm 變量用于記錄接收到的字符數量,但未進行初始化。需要在主函數中添加類似 nm = 0; 的語句。  在 panduan_jisuan() 函數中,判斷數字范圍的條件語句錯誤。正確的條件應為 '0' <= rec_data[i] && rec_data[i] <= '9'。此外,該條件語句也需要修正為 rec_data[i] 而不是 rec_data[0]。  在 panduan_jisuan() 函數中,返回值 ansi 應在最后的 switch 語句之后進行賦值,而不是在進入循環時
回復

使用道具 舉報

8#
ID:1087948 發表于 2023-7-31 12:30 | 只看該作者
我注意到了幾個可能的問題:  在 uart() 中斷函數中,你在接收到數據后立即發送了相同的數據回去,這可能不是你想要的行為。  在 panduan_jisuan() 函數中,你的代碼假設每個數字和運算符都是由單個字符表示的,且每個數字和運算符之間沒有任何空格或其他字符。如果輸入的表達式不滿足這些條件,你的代碼可能無法正確地解析和計算它。  同樣在 panduan_jisuan() 函數中,你的代碼只處理了第一個運算符和等號之后的字符,對于等號之后的字符,你的代碼并沒有進行處理。  你的代碼沒有處理除數為0的情況,如果輸入的表達式包含除以0的操作,你的代碼可能會產生錯誤。  在 main() 函數中,你使用了一個名為 flag 的變量來判斷是否已經接收到數據,但是你并沒有在任何地方初始化這個變量。如果這個變量的初始值不是0,你的代碼可能會在接收到任何數據之前就開始嘗試進行計算。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲日韩中文字幕一区 | 日韩国产中文字幕 | 99re国产| 91激情电影| 日日射夜夜骑 | 99精品一区二区 | 4hu最新网址 | 欧美99久久精品乱码影视 | 欧美激情在线观看一区二区三区 | 美女131mm久久爽爽免费 | 亚洲成人精品一区二区 | 国产精品成人一区二区三区 | k8久久久一区二区三区 | 国产不卡一 | 天天夜夜人人 | 国产精品久久久久久久7电影 | 精品在线99 | 国产免费人成xvideos视频 | 黄色欧美在线 | 精品国产乱码久久久久久1区2区 | 久久久久久免费观看 | 999视频| 日韩伦理一区二区 | 久久一及片 | 亚洲国产精品一区二区第一页 | 亚洲国产一区二区三区四区 | 久久合久久| 国产一区欧美 | 国产一区二区三区四区五区3d | 美女一级毛片 | 日韩精品 | 欧美日韩亚洲系列 | 亚洲三区在线观看 | 精品一区电影 | 2021狠狠干 | 99久久成人 | 国产精品自产拍 | 黄色免费网站在线看 | 97久久久久久久久 | 国产日韩欧美一区二区 | 午夜精品在线观看 |