⑴ 单片机程序
;程序功能:带定时闹铃及倒计时时钟
;----------------------------------------------------------
;--------―――时钟程序部分---――――――――
;-----―――程序初始化――――――――――
;定义存放计时单元地址
;....................
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℃的设计目标。