色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

干貨 | 關于單片機上for循環中運用ACC的隱蔽錯誤

2oON_changxuemc ? 來源:YXQ ? 2019-06-20 10:47 ? 次閱讀

先上代碼:第一個為錯誤代碼,第二個為正確代碼。這是用來向ds1302芯片寫入命令或數據的函數。實現把8位的數據dat一位一位地寫入ds1302的io口。其中ACC0為ACC的第0位。

認真對比這兩個代碼,可能會覺得沒區別,而且這兩個代碼都可以通過編譯(加上reg52.h和一些宏定義)。我也是一直認為for()這里邊沒有錯誤,結果。。。試著修改時鐘信號,增加延時之類的,調了好久還是錯,嚴重打擊我的自信心。這兩個代碼的區別就只有for(i=0;i<8;i++)和for(i=8;i>0;i--)了。學過c語言的人都知道,這兩個句子都是實現一個8次的循環,功能一模一樣。怎么會因為這個句子的區別就導致單片機控制的錯誤呢?神奇!

接著我試著把錯誤程序中的ACC改為51芯片的寄存器B,燒錄進單片機,程序運行成功,跟“for(i=8;i>0;i--),ACC版”一樣,lcd在很囂張地顯示著正確的時間( for(i=0;i<8;i++),ACC版lcd的時間顯示為0)。附:

這樣就知道原因了,使用for(i=0;i<8;i++)的運算中可能有累加器ACC參與了,導致修改了ACC的值,使寫入的命令出現錯誤。但為什么for(i=8;i>0;i--)就沒有ACC的參與呢?一個大大的問號。基于我調試了一個星期的程序,皆因為這一個神奇的錯誤,我實在不甘心,決定研究到底。于是,分別查看了這三個程序代碼keil4 編譯后得到的 匯編代碼。(學過匯編就是爽啊,哈)

對比后,可以發現,出錯的原因是for(i=0;i<8;i++)ACC版中,用ACC接收了實參(存儲的為要寫入的指令),然后在 for 循環前要給變量 “ i " 賦值時,要用到ACC清零,再把ACC中的零賦給 R7 ("i"的值存儲在R7)。這樣的話,原來存儲在ACC中的寫入指令就被清零,自然會導致控制出現錯誤,最終沒法讀取ds1302芯片的時間,故顯示為零。

而在for(i=8;i>0;i--)ACC版中,也用ACC接收了實參的值,但在 for 循環前,給變量“ i ” 賦值時,賦值為8,不需要用到ACC,所以ACC一直是存儲著實參中的指令,沒有被清零,所以能夠順利地向ds1302發送指令,從而能夠讀取到時間。

總結:

因為用for(i=0;i0;i--)類的指令多了 CLR A 和 INC R7 兩條指令,CJNE 指令又比較DJNZ指令多了一個字節的程序代碼存儲空間,在頻率為12M的51單片機上體現為執行同樣功能的程序,要多用2us,代碼空間花多一字節。所以前者是毫無優勢的,以后應養成用

for(i=n;i>0;i--)的習慣。

請不要反駁我用了這么長的時間去研究,只能使單片機執行快2us,而說我鉆牛角尖,只是因為,這個錯誤導致我整個程序無法正常運行,這不是一件小事。

至于為什么要用到累加器ACC來接收實參,是因為后面的程序要把一個8位的實參一位一位地輸出到一個io口,自定義一個變量的話,按位尋址好像比較麻煩,要經過一系列 位運算 ,或者用bit定義8個位(有好的方法請告訴我,哈),而且我寫不出來。而用ACC的話,可以很輕易地操作ACC的任意一位,如ACC0,ACC7。在網上查了一下,好像還有一種方法是定義 一種叫 位域 的東東,我看的c語言的書都沒介紹,所以還不是很了解。

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

剛剛想了一下,不用ACC 的方法,作一個位運算dat &0x01,修改如下:

想到了這個方法后,覺得自己好白癡,以后都不用ACC了。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6042

    文章

    44617

    瀏覽量

    637703
  • ACC
    ACC
    +關注

    關注

    1

    文章

    57

    瀏覽量

    22785

原文標題:關于單片機上for循環中運用ACC的隱蔽錯誤

