❶ 單片機課程設計!不要復制百度!高分懸賞!!
1.單片機控制的60s倒計時
這個太簡單了,不用什麼提示吧?硬體上只要單片機最小系統加上數碼管兩個,程序上只要設置好定時器就行.
2.
基於單片機的電子鍾設計
這個要復雜一點.大概要單片機+數碼管+實時時鍾晶元如DS系列(ds1302加要電池)+存儲晶元如24C02,當然驅動數碼管的如解碼器或鎖存器也要有.
實在說你第一個設計網上能找到現成的,第二個設計網上也能找到現成的,不過要你自己使用keil、proteus軟體綜合調試模擬,這兩個內容都有,自己動手網路一下吧,不要太依賴別人.畢竟這樣才能提高一下你自己.
❷ 單片機實驗注意事項
單片機開發規則與注意事項
隨著大規模集成電路技術的發展,單片微型計算機也隨之大發展,各種新穎的單片機層出不窮。單片機具有體積小、重量輕、應用靈活且價格低廉等特點,廣泛地應用於人類生活的各個領域,成為當今科學技術現代化不可缺少的重要工具。
單片機系統的開發融合了硬體和軟體的相關技術。要完成單片機系統的開發,用戶不僅需要掌握編程技術,還需要針對實際應用選擇合理的單片機晶元和外圍器件,以此為基礎,設計硬體電路。
正確估計單片機的能力,知道單片機能做什麼,最大程度的挖掘單片機的潛力對一個單片機系統設計者來說是至關重要的。單片機的能力的關鍵就在軟體設計者編寫的軟體上。只有充分地了解到單片機的能力,才不會做出「冗餘」的系統設計。而採用許多的外圍晶元來實現單片機能實現的功能。這樣做,即增加了系統成本,也可能會降低了系統的可靠性。
要完成單片機系統的開發,用戶不僅需要掌握編程技術,還需要針對實際應用選擇合理的單片機晶元和外圍器件,以此為基礎,設計硬體電路。
單片機開發規則與注意事項
設計滿足要求的最精簡的系統
正確估計單片機的能力,知道單片機能做什麼,最大程度的挖掘單片機的潛力對一個單片機系統設計者來說是至關重要的。單片機的能力的關鍵就在軟體設計者編寫的軟體上。只有充分地了解到單片機的能力,才不會做出「冗餘」的系統設計。而採用許多的外圍晶元來實現單片機能實現的功能。這樣做,即增加了系統成本,也可能會降低了系統的可靠性。
看門狗電路通常是一塊在有規律的時間間隔中進行更新的硬體。更新一般由單片機來完成,如果在一定間隔內沒能更新看門狗,那看門狗將產生復位信號,重新復位單片機。更新看門狗的具體形式多是給看門狗晶元相關引腳提供一個電平上升沿或讀寫它的某個寄存器。使用看門狗電路將在單片機發生故障進行死機狀態時,重新復位單片機,像EN8F154本身就帶有看門狗。
確定系統的復位信號可靠
一般在單片機的數據手冊(Datasheet)中都會提到該單片機需要的復位信號的要求。一般復位信號的寬度應為。復位電平的寬度和幅度都應滿足晶元的要求,並且要求保持穩定。還有特別重要的一點就是復位電平應與電源上電在同一時刻發生,即晶元一上電,復位信號就已產生。不然,由於沒有經過復位,單片機中的寄存器的值為隨機值,上電時就會按PC寄存器中的隨機內容開始運行程序,這樣很容易進行誤操作或進入死機狀態。
確定系統的初始化有效
系統中的晶元以及器件從上電開始到正常工作的狀態往往有一段時間,程序開始時延時一段時間,是讓系統中所有器件到達正常工作狀態。究竟延時多少才算合適?這取決於系統的各晶元中到達正常工作狀態的時間,通常以最慢的為准。一般來說,EN8F154的延時20-100毫秒已經足夠。對於系統中使用嵌入式MODEM等「慢熱」型的器件來說,則應更長。當然,這都需要在系統實際運行中進行調整。
當然,模擬是單片機開發過程中非常重要的一個環節,除了一些極簡單的任務,一般產品開發過程中都要進行模擬,模擬的主要目的是進行軟體調試,當然藉助模擬機,也能進行一些硬體排錯。一塊單片機應用電路板包括單片機部份及為達到使用目的而設計的應用電路,模擬就是利用模擬機來代替應用電路板(稱目標機)的單片機部份,對應用電路部份進行測試、調試。模擬有CPU模擬和ROM模擬兩種,所謂CPU模擬是指用模擬機代替目標機的CPU,由模擬機向目標機的應用電路部份供給各種信號、數據,進行調試的辦法。
❸ 用單片機做一個簡單的實驗,控制電路什麼的,不要像畢業設計那樣復雜的。
看這篇帖子的,我想都是電子愛好者或電類專業學生。不知道大家都處於什麼一個階段,這篇帖子是寫給入門者的,要解決一個問題:初學者應重點掌握什麼電子知識,大學階段如何學習?
先說點貌似題外的東西——3個謬論。
謬論一:高中老師常對我們說,大家現在好好學,考上了大學就輕鬆了,愛怎麼玩怎麼玩。這真是狗屁。別的專業我不好說,電氣、電子、電力、通信、自動化等電類專業,想要輕松那是不可能地(當然你是天才就另說),專業課上講的東西對決大多數人來說那是雲里霧里,從來都是一知半解,需要你課下大量時間精力地消化。有些東西甚至需要你若干年後在工作中遇著時才回過味:「哦,原來以前學的那東西是干這使的。」你要能想得起,並知道怎麼回頭去補,就算是上學時專業課學得很扎實了。
謬論二:填志願時經常有人對我們說:專業不重要,學校最重要,進了個好學校想學什麼再學。這亦是狗屁。進了學校,本專業的課程就可能會壓得你喘不過氣來,還有多少人有時間和毅力選修第二專業?而所學專業幾乎就是決定了你今後一生的職業生涯。而學校,說實在話本科階段我覺得從老師那學到的東西各校間差別不是很大。課上講的大同小異,課下也不會有什麼好老師給你單獨指導和點撥,若能遇著,那是你的幸運。越牛的學校的越牛的老師就越忙,不要指望他們會在教學上花多少心思,更不要指望他們對你另眼相看。反倒是一些普通院校的小老師們可能跟學生走得更近,輔導更多些,雖然他們可能水平一般,但對於你大學的學習來說還是足夠的。綜上所述,我覺得對於一個電子愛好者來說,成為一名普通重點大學的電子系學生比成為北大的哲學系學生更重要。當然看帖的應該大多數都是學電的,那恭喜你,這個專業不錯的,雖不是什麼「朝陽產業」,但絕對是個「常青行業」。
謬論三:上了大學,可能又有不少人對你說,在大學專業不重要,關鍵的是學好計算機和英語,這樣就不愁找不到好工作了。這也是屁話。你要明確一點:你將來不是純靠英語吃飯的,也不是做編程、搞軟體開發或動畫創作的。我是想說:若果你性格偏內向沉穩、肯鑽研、愛好電子行業,將來想從事電子設計和研發工作,那你一定要學好專業課。當然英語也很重要,但以後工作中用得多的是你的專業英語,即能讀懂英語技術文檔,而不是跟別人比你口語多正宗多流利。至於計算機,那就是一工具,不要花太多時間去學photoshop、3dmax、Flash、網頁製作等流行軟體,這些在你今後的工作中用不著,也會牽扯你大量時間精力。好鋼用在刀刃上,多進進實驗室多搭搭電路吧。當然,電類學生對電腦也有特殊要求,那就是用熟Protel、
Multisim,學好匯編語言、C語言、選學PLD相關軟體。任務也是很重的。
以上說了3個謬論,下面言歸正傳吧。那麼進了大學,讀了電類專業,這4年你該學些什麼呢?
首先要了解:電類專業可分為強電和弱電兩個方向,具體為電力工程及其自動化(電力系統、工廠供變電等)專業屬強電,電氣工程及其自動化以強電為主弱電為輔,電子、通信、自動化專業以弱電為主。其他更進一步的細分要進入研究生階段才劃分。但無論強電還是弱電,基礎都是一樣的。
首先高數是要學好的,以後的信號處理、電磁場、電力系統、DSP等不同方向的專業課都用得著。
專業基礎課最重要的就是電路分析、模擬電路、數字電路。這3門課一定要學好。這3門課一般都是大一下學期到大三上學期開設,對大多數對電子知識還了解不多的同學來說,通常是學得一知半解,迷迷糊糊。所以,最好是在開課之前或是開課的同時讀一兩本通俗淺顯的綜合介紹電子知識的書籍,對書中的知識你不需要都懂,能有個大致感覺就行。
對這這種入門讀物的選擇很重要,難了看不懂可能興趣就此喪失或備受打擊,反而事與願違。在此推薦一本《電子設計從零開始》(楊欣編著,清華大學出版社出版),該書比較系統全面地介紹了電子設計與製作的基礎知識,模電、數電、單片機、Multisim電路模擬軟體等都有涉及,一冊在手基本知識就差不多了,關鍵是淺顯易懂,有一定趣味性。另外科學出版社引進出版的一套小開本(32開)電子系列圖書也不錯,是日本人寫的,科學出版社翻譯出版,插圖較多,也較淺顯,不過這一系列分冊較多,內容分得較細。
除了看書,還要足夠重視動手實踐。電路、模電、數電這些課程進行的同時都會同時開設一些課程試驗,珍惜這個動手機會好好弄一弄,而不要把它當作一個任務應付了事。跟抄作業一樣,拷貝別人的試驗結果在高校中也是蔚然成風,特別是幾個人一個小組的實驗,那就是個別勤奮好學的在那折騰,其他人毫不用心地等著出結果。
我只想說,自己動手努力得來的成果才是甜美的,那種成就感會讓你充實和滿足。游手好閑的,到臨近畢業找工作或在單位試用時,心中那種巨大的惶恐會讓你悔不當初。這種教訓太多了,多少次我們都是蹉跎了歲月才回過頭來追悔莫及。除了實驗課好好准備好好做之外,許多學校都設有開放性實驗室,供學生平時課余自覺來弄弄。珍惜這種資源和條件吧,工作後不會再有誰給你提供這種免費的午餐了。
當然有些學校沒有這么好的條件,或缺少器件,那同學們就在電腦上模擬一把試驗平台吧,就是學好用好Multisim軟體。Multisim是一種電路模擬軟體,筆者上學時叫做EWB,後來隨著版本更新,先後更名為Multisim2001、Multisim7、Multisim8。這個軟體可模擬搭建各種模擬電路和數字電路,並可觀測、分析電路模擬結果。大夥可以把模電、數電中學習的電路在這軟體裡面模擬一下,增加感性認識,實驗前後也可把試驗電路在軟體里模擬,看跟實際試驗結果有多大差別。可以說,只要你是學電的,這個小軟體就是你上學時必須掌握的,對你的學習助益很大。另一個必須掌握的軟體那就是protel了。
上學時,從小學期的綜合設計實驗到畢業設計,最後都會要求你用Protel繪出設計的電路原理圖和PCB版;工作後,Protel也是你必須掌握的基本技能,部分同學畢業後一兩年內的工作,可能就是單純地用這軟體畫板子。Protel的版本也走過了Protel98、Protel99、Protel99SE、ProtelDXP、Protel2004的發展道路。Protel99SE、ProtelDXP、Protel2004這三個版本現在用得最多,目前許多學校教學或公司內工程師使用的都還是Protel99SE,當然若作為新的自學者直接從Protel2004學起似乎好一些。
綜上所敘,作為最基本的EDA(電子設計自動化)軟體,Multisim和Protel是所有電類學生在上學時必須掌握的。其他的如Pspice、Orcad、SYstemview、MATLAB、QuartusII等等,需根據不同的專業方向選學,或是在進入研究生階段或工作後在重點學習使用。那Multisim和Protel好學么?入門應該問題不大,讓師兄師姐指導指導,或是找一兩本入門書看一看就OK了。這里推薦一本《電路設計與模擬——基於Multisim 8與Protel 2004》(也是楊欣編著,清華社出版),作為這兩款軟體的入門學習挺不錯的,關鍵是一本書包含了兩款軟體學習,對窮學生來說比較劃算,若是花錢買兩本書分別去學這兩個軟體,就不值了,因為Multisim的入門不是很難。另用Protel畫PCB電路板學問挺大的,有必要多看一些技術文檔或是買一本高級應用類的圖書。
2.大三大四(學習專業課,嘗試應用)
進入大三,就涉及到專業課的學習了,本文只討論以應用為主的專業課,其他如《電力系統分析》、《電機學》、《自控原理》、《信號與處理》、《高電壓》、《電磁場》等等以理論和計算為主的專業課,咱就不多提了。當然這些課對你今後向研究型人才發展很重要,也都很讓人頭疼,要有建議也只能說是努力學、好好學,懂多少是到少(不過別指望全都懂),以後工作或接著深造用得著時再回過頭來接著補接著學,那時有工作經驗或接觸多了有感性認識,可能學著就容易些了。
那以應用為主的專業課又有哪些呢?不同專業方向有不同的課程,很難面面俱到。這里先簡單羅列一下,有微機原理與介面技術(也稱單片機)、開關電源設計、可編程邏輯器件(PLD)應用、可編程邏輯控制(PLC)應用、變頻器應用、通信電路、數字集成電路分析與設計、DSP、嵌入式等等。可能有同學要問:這么多東西,大學階段要想都學好不容易吧?答案是不僅是不容易,而且是不可能。這些技術每一門展開來都是復雜的一套知識,可以說,你只要精通其中一門,就可以到外邊找個不錯的工作了。
而且在大學階段,這些課程也不是都要學的,而是針對不同專業方向選修其中幾門(具體選哪幾門,多研究研究你們各自的專業培養方案,多請教老師),學的時候爭取能動基本用法即可,真正的應用和深入是要到工作後的;當然你若很勤奮或有天賦,能熟練掌握某一門達到開發產品的程度,那畢業後找個好工作就輕而易舉了。到這里我們需要再明確一點:電子領域知識繁多、浩如煙海,所以一般搞硬體的公司都有較多的員工,一個研發項目是多人細致分工、共同完成的,所以我們經常會聽到團隊意識這個名詞。因為一個人的能力有限,不可能掌握所有的知識。比如一些人專門負責搞驅動,一些人專門從事邏輯設計,一些人專門搞高頻無線,一些人專門搞測試,一些人專門設計外殼,一些人專門設計電路板等等。
看到這里可能有的同學頭都大了:那說來說去大學階段到底究竟應該學些什麼呢?說實話寫到這里我的頭也大了,電子設計涉及方方面面的東西太多了,實在不是一篇文章甚至一本書能說得清楚的。所以我決定剔除這些生澀的課程名目,大致說一下我所認為的一個電類學生或是想要成為電子工程師的自學者應該掌握的基本的專業技能。
現在應該說單片機不知道那是相當嚴重的問題。單片機的知識和應用的技巧成了求職面試中必備的問題。但是單片機的知識較難入手,但是你如果看了《51單片機應用從零開始》(清華大學出版社,王玉鳳,劉湘黔,楊欣編著)就不是這么感覺的了,這是一本中學生都讀得懂的單片機基礎和應用教程。這本教程凝結了國內幾所重點大學中站在科研、教學第一線教師們的心血,也得到了英國劍橋大學、牛津大學、倫敦帝國理工大學、倫敦大學、加的夫大學等世界著名大學多位博士生導師的指導意見。經過多位學者的精心裁剪,本書的脈絡、線索、內容才真正符合讀者學習單片機的需要。
《51單片機應用從零開始》以生動活潑、平實易懂的語言講述。盡量讓單片機學習過程中不斷涌現的專業詞彙,在不知不覺的情況下通過多方面的使用而掌握。本書沒有用專業的描述方法來敘述知識點,取而代之的是以「講故事」的形式把應該了解的內容和盤托出。
十分注重基礎知識的鋪墊。在單片機學習之前,需要對計算機原理和電子技術有一定的了解。本書考慮到不同讀者的知識背景不同,把這兩個基礎理論融入到了單片機的講解當中,使閱讀起來感覺不到有什麼障礙。
構建了全面的學習支撐體系。每章最後的「實例點撥」除了鞏固每章的學習知識外,更重要的是開辟單片機應用的視野;再加上「器件介紹」環節,補足單片機從基礎到應用所需要的知識;以及豐富的附錄內容可作為學習和應用單片機的強力參考。這便構建了一個完整學習單片機的支撐體系。
既授人以魚,也授人以漁。書中有充足的實例應用,可以用在單片機實驗、單片機課程設計當中。但更重要的是,這些實例前後都伴隨著仔細的講解,一個例子下來就能摸清來龍去脈。
敘述的內容全面、新穎、權威。嚴格按照單片機官方的技術參考對其進行講解,包括所有51單片機學習與應用需要的基礎知識。無論敘述的內容或是實例,都是目前世界上單片機應用的主流。
全書渾然一體。雖然每章各具標題,實際上互有聯系。而這種聯系如果在書中忽略不談,則會對理解和記憶產生障礙。本書在正文中多次有知識點的相互映射,這不但能加深前後內容的聯系,而且能深化理解與記憶。
我認為:除了最初提到的電路分析、模擬電路、數字電路、單片機外,應了解並掌握電子元器件識別與選用指導、基本儀器儀表的使用、一些常用電路模塊的分析與設計、單片機的應用、PLD的應用、模擬軟體的應用、電路板設計與製作、電子測量與電路測試。
電子元器件的識別與使用就不用說了,這是元素級的基礎,不過要想掌握好也並不容易,一些電子系學生畢業了,還認不出二極體、三極體實物、分不清電解電容的正負極等等,也不是沒有的事。還是一句話,多進進實驗室,多跑跑電子市場,多看看書。
儀器儀表的使用,大學的實驗課中你至少會用過數字萬用表,波形發生器、電源、示波器、小電機、單片機模擬機,至少要把這些東西的接線方法和用法弄懂吧。
常用電路模塊也是包羅萬相,各種放大電路、比較器、AD轉換電路、DA轉換電路、微分電路、積分電路,還有各種數字邏輯單元電路等等,只能說,大致了解吧,並學會怎麼去查資料、查晶元查管腳。最基本的,做實驗或課程設計中用到的各種晶元要弄熟。
單片機,這是應該掌握的。時下單片機種類繁多,但各大小企業用得最多的還是51系列單片機,而且價格便宜、學習資料也最全,故給自學者推薦。當然各學校開課講的單片機型號會有所不同,沒關系,學好單片機編程,學好了一種,再學別的單片機就容易了。
PLD(可編程邏輯器件),一種集成電路晶元,提供用戶可編程,實現一定的邏輯功能。對可編程邏輯器件的功能設定(即要它實現什麼功能)要有設計者藉助開發工具,通過編寫程序來實現,這跟單片機類似。開發工具可學習Altera公司的Quartus II軟體(這是該公司的第4代PLD開發軟體,第3代是MAX+PLUS II軟體)。編程語言學習硬體描述語言VHDL或Verilog HDL。
模擬軟體最基本的就是前面說的Multisim了,另外還可學MATLAB。其他的試專業情況選學或是工作後學。電路板設計與製作主要是用Protel軟體輔助進行。這在前面已有介紹,讀者應該也比較熟悉。
最後建議同學們積極與各類電子競賽賽事,參加一場比賽一個項目做下來,電子設計的一個流程和各環節的基礎知識就能串起來了,對知識的融會貫通及今後走向工作崗位都有莫大裨益。
以上這些東西我說得籠統,深入下去又是一大堆要學的東西。還是那句話,多啃書本、多實踐!清華大學出版社有一套「電子電路循序漸進系列教程」是按照上面我所講的那個思路出的,可惜好像還沒出全,現在好像只有《單片機在電子電路設計中的應用》、《電路設計與制板——Proetl應用教程》、《模擬軟體教程——Multisim和MATLAB》、《常用電路模塊分析與設計指導》幾本。另外聽聽你們老師的意見、師兄師姐的意見,問問他們應讀些什麼書,當然也不能盡聽盡信,翻開一本書我想你先大致看看他講得是否通俗,自己琢磨著能看懂幾分?我想能有5分懂這本書就值得一看了,示自己現階段的知識情況,太淺顯的書不用看了,太深的書也不要去看,看得迷迷糊糊還打擊自信心喪失了興趣。
好了,就此停筆吧。本來是要寫個書目推薦,可干癟癟的羅列一堆書目有什麼意義?還是寫下這些字,讓同學們自己去思考去選擇去深入吧,希望能對你們有所幫助。
最後一句老生常談也是我的切膚之痛:大學四年會一晃而過,要學的東西太多太多,不要虛度光陰。及時當努力,歲月不待人!
另外,虛機團上產品團購,超級便宜
❹ 單片機 實驗 編程查表程序設計、數據排序實驗
這么多問題,還沒積分。。。誰回答啊。。
❺ 單片機及模數綜合系統設計
問題1:
;;8051
BCDASC: MOV R2,#20 ;20個數
MOV R1,#40H ;內部地址
MOV R0,#80H ;外部地羨簡址
$A MOVX A,@R0
ADD A,#30H ;BCD--->ASCII
MOV @R1,A
INC R0
INC R1
DJNZ R2,$A
RET
;
問題2:
;;晶體高派銷振戚游盪f=12Mhz
TEN_BUF EQU 30H
TWE_BUF EQU 31H
FIF_BUF EQU 32H
SENCOND EQU 40H
;
LED REG P1.0 ;DISPLAY
KEY1 REG P3.2
;
ORG 0000H
AJMP MAIN
ORG 0003H
RETI
ORG 000BH
AJMP TM_0 ;用到定時器0中斷方式
ORG 0013H
RETI
ORG 001BH
RETI
ORG 0023H
RETI
;
MAIN: MOV R0,#00H
DJNZ R0,$
MOV SP,#60H
RDY_T MOV TMOD,#11H
MOV TH0,#3CH
MOV TL0,#B0H
MOV SENCOND,#20
CLR TF0
SETB TR0
SETB ET0
SETB EA
$A JB KEY1,$A ;KEY1 按下則重新開始
SETB LED
MOV SENCOND,#20
SETB TR0
AJMP $0
TM_0: MOV TL0,#B0H ; TIMER 50 ms
MOV TH0,#3CH
DJNZ SENCOND,$0 ;50ms * 20 = 1S
MOV SENCOND,#20
CLR LED ;LED 亮提示你結束了
CLR TR0
$0 RETI
;;;;
❻ 幫我設計單片機課程設計實驗,用c語言程序寫,題目是:搶答器,要求製作一個四人搶答器,4個燈跑馬循環
#define PlayerKey1_IO (P0.1)
#define PlayerKey2_IO (P0.2)
#define PlayerKey3_IO (P0.3)
#define PlayerKey4_IO (P0.4)
#define PlayerLED1_IO (P1.1)
#define PlayerLED2_IO (P1.2)
#define PlayerLED3_IO (P1.3)
#define PlayerLED4_IO (P1.4)
#define BuzzerEnable_IO (P1.5)
void SysInit(void)
{
//設置Key_io為上拉輸入
//設置LED_io為通用輸出
//設置BuzzerEnable_io為通用輸出
}
unsigned char KeyScan(void)
{
if (PlayerKey1_IO == 0) return 1;
if (PlayerKey2_IO == 0) return 2;
if (PlayerKey3_IO == 0) return 3;
if (PlayerKey4_IO == 0) return 4;
return 0;
}
void Delay_Ms(unsigned char Nms)
{
volatile unsigned short tempcnt;
while (Nms--)
for (tempcnt = 0; tempcnt < 500; tempcnt++);//按照相應的參數配置計數上限,此處設為500
}
void main(void)
{
unsigned char MarqueeStep=0;
unsigned char KeyValue=0;
SysInit();
while (1)
{
Delay_Ms(400);
KeyValue = KeyScan(); //無按鍵去抖
if (KeyValue == 0)
{
MarqueeStep++;
if (MarqueeStep > 4) MarqueeStep = 0;
BuzzerEnable_IO = 0; // 按鍵取消停止蜂鳴器發聲
}
else
{
MarqueeStep = KeyValue;
BuzzerEnable_IO = 1; //蜂鳴器發聲
}
PlayerLED1_IO = 0;
PlayerLED2_IO = 0;
PlayerLED3_IO = 0;
PlayerLED4_IO = 0;
if (MarqueeStep == 0)
PlayerLED1_IO = 1;
else if (MarqueeStep == 1)
PlayerLED2_IO = 1;
else if (MarqueeStep == 2)
PlayerLED3_IO = 1;
else if (MarqueeStep == 3)
PlayerLED4_IO = 1;
}
}
基礎框架是這樣。
❼ 單片機實驗與課程設計
/陵臘/假嘩汪磨設晶振12MHZ,P1控制LED低電平亮
#include "reg51.h"
unsigned int YSJS=0;
void main(void)
{
TMOD |= 0X10; //定時器1工作於方式1,16位定時器
TH1 = 0XFF; //定時器1定時時間=500uS
TL1 = 0X06;
ET1 = 1; //使能定時器1中斷
IT1=1; //負跳變觸發
EX1=1; //開外部中斷1
EA =1; /亂斗/開總中斷
P1 = 0XFF;
while(1)
{
}
}
void INT0() interrupt 0
{
P1 = 0X55;
TR1 = 1; //開啟定時器1
}
void TIMER1(void) interrupt 3 //定時器1中斷函數使用默認寄存器組
{
TH1 = 0XFF; //定時器1定時時間=500us
TL1 = 0X06;
YSJS++;
if(YSJS==2000) //500uS*2000=1000000us=1s
{
P1 = P1 & 0XFF;
YSJS = 0
}
}
❽ 求單片機課程設計實驗 用匯編語言,基於51單片機的定時鬧鍾
MODE_RG EQU40H ;模式選擇
MODE2 EQU 60H ;MODE值
MODE3 EQU61H
MODE4 EQU62H
MODE5 EQU63H
MODE6 EQU64H
MODE1 EQU65H
HOUR EQU41H ;小時緩沖區
MIN EQU42H ;分鍾緩沖區
SEC EQU 43H ;秒緩沖區
TEMP EQU4AH
;*********鬧鍾緩沖區********************
H_ALARM EQU 6AH ;鬧鍾緩沖區
M_ALARM EQU6BH
S_ALARM EQU6CH
F_ALARM EQU6DH
;***********秒錶緩沖區******************
M_SEC EQU76H
S_SEC EQU77H
;*********LED送顯示臨時變數*************
LED0 EQU51H
LED1 EQU52H
LED2EQU53H
LED3 EQU54H
MODE_KEYEQUP3.4
UP_KEY EQUP3.3
DOWN_KEY EQUP3.5
BUF EQU49H
ORG0000H
LJMPMAIN
ORG000BH
LJMPINT_0
ORG001BH
LJMPINT_1
ORG0080H
MAIN: MOVSP,#2FH ;堆棧初始化
MOVMODE_RG,#0 ;MODE_RG寄存器值初始化
MOVLED0,#0FEH ;初始化LED
MOVLED1,#0FDH
MOVLED2,#0FBH
MOVLED3,#0F7H
MOVMODE1,#1
MOVMODE2,#2
MOVMODE3,#3
MOVMODE4,#4
MOVMODE5,#5
MOVMODE6,#6
MOVF_ALARM,#0 ;錯誤2:一開始用CLRF_ALARM,這導致在後面的時候JZF_ALARM運行錯誤,
MOVBUF,#0 ;在於JZ指令是對累加器A全為0或者全為1進行判斷,CLR只能對一位操作
MOVTMOD,#11H ;定時器初始化:定時器0,方式1,定時器1,方式1
MOVIP,#00001000B ;定時器1優先順序高
MOVTH0,#3CH ;定時50MS
MOVTL0,#0B1H
MOVTH1,#0D8H ;定時10MS
MOVTL1,#0F0H
SETBEA
SETBET0
SETBET1
SETBTR0;啟動定時器
MOVHOUR,#0 ;fortest
MOVMIN,#0
MOVSEC,#0 ;定時器計數器,50MS中斷一次,200次則剛好1S
MOVM_SEC,#0
MOVS_SEC,#0
MOVH_ALARM,#0
MOVM_ALARM,#0
MAIN1: LCALLDISPLAY12
LCALLDISPLAY34
;CLRP1.4 TEST
JNBMODE_KEY,KEY_SCAN
MOVA,MODE_RG
CJNEA,MODE6,Y1 ;MODE6秒錶
JNBDOWN_KEY,DEALDOWN ;判斷秒錶開關
JNBUP_KEY,DEALUP
Y1: MOVA,F_ALARM ;判斷鬧鍾
JNZALARM
LJMPMAIN1
;-----------------------------------秒錶開關程序---------------------------
DEALDOWN: LCALLDELY10MS
JBDOWN_KEY,MAIN1
H1: JNBDOWN_KEY,H1
CPLTR1
LJMPMAIN1
DEALUP: LCALLDELY10MS
JBUP_KEY,MAIN1
H2: JNBUP_KEY,H2
MOVM_SEC,#0
MOVS_SEC,#0
CLRTR1
LJMPMAIN1
;-----------------------------------鬧鍾掃描程序---------------------------
ALARM: MOVA,H_ALARM
CPLP1.2
CJNEA,HOUR,EXIT3
MOVA,M_ALARM
CJNEA,MIN,EXIT3
LJMPSTARTALARM
EXIT3: SETBP3.6
LJMPMAIN1
STARTALARM:CPLP3.6
JNBDOWN_KEY,OFFALARM
LJMPS1
OFFALARM: LCALLDELY10MS
JBDOWN_KEY,MAIN1
S2: JNBDOWN_KEY,S2
MOVF_ALARM,#0
SETBP3.6
LJMPMAIN1
S1: LCALLDELAY
LJMPMAIN1
;-----------------------------------鍵盤掃描程序---------------------------
KEY_SCAN: LCALLDELY10MS
JBMODE_KEY,MAIN1
INCMODE_RG
;SETBP1.4 測試
K1: JNBMODE_KEY,K1 ;按鍵直到用戶松開按鍵
K2: MOVA,MODE_RG
CJNEA,#0,DEALMODE;不是在正常顯示模式下則跳轉到模式處理程序
LJMPMAIN1 ;返回主程序
;*******************模式處理程序部分
DEALMODE: MOVTEMP,#0 ;凡轉入MODE處理,則首先清除TEMP
MOVA,MODE_RG ;有MODE_RG值不為5、0
CJNEA,MODE2,M0 ;判斷MODE_RG值,不為1跳轉
LJMPH_GLINT ;模式1,小時位閃爍
M0: CJNEA,MODE3,M1 ;不是模式2,跳轉
LJMPM_GLINT ;模式2,分鍾位閃爍
M1: CJNEA,MODE4,M2 ;不是模式3,跳轉
LJMPH_GLINT
M2: CJNEA,MODE5,M3
LJMPM_GLINT
M3: CJNEA,MODE6,M4
MOVM_SEC,#0
MOVS_SEC,#0
LJMPMAIN1
M4: CJNEA,MODE1,M5
;CLRTR1
LJMPMAIN1
M5: MOVMODE_RG,#0
LJMPMAIN1
;*****************************MODE為1,3,小時位閃爍
//MOVTEMP,HOUR ;將TEMP賦值,防止在加的時候是在隨機值的基礎上增加
H_GLINT: ;CPLP1.0
MOVR0,#28
MOVR1,#28
K4: LCALLDISPLAY12 ;分開顯示
LCALLDISPLAY34
E1: JNBMODE_KEY,K21 ;檢測是否有按鍵按下,有按下則跳轉到分鍾位閃爍
JBUP_KEY,E9 ;判斷加位有無按鍵按下
LJMPUP
E9: DJNZR0,K4
K6: LCALLDISPLAY34
JNBMODE_KEY,K21 ;檢測是否有按鍵按下,有按下則跳轉延時後進行模式判斷
LJMPG1
K21: LCALLDELY10MS ;延時後確定有MODE按鍵按下,將
JBMODE_KEY,H_GLINT
W: JNBMODE_KEY,W
INCMODE_RG
CPLP1.4
LJMPDEALMODE ;確定有按下,MODE+1後返回MODE處理程序
JNBUP_KEY,UP ;判斷加位有無按鍵按下
G1: DJNZR1,K6
LJMPH_GLINT ;調用完畢返回,實現閃爍
K3: LJMPMAIN1 ;可省略
;******************************MODE為2,4,分鍾位閃爍
M_GLINT: MOVR0,#28
MOVR1,#28
K23: CPLP1.7
LCALLDISPLAY12
LCALLDISPLAY34
JNBMODE_KEY,KK ;跳轉,確定是否有按鍵按下
JNBUP_KEY,UP ;判斷加位有無按鍵按下
MOVA,MODE_RG
CJNEA,MODE3,E2 ;在MODE5的情況下要判斷鬧鍾確認鍵有沒按下
LJMPE5
E2: JNBDOWN_KEY,F2
LJMPE5
F2: LJMPONALARM2
E5: DJNZR0,K23
K24: LCALLDISPLAY12
JNBMODE_KEY,KK ;檢測是否有按鍵按下,有按下則跳轉
JNBUP_KEY,UP ;判斷加位有無按鍵按下
MOVA,MODE_RG ;掃描鬧鍾確認鍵
CJNEA,MODE3,E7 ;在MODE5的情況下要判斷鬧鍾確認鍵有沒按下
LJMPG2
E7: JBDOWN_KEY,E8
CPLP1.3
LJMPONALARM2
E8: LJMPG2
KK: LCALLDELY10MS ;去抖
JBMODE_KEY,M_GLINT
W1: JNBMODE_KEY,W1
INCMODE_RG
CPLP1.4
LJMPDEALMODE ;確定有按下,MODE+1後返回MODE處理程序
G2: DJNZR1,K24
LJMPM_GLINT
;*************************位加,處理程序
;***************小時調整
UP: MOVR1,#20
UP11: INCTEMP
UP12: MOVA,MODE_RG ;判斷此時的MODE,根據MODE將臨時變數給對應的賦值
CJNEA,MODE2,AA0 ;不是在MODE2的情況下跳轉
MOVA,TEMP
CJNEA,#24,A_UP1
MOVTEMP,#0
A_UP1: MOVHOUR,TEMP ;為MODE2,將臨時變數賦給小時位
LJMPUP15
AA0: CJNEA,MODE4,UP13//UP13為分鍾調整入口
MOVA,TEMP
CJNEA,#24,A_UP
MOVTEMP,#0
A_UP: MOVH_ALARM,TEMP ;模式3,將臨時變數賦給鬧鍾的小時位
LJMPUP15 ;UP15為顯示入口
;****************分鍾調整入口
UP13: MOVA,MODE_RG
CJNEA,MODE3,UP14 ;不是模式2,跳轉
MOVA,TEMP
CJNEA,#60,DISOVER2
MOVTEMP,#0
DISOVER2: MOVMIN,TEMP
LJMPUP15
UP14: MOVA,TEMP ;上面判斷不是模式2,則必然是模式4
CJNEA,#60,DISOVER3
MOVTEMP,#0
DISOVER3: MOVM_ALARM,TEMP
LJMPUP15
UP15: LCALLDISPLAY12
LCALLDISPLAY34
DJNZR1,UP01
MOVR1,#1 ;
JNBUP_KEY,UP11
UP01: JNBUP_KEY,UP12
UP16: MOVA,MODE_RG ;松開鍵以後按照模式判斷該返回哪種狀態,不能返回DEALMODE函數
CJNEA,MODE2,UP17
LJMPH_GLINT
UP17: CJNEA,MODE3,UP18
MOVSEC,#0 ;每次設置完時間後將秒鍾位置零保證時間准確
LJMPM_GLINT
UP18: CJNEA,MODE4,UP19
LJMPH_GLINT
UP19: CJNEA,MODE5,UP20
LJMPM_GLINT
UP20: LJMPMAIN1
ONALARM2: LCALLDELY10MS ;延時10MS,去抖
JBDOWN_KEY,B2 ;抖動所致,返回分鍾位閃爍
LJMPK42
B2: LJMPM_GLINT
K42: JNBDOWN_KEY,K42
MOVF_ALARM,#0FFH
MOVMODE_RG,#0
LJMPMAIN1
;---------------------------------------中斷程序入口---------------------
;*******************時間中斷0*********************
;錯誤1:中斷程序EXIT處用了MAIN1,導致一直處於中斷狀態
INT_0: PUSHACC
PUSHPSW
MOVTH0,#3CH
MOVTL0,#0B1H
INCBUF
MOVA,BUF
CJNEA,#20,EXIT
TIME: MOVBUF,#0
INCSEC
MOVA,SEC
CJNEA,#60,EXIT
MOVSEC,#00H
INCMIN
MOVA,MIN
CJNEA,#60,EXIT
MOVMIN,#00H
INCHOUR
MOVA,HOUR
CJNEA,#24,EXIT
MOVHOUR,#0
RETI
EXIT: POPPSW
POPACC
RETI
;******************時間中斷1***********************
INT_1: MOVTH1,#0D8H ;定時10MS
MOVTL1,#0F0H
INCS_SEC
MOVA,S_SEC
CJNEA,#100,EXIT4
MOVS_SEC,#0
INCM_SEC
MOVA,M_SEC
CJNEA,#100,EXIT4
MOVM_SEC,#0
EXIT4: RETI
;---------------------------------------顯示-----------------------------
DISPLAY12: MOVA,MODE_RG ;判斷模式,決定是顯示鬧鍾時間還是顯示當前時間
CJNEA,MODE4,DIS0 ;模式四,顯示鬧鍾
LJMPDIS01 ;MODE4
DIS0: CJNEA,MODE5,DIS20
DIS01: MOVR7,H_ALARM ;鬧鍾模式
LJMPDIS2
DIS20: CJNEA,MODE6,DIS21
MOVR7,M_SEC ;秒錶模式,顯示秒錶高位
LJMPDIS2
DIS21: CJNEA,MODE1,DIS1
LJMPDIS22
DIS22: MOVR7,MIN
LJMPDIS2
DIS1: MOVR7,HOUR ;DISPLAY12顯示高位
DIS2: LCALLBCTD ;判斷完畢,調用顯示
;將秒、分分別轉碼,放到R4,R3
MOVA,R4
MOVR3,A
LCALLDIVIDE
MOVDPTR,#NUMTAB
MOVP2,#0FH
MOVP2,LED0
MOVA,45H ;從拆字的出口獲取值
MOVCA,@A+DPTR
MOVP0,A
LCALLDELY10MS
MOVP2,LED1
MOVA,46H
MOVCA,@A+DPTR
MOVP0,A
LCALLDELY10MS
RET
DISPLAY34: MOVA,MODE_RG ;判斷模式,決定是顯示鬧鍾時間還是顯示當前時間
CJNEA,MODE4,DIS31
LJMPDIS32
DIS31: CJNEA,MODE5,DIS35
DIS32: MOVR7,M_ALARM
LJMPDIS34
DIS35: CJNEA,MODE6,DIS41
MOVR7,S_SEC ;秒錶模式,顯示秒錶低位
LJMPDIS34
DIS41: CJNEA,MODE1,DIS33
MOVR7,SEC
LJMPDIS34
DIS33: MOVR7,MIN ;DISPLAY34顯示低位
DIS34: LCALLBCTD
MOVA,R4
MOVR3,A
LCALLDIVIDE
MOVP2,LED2
MOVA,47H
MOVCA,@A+DPTR
MOVP0,A
LCALLDELY10MS
MOVP2,LED3
MOVA,48H
MOVCA,@A+DPTR
MOVP0,A
LCALLDELY10MS
SETBP2.3
RET
;--------------------二翻十:入口:R6R7出口:R2R3R4----------------------
BCTD: MOVR5,#16
CLRA
MOVR2,A
MOVR3,A
MOVR4,A
LOOP: CLRC
MOVA,R7
RLCA
MOVR7,A
MOVA,R6
RLCA
MOVR6,A
MOVA,R4
ADDCA,R4
DAA
MOVR4,A
MOVA,R3
ADDCA,R3
DAA
MOVR3,A
MOVA,R2
ADDCA,R2
DAA
MOVR2,A
DJNZR5,LOOP
RET
;-----------------------拆字:入口:R3R4出口:45H46H47H48H------------------
DIVIDE: MOVA,R3
ANLA,#0FH
MOV46H,A
MOVA,R3
ANLA,#0F0H
SWAPA
MOV45H,A;時拆字45H放時高位,46H放十低位
MOVA,R4
ANLA,#0FH
MOV48H,A
MOVA,R4
ANLA,#0F0H
SWAPA
MOV47H,A;分拆字47H放分高位,48H放分低位
RET
;------------------------------------延時----------------------------------
DELY10MS:MOVR6,#10
D1:MOVR7,#248
DJNZR7,$
DJNZR6,D1
RET
DELAY: MOV74H,#2;延時子程序,12M晶振延時1.002秒
L3: MOV72H,#10
L1: MOV73H,#249
L2: DJNZ73H,L2
LCALLDISPLAY12
LCALLDISPLAY34
JNBDOWN_KEY,OFFALARM1
LJMPS3
OFFALARM1: LCALLDELY10MS
JBDOWN_KEY,S3
S4: JNBDOWN_KEY,S4
MOVF_ALARM,#0
SETBP3.6
LJMPMAIN1
S3: DJNZ72H,L1
DJNZ74H,L3
RET
NUMTAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH;碼表
END
❾ 基於單片機的雙路信號檢測系統綜合設計
模塊悔襪名稱:雙路信櫻前余號檢測(直流電壓+溫度)
晶振頻率:12.0000MHz
建脊滾立時間:2009/5/28
作 者 :Q,6,4,1,8,2,9,5,1,4
#include <REGX52.H>
#define uint unsigned int
#define uchar unsigned char
uchar code dispcode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,<br/> 0x80,0x90,0xFF,0xA1,0x86,0xC7};