1. 幫解釋一下這個單片機的程序
#include <reg52.h> //包含51單片機頭文件
//共陽極數碼管0-9數組編碼
unsigned char code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//數碼管位選數組編碼,這里有8位數碼管(既8個數碼管)
unsigned char code wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//下面是變數申明
unsigned char mode=0;
unsigned int temp;
float dianya;
unsigned int dianya1;
//下面是51單片機埠位申明
sbit START=P1^5;
sbit EOC=P1^6;
sbit OE=P1^7;
sbit a=P1^0;
sbit b=P1^1;
sbit c=P1^2;
sbit key=P1^3;
//一個延時函數
void delay(unsigned int z)
{
while(z--);
}
//按鍵掃描函數
void key_scan()
{
if(key==0) //當key按下時,key既埠P1^3
{
delay(10); //延時
if(key==0) //在檢測埠P1^3是否為低
{
/********************************************
到這里你發現你程序有問題
********************************************/
}
}
switch (mode) //這里也有問題,如果mode只為0,變數a b c清0,可以用if語句
{
case 0 : a=0;b=0;c=0;break;
}
}
void main() //主函數
{
unsigned char aa[4],i;
while(1)
{
key_scan();
P2=wei[0]; // 選中第一個數碼管
P0=seg[mode]; //第一個數碼管顯示存在變數mode里的數
/*******************************************
下面部分應該為從AD檢測一個電壓
*******************************************/
START=1; //P1^5 置1
delay(10); //延時
START=0; //P1^5 置0
while(EOC==0); //如果P1^6為0,一直循環等待
OE=1; //P1^7置1
temp=P3; //把P3埠上8位數賦值給變數temp
dianya=(5.0/255)*temp; //8位AD值轉換成電壓顯示值
dianya1=dianya*10;
aa[2]=dianya1/10; //把轉換後的值除10
aa[3]=dianya1%10; //把轉換後的值求模
for(i=2;i<4;i++)
{
P2=wei[i]; //數碼管2,3分別位選
if(i==2)
P0=seg[aa[i]]&0x7f; //顯示轉換後的電壓值aa[2]並加上點 (除10的值)
else P0=seg[aa[i]]; //顯標轉換後的電壓值aa[3](求模值)
delay(1);
}
}
}
2. 單片機關於STARTUP.A51
用包含一詞好像有點不妥,當在kiel C中新建項目時,會問:
Copy standard 8051 Starup Code to Project Forder and add file to Project?
翻譯為:復制8051啟動代碼到項目並和添加文件到項目?
其實無論您選是還是否,您的代碼中都將包含該文件。
該文件的作用是 初始化 內外部 RAM使其清零,另外還初始化SP等。
如果上述提示框您選否,對哪些RAM清零將採用默認的方式。
如果您想改變RAM清零區域(假如希望復位時某些RAM不被清零時會很有用。),您可以選是,這樣該文件的一個副本將添加到您的項目,您可以根據需要改寫此文件。
其他SP,SAMLL/COMPACT、LARGE模式的重入函數的堆棧和指針的初始化等和RAM的道理是一樣的。
3. 請教單片機的啟動過程
看過一篇文章說道:
CPU啟動後到有兩種方式:
1、CPU重啟後,將其PC寄存器設為特定地址,只要用戶的起始程序存在這個地址,就可以被正確執行;
——貌似51就是啟動後將PC寄存器設為00H。
2、CPU重啟後,會將CPU中存儲中斷矢量表地址的寄存器設為某特定地址,接著引發RESET中斷,程序
員只要把中斷矢量表存儲在這個地址。並指定RESET中斷的處理程序為自己寫的某個函數,則該函數就可以在
開機後被CPU執行。
——中斷矢量表不是固定在FLASH內部的一段內存嗎?怎麼又多了個存儲中斷矢量表的寄存器?
——棧、堆等的初始化到底是在RESET中斷的執行之前還是之後?
由於,應用到的程序一直是用C寫的,很少去關心單片機的啟動過程,往往編譯器也有現成的傻瓜版啟動代碼,
至於匯編畢業後就都忘得7788了。所以,單片機啟動過程這一塊我還是很亂很迷糊的,希望哪位有經驗的朋友
能夠指導或者做個概述一下,萬分感謝!~
4. 單片機C語言程序,看不懂,求講解
「T0中斷服務程序不是一個子程序嗎?但沒看見在主程序中調用這個子程序啊,求講解這個程序命令的運行過程,定時器怎麼中斷的?」
該子程序是在硬體產生中斷的時候,跳轉到相應中斷入口後,再跳轉到這個中斷服務程序的。請注意函數後面的「interrupt x」聲明,這是C51的擴展內容。
「用示波器測波形是測p1.0引腳,為什麼是這個引腳,怎麼確定的?咐族仿p1_0不是個變數名嗎?」
P1_0這個符號在前面的頭文件穗漏 t89c51cc02.h 中有定義。至於「為什麼是這個引腳」,是由硬體設計及本程序共同確定的。P1_0(不是你寫的p1_0,C語言要區分衡纖大小寫哦)代表P1口的第0管腳,在頭文件中通過sbit定義。
「為什麼T0中斷服務程序和主程序中都有T0的初值,設置還是一樣,他們有什麼關系?」
主程序前面的是對Timer0初始化,賦以初值。執行 TR0 = 1; 這一句以後,Timer0就開始運行了——TL0與TH0組成的13位計數器開始不斷遞增。當13位全部為1之後,再遞增就全部為0,此時溢出事件會觸發產生定時器0,同時計數器仍然在繼續計數——為了讓時間間隔保持一致,就需要再度將計數器賦以初值。