二、何謂“IO口”
三、IO口的性能指標
IO口的兩種狀態
如上圖(有個選擇開關實際電路中不存在的為了好理解才給出的)輸出就是 要么給個5V 要么給個地 0V
上圖輸入模型
IO口的輸出性能指標
1/AVR 的IO口灌電流能力與拉電流能力均達30mA
2/51的拉電流能力<100uA,灌電流能力10mA
拉電流能力:
能夠從IO口流出的最大電流
灌電流能力:
能夠流入IO口的最大電流
下圖同理 IO口的輸入
一、AVR的IO口輸入狀態時可配置上拉電阻,值為100K 數量級
二、最大輸入電壓范圍:-0.5V~VCC+0.5V
一、IO口語IO寄存器的映射(x代表A~D)\
方向寄存器:DDRx
數據寄存器:PORTx
輸入寄存器:Pinx
二、C語言變量與寄存器的映射
io.h這個文件中將所有寄存器映射為同名的變量,對這些變量的讀寫相當于對寄存器的讀寫
三、輸出狀態IO寄存器設置
DDRx某一位置1,相應位的IO口被設置為輸出
PORTx某一位置1或0,對應IO口相應位的電平高低
下面是一些映射關系
第一個:C語言通過AVR Studio/WinAVR 等編譯成目標代碼,然后通過下載線編程器(現在個人一般不用了)、JATG口到硬件單片機
第二個:說的是寄存器到寄存器的映射 通過同名變量 、單片機一般多數為8位定時器當然也有16位計數器、然后映射到寄存器內的數據0
1 雖然在RAM存的是0或1 相當于內部高低電平的一種形式進行存儲最后通過IO口 UART
第三個、其他的變量 其實就是RAM中的數據也就是占用RAM中的存儲單元當然這個RAM不能直接跟外界直接進行接觸的。
第四個、函數表示的就是各個函數之間的一些運算還有就是互動的關系,表現到單片機內部就是各個寄存器還有RAM的互動關系,最后轉化為硬件模塊之間的關系。
循環語句、
對IO寄存器進行移位運算,即可實現流水燈效果
循環語句
各種運算符的流水燈驗證
賦值=
與& 或| 取反 ~
邏輯與 && 邏輯或||
while(表達式)//表達式不為0
即為真
{
}
斷點就是全速運行時候當運行到斷點位置就停下來如下圖
Run
去除斷點就是把光標定位到斷點處再次點擊小手或F9 斷點就去除了。
再次按全速運行結果如下圖燈全亮了
原因是因為運行循環速度太快應該加個延時AVR CPU 主頻能跑到16MHZ 一個1到2微秒的時間。1百萬沒秒循環幾十萬次,然人眼分辨加延時。
for (賦值初始值只做一次;條件(真進入內容);執行完內容后執行此條語句){};來回判斷 第2條與第3條語句
for 循環大括號沒有是只執行 第二條與第三條 判斷 加加動作。
注意:在32位操作系統中 是補符號位
如果自制的仿真器缺點如果濾波做不好會出現跑飛的現象。
(引用百度說辭:程序跑飛
程序跑飛是指系統受到某種干擾后,程序計數器PC的值偏離了給定的唯一變化歷程,導致程序運行偏離正常的運行路徑.程序跑飛因素及后果往往是不可預計的.在很多情況下,程序跑飛后系統會進入死循環而導致死機
)
任何數與1 進行^ 異或就取反了。
PORTB = PORTB ^ 0b11111111;//利用異或可以實現閃爍燈
IO口設置為輸出狀態
一、有源蜂鳴器
加上電源電壓即可發出鳴叫聲,消耗電流20mA左右
傳統的蜂鳴器驅動電路
三極管驅動(如下圖)
AVR的蜂鳴器驅動電路
IO口直接驅動(如圖)
可看到PORTA 變化
好了總結下
第一步:IO設置為輸出
DDRB = 0XFF;
DDRB |= 0b00100000//第五位輸出高電平
第二步:對應位輸出數據
輸出1:PORTB |= 0b00100000;//第五位輸出高電平
輸出0:PORTB &= ~0b00100000;//第五位輸出低電平
輸出1:PORTB |= (1<<5);//第五位輸出高電平
輸出0:PORTB &= ~(1<<5);//第五位輸出低電平
對應位取反:PORTB^ = (1<<5);//第五位輸出高電平