文章出處:【微信號:changxuemcu,微信公眾號:暢學單片機】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    單片機控制ADS7953讀取每個通道電壓,返回值異常的原因?

    單片機IO模擬SCK, MOSI, MISO 控制ADS7953,在電路中沒有使用到ADS7953的四個GPIO口,程序在16次的for循環中實現16次SCK脈沖,同時控制MOSI,并讀取
    發表于 01-23 06:34

    單片機Debug工具性能對比 單片機調試常用命令

    單片機(Microcontroller Unit, MCU)調試是嵌入式開發中的一個重要環節,它幫助開發者發現和修復代碼中的錯誤,優化程序性能。不同的單片機和開發環境可能使用不同的調試工具和命令
    的頭像 發表于 12-19 09:56 ?437次閱讀

    單片機Debug與仿真區別

    單片機的開發是一個復雜的過程,涉及到硬件設計、軟件開發和測試等多個環節。為了確保單片機能夠按照預期工作,開發者需要使用Debug和仿真技術來檢測和修正代碼中的錯誤。 Debug(調試) Debug
    的頭像 發表于 12-19 09:47 ?264次閱讀

    請問TPA3112D1的datasheet上的control system要連在單片機上嗎?

    請問TPA3112D1的datasheet上的control system 要連在單片機上嗎?AVCC是連在單片機上的某個引腳嗎?PVCC是連接電源嗎?附件是datasheet上給的參考電路圖。
    發表于 10-31 08:32

    西門子博途中循環中斷功能的編程示例

    在以下示例中,將讀取循環中斷 OB (OB31) 的相位和循環時間,并設置一個新的循環時間。
    的頭像 發表于 10-28 10:11 ?1359次閱讀
    西門子博途中<b class='flag-5'>循環中</b>斷功能的編程示例

    TAS5711用GDE生成的EQ cfg配置文件怎么加載到單片機上

    TAS5711 的用GDE 生成的EQcfg配置文件怎么加載到單片機上
    發表于 10-25 13:48

    智能記錄隱蔽工程管理系統

    ? ? ? 隱蔽工程管理是現代建筑工程中一個至關重要的環節。為了提高工程質量和管理效率,智能記錄隱蔽工程管理系統應運而生。本文將從隱蔽工程APP、工程臺賬、管理系統和云端存儲四個方面介紹該系統的功能
    的頭像 發表于 10-18 10:18 ?198次閱讀
    智能記錄<b class='flag-5'>隱蔽</b>工程管理系統

    單片機燒錄程序的線比單片機上的少還能燒錄嗎

    單片機燒錄原理 單片機燒錄是指將編寫好的程序代碼通過一定的方式傳輸到單片機的存儲器中,使其能夠按照程序的指令運行。這個過程通常需要使用燒錄器或者編程器等設備,通過一定的接口與單片機進行
    的頭像 發表于 09-02 09:54 ?594次閱讀

    單片機程序燒錄成功為什么不運行

    燒錄問題 : 確保燒錄過程沒有中斷或錯誤。 檢查燒錄器和連接線是否工作正常。 確認燒錄器設置(如電壓、波特率等)與單片機兼容。 電源問題 : 檢查單片機是否獲得了正確的電源電壓。 確保電源穩定,沒有
    的頭像 發表于 09-02 09:45 ?2606次閱讀

    一個暑假如何學習單片機

    一個暑假是學習和掌握單片機基礎知識的良好時機。以下是一個關于如何在暑假期間學習單片機的建議計劃
    的頭像 發表于 07-03 09:19 ?568次閱讀
    一個暑假如何學習<b class='flag-5'>單片機</b>

    單片機上位機軟件用什么開發

    在開發單片機上位機軟件時,選擇合適的開發工具和編程語言至關重要。本文將詳細介紹單片機上位機軟件開發的各個方面,包括開發環境、編程語言、界面設計、通信協議、調試與測試等。 1. 開發環境選擇 開發單片機上
    的頭像 發表于 06-07 09:17 ?1572次閱讀

    請問stm8單片機上電后PC的變化是怎樣的?

    請問一下stm8單片機上電后,PC的變化是怎樣的?
    發表于 05-15 08:04

    基于52單片機的28BYJ48步進電機運用

    基于52單片機的28BYJ48步進電機運用
    發表于 04-10 08:28

    使用STM32F401的單片機移植了ucosii操作系統后,在循環中調用sprintf函數時莫名卡死的原因?

    使用STM32F401的單片機移植了ucosii操作系統后。在編寫任務函數時,在循環中調用sprintf函數時莫名卡死的原因?
    發表于 04-02 06:12

    使用 MISRA C++:2023? 避免基于范圍的 for 循環中錯誤

    在前兩篇博客中,我們?向您介紹了新的 MISRA C++ 標準?和?C++ 的歷史?。在這篇博客中,我們將仔細研究以 C++ 中?for?循環為中心的特定規則。
    的頭像 發表于 03-28 13:53 ?846次閱讀
    使用 MISRA C++:2023? 避免基于范圍的 for <b class='flag-5'>循環中</b>的<b class='flag-5'>錯誤</b>
    主站蜘蛛池模板: 国产又湿又黄又硬又刺激视频 | 久久精品国产色蜜蜜麻豆国语版 | xxxxhdvideos动漫| 国产人妻人伦精品59HHH | 日韩欧美一区二区三区在线视频 | 把腿张开再深点好爽宝贝 | 乌克兰黄色录像 | 国产午夜久久影院 | 亚洲成人在线免费观看 | 久久偷拍人 | 国产99久久亚洲综合精品西瓜tv | 中文字幕成人免费高清在线 | sao虎影院桃红视频在线观看 | 高清欧美性猛交xxxx黑人猛交 | 亚洲AV精品一区二区三区不卡 | 久章草一区二区 | 成人在线视频在线观看 | 久久99re6国产在线播放 | 国产呦精品一区二区三区网站 | 97在线观看免费 | 日日操天天操夜夜操 | a视频在线观看免费 | 国产亚洲精品久久无亚洲 | 男人扒开添女人屁股 | 99婷婷久久精品国产一区二区 | 超污视频带污疼免费视频 | 欧美最猛性XXX孕妇 欧美最猛性xxxxx亚洲精品 | 欧美多毛的大隂道 | 伊人久久大香线蕉综合电影网 | 千禧金瓶梅快播 | 大睾丸内射老师 | 国产精品嫩草影院在线观看免费 | 欧美乱码伦视频免费66网 | 暖暖 视频 免费 高清 在线观看 | 亚洲精品无码久久久久A片 亚洲精品无码国产爽快A片百度 | 嗯啊插的好深啊使劲抽视频 | 天天摸夜添狠狠添高 | 亚洲大片免费看 | 四虎国产精品永久免费入口 | 凹凸精品视频分类视频 | 榴莲推广APP网站入口官网 |