freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

單片機c語言學習心得(編輯修改稿)

2024-11-15 23:55 本頁面
 

【文章內(nèi)容簡介】 lay(250)。P1_2 = 1。P1_3 = 0。Delay(250)。P1_3 = 1。P1_4 = 0。Delay(250)。P1_4 = 1。P1_5 = 0。Delay(250)。P1_5 = 1。P1_6 = 0。Delay(250)。P1_6 = 1。P1_7 = 0。Delay(250)。P1_7 = 1。}}sbit 定義位變量,unsigned char a 定義無符字符型變量a,以節(jié)省單片機內(nèi)部資源,其有效值為0~255。main函數(shù)調(diào)用Delay()函數(shù)。Delay函數(shù)使單片機空轉(zhuǎn),LED持續(xù)點亮后,再滅,下一個LED亮。while(1)產(chǎn)生循環(huán)。(三)上面我們講了如何使LED產(chǎn)生流動,但是你是否發(fā)現(xiàn)一個問題:寫的太冗長了!能不能再簡單點呢?可以!。函數(shù)unsigned char _crol_(unsigned char a, unsigned char n)可以使變量a循環(huán)左移n位,如果我們先給P1口賦0000 0001那么當n為1時,便會產(chǎn)生和上面一樣的效果!includeincludevoid Delay(unsigned char a){unsigned char i。while(a!= 0){for(i = 0。i 125。i++)。}}void main(void){unsigned char b, i。while(1){b = 0xfe。for(i = 0。i 8。i++){P1 = char _crol_(b, 1)。b = P1。Delay(250)。}}} char _cror_(unsigned char a, unsigned char n)右移也可以實現(xiàn)同樣的效果!這里就不再累述。流水燈的花樣很多,我還寫過那種拉幕式的流動等,程序很簡單,有興趣的朋友,可以自己試著寫寫!對了,講了那么多,有些朋友一定還不知道編譯軟件怎么用?這里給大家介紹幾個吧?WAVE(偉福)大家一定聽說過吧!還有一個就是KEIL2,我用的就是KEIL2,下面就來講講如何使用KEIL2這個編譯軟件!,這個應(yīng)該不用再講了吧!,啟動KEIL軟件左擊ProjectNew Project輸入文件名選擇我們所以使用的芯片(這里我們一般用到Atmel的AT89C51或AT89C2051,點確定。New輸入我們編寫的程序。(一般情況下,我們保存的文件名和前面的工程名一樣。) 1右擊Source Group 1Add Files to Group 39。Source Group 139。,關(guān)閉對話框。 Group 1 下。 1Optionsfor 39。Target 139。Target中填寫晶體的大小,Output中,在Create HEX Files 前打上鉤,點確定。Rebuild All Traget Files,若提示creating hex file from “XXX”...“XXX”5000)/ 256。//載入高8位初值TL0 =(655365000)/ 256。//載入高8位初值。若在12M晶體下,定時5000微秒,即為5毫秒;但是如果不是在12M下,那又該怎么計算了呢??還記不記得,我們前面講過的機器周期和時鐘周期的概念? ^_^忘了,還是看看前面吧!呵呵!沒事,學習嘛,忘了再翻翻書,看看就可以了!其實上訴的5000 = 1 * C 很顯然C=5000,,那么5000 = * C,則C就為5000 / = ? 具體多少,大家自己去算算吧?同理TL0也是一樣的!但是,細心的朋友會發(fā)現(xiàn)網(wǎng)上或者是資料上的TH0,TL0并不是和上面一樣的,而是直接TH0 = 0XEC;TL0 = 0X78 是不是和上面的一樣的,別忘了單片機也是計算機的一種哦。用C的話,直接寫上計算公式就行,計算就交給單片機完成。TR0 = 1;這句就是啟動定時器0,開始記數(shù)!哦,還有一點,有些朋友會問,你是65536是哪里來的呢?呵呵你可別忘了:設(shè)置定時器0 工作方式0是16位的(2的16次方是多少,自己算算就知道了)簡單吧?但是如何和中斷一起使用呢?請繼續(xù)看下面的講解!TMOD = 0X01。//設(shè)置定時器0 工作方式0TH0 =(655365000)% 256。//載入低8位初值TR0 = 1。//啟動定時器EA = 1;//開總中斷ET0 = 1;//開定時器中斷。若為0則表示關(guān)閉!這樣我們,就初始化定時器T0和中斷了,也就是定時器滿5毫秒后,產(chǎn)生一次中斷。產(chǎn)生中斷后,我們怎么處理呢?嘿嘿!仔細想想?^_^ 每次中斷后,我們可以讓一個變量自加1,那么200次中斷后,不就是1秒的時間了嗎?比起上面我們說的延時來出來是不是更加精確多了呢?那是肯定的!但是想想1秒種的時間就讓單片機產(chǎn)生那么多次的中斷,單片機會不會累著呢?恩,那么不好。如果在12M的晶體下,?那么我們讓他每50毫秒中斷一次好了!這樣我們就20次搞定一秒的時間了!爽好了,講了那么多,現(xiàn)在我們來寫個時間的程序吧!^_^includedefine HI((6553650000)% 256)define _TH0_TL0_(6553650000)define M//(1000/25)/**********************************************************************************************/ unsigned hou = 12, min = 0, sec = 0。unsigned char SEG_TAB_B[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}。//09數(shù)字 unsigned char SEG_TAB_A[ ] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}。///*********************************************************************************************/ void Delay(unsigned char a)//延時程序a*1MS {unsigned char j。while(a!= 0){for(j = 0。j 125。j++)。} }/*********************************************************************************************/ void Disp(void)//數(shù)碼管顯示 {P2_0 = 1。P1 = SEG_TAB_B[ hou / 10 ]。Delay(5)。P2_0 = 0。P2_1 = 1。P1 = SEG_TAB_A[ hou % 10 ]。Delay(5)。P2_1 = 0。P2_2 = 1。P1 = SEG_TAB_B[ min / 10 ]。Delay(5)。P2_2 = 0。P2_3 = 1。P1 =S EG_TAB_A[ min % 10 ]。Delay(5)。P2_3 = 0。P2_4 = 1。P1 = SEG_TAB_B[ sec / 10 ]。Delay(5)。P2_4 = 0。P2_5 = 1。P1 = SEG_TAB_B[ sec % 10 ]。Delay(5)。P2_5 = 0。}/********************************************************************************************/ void IsrTimer0(void)interrupt 1 using 1//定時50ms {static unsigned char count = 0。//定義靜態(tài)變量countcount++。if(count == M){count = 0。sec++。if(sec == 60){min++。sec = 0。if(min == 60){hou++。min = 0。if(hou == 24){hou = 0。}}//if}//if}//if }/******************************************************************************************/ void Timer0Init(void)//定時器0 {TMOD = 0x01。TH0 = HI。TL0 = LO。TR0 = 1。ET0 = 1。EA = 1。}/******************************************************************************************/ void main(void)//主函數(shù) {Timer0Init()。while(1){Disp()。} }簡單吧,還是有點看不懂哦,那你自己慢慢體會吧,如果你自己能寫個時鐘程序來,那么你的51單片機也就學了80 % 了。中斷和定時/記數(shù)器器,是個很重要的東西,幾乎用到單片機的地方都會涉及到中斷和定時!所以大家要好好掌握哦!^_^哈哈,趕緊編譯HEX文件,搭好硬件,燒入單片機,上電看看效果先!呵呵,現(xiàn)在你應(yīng)該有成就感了吧,想不到一個時鐘居然那么簡單,嘿嘿!但是問題來了!時鐘雖然做出來了,但是他的精度怎么樣呢?一兩個小時,或許看不出什么誤差,但是一天或者一年呢?暈,我的天呀,要是按年來算的話,那這個時鐘根本沒有實用價值!人家都說用C寫不出,精度高的時鐘程序來的??!是不是有點后悔了,去學匯編吧!但是既然選擇了C,那么就不要后悔!嘿嘿,想想C的高級語言,怎么會輸給匯編呢 ^_^ 呵呵!看下面這段代碼:static unsigned char count = 0。TR0 = 0。TL0 +=(_TH0_TL0_ + 9)% 256。TH0 +=(_TH0_TL0_ + 9)/ 256 +(char)CY。TR0 = 1。count++。在中斷處理服務(wù)程序中,我們加入上面的代碼。TR0 = 0。先關(guān)閉定時器T0,然后重新給TH0和TL0 賦值,再開啟 TR0 = 1。燒入單片機看看效果,怎么樣,你第一次精確多了吧。但是還是有誤差!郁悶!為什么呢?那是硬件造成的誤差,我們可以用軟件來彌補!我們先把時鐘點亮,讓他走上幾個小時或者是幾天,看看到底誤差是多少!取個平均值。(這里比如我們10小時快1秒)那么可以通過以下語句if(hour % 10 = 0){sec。} 來彌補!這樣可能會出現(xiàn)這樣的現(xiàn)象:秒直接跳變!我們可以再通過細分來實現(xiàn),不要10小時那么大,小些的就行!具體的操作還是留給朋友們吧?。ㄆ撸┻@回我們來講講鍵盤,大家肯定見過銀行柜員機吧,取錢輸入密碼就要用到鍵盤,超市購物取回寄存物品要輸入密碼,還有你現(xiàn)在在用的PC機的鍵盤。但是鍵盤的是怎么工作的呢?一般有2種方式:(1)掃描法,不斷掃描鍵盤的狀態(tài),送CPU判斷并處理。如果鍵盤數(shù)目一大的話,顯然不適合(2)線反轉(zhuǎn)法,通過行列狀態(tài)的改變來判斷有無鍵被按下!現(xiàn)在我們在P1口接個4*4的鍵盤,--,再接4個4K7的上拉電阻至VCC。代碼如下://鍵盤掃描
點擊復(fù)制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1