⑴ proteus模擬電路圖,51單片機按鍵計數
按照你題目,用了2個2位顯示,實際有4位合一起的。
k3:切換計數模式/預置模式。
計數模式:LED顯示計時數字,從0開始計時,直到預置最大值。
預置模式:LED顯示當前預置最大值,按k1,k2可對預置值+-操作,長按k1,k2大約2秒,會進入自動加減預置值。直到再次點擊k1,k2,k3任意一鍵停止自動。
k4:在計數模式下使用,每按下一次顯示的數字加一(會在正常計時同時額外+1)。
當計數達到預置最大值,會停止計數,LEN閃爍(實際就是交替顯示間隔邊長),蜂鳴器響。
按鍵時長、LED動態顯示間隔、閃爍間隔、計數速度,均可直接修改常量,需要自己改,我備注寫的很詳細。
電路基本按照你上圖,略有修改。
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define an P0
#define on 0
#define off 1
#define SSSPEED 35 //LED交替閃爍間隔時間
#define JSPEED 5000//計數模式,速度默認數值(5000*200us=1S) 值越小計數越快
#define PREESTIME 500//按鈕長按時間判定,預設500(大約2秒),需要自改,值越大,長按時間越長
sbit fm=P3^3;
sbit wei1=P3^4;
sbit wei2=P3^5;
sbit wei3=P3^6;
sbit wei4=P3^7;
sbit k1=P1^4;
sbit k2=P1^5;
sbit k3=P1^6;
sbit k4=P1^7;
uint jsSpd=JSPEED;//計時速度,默認1s一次(5000*200us)
uint ssSpd=SSSPEED;//LED交替閃爍速度
//共陽極
int delay(uint xms);
void init();
void jspause();//計數器開啟/停止
void setnumYS();//設置預設數值
void numJsChange();//計數模式數字改變
void showLED();
int pressWait(uint btn);
uint g=0;
uint s=0;
uint b=0;
uint q=0;
uint count=0;
uint ispause=1;
uint numYS=0;//預設數值
uint numJS=0;//實際計時的數字
uint isMaxJs=0;//標識:計時達最大。 達最大1,否0
uint isk3press=0;//標識:k3按鈕是否被點擊。 點擊1,否0
uint ispress1=0;//標識:k1被長按
uint ispress2=0;//標識:k2被長按
uint isbtn4=0;//標識:k4被按下
uint btnName=0;//按鈕長按計時
void main()
{
init();
while(1)
{
if(ispause==1 && ispress1==1 && numYS<9999) //預置模式下,k1已長按,自動增
{
numYS++;
setnumYS();
}
if(ispause==1 && ispress2==1 && numYS>0) //預置模式下,k2已長按,自動減
{
numYS--;
setnumYS();
}
if(isMaxJs==0 && numJS>=numYS && ispause==0) //計時模式下達最大值
{
fm=on;
ssSpd=1000;//增加LED交替間隔,實現數字閃爍
isMaxJs=1;
EA=0;
setnumYS();
numJS=0;
}
if(k1==0 ||k2==0|| k3==0) //k1k2k3任意一個按鈕被按下,停止預置數自動增長
{
ispress1=0;
ispress2=0;
}
if(k1==0 && ispause==1)//預置模式下+
{
delay(10);
if(k1==0)
{
btnName=1;
if(pressWait(btnName))//判斷連按
{
while(k1==0);
ispress1=1;
}
else if(numYS<9999)
{
numYS++;
setnumYS();
}
}
}
if(k2==0 && ispause==1)//預置模式下-
{
delay(10);
if(k2==0)
{
btnName=2;
if(pressWait(btnName))//判斷連按
{
while(k2==0);
ispress2=1;
}
else if(numYS>0)
{
numYS--;
setnumYS();
}
}
}
if(k3==0)
{
delay(10);
if(k3==0)
{
while(k3==0);
fm=off;
jspause();
}
}
if(k4==0 && ispause==0)//計數模式下按下k4,k4的防抖寫在中斷中
{
delay(10);
if(k4==0)
{
while(k4==0);
isbtn4=1;
}
}
showLED();
}
}
void showLED()
{
uchar nums[10]={0xc0,0xf9,0xa4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x98};
if(g>=0)
{
an=nums[g];
wei4=on;
delay(ssSpd);
wei4=off;
}
if(s>0 || (s==0 && b>0))
{
an=nums[s];
wei3=on;
delay(ssSpd);
wei3=off;
}
if(b>0 || (b==0 && q>0))
{
an=nums[b];
wei2=on;
delay(ssSpd);
wei2=off;
}
if(q>0)
{
an=nums[q];
wei1=on;
delay(ssSpd);
wei1=off;
}
}
void setnumYS()//設置預設數值
{
q=numYS/1000;
b=(numYS%1000)/100;
s=(numYS%100)/10;
g=numYS%10;
}
void jspause()
{
if(ispause==0 || isMaxJs==1)//關閉計時模式 / 啟動預置模式
{
EA=0;
isMaxJs=0;
ispause=1;
ssSpd=SSSPEED;
ispress1=0;
ispress2=0;
setnumYS();
}
else if(ispause==1) //啟動計時模式 / 關閉預置模式
{
ispause=0;
q=b=s=g=0;
numJS=0;
ssSpd=SSSPEED;
EA=1;
}
}
void init()
{
TMOD=0x02; //T0 工作模式2 自動裝填8位 200us
TH0=0x38;
TL0=0x38;
EA=0;
ET0=1;
TR0=1;
wei1=off;
wei2=off;
wei3=off;
wei4=off;
}
void numJsChange()//計數模式數字改變
{
if(g==9)
{
g=0;
if(s==9)
{
s=0;
if(b==9)
{
b=0;
if(q==9)
{
q=0;
}
else
q++;
}
else
b++;
}
else
s++;
}
else
g++;
}
void ct() interrupt 1 //一次中斷200us
{
if(count<jsSpd)
count++;
else
{
count=0;
numJsChange();
numJS++;
}
if(isbtn4==1)
{
isbtn4=0;
numJsChange();
numJS++;
}
}
int pressWait(uint btn)
{
uint i,j;
for(i=PREESTIME;i>0;i--)
for(j=110;j>0;j--)
{
if((k1==1 && btn==1)||(k2==1 && btn==2))
return 0;
}
return 1;
}
int delay(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--)
{
if(k1==0 || k2==0 ||k3==0)
return 1;
}
return 0;
}
⑵ 如何用單片機控制液晶顯示器呀,怎麼接線……
液晶顯示器有字元型,如1602,這個液晶顯示器目前是統一的,引腳和命令字都 是統一的。接線如下圖所示
⑶ 單片機的輸入和輸出的都是什麼
單片機的輸入和輸出分為數字量和模擬量兩種。
數字量定義為:在時間和數值上都是斷續變化的離散信號。最基本的數字量就是0和1,反映到開關上就是指一個開關的打開(0)或閉合(1)狀態。
模擬量定義為:在時間和數上都是連續變化的信號。指經PT、CT等各類感測器傳送過來的電壓、電流、頻率等信號,即模擬量。
輸入信號:是通過外部的觸點、開關、變送器、感測器等信號接入到單片機中。
輸出信號:單片機通過內部程序的判斷和計算,將電流、電壓、開關等信號傳送到外部的信號。
下圖為典型的51系列單片機接線圖
其中P0為模擬量輸入端、P3為數字量輸入端。
⑷ 請問AVR單片機中「輸入捕獲功能」怎麼用有例子最好!
DSP(digital signal processor)是一種獨特的微處理器,是以數字信號來處理大量信息的器件。其工作原理是接收模擬信號,轉換為0或1的數字信號,再對數字信號進行修改、刪除、強化,並在其他系統晶元中把數字數據解譯回模擬數據或實際環境格式。它不僅具有可編程性,而且其實時運行速度可達每秒數以千萬條復雜指令程序,遠遠超過通用微處理器,是數字化電子世界中日益重要的電腦晶元。它的強大數據處理能力和高運行速度,是最值得稱道的兩大特色。 DSP微處理器(晶元)一般具有如下主要特點: (1)在一個指令周期內可完成一次乘法和一次加法; (2)程序和數據空間分開,可以同時訪問指令和數據; (3)片內具有快速RAM,通常可通過獨立的數據匯流排在兩塊中同時訪問; (4)具有低開銷或無開銷循環及跳轉的硬體支持; (5)快速的中斷處理和硬體I/O支持; (6)具有在單周期內操作的多個硬體地址產生器; (7)可以並行執行多個操作; (8)支持流水線操作,使取指、解碼和執行等操作可以重疊執行。 當然,與通用微處理器相比,DSP微處理器(晶元)的其他通用功能相對較弱些。 DSP優點: 對元件值的容限不敏感,受溫度、環境等外部參與影響小; 容易實現集成;VLSI 可以分時復用,共享處理器; 方便調整處理器的系數實現自適應濾波; 可實現模擬處理不能實現的功能:線性相位、多抽樣率處理、級聯、易於存儲等; 可用於頻率非常低的信號。 DSP缺點: 需要模數轉換; 受采樣頻率的限制,處理頻率范圍有限; 數字系統由耗電的有源器件構成,沒有無源設備可靠。 但是其優點遠遠超過缺點。
DSP技術的應用
語音處理:語音編碼、語音合成、語音識別、語音增強、語音郵件、語音儲存等。 圖像/圖形:二維和三維圖形處理、圖像壓縮與傳輸、圖像識別、動畫、機器人視覺、多媒體、電子地圖、圖像增強等。 軍事;保密通信、雷達處理、聲吶處理、導航、全球定位、跳頻電台、搜索和反搜索等。 儀器儀表:頻譜分析、函數發生、數據採集、地震處理等。 自動控制:控制、深空作業、自動駕駛、機器人控制、磁碟控制等。 醫療:助聽、超聲設備、診斷工具、病人監護、心電圖等。 家用電器:數字音響、數字電視、可視電話、音樂合成、音調控制、玩具與游戲等。 生物醫學信號處理舉例: CT機示例
CT:計算機X射線斷層攝影裝置。(其中發明頭顱CT英國EMI公司的豪斯菲爾德獲諾貝爾獎。) CAT:計算機X射線空間重建裝置。出現全身掃描,心臟活動立體圖形,腦腫瘤異物,人體軀干圖像重建。 心電圖分析。
編輯本段AVR的主要特性
高可靠性、功能強、高速度、低功耗和低價位 , 一直是衡量單片機性能的重要指標,也是單片機佔領市場、賴以生存的必要條件。 早期單片機主要由於工藝及設計水平不高、功耗高和抗干擾性能差等原因,所以採取穩妥方案:即採用較高的分頻系數對時鍾分頻,使得指令周期長,執行速度慢。以後的 CMOS單片機雖然採用提高時鍾頻率和縮小分頻系數等措施,但這種狀態並未被徹底改觀(51以及51兼容)。此間雖有某些精簡指令集單片機(RISC)問世,但依然沿襲對時鍾分頻的作法。 AVR單片機的推出,徹底打破這種舊設計格局,廢除了機器周期,拋棄復雜指令計算機(CISC)追求指令完備的做法;採用精簡指令集,以字作為指令長度單位,將內容豐富的操作數與操作碼安排在一字之中(指令集中佔大多數的單周期指令都是如此),取指周期短,又可預取指令,實現流水作業,故可高速執行指令。當然這種速度上的升躍,是以高可靠性為其後盾的。 AVR單片機硬體結構採取8位機與16位機的折中策略,即採用局部寄存器存堆(32個寄存器文件)和單體高速輸入/輸出的方案(即輸入捕獲寄存器、輸出比較匹配寄存器及相應控制邏輯)。提高了指令執行速度(1Mips/MHz),克服了瓶頸現象,增強了功能;同時又減少了對外設管理的開銷,相對簡化了硬體結構,降低了成本。故AVR單片機在軟/硬體開銷、速度、性能和成本諸多方面取得了優化平衡,是高性價比的單片機。 AVR單片機內嵌高質量的Flash程序存儲器,擦寫方便,支持ISP和IAP,便於產品的調試、開發、生產、更新。內嵌長壽命的EEProm可長期保存關鍵數據,避免斷電丟失。片內大容量的RAM不僅能滿足一般場合的使用,同時也更有效的支持使用高級語言開發系統程序,並可像MCS-51單片機那樣擴展外部 RAM。 AVR單片機的I/O線全部帶可設置的上拉電阻、可單獨設定為輸入/輸出、可設定(初始)高阻輸入、驅動能力強(可省去功率驅動器件)等特性,使的得I/O口資源靈活、功能強大、可充分利用。 AVR單片機片內具備多種獨立的時鍾分頻器,分別供URAT、I2C、SPI使用。其中與8/16位定時器配合的具有多達10 位的預分頻器,可通過軟體設定分頻系數提供多種檔次的定時時間。AVR單片機獨有的「以定時器/計數器(單)雙向計數形成三角波,再與輸出比較匹配寄存器配合,生成占空比可變、頻率可變、相位可變方波的設計方法(即脈寬調制輸出PWM)」更是令人耳目一新。 增強性的高速同/非同步串口,具有硬體產生校驗碼、硬體檢測和校驗偵錯、兩級接收緩沖、波特率自動調整定位(接收時)、屏蔽數據幀等功能,提高了通信的可靠性,方便程序編寫,更便於組成分布式網路和實現多機通信系統的復雜應用,串口功能大大超過MCS-51/96單片機的串口,加之AVR單片機高速,中斷服務時間短,故可實現高波特率通訊。 面向位元組的高速硬體串列介面TWI、SPI。TWI與I2C介面兼容,具備ACK信號硬體發送與識別、地址識別、匯流排仲裁等功能,能實現主/從機的收/發全部4種組合的多機通信。SPI支持主/從機等4種組合的多機通信。 AVR單片機有自動上電復位電路、獨立的看門狗電路、低電壓檢測電路BOD,多個復位源(自動上下電復位、外部復位、看門狗復位、BOD復位),可設置的啟動後延時運行程序,增強了嵌入式系統的可靠性。 AVR單片機具有多種省電休眠模式,且可寬電壓運行(5-1.8V),抗干擾能力強,可降低一般8位機中的軟體抗干擾設計工作量和硬體的使用量。 AVR單片機技術體現了單片機集多種器件(包括FLASH程序存儲器、看門狗、EEPROM、同/非同步串列口、TWI、SPI、A/D模數轉換器、定時器/計數器等)和多種功能(增強可靠性的復位系統、降低功耗抗干擾的休眠模式、品種多門類全的中斷系統、具輸入捕獲和比較匹配輸出等多樣化功能的定時器/計數器、具替換功能的I/O埠…… )於一身,充分體現了單片機技術的從「片自為戰」向「片上系統SoC」過渡的發展方向。 綜上所述,AVR單片機博採眾長,又具獨特技術,不愧為8位機中的佼佼者。
編輯本段AVR 最大特點
● 哈佛結構,具備1MIPS / MHz的高速運行處理能力; ● 超功能精簡指令集(RISC),具有32個通用工作寄存器,克服了如8051 MCU採用單一ACC進行處理造成的瓶頸現象; ● 快速的存取寄存器組、單周期指令系統,大大優化了目標代碼的大小、執行效率,部分型號FLASH非常大,特別適用於使用高級語言進行開發; ● 作輸出時與PIC的HI/LOW相同,可輸出40mA(單一輸出),作輸入時可設置為三態高阻抗輸入或帶上拉電阻輸入,具備10mA-20mA灌電流的能力; ● 片內集成多種頻率的RC振盪器、上電自動復位、看門狗、啟動延時等功能,外圍電路更加簡單,系統更加穩定可靠; ● 大部分AVR片上資源豐富:帶E2PROM,PWM,RTC,SPI,UART,TWI,ISP,AD,Analog Comparator,WDT等; ● 大部分AVR除了有ISP功能外,還有IAP功能,方便升級或銷毀應用程序 AVR系列單片機的選型 AVR單片機系列齊全,可適用於各種不同場合的要求。AVR單片機有3個檔次: 低檔Tiny系列AVR單片機: 主要有Tiny11/12/13/15/26/28等; 中檔AT90S系列AVR 單片機: 主要有AT90S1200/2313/8515/8535等; (正在淘汰或轉型到Mega中) 高檔ATmega系列AVR單片機: 主要有ATmega8/16/32/64/128( 存儲容量為8/16/32/64/128 KB)以及ATmega8515/8535等。
我個人的觀點,單片機是所有微處理器的基礎,也是最容易掌握的,AVR單片機只是其中的一種。而DSP要比單片機復雜一些,主要應用在數字信號處理,其實是較復雜的單片機,當然,你要學會了DSP,單片機自然也就會了。至於就業問題,DSP要好一些。