⑴ 單片機程序
;程序功能:帶定時鬧鈴及倒計時時鍾
;----------------------------------------------------------
;--------―――時鍾程序部分---――――――――
;-----―――程序初始化――――――――――
;定義存放計時單元地址
;....................
ALBEQU20H.0;鬧鈴設置標志
;....................
BUFEQU30H;30~33H連續4位元組存放顯示器數據
HOUREQU34H;存放小時變數
MINEQU35H;存放分鍾變數
SECEQU36H;存放秒鍾變數
DEDAEQU37H;存放5ms計數值
;....................
HHEQU38H;鬧鈴設置小時變數
MMEQU39H;鬧鈴設置分鍾變數
;....................
;--------------------------------
SEC0EQU3AH;存放舊的秒數
MM_DEQU3BH;倒數時間分鍾數
SS_DEQU3CH;倒數時間秒鍾數
;--------------------------------
;按鍵輸入引腳定義
K1EQUP2.4;按鍵1引腳定義
K2EQUP2.5;按鍵2引腳定義
K3EQUP2.6;按鍵3引腳定義
K4EQUP2.7;按鍵4引腳定義
;壓電喇叭和指示燈引腳定義
SPKEQUP3.4;壓電喇叭控制信號
WLEDEQUP1.0;工作指示燈引腳定義
;程序開始執行地址
ORG0H;程序代碼由地址0開始執行
JMPMAIN
ORG0BH;定時器0中斷地址設置
JMPTO_SRV
;---------主程序--------――
MAIN:;開始
;...................
CLRALB;清除鬧鈴標志
;...................
ACALLBZ;壓電喇叭連續兩次鳴響一聲
ACALLBZ
ACALLLED_BL;LED閃動,表示程序開始執行
ACALLINIT;初始變化量
ACALLINIT_TIMER;設置定時器
;載入顯示器初值數據
MOVA,#0C0H
MOVP0,A
;無窮循環
LOOP:;無窮循環
ACALLCONV;轉換時時分分數據
;....................
ACALLTIME_PRO;檢查鬧鈴時間
;....................
ACALLDISP;掃描顯示
JBK1,M1;未按下K1鍵則繼續掃描
ACALLLED_BL;LED閃動
ACALLSET_TIME;設置目前時間
JMPLOOP;繼續循環執行
;設置鬧鈴時間
M1:JBK2,M2;未按下K2鍵則繼續掃描
;.....................
ACALLLED_BL
ACALLSET_ATIME;設置鬧鈴時間
;.....................
JMPLOOP;繼續循環執行
;設置倒計時間
M2:JBK3,M3;未按下K3鍵則繼續掃描
;---------------------------------
ACALLLED_BL
ACALLDOWN_ATIME;設置倒計時間
;--------------------------------
JMPLOOP;繼續循環執行
M3:JBK4,M4;未按下K4鍵則繼續掃描
;...................
CPLALB
JNBALB,M31
;鬧鈴啟動連續3次發出響聲
ACALLBZ
ACALLBZ
ACALLBZ
;...................
JMPLOOP;繼續循環執行
;....................
M31:
ACALLBZ;鬧鈴停止,發出一聲響
JMPLOOP;繼續循環執行
;...................
M4:
JMPLOOP;繼續循環執行
;-----實現走時功能的子程序------――
;使用定時器0模式0計時
INIT_TIMER:;初始化定時器,使用定時器0模式1計時
MOVTMOD,#00000000B;設置定時器0工作模式為0
MOVIE,#10000010B;啟用定時器0中斷產生
MOVTL0,#(8192-4900)MOD32;載入低位元組
MOVTH0,#(8192-4900)/32;載入高位元組
SETBTR0;啟動定時器0開始計時
RET
;-----------―――
;中斷服務程序
TO_SRV:;定時器0計時中斷程序每隔5ms中斷一次
PUSHACC;將累加器放入堆棧
MOVTL0,#(8192-4900)MOD32;載入低位元組
MOVTH0,#(8192-4900)/32;載入高位元組
INCDEDA;5ms計數值加1
;秒輸出
MOVA,DEDA
CJNEA,#200,TT1;是否1s到了
MOVDEDA,#0;計數值清除為0
CPLWLED;LED燈亮滅變換
INCSEC;秒計數加1
MOVA,SEC
CJNEA,#60,TT1;是否1min到了
;分輸出
INCMIN;分計數加1
MOVSEC,#0;秒計數清除為0
MOVA,MIN
CJNEA,#60,TT1;是否1h到了
;時輸出
INCHOUR;小時計數加1
MOVMIN,#0;分計數清除為0
MOVA,HOUR
CJNEA,#24,TT1;是否24h到了
MOVSEC,#0;秒鍾變數清除為0
MOVMIN,#0;分鍾變數清除為0
MOVHOUR,#0;小時變數清除為0
TT1:
POPACC;將累加器由堆棧取出
RETI
;----――實現顯示功能的子程序---――――
;轉換時時:分分數據
CONV:
;轉換小時數據
MOVA,HOUR
MOVB,#10
DIVAB
MOVDPTR,#TABLE;查表轉換
MOVCA,@A+DPTR
MOVBUF,A
MOVA,B
MOVCA,@A+DPTR
MOVBUF+1,A
;轉換分鍾數據
MOVA,MIN
MOVB,#10
DIVAB
MOVDPTR,#TABLE;查表轉換
MOVCA,@A+DPTR
MOVBUF+2,A
MOVA,B
MOVCA,@A+DPTR
MOVBUF+3,A
RET
;字型數據編碼表
TABLE:
DB0C0H,0F9H,0A4H,0B0H
DB99H,92H,82H,0F8H
DB80H,90H,88H,83H
DB0C6H,0A1H,86H,8EH
;---------――――
;掃描顯示
DISP:
MOVR0,#BUF;指向顯示器顯示緩沖區起始地址
MOVR2,#4;循環執行4次
MOVACC,#11110111b;載入掃描信號初值11110111B
S1:
PUSHACC
MOVA,@R0;取出顯示器數據
MOVP0,A;由P0送出一位顯示器數據
POPACC
MOVP2,ACC;由P2送出掃描輸出信號
MOVR5,#2;延遲一會兒
ACALLDELAY
;改變掃描碼EX:XXXX1011
RRA;累加器向右移動一位
INCR0;顯示器顯示緩沖區地址加1
DJNZR2,S1;循環判斷是否繼續執行
RET
;---――實現調整時間子程序――――――
;設置目前時間
SET_TIME:
CLRTR0;定時器動作暫停
MOVSEC,#0;秒鍾變數清除為0
L0:
ACALLDISP;掃描顯示
JBK2,L1;未按下K2鍵則繼續掃描
JNBK2,$;有按下則等待放開來
;K2小時調整
INCHOUR;小時計數加1
MOVA,HOUR
CJNEA,#24,L11;是否24H到了
MOVHOUR,#0;小時變數清除為0
L11:
ACALLCONV;轉換顯示數據
ACALLDISP;掃描顯示
JMPL0;繼續程序執行
L1:JBK3,L2;未按下K3鍵則繼續掃描
JNBK3,$;有按下則等待放開來
;K3分鍾調整.
INCMIN;分鍾計數加1
MOVA,MIN
CJNEA,#60,L21;是否60min到了
MOVMIN,#0;分鍾變數清除為0
L21:
ACALLCONV;轉換顯示數據
ACALLDISP;掃描顯示
JMPL0;繼續程序執行
L2:JBK4,L0;未按下K4鍵則繼續掃描
JNBK4,$;有按下則等待放開來
ACALLBZ;壓電喇叭鳴響一聲
;K4設置完成
ACALLLED_BL;LED閃動
SETBTR0;啟動定時器
RET
;----―喇叭和指示燈等其它子程序----――
;計時單元清零
INIT:
MOVDEDA,#0;5ms計數值清除為0
MOVSEC,#0;秒鍾變數清除為0
MOVMIN,#0;分鍾變數清除為0
MOVHOUR,#0;小時變數清除為0
RET
;―――――――――――――
;壓電喇叭
BZ:;壓電喇叭鳴響一聲
MOVR6,#250
B1:ACALLDEX
CPLSPK
DJNZR6,B1
MOVR5,#50;#10
ACALLDELAY
RET
;----------―――
;工作指示
LED_BL:;工作指示燈閃爍
MOVR4,#6
LE1:CPLWLED;位反向
MOVR5,#25;#5
ACALLDELAY
DJNZR4,LE1;延遲50ms
RET
;----------―――
;延時子程序
DELAY:;;總延遲時間R5*2ms
MOVR6,#10;#50
D1:MOVR7,#100
DJNZR7,$
DJNZR6,D1
DJNZR5,DELAY
RET
;----------―――
;壓電喇叭短暫延時子程序
DEX:MOVR7,#180;短暫延時
DE1:NOP
DJNZR7,DE1
RET
;-------――增加定時鬧鈴程序部分-------――
;――――――――設置鬧鈴時間―――――――――
;設置鬧鈴時間
SET_ATIME:
ACALLCONVA;載入鬧鈴時間數據
N0:
ACALLDISP
;-----------
JBK2,N1;未按下K2鍵則繼續掃描
JNBK2,$;有按下則等待放開來
;K2調整小時
INCHH;小時數加1
MOVA,HH
CJNEA,#24,N11;是否24h到了
MOVHH,#0;小時請為0
N11:
ACALLCONVA;載入鬧鈴時間數據
ACALLDISP;掃描顯示
JMPN0;繼續按鍵掃描
;------------
N1:JBK3,N2;未按下K3鍵則繼續掃描
JNBK3,$;有按下則等待放開來
;K3調整分鍾
INCMM;調整分鍾數
MOVA,MM;分鍾數加1
CJNEA,#60,N21;是否60min到了
MOVMM,#0;分鍾數請為0
N21:
ACALLCONVA;載入鬧鈴時間數據
ACALLDISP;掃描顯示
JMPN0;繼續按鍵掃描
;------------
N2:JBK4,N0;未按下K4鍵則繼續掃描
JNBK4,$;等K4鍵放開
;K4設置完成......
ACALLLED_BL;LED閃動
ACALLCONV;載入現在時間數據
RET
;――――――――載入鬧鈴時間數據―――――――
;轉換時時:分分數據
CONVA:
;轉換小時數據
MOVA,HH
MOVB,#10
DIVAB
;-----------
MOVDPTR,#TABLE;查表轉換
MOVCA,@A+DPTR
MOVBUF,A
;-----------
MOVA,B
MOVCA,@A+DPTR
MOVBUF+1,A
;轉換分鍾數據
MOVA,MM
MOVB,#10
DIVAB
;-----------
MOVDPTR,#TABLE;查表轉換
MOVCA,@A+DPTR
MOVBUF+2,A
;-----------
MOVA,B
MOVCA,@A+DPTR
MOVBUF+3,A
RET
;――――――――檢查鬧鈴時間處理――――――――
;檢查是否啟動鬧鈴
TIME_PRO:
JBALB,TI3
RET
;――――――――――――――
;檢查鬧鈴時間是否到了
TI3:
MOVA,HOUR
MOVB,HH
CJNEA,B,BK;檢查鬧鈴小時時間
;-----------
MOVA,MIN
MOVB,MM
CJNEA,B,BK;檢查鬧鈴分鍾時間
;-----------
ACALLTIME_OUT;執行檢查鬧鈴時間到了處理
BK:
RET
;--------執行鬧鈴時間處理――――――――
TIME_OUT:;所設置的鬧鈴數據到了
X1:ACALLLED_BL;LED閃動
ACALLBZ;壓電喇叭發出嘩的一聲
;按下K4鍵停止鬧鈴
JBK4,X1;等待是否按下K4鍵
JNBK4,$;若有按下鍵則等待按鍵放開來
ACALLLED_BL;LED閃動
CLRALB;清除鬧鈴位
RET
;************************增加倒計時程序部分*********************
;----------設置倒數時間----------
;設置倒數時間
DOWN_ATIME:
CLRTR0;定時器動作暫停
MOVSS_D,#1;秒鍾變數為1
S0:
ACALLDISP;掃描顯示
;-----------
;按K2分鍾數增加
JBK2,S12;未按下K2繼續掃描
JNBK2,$;有按下則等待放開來
INCMM_D;分鍾數加1
MOVA,MM_D
CJNEA,#60,S11;是否60min到了
MOVMM_D,#0;分鍾變數請除為0
S11:
ACALLDOWN_CONV;顯示倒數的時間
ACALLDISP;掃描顯示
JMPS0;繼續對按鍵掃描
;------------
;按K3分鍾數減少
S12:JBK3,S2;未按下K3繼續掃描
JNBK3,$;有按下則等待放開來
DECMM_D;分鍾數減少1
MOVA,MM_D
CJNEA,#0,S21;是否為0?
MOVMM_D,#60;分鍾數賦值為60
S21:
ACALLDOWN_CONV;載入倒數時間數據
ACALLDISP;掃描顯示
JMPS0;循環執行
;------------
S2:JBK4,S0;未按下K4繼續掃描
JNBK4,$;等K4鍵放開
;K4設置完成......
ACALLBZ;響4聲
ACALLBZ
ACALLBZ
ACALLBZ
ACALLLED_BL;LED閃動
SETBTR0;啟動定時器
S3:
ACALLDOWN_TIME;檢查倒計時
ACALLDOWN_CONV;載入倒數時間數據
ACALLDISP;掃描顯示
JMPS3
RET
;----------------載入倒計時時間-----------------------
;顯示倒數的分鍾數
DOWN_CONV:
MOVA,MM_D
MOVB,#10;設置被除數
DIVAB;除法運算,結果A存商數,B存余數
MOVDPTR,#TABLE;查表轉換
MOVCA,@A+DPTR
MOVBUF+2,A;商數存入BUF+2
MOVA,B;余數暫存入A
MOVCA,@A+DPTR;查表轉換
MOVBUF+3,A;余數存入BUF+3
RET
;----------檢查倒計時------------
;檢查倒計時
DOWN_TIME:;檢查是否倒數終止
MOVA,SEC;載入現在秒數
MOVB,SEC0;載入舊秒數
CJNEA,B,D01;是否過了1秒
RET
;-----------------------------------
D01:
MOVSEC0,SEC;記錄舊的秒數
DECSS_D;秒數減1
MOVA,SS_D
CJNEA,#0,D11;秒鍾數是否為0
MOVA,MM_D
CJNEA,#0,D12;分鍾數是否為0
;秒鍾數=0且分鍾數=0則倒數終止
ACALLTIME_OUT;倒數終了處理程序
JMPLOOP
RET
;-----------
D12:
MOVSS_D,#59;秒鍾數=59
DECMM_D;分鍾數減1
D11:
ACALLDOWN_CONV;顯示倒計時時間
RET
;------------------------------
⑵ 51單片機獨立按鍵控制LED燈 這個程序按下k4的時候,在按k1,k2並不能實現左右流水怎麼改
按K1部分加一行
flag=1;
led=0xfe;//重新賦值
K2部分也加這一行
因按K4後,Ied=led+1;
就不是亮一個啦
⑶ altium庫菜單和工程菜單跑到一邊去了上下放置的不是一邊一個,該怎麼辦
直接用滑鼠拖拽到側邊再放開就是了,或者在察看菜單>桌面布局裡面>defalt 默認
⑷ 51單片機如何在一個工程中同時加入循環左移和循環右移,
這個問題很簡單,因為循環左移和循環右移並不相互排斥,可以單獨存在,不僅僅在一個工程中,在用一個文件或者同一個程序段中都是可以的。比如。
#include<reg51.h>
#include<intrins.h>
void delay(int a)
{
int i,j;
for(i=0;i<a;i++)
for(j=0;j<110;j++);
}
main()
{
unsigned char led1=0xfe,led2=0x7f;
while(1)
{
P0=_crol_(led1);
P1=_cror_(led2);
delay(100);
}
}
⑸ 單片機定時
不行,你設置led2減1的時候,數碼管後3位顯示的是led2已經設置好的值,這個值在定時器的作用下1s減1.你想同時設置其他led的初值,不能顯示在數碼管上,但能加1減1,但你看不到,不能確定加到幾或減到幾。
⑹ 如何實現51單片機按下k2燈從上往下亮,按下k3熄滅,按k4從下往上亮,按下k5熄滅
這個很好實現,沒有原理圖,那麼隨意設計好了。
#include<reg51.h>
#include<intrins.h>
#defineucharunsignedchar
sbitk2=P1^0;
sbitk3=P1^1;
sbitk4=P1^2;
sbitk5=P1^3;
ucharmode;
voiddelay(ucharms)
{
uchari;
while(a--)for(i=0;i<120;i++);
}
main()
{
ucharled=0xfe;
while(1)
{
if(k2==0)
{
while(k2==0);
mode=1;
}
if(k3==0)
{
while(k3==0);
mode=2;
}
if(k4==0)
{
while(k4==0);
mode=3;
}
if(k5==0)
{
while(k5==0);
mode=4;
}
switch(mode)
{
case1:P0=led;led=_crol_(led,1);delay(200);break;
case2:P0=0xff;break;
case3:P0=led;led=_cror_(led,1);delay(200);break;
case4:P0=0xff;break;
default:break;
}
}
}
⑺ 單片機 ,編寫k1-k4狀態顯示。
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED1=P0^0;
sbit LED2=P0^1;
sbit LED3=P0^2;
sbit LED4=P0^3;
sbit K1=P1^0;
sbit K2=P1^1;
sbit K3=P1^2;
sbit K4=P1^3;
//延時
void DelayMS(uint x) //這是一個延時函數,延時毫秒級,後面的參數是幾就是幾毫秒
{
uchar i;
while(x--) for(i=0;i<120;i++);
}
//主程序
void main()
{
P0=0xff; //51單片機為准雙向口,讀入前先寫1
P1=0xff;
while(1)
{
LED1=K1; //前兩個鍵按下則對應的燈亮,松開則滅
LED2=K2;
if(K3==0)
{
while(K3==0); //這一句是等按鍵釋放
LED3=~LED3; //這一句是燈取反,實現按一次鍵亮再按一次滅依次往復
}
if(K4==0) //同K3
{
while(K4==0);
LED4=~LED4;
}
DelayMS(10); //延時10毫秒,也起到一個去抖動作用
}
}
⑻ 單片機中k1~k4控制led燈移位
單片機想要控制LED燈移位的話,那我們可以可以去通過它裡面的設置軟體,然後去進行讓它進行移動。
⑼ 怎麼把程序導入單片機中
如何將已編好的程序塊導入源文件,有兩種方法:
1.打開所要導入源文件的功能塊,在LAD/STL/FBD編輯窗口中選擇菜單FILE-->Generate Source...,輸入源文件名,選擇要導入的塊,點擊OK.後就可以在工程管理器裡面的SOURCE項下找到剛才生成的源文件.打開即可
2.首先在工程管理器裡面的SOURCE項建立一個源文件(打開SOURCE項,菜單:INSERT-->S7 SOFTWARE-->STL SOURCE).打開,菜單:INSERT-->BLOCK,在打開的界面選擇需要導入的塊.結果同上
⑽ 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℃的設計目標。