基于普中的stc89c52,
串口:
? ? ? ? 通訊接口,51單片機自帶UART(通用異步收發器),可實現窗口通訊。
硬件電路:
? ? ? ? 簡單雙向串口通信有兩根通信線(發送端TXD和接收端RXD),TXD和RXD需要交叉連接,單向數據傳輸時,可以接一根通信線,電平協議不一致,需要加電平轉換芯片。
電平標準:
? ? ? ? 電平標準是數據1和數據0的表達方式,是傳輸線纜中人為規定的電壓與數據的對應關系,串口常用的電平標準有三種:
? ? ? ? TTL電平:+5v表示1,0v表示0;
? ? ? ? RS232電平:-3~-15V表示1,+3~+15V表示0;
以上電平距離十多米以上傳輸信號就會錯亂;
? ? ? ? RS485電平:兩線壓差+2~+6V表示1,-2~-6V表示0;(差分信號)
RS485傳輸距離遠;
流控制,調整傳輸速率和接收速率不匹配的情況;
同步的帶時鐘線:SCL,SCLK
全雙工:兩根線,設備a和設備b可以同時發;
半雙工:一根線,利用同一根線收發;分時復用一根線
單工:只能單向傳輸;
51單片機里的UART:
????????
串口參數及時序圖:
? ? ? ?波特率:串口通信的速率(發送和接收各數據位的間隔時間)
? ? ? ? 檢驗位:用于數據驗證(奇偶校驗,)
? ? ? ? 停止位:用于數據幀間隔
? ? ? ? ?比特率:bit,傳送多少位;
串口模式圖:
配置ES,EA;
波特率計算:
-----------------------------------------------------
SCON = 0x40;//模式一,SM0=0,SM1=1;
?? ?PCON |= 0x80;//波特率
?? ?TMOD &= 0x0F;?? ??? ?//設置定時器模式
?? ?TMOD |= 0x20;?? ??? ?//設置定時器模式,八位自動重裝
?? ?TL1 = 0xF3;?? ??? ?//設置定時初值,和波特率有關
?? ?TH1 = 0xF3;?? ??? ??? ?//設置定時初值
?? ?ET1 = 0;?? ??? ?//禁止定時器1中斷
?? ?TR1 = 1;?? ??? ?//啟動定時器1
---------------------------------------------------------
以12MHZ的晶振為例(每過1微秒記一次數,)
定時器為0xF3(十進制為243),八位寄存器,每隔256溢出一次,與初始值相差13個數(每記13個數溢出一次),每隔13微秒溢出一次,TI的溢出率即為1/13=?0.07692307692307692307692307692308 MHZ
SMOD = 1:??
1/13=?0.07692307692307692307692307692308 MHZ? / 16 =4,807.6923076923076923076923076923 HZ
頻率沒有與晶振對應,所以會產生誤差;
誤差值為溢出率/波特率
0.07692307692307692307692307692308 / 4,807.6923076923076923076923076923
=1.6000000000000000000000000000001e-5
所以會產生0.16/100的誤差;
如果不選擇SMOD就先 / 2再 / 16;
串口相關寄存器:
????????
PCON(電源寄存器)前兩位與串口有關;
串口控制寄存器SCON和PCON:
配置目標:讓UART處于模式1工作狀態;(模式1:8位UART)
SCON = 0x40? //SM0:0;SM1:1;//模式一給二進制位:0100 0000;十六進制0x40;
PCON=0 /波特率配置;
------------------配置定時器
串口中定時器有自己的工作模式;
-----------------------------------------------------
SCON = 0x40;//模式一,SM0=0,SM1=1;
?? ?PCON |= 0x80;//波特率
?? ?TMOD &= 0x0F;?? ??? ?//設置定時器模式
?? ?TMOD |= 0x20;?? ??? ?//設置定時器模式,八位自動重裝
?? ?TL1 = 0xD0;?? ??? ?//設置定時初值,和波特率有關
?? ?TH1 = 0xFF;?? ??? ??? ?//設置定時初值
?? ?ET1 = 0;?? ??? ?//禁止定時器1中斷
?? ?TR1 = 1;?? ??? ?//啟動定時器1
---------------------------------------------------------
定時器和波特率stc配置樣例:
發送速率過快或者波特率過高都會產生誤差,可以采用低波特率和Delay延遲函數解決;
配置單片機收數據:
把REN置為1;
SCON = 0x50;//模式一,SM0=0,SM1=1;
?? ?PCON |= 0x80;//波特率
?? ?TMOD &= 0x0F;?? ??? ?//設置定時器模式
?? ?TMOD |= 0x20;?? ??? ?//設置定時器模式,八位自動重裝
?? ?TL1 = 0xD0;?? ??? ?//設置定時初值,和波特率有關
?? ?TH1 = 0xFF;?? ??? ??? ?//設置定時初值
?? ?ET1 = 0;?? ??? ?//禁止定時器1中斷
?? ?TR1 = 1;?? ??? ?//啟動定時器1
? ? ?EA = 1;//啟動中斷
? ?ES = 1;//啟動串口中斷;
中斷號:
void UART_Routine() interrupt 4? ? ? ?串口中斷號4
單片機是用同一個串口同時收發:所以在中斷函數里面用if判斷是接收中斷還是發送中斷;
一個函數不能再主函數和中斷函數中同時調用;
數據顯示模式:
HEX模式/二進制模式:以原始數據形式顯示;
文本模式/字符模式:以原始數據編碼后的數據顯示;
數據在文本模式時需要用ascll碼進行編碼在進行發送,可以傳輸的數據為0-255;(對應ascll碼表)
在實際傳輸過程中只傳輸二進制碼,只是顯示方式不一樣;
LED點陣屏:
? ? ? ? ?
本次使用的開發板只是一個8*8單色點陣;
顯示原理:
類似于數碼管,點陣屏只能掃描法顯示不同內容;
74HC595(可控制多位輸出):
QA--QH輸出端;
OE上加橫線說明低電平有效;OE使能接口(只有OE低電平芯片才工作);
RCLK:寄存器時鐘;
SRCLR:串行清零端? (直接接VCC代表不清空)
SRCLK:串行時鐘
SER:串行數據
--------------------------------------------
SER:串行數據:
? ? ? ??
數據分串行(一個一個在時鐘的激勵下出去)和并行(同時輸出)
串行數據接移位寄存器:把數據寫入高電平,控制時鐘上升沿移位(SERCLK),把SER清零,再給一個上升沿移位,,數據會一個一個向下移動;
RCLK會把移位寄存器的數據移位到輸出端(給RCLK一個上升沿)
以上是一片74HC595的工作方式;
QH` 多片級聯:
當移位寄存器滿的時候,SER繼續給1,輸出端會輸出到QH`給下一個移位寄存器;
每一片移位寄存器的時鐘是連接到一起的;當所有的移位寄存器滿的時候,數據移位完成是,上升沿鎖存(RCLK)會控制所有的移位寄存器輸出到輸出緩沖區;
單片機低電平強,高電平弱,如直接接芯片IO口會影響亮度;如果用三極管放大電路進行放大輸出電平,IO口作為控制電路,這樣緩沖后可以增加導通效果;
同一列輸出和同一行輸出燈亮度不一樣;(恒壓輸出和恒流輸出);
c51中的sfr、sbit:(在頭文件中可以找到)
sfr:特殊功能寄存器聲明;
例如:sfr P0 =0x80;? 聲明P0口寄存器,物理地址為0x80;
sbit:特殊位聲明
例如:sbit P0_1 = 0x81;? 或 sbit P0_1 = P0^1; /聲明P0寄存器的第一位;
可位尋址/不可位尋址:
單片機系統中,操作任意寄存器或者某一位數據時,必須給出其物理地址,又因為一個寄存器里有八位,所以位的數量是寄存器數量的8倍。單片機無法對所有位進行編碼,故每8位寄存器中,只有一個是可以尋址的,對不可尋址的寄存器,若只操作其中一位而不影響其他位,可以用“&=”,“|=”,“^=”的方法進行位操作;
-----------------------------
sbit RCK = P3^5;? ? ? //把P3的第五位命名為RCLK,,等同于操作P35
采用不同的命名方法:來保證避免命名沖突;
高位優先推入QH:
SER第一個給最高位值;把byte的最高位取出賦值給SER;
單片機初始化后所有的IO口都是高電平:所以要操作sck要把先賦值為0;
上升沿移位由0置1后SER給的高位1被移入下一層,移動結束后,再次置0,為下一次移動準備;
重復移位:
用for循環解決:
上升沿移位完成后,進行上升沿鎖存,把八位數據送到IO口上;
點陣屏代碼:
當Column = 0 ,P07 = 0.其他輸出1;
代碼改進:
段選? 位選? ?段選? 位選?段選? 位選 ? ? ? ?//點陣屏重復執行,會把位選的數據影響到段選數據;所以要消影;
消除殘影,所以加上延時 位清零