国产成人av人人爽人人澡-亚洲国产日韩欧美一区-好吊日视频这里只有精品-日本高清精品视频在线

你好!歡迎來到深圳市穎特新科技有限公司!
語言
當(dāng)前位置:首頁 >> 技術(shù)中心 >> 單片機入門 >> 關(guān)于單片機上for循環(huán)中運用ACC的隱蔽錯誤

關(guān)于單片機上for循環(huán)中運用ACC的隱蔽錯誤

關(guān)鍵字:單片機 C語言 編程 作者:admin 來源:不詳 發(fā)布時間:2018-05-19  瀏覽:1

最近寫了幾個程序,一個是用51單片機讀取模數(shù)傳感器adc0832的電壓值,一個是讀取ds1302的時間值,結(jié)果都出現(xiàn)了讀數(shù)一直為0的情況。我調(diào)試了近一個星期,修改了一個我認為不可能會錯的句子,程序運行成功了,這才發(fā)現(xiàn)了一個極其隱蔽的錯誤。(我用的是xp系統(tǒng),用keil4軟件編譯)

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

1.jpg

2.jpg

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

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

3.jpg

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

4.jpg

5.jpg

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

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

總結(jié):

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

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

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

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

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

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

6.jpg

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

編輯:admin  最后修改時間:2018-05-19

聯(lián)系方式

0755-82591179

傳真:0755-82591176

郵箱:vicky@yingtexin.net

地址:深圳市龍華區(qū)民治街道民治大道973萬眾潤豐創(chuàng)業(yè)園A棟2樓A08

Copyright © 2014-2023 穎特新科技有限公司 All Rights Reserved.  粵ICP備14043402號-4

中文字幕区自拍偷拍区| 黄色美女日本的美女日人| 日本精品免费在线观看| 久久精品中文字幕人妻中文 | 亚洲乱妇熟女爽的高潮片| 国产福利在线播放麻豆| 欧美精品久久男人的天堂| 日韩欧美中文字幕人妻| 亚洲一区二区三区在线免费| 免费观看一级欧美大片| 国产又粗又长又大的视频| 丰满人妻一二区二区三区av | 欧美日韩国产二三四区| 日韩精品一区二区三区含羞含羞草| 日本最新不卡免费一区二区| 亚洲中文在线观看小视频| 欧美大粗爽一区二区三区| 欧美精品专区一区二区| 九九蜜桃视频香蕉视频| 国内真实露脸偷拍视频| 国产午夜福利不卡片在线观看| 中文字幕区自拍偷拍区| 国产精品午夜小视频观看| 亚洲中文字幕亲近伦片| 国产精品美女午夜福利| 在线懂色一区二区三区精品| 91偷拍裸体一区二区三区| 尤物天堂av一区二区| 日本午夜一本久久久综合| 欧美一本在线免费观看| 国产精品熟女在线视频| 视频一区二区 国产精品| 91亚洲国产—区=区a| 一个人的久久精彩视频| 亚洲中文字幕有码在线观看| 国产一区国产二区在线视频| 国产在线观看不卡一区二区| 99热九九热这里只有精品| 亚洲超碰成人天堂涩涩| 一级片二级片欧美日韩| 91天堂免费在线观看|