實驗4,c8051f020 SPI的使用

2021-09-21 00:25:56 字數 2866 閱讀 1301

今天,就在今天,終於調通了zlg7289的實驗四**,滿足,又有點虛脫,趁著熱情還在,趕快記錄下來。

問題一:標頭檔案的引用。

風風火火寫完**,編譯爆出長長以列表的錯誤,undifine,undifine ...我就納了個悶,p3這種引腳為什麼沒有定義,原因就在於。這次用到的檔案除了配置檔案c8051f020.外還有'zlg7289.h','zlg7089.c' p3的undifine指的是zlg7289f020.c中未定義,因為在這個原始檔中要加上標頭檔案『#include 『c8051f020.h'

緊接著就是編譯報錯redifine。。。excuses me???剛才爆沒定義,現在重複定義這其中怕是有什麼誤會。尋訪高人後才知道,因為在main.c函式宣告了#include'c8051f020.h',定義一次,在zlg7289.c中,我又包含了標頭檔案,造成兩次定義,

解決辦法是在c8051f020.h中加入#ifndef__c8051f020_h__

#definec8051f020_h…#endif

這句話的意思 是如果沒定義,那就定義,否則不定義。

問題二:中斷函式中語句的使用。

在中斷中,最好做一些簡單的事情,不要把封裝的函式,用在裡面,尤其是zlg的download函式,每進入這個函式,都會先關閉中斷,執行命令,在開啟中斷,彈出函式,另外在定時器中斷中,也不要有這種操作,本來定時器中斷使用目的就是為了讓程式每隔一段準確時間來做一些事情,如果定時器中斷函式中加入多餘操作會打亂定時器計時節奏,簡直是沙雕行為(假裝我沒犯)。。。。

問題三:main()函式和中斷的配合

這次實驗裡微控制器和zlg完成的任務是讀鍵值,數碼管顯示,中斷要做的就是判斷有沒有鍵被按下,是,更新標誌位,是不是到了該顯示的掃瞄時間,是,更新標誌位。主函式裡要做的就是判斷(查詢),標誌位有沒有改變,如果改變了,微控制器該做什麼。

問題四:c51微控制器和zlg晶元的通訊頻率匹配問題。(燈不亮,debug時中斷函式進不去,最頭禿的問題)

周立功晶振4m,我選的微控制器頻率是外部時鐘24m二分頻也就是12m,在zlg7289_init(t)中t>5*12/4,函式注釋說t值超過40可能會出錯。這個t是什麼意思呢?,他其實跟zlg的輸入時鐘有關,zlg通過p3^4引腳置高低電平,產生時鐘,脈衝寬度就與t有關,t值越大,時鐘週期越長,越與zlg晶元匹配(速度相對於微控制器是很慢的),就如同乙個人(zlg)只能每分鐘揮臂30次,(微控制器)非要讓他每分鐘揮90次,那他只能累死(zlg跑死),zlg可以執行動作很快,但是不能長時間以高速行駛,否則,跑死。我寫的**!

開始沒有&&後面的那句,因為初始count_t=0,故會一直進入函式,函式裡連續4次zlg_download,會讓微控制器跑死。真的是頭一次碰到這種問題,記憶深刻。

上面的內容都是我自己瞎琢磨出來的,如有錯誤歡迎指正!也歡迎討論。最後,特別感謝某鄭姓男子,幫我debug。

背靠大佬就是好,就是好!

說了這麼多,附上low眉low眼**。

#include

#include

char key_data;

unsigned

char ss;

unsigned

char sc;

unsigned

char mins;

unsigned

char minc;

unsigned

char mss;

unsigned

char msc;

unsigned

int input_t;

unsigned

int count_t;

unsigned

char n;

unsigned

char t_end;

unsigned

char t_wei;

unsigned

char count;

unsigned

char dat;

bit flag_key;

void

delay

(unsigned

int t)

//1ms級延時,定時器0實現

while

(--t);}

void

display_end()

//閃爍函式

zlg7289_flash

(0x5a);

}void

display_set()

//數碼管前四位顯示設定的時鐘值

void

display_jishi()

void

function_key()

}if(key_data ==

14)

tr1 =1;

if(key_data ==15)

tr1 =

~tr1;

}void

main()

}if(count_t%2==

0&&count_t!=0)

display_jishi()

;//每200ms,顯示重新整理

if(count_t == input_t&&count_t!=0)

end_display()

;//定時時間到,閃爍函式}}

void

key_scan

() interrupt 19

void

timer1

() interrupt 3

}

C8051F環境搭建

usb偵錯程式 u ec6 支援jtag模式 c2模式 jtag介面定義 適用型號c8051f00x c8051f01x c8051f02x c8051f04x c8051f06x c8051f12x c8051f2xx c2介面定義 適用型號c8051f3xx c8051f41x c8051f5x...

C8051F020外部儲存器介面

這幾天做了做乙太網控制器的實驗,對 cp2200 的控制涉及到一些 c8051f020 外部資料儲存器介面的訪問的內容,在這裡總結一下。首先看一下 c8051f020 的原理框圖 此圖 於晶元手冊,借來用一下。從這張圖可以清楚的看到晶元儲存器的分布和儲存器介面的分布。從紅色部分可以看出位址匯流排 資...

C8051F340晶元64位驅動移植

win7 64位機上需要使用以上晶元進行usb的資料通訊,因此需要移植c8051f340的驅動韌體以及對應的通訊上位機程式。2 以管理員身份執行cmd.exe,輸入命令bcdedit.exe set loadoptions ddisable integrity checks關閉數字簽名認證 3 在預...