㈠ 單片機串口通信原理
非同步通信
固定波特率下傳送0,1信號
就是在規定的時間間隔內傳送0.1數據
㈡ c51單片機串並口轉換程序
1 系統的組成和工作原理
多功能溫度控制系統的結構如圖1所示,系統由六部分組成:控制核心部分、溫度數據採集部分、加熱裝置控制部分、液晶顯示部分、按鍵輸入部分和報警提示部 分。單片機啟動溫度採集電路完成溫度的一次轉換,然後讀出轉換後的數字量並轉化成當前的溫度呈現在顯示模塊中,並將當前的溫度與通過按鍵輸入電路設定的保 持恆溫度數進行比較,以實現溫度的控制。還可以通過按鍵設置溫度的上下限值以實現超溫或低溫報警提示功能。本系統的設計目標要對溫度的控制精度達到 0.1℃。
1.1 報警電路
報警電路採用蜂鳴器作為發聲裝置,當溫度高於設定的上限值或低於下限值,給蜂鳴器送周期為1s,占空比為50%的方波,報警的時間可以持續1分鍾或等待按 鍵解除報警,這由軟體控制實現。
1.2 按鍵電路
採用2×3的小鍵盤,鍵盤的識別可以採用兩種方法:行掃描法和行反轉法。兩種方法都要注意消除按鍵的抖動。文中採用行掃描法並做成子程序,出口參數為按鍵 的鍵值。定義鍵K1設置TH,K2設置TL,K3調高TH或TL,K4調低TH或TL,K5對TH或TL的數值進行確認。
1.3 溫度檢測電路
溫度檢測電路採用智能溫度感測器DSl8820,它與單片機相連只需要3線,減少了外部的硬體電路。DSl8820主要性能特點如下:
(1)測溫的范圍為-55~125℃,最大解析度可以達到0.0625℃;
(2)電源電壓范圍為3.0~5.5V;
(3)供電模式:寄生供電和外部供電;
(4)封裝形式有兩種:3腳的TO-92封裝和8腳的SOIC封裝;
(5)可編程的溫度轉換解析度,解析度為9~12位(包括1位符號位),由配置寄存器決定具體位數,配置寄存器的格式如表1所示。
其中RlR0是用來設定解析度的,解析度的定義如表2所示。
由表2可以看出,解析度設定得越高,溫度轉換所需要的時間就越長,因此應根據實際應用的需要來選擇合適的解析度。本文中選取12位解析度,每隔1秒檢測一 次溫度。12位解析度的溫度數據值格式如下:
當S=0表示測得的溫度為正值,當S=l表示測得的溫度為負值。
1.3.1 DSl8820的存儲器結構
DSl8820的存儲器有高速暫存RAM和非易失性電擦寫EEPROM。高速暫存RAM的內容從低位元組到高位元組9個位元組依次為:溫度LSB、溫度MSB、 高溫限值位元組TH、低溫限值位元組TL、配置寄存器、保留、保留、保留,最後一個位元組是前8個位元組的CRC碼。EEPROM用來存儲TH和TL。
1.3.2 溫度數據的處理方法
從DSl8820讀出的兩個位元組的二進制值溫度必須先轉換成十進制數值,然後才能將其ASCII碼送往LCDl602顯示。12位的解析度,溫度是以 0.0625步進的,由於兩個位元組的溫度採用補碼表示,所以先判斷讀出溫度的最高位是0還是1,即判斷是正溫還是負溫,然後對其求補碼轉化成正溫,之後將 高位元組的低4位和低位元組的高4位組成一個位元組,這個位元組的二進制值不斷除以10得出的余數即為溫度值的個、十、百位值。若讀出的溫度數值是負數,顯示處理 時,在溫度數的前面人為顯示負號即可。對小數部分的溫度只需將低位元組的低4位乘以0.0625,然後對乘積取其小數點後的一位數即可。
1.3.3 DSl8820的控制步驟
(1)首先對DSl8820進行復位。由單片機將數據線DQ拉至低電平480-960 μs,然後將DQ拉高15-60 μs,以便單片機檢測到DSl8820送來的低電平響應。然後檢測DQ,若DQ仍然為高電平,則復位操作失敗,可採用循環的方式再次對其進行復位;若DQ 為低電平,則復位操作成功。
(2)DSl8820的ROM操作命令。DSl8820復位後,主機可以發器件ROM的操作命令如讀ROM[33H]、匹配ROM[55H]、跳過 ROM[0CCH],報警搜索[4EH]等。在單點匯流排的情況下,可發跳過ROM[0CCH]操作命令,以節省時間。另外,文中有報警的功能,溫度轉換後 還需要發報警搜索命令,該命令會將最近一次測得的溫度值T與高速RAM中的TH或TL作比較,若T>TH或T<TL,則該器件內的報警標志位 置位,並對主機發出的報警搜索命令作出響應。
(3)DSl8820的存儲器操作命令。如啟動溫度轉換命令[44H],寫入命令[4EH](寫入該命令後,緊接著要寫入報警上限TH,報警下限TL及配 置寄存器位元組),讀暫存器RAM的內容命令[0BEH](讀取將從第一個位元組開始一直到第9個位元組結束,如僅需要部分位元組,主機可以在合適的時刻發復位命 令來終止讀取)及復制命令[48H](把暫存器RAM的第2、3、4位元組轉存到DSl8820的EEROM中)等。
(4)DSl8820的ROM或RAM操作的匯流排讀寫時序。對於讀時序,首先將DQ拉低並延時1-15μs以內(延時時間不能太長),然後將DQ拉高並延 時幾個μs後再讀取DQ的值,讀完一位後需要延時45 μs以上才能讀取下一位;對於寫時序,先將DQ拉低10-15μs,接著向匯流排寫入數據並延時50μs以上,最後將DQ拉高1μs以上再進行下一位的寫 入。
1.4 液晶顯示模塊
採用的是長沙太陽人電子有限公司生產的SMCl602A。
1.4.1 主要技術參數
晶元的工作電壓4.5~5.5V,能顯示兩行,每行顯示16個字元,字元的大小為2.95×4.35mm。
1.4.2 介面信號說明
除電壓、背光引腳及8個I/O引腳外,主要的控制引腳還有數據/命令選擇RS引腳,該引腳為高電平時表示I/O引腳出現的是數據,該引腳為低電平時表示 I/O引腳出現的是命令;讀/寫選擇引腳及使能引腳E(該引腳為高電平時對SMCl602A的操作才有效)。
1.4.3 指令說明
(1)初始化設置
a.顯示模式設置。指令碼:00111000b,用於設置16×2顯示,5×7點陣。
b.顯示開/關及游標設置。二進制指令碼:00000DCB中D位用來控制顯示開或關,C位用來控制顯示游標,B位控制游標是否閃爍。二進制指令 碼:000001NS中N位控制讀寫一個數據後地址指針和游標加或減1,S位控制字元的移動。
c.數據指針設置。指令碼:80H+地址碼(0-27H,40H-67H)用於設置數據指針。
(2)其他設置。如指令碼01H:顯示清屏且數據指針清零。
1.4.4 LCDl602的初始化步驟
(1)延時15ms,寫指令38H(不檢測忙信號);
(2)延時5ms,寫指令38H(不檢測忙信號),上述過程執行兩遍,後面的過程每次寫指令、讀/寫數據之前均需要檢測忙信號;
(3)寫指令38H:顯示模式設置;
(4)寫指令08H:關閉顯示;
(5)寫指令0lH:清屏且數據指針清零;
(6)寫指令06H:字元不移動,游標和指針加1;
(7)寫指令0FH:顯示開,游標閃爍。
1.5 恆溫保持控制模塊
選用6V固態繼電器作為開關器件,通過控制其斷與通的時序從而控制加熱器件的工作時長,以實現樣品的恆溫保持功能。
2 系統硬體電路的設計
該系統的主要電路原理圖如圖2所示。系統中使用USB口提供5V電源的電路;使用RS232串口通過P3.0和P3.1燒寫程序的電路;以及使用繼電器控 制的恆溫保持電路等在原理圖中並未畫出。
3 系統的軟體設計
系統總的流程圖如圖3所示。系統程序主要有主程序和LCDl602初始化子程序及讀寫時序子程序、DSl8820復位及讀寫時序子程序、鍵盤掃描子程序、 溫度數據處理子程序等構成。
4 程序的編輯及調試
編程語言可以採用匯編語言,也可以採用C51語言。本文採用匯編語言,使用Keil C軟體新建一個工程,然後新建一個文件輸入源程序並保存成.asm格式,並將該源文件添加到剛剛新建的工程,隨後編譯鏈接後生成十六進制文件 (.HEX),最後使用燒寫軟體stc-isp-v3.9l通過RS232串口將十六進制文件燒寫進單片機的Flash中運行程序即可。
5 結論
本文設計的多功能溫度控制器體積小、功耗低、可靠性高,實驗表明,對溫度的控制精度達到了0.1℃的設計目標。
㈢ 求助,關於單片機串列轉並行問題!
74HC595是具有8位移位寄存器和一個存儲器,三態輸出功能。移位寄存器和存儲器是分別的時鍾。數據在SCK的上升沿輸入,在RCK的上升沿進入的存儲寄存器中去。如果兩個時鍾連在一起,則移位寄存器總是比存儲寄存器早一個脈沖。移位寄存器有一個串列移位輸入(SI),和一個串列輸出(Q7』),和一個非同步的低電平復位,存儲寄存器有一個並行8位的,具備三態的匯流排輸出,當使能 OE時(為低電平),存儲寄存器的數據輸出到匯流排。
QB--|1 16|--VccQC--|2 15|--QA
QD--|3 14|--SI
QE--|4 13|--/G
QF--|5 12|--RCK
QG--|6 11|--SCK
QH--|7 10|--/SCLR
GND-|8 9|--QH'
74595的數據端:
QA--QH: 八位並行輸出端,可以直接控制數碼管的8個段。
QH': 級聯輸出端。我將它接下一個595的SI端。
SI: 串列數據輸入端。
74595的控制端說明:
/SCLR(10腳): 低點平時將移位寄存器的數據清零。通常我將它接Vcc。
SCK(11腳):上升沿時數據寄存器的數據移位。QA-->QB-->QC-->...-->QH;下降沿移位寄存器數據不變。(脈沖寬度:5V時,大於幾十納秒就行了。我通常都選微秒級)
RCK(12腳):上升沿時移位寄存器的數據進入數據存儲寄存器,下降沿時存儲寄存器數據不變。通常我將RCK置為低電平,當移位結束後,在RCK端產生一個正脈沖(5V時,大於幾十納秒就行了。我通常都選微秒級),更新顯示數據。
/G(13腳): 高電平時禁止輸出(高阻態)。如果單片機的引腳不緊張,用一個引腳控制它,可以方便地產生閃爍和熄滅效果。比通過數據端移位控制要省時省力。
74595的主要優點是具有數據存儲寄存器,在移位的過程中,輸出端的數據可以保持不變。這在串列速度慢的場合很有用處,數碼管沒有閃爍感。
應用如下:
以下是用C語言編寫的,採用動態掃描方式顯示0123這四個數字,此程序是經過模擬模擬的。
//#################################################################
//程序名稱:8位數碼管顯示程序
//程序功能:讓8位數碼管顯示display_7leds[8]中的內容
//程序說明:使用時改變display_7leds[8]中的內容,調用wr7leds()函數即可
//#################################################################
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//#############管腳定義#######################
#define PORT_LED P0 //LED位選信號輸入管腳
sbit sclk=P2^0; //595移位時鍾信號輸入端
sbit st=P2^1; //595鎖存信號輸入端
sbit da=P2^2; //595數據信號輸入端
//#############################################
//共陰極數碼管顯示代碼:7 6 5 4 3 2 1 0
// a b c d e f
uchar code LED_7SEG[16]={0xfc,0x60,0xda,0xf2,//0,1,2,3,<br>0x66,0xb6,0xbe,0xe0, //4,5,6,7,<br>0xfe,0xe6,0xee,0x3e, //8,9,A,b,<br>0x9c,0x7a,0x9e,0x8E};//C,d,E,F
//#####################################################
//名稱:wr595()向595發送一個位元組的數據
//功能:向595發送一個位元組的數據(先發低位)
//#####################################################
void wr595(uchar wrdat)
{
uchar i;
sclk=0;
st=0;
for(i=8;i>0;i--)//循環八次,寫一個位元組
{
da=wrdat&0x01; //發送BIT0 位
wrdat>>=1; //要發送的數據右移,准備發送下一位
sclk=0; //移位時鍾上升沿
_nop_();
_nop_();
sclk=1;
_nop_();
_nop_();
sclk=0;
}
st=0; //上升沿將數據送到輸出鎖存器
_nop_();
_nop_();
st=1;
_nop_();
_nop_();
st=0;
}
//##########################################################
// 延時函數
//##########################################################
void delay(uint del)
{
while(del--)
{ ;
}
}
//##########################################################
//名稱:wr7leds()8個led顯示數字函數
//功能:向595發送一個位元組的數據,然後發送位選信號
//##########################################################
void wr7leds(void)
{
uchar i,wx;
wx=0x01; //位選信號初始化
for(i=0;i<4;i++) //循環4次寫4個數據
{
wr595(LED_7SEG[i]); //傳送顯示數據
PORT_LED=~wx; //送位選信號
wx<<=1; //位選信號左移,准備顯示下一個數字
delay(50); //延時,(決定亮度,和閃爍)
}
}
//##########################################################
//主函數
//##########################################################
main(void)
{
while(1)
{
wr7leds(); //向74HC595發送數據並顯示
}
}
㈣ 單片機的晶振如果串聯或者並聯會怎麼樣
一個晶振相當於一個電容電感的並聯和串聯,他們的選頻截止頻率不同,無法完成選頻功能,無法起振,完畢
㈤ 求原理圖,單片機串並轉換連接32個led燈,同時還有鍵掃96個按鍵的原理圖。。包括單片機
見圖
㈥ 單片機串並轉換
1、0-F,是16個鍵值,可以採用鍵盤陣列完成,佔用 8 個 IO 口。
2、LED的顯示,LED 是七段的(ABCDEFG),佔用 7 個 IO 口。
3、輸入數字轉換為二進制,佔用 4 個 IO 口。
4、根據以上的分析,模塊化的編寫程序,逐步完成。
㈦ 怎樣區分單片機中的串列與並行通信
串列是所有信息從一個IO口輸出,並行是每個位元組的八個位從八個IO口輸出
㈧ 幫忙把匯編轉換成C語言,急!!是關於單片機串並轉換的程序
這個明顯是51吧。
start主要是設置了定時器的時間和模式,然後開啟定時器,
死循環
等中斷。
int_t0是定時器0的中斷處理,查表那一段好像有問題,好像永遠不會執行,給R0賦值的那一句位置不對。
㈨ 在單片機中什麼叫串入並出
在8051單片機中把一個時鍾周期定義為一個節拍(用P表示),二個節拍定義為一個狀態周期(用S表示)時鍾周期也稱為振盪周期,定義為時鍾脈沖的倒數(可以這樣來理解,時鍾周期就是單片機外接晶振的倒數,例如 12M的晶振,它的時間周期就是1/12 us),是計算機中最基本的、最小的時間單位。
㈩ 單片機串並轉換晶元
74hc595.用得最多的串並轉換晶元
引腳說明:
SDA:數據輸入口。
CLK:時鍾輸入端。
Q0~Q7:數據並行輸出端。
74HC595 內含8 位串入、串/ 並出移位寄存器和8位三態輸出鎖存器。寄存器和鎖存器分別有各自的時鍾輸入(SH_CP和ST_CP) , 都是上升沿有效。當SH_CP從低到高電平跳變時, 串列輸入數據(SDA) 移入寄存器; 當ST_CP從低到高電平跳變時, 寄存器的數據置入鎖存器。清除端(CLR) 的低電平只對寄存器復位(QS 為低電平) , 而對鎖存器無影響。當輸出允許控制(EN) 為高電平時, 並行輸出(Q0~Q7) 為高阻態, 而串列輸出(QS) 不受影響。74HC595 最多需要5 根控制線, 即SDA、SH_CP、ST_CP、CLR 和EN。其中CLR 可以直接接到高電平, 用軟體來實現寄存器清零; 如果不需要軟體改變亮度, EN 可以直接接到低電平, 而用硬體來改變亮度。把其餘三根線和單片機的I/ O 口相接, 即可實現對LED 的控制。數據從SDA 口送入74HC595 , 在每個SH_CP的上升沿, SDA 口上的數據移入寄存器, 在SH_CP的第9個上升沿, 數據開始從QS 移出。如果把第一個74HC595 的QS 和第二個74HC595 的SDA 相接, 數據即移入第二個74HC595 中, 照此一個一個接下去, 可接任意多個。數據全部送完後, 給ST_CP 一個上升沿, 寄存器中的數據即置入鎖存器。此時如果EN 為低電平, 數據即從並口Q0~Q7 輸出, 把Q0~Q7 與LED 的8 段相接, LED 就可以實現顯示了。要想軟體改變LED 的亮度, 只需改變EN 的占空比就行了。
程序如下所示:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SDA = P1^1;
sbit SHIFT = P1^2;
sbit ST = P1^0;
#define NOP _nop_()
uchar led[] = {0x5b,0x3f,0x3f,0x6f};
uchar select[] = {0x0fe,0xfd,0xfb,0xf7};
uchar i=0;
void Init( )
{
SDA = 0;
SHIFT = 0;
ST = 0;
}
void delay()
{
uchar jj;
for(jj=0;jj<200;jj++);
while(jj--);
}
void display(uchar dat)
{
uchar ii;
uchar sdata=dat;
for(ii=0;ii<8;ii++)
{
if(sdata&0x80)SDA=1;
else SDA = 0;
sdata<<=1;
SHIFT =0;
NOP;
NOP;
SHIFT = 1;
NOP;
NOP;
}
ST = 1;
NOP;
NOP;
ST = 0;
}
void main()
{
Init();
while(1){
delay();
delay();
P2 = select[i];
display(led[i]);
i=(i+1)%4;
}
}