单片机课程设计.docx
《单片机课程设计.docx》由会员分享,可在线阅读,更多相关《单片机课程设计.docx(33页珍藏版)》请在冰豆网上搜索。
单片机课程设计
单片机课程设计
题目
院别
专业班级
设计人
学号
指导教师
成绩
一、设计要求
在单片机的智能仪器仪表,数据采集以及实时控制系统中,被控制对象往往是一些连续变化的模拟量,例如温度、压力、形变、位移、流量等。
这些非电的模拟量必须通过传感器转换成模拟量,再转换成数字量后,才能输入到计算机加工处理。
有时还要求处理结果转换成模拟量以实现对被控对象的控制并要求通过键盘置数、显示、打印等
二、系统原理总体框图
图1系统总体结构框图
系统工作原理:
主机AT89C51借助于程序可启动A/D转换器(TLC549)进行转换工作,通过DS18B20对系统周围温度进行检测,对采样的数据进行修正(或不修正),将结果存入24C02(256*8)中,同时可将此数据送显示缓冲区,经LED显示,并送D/A转换器输出,经标准打印机的接口(DB25)记录实测结果。
三、系统硬件设计
(1)显示键盘电路:
由a和b组成
a显示电路:
P0口、P2口低4位和4位共阳极LED显示器,4只9015三极管构成
b键盘电路:
P2口低4位与P1口高3位组成4*3矩阵结构形式的12个键组成,其中10个数字键,2个功能键。
显示电路工作原理:
P0口送七段码字形,根据电路图中D0对应七段码中a段,D6对应七段码中g段及共阳极“0”电平点亮的原则,得符合本电路的共阳极七段码见表1。
表一七段码字形表
字形
七段码
字形
七段码
0
0C0H
9
90H
1
0F9H
A
88H
2
0A4H
B
83H
3
0B0H
C
0C6H
4
99H
D
0A1H
5
92H
E
86H
6
82H
F
8EH
7
0F8H
P
8CH
8
80H
图2键盘显示电路
位选择由P2~P2.3经9015后分别对应千位、百位、十位、个位,根据共阳极原理,位选信号经9015驱动后从VCC送入显示阳极,因此得位选择码,千位对应位选码为0EH,百位对应位选码为0DH,十位对应位选码为0BH,个位对应位选码为07H,由千位到个位分别送出千位字形,千位位选0EH,百位字形,百位位选0DH,十位字形,十位位选0BH,个位字形,个位位选07H,即由千位到个位逐位显示,由于人眼的惰性,我们观察到四位同时显示。
键盘电路:
在键盘扫描电路中,P2.0、P2.1、P2.2、P2.3用作控制键盘扫描的行线,是输出口,P1.5、P1.6、P1.7用作控制键的列线,是输入口。
其扫描过程为,P2.0~P2.3四线中先送P2.3线为0,其余位送全1(07H),读P1口。
若由键按下,则P1.5~P1.7中必有一线为0,再分别送0BH、0DH、0EH和读P1口值,达到扫描键盘的作用。
闭合键的键值的确定是根据该键所在的行、列值确定。
如图2显示键盘电路图所示。
(2)DS18B20,,24C02电路
选用精度高,廉价的数字温度传感器BS18B20作为测量系统的环境温度,又选用24C02串行E2PROM来记录A/D转换器的转换结果及环境温度变化值。
系统中由DS18B20与P1口低三位构成高精度数字传感器接口电路,DS18B20最小分辨率可达0.06250C,具有线性度高等特点。
24C02(256x8)与P1.2低3位实现外扩E2PROM功能。
具体电路见图3。
图3单片机与DS18B20、24C02接口电路
(3)A/D、D/A转换器电路A/D、D/A转换器电路见图4.由P1口低3位和串行A/D转换器TLC549实现8位A/D转换器功能,当在TLC549的CS端加上低电平后A/D转换器被启动,此时在CLK上必须送入移位脉冲,将SDA上的转换结果经过C进位送入累加器A中。
DAC0832由8位数据输入寄存器,8位DAC寄存器和8位D/A转换器三部分组成。
它是电流输出型的,即将输入的数字量转换成模拟电流量输出。
IOUT1和IOUT2的和是常数,他们的值随DAC寄存器的内容呈线性变化。
但是,在单片机的应用系统中,往往需要电压信号输出,为此将电流在经过运算放大器LM2904,即可得到转换电压输出。
本系统采用单缓冲方式连接,P0口送8位数据,P3.6作为选通信号。
图4A/D、D/A转换器电路
(4)并行输出打印电路和串行输出RS-232电路
单片机应用系统中经常选用打印机来记录系统中数据等,本系统选用标准并口打印口输出,用P0口输出并行数据,P3.7作为打印口的选通信号,当AT89C51向打印口输出选通信号STROBE时,数据就输出到打印机,并启动打印机的机械装置进行打印工作,当打印时,其状态输出线BUSY呈高电平,空闲时送出低电平,P2.4引脚连到打印口BUSY信号,供CPU查询用。
如图8串行输出RS-232,并行输出标准打印口电路图5所示
图5并行输出打印电路和串行输出RS-232电路
8位A/D、D/A转换系统总体逻辑图见图6
图6-408位A/D、D/A转换系统总体逻辑图
四、系统软件设计
系统软件设计采用模块化结构,整个程序由主程序,显示键盘扫描,测温E2PROM存取A/D,D/A转换,RS-232通信,打印口等程序模块组成。
在AT89C51单片机系统中由于CPU内部含有4kb的快擦写可编程只读存储器可作为监控程序使用单元,系统外扩24C02E2PROM作为存取随机采集数据的存储单元。
系统试用地址单元分配如下:
(1)显示缓冲区设在片内RAM的61H、62H、63H、64H单元中。
(2)键盘扫描代码设在片内RAM的40H、41H、42H、43H单元中。
(3)键值代码设在片内RAM的44H-4FH中。
由于键盘较少,安排命令键有困难,我们采用数字代码与命令执行键(#),退出命令执行键(*)组合而成。
具体方法是:
取低二位数值作为命令键不同的键值,再按下#后程序转入命令键处理,完成(63H)x16+(62H)操作得到各命令键,并作出如下定义:
(1)12H对应A/D,D/A转换功能;21H对应打印功能。
(2)31H对应串行通信功能;41H对应测温功能。
表2键盘值对应的8位代码
键值
8位代码
键值
8位代码
0
4EH
6
8BH
1
27H
7
2DH
2
47H
8
4DH
3
87H
9
8DH
4
2BH
A/*
2EH(退出命令执行键/数字键A)
5
4BH
B/#
8EH(命令执行键/数字键B)
(1)主程序图6-41是主程序的流程图所示
图6-41主程序的流程图
主程序
ORG0000H
AJMPMAIN
ORG0023H
ORG0100H
MAIN:
MOV40H,#07H;键行扫描码赋予40H—43H
MOV41H,#0BH
MOV42H,#0DH
MOV43H,#0EH
MOV44H,#4EH;键值码赋予44H—4FH
MOV45H,#27H
MOV46H,#47H
MOV47H,#87H
MOV48H,#2BH
MOV49H,#4BH
MOV4AH,#8BH
MOV4BH,#2DH
MOV4CH,#4DH
MOV4DH,#8DH
MOV4EH,#2EH
MOV4FH,#8EH
MOV60H,#00H
MAIN0:
MOVSP,#68H;设置SP指针
MOVR0,#61H
ML0:
MOVA,#00H;显示缓冲区清零
MOV@R0,A
INCR0
CJNER0,#65H,ML0
ML1:
MOVR0,#64H
MOVR3,#00H
ML2:
ACALLDISPLAY;调用显示子程序
ACALLKEY1;调用键盘扫描子程序
CJNEA,#0BH,ML6;不是命令执行键转数字键处理
MOVA,63H;是,进行命令键处理
SWAPA;形成命令字
ANLA,#0F0H
MOVB,A
MOVA,62H
ADDA,B
CJNEA,#12H,ML3;不是A/D、D/A命令转到ML3
AJMPADC;执行A/D、D/A子程序
ML3:
CJNEA,#21H,ML4;不是打印命令转到ML4
ML4:
CJNEA,#31H,ML5;不是串口命令转到ML5
ML5:
CJNEA,#41H,ML6;不是测温命令转到数字键出理
AJMPB20;执行测温子程序
ML6:
AJMPML2;"#"是数字键B,转显示程序
2)键盘显示功能程序
(1)本程序段使用显示缓冲区为内部RAM中的64H(千位)、63H(百位)、62H(十位)、61H(个位)。
程序流程框图见图6-42。
图6-42显示程序流程图
显示子程序:
DISPLAY:
MOVDPTR,#NUMTAB;取七段码首地址
SETBC
MOVR7,#0FEH;位选择置处置(从千位开始)
MOVR0,#64H;显示缓冲区首地址送R0
MOVR4,#04H;设循环次数(4位)
SHOW:
MOVA,@R0;取显示缓冲区要显示的数值
MOVCA,@A+DPTR;查七段表,取七段码
MOVP0,A;送字形码到P0口
MOVA,R7;送数位到P2口
MOVP2,A
DELAY:
MOVR5,#0FFH;延时
DELAY1:
DJNZR5,DELAY1
DECR0
MOVA,R7;修改显示值
RLCA
MOVR7,A
DJNZR4,SHOW
RET
NUMTAB:
DB0C0H,0F9H,0A4H,0B0H,99H;七段码字形表
DB92H,82H,0F8H,80H,90H
DB88H,83H,0C6H,0A1H,86H
DB8EH,8CH
(2)键盘扫描子程序键盘扫描子程序有两方面功能:
○1判别键盘上的键是否按下方法是让扫描口P2.3~P2.0输出全“0”,然后读P1.7~P1.5端的状态。
若P1.7~P1.5为全1。
(键盘上列线为高电平),则没有键按下,若P1.7~P1.5不为全0,则有键按下,但是为了排除由于键盘上键的抖动而产生的误判,可以在判到有键按下后经软件延时一段时间后再判键盘状态,若仍有键按下则才认为有键按下,否则就认为是键抖动。
○2判别闭合键的键号方法是对键盘的行线依次扫描,扫描口P2.3~P2.0依次送出如表3所示的值。
表3
P2.3
P2.2
P2.1
P2.0
0
1
1
1
1
0
1
1
1
1
0
1
1
1
1
0
相应地顺次读P1.7~P1.5端状态,若P1.7~P1.5为全1,则表示行线为0的这行上没有键按下,否则就确认这一行上有键按下。
放下键的键号等于P1.7~P1.5端读得的值取反加上P2.3~P2.0端送行扫描码,形成键代码。
例如P2.3~P2.0输出为0111,扩展成8位07H,读入P1.7~P1.5的值为110,扩展成8位码为11011111B,与扫描码相加为20H+07H=27H,得该键码为27H,查表得按下键的值为1。
键扫描子程序的流程框图如图9所示,其中延时时间采用调用显示子程序,其优点是进入键扫描子程序后,显示器一直是亮的。
图6-43键盘扫描子程序流程图
键盘扫描子程序:
KEY1:
ACALLKS1
JNZLK1
NI:
MOVR6,#06H
YS:
ACALLDISPLAY
DJNZR6,YS
AJMPKEY1
LK1:
MOVR6,#12
YS1:
ACALLDISPLAY
DJNZR6,YS1
ACALLKS1
JNZLK2
AJMPNI
LK2:
MOVR0,#40h
LK3:
MOVP1,#0FFH
MOVA,@R0
MOVP2,A
MOVR6,#0FFH
LK4:
DJNZR6,LK4
MOVA,P1
CPLA
JZNEXT
ADDA,@R0
MOV60H,A
MOVR1,#44H
MOVR3,#00H
CMP:
CLRC
MOVA,60H
SUBBA,@R1
JZLK5
INCR1
INCR3
AJMPCMP
LK5:
ACALLDISPLAY
ACALLKS1
JNZLK5
MOVA,R3
MOV64H,63H
MOV63H,62H
MOV62H,61H
MOV61H,A
ACALLSOND
RET
NEXT:
INCR0
CJNER0,#45H,LK3
AJMPKEY1
KS1:
MOVP1,#0FFH
MOVP2,#0F0H
MOVR6,#05H
DS6:
DJNZR6,DS6
MOVA,P1
CPLA
RET
SOND:
MOVR7,#35H
SOND0:
MOVR2,#80H
CLRP1.4
SOND1:
DJNZR2,SOND1
MOVR2,#80H
SETBP1.4
SOND2:
DJNZR2,SOND2
DJNZR7,SOND0
RET
KSA:
MOVR3,#00H
MOVP0,#0FFH
MOVP1,#0FFH
MOVA,P1
CPLA
JNZKSA1
EXIT:
MOVA,R3
RET
KSA1:
MOVR6,#12
YS2:
ACALLDISPLAY
DJNZR6,YS2
MOVP2,#0EH
MOVA,P1
CPLA
MOV60H,A
MOVR3,#00H
CMP1:
CLRC
MOVA,60H
SUBBA,@R1
JZEXIT
INCR1
INCR3
AJMPCMP1
RELEASE:
ACALLKS1
MOVB,A
ACALLDISPLAY
MOVA,B
JNZRELEASE
RET
3)DS18B20、24C02功能块程序
(1)DS18B20程序设计
由图6所示,DS18B20的DQ端接P1.0,根据DS18B20的通信协议,由主机控制DS18B20完成温度转换必须经过三个步骤:
每一次读/写前都要对DS18B20进行复位;复位成功后发送ROM指令。
最后发送功能指令。
这样才能对DS18B20进行预定的操作。
复位要求主机CPU将数据DQ(P1.0)引脚送低电平500us,然后释放。
DS18B20收到信号后,等待16~60us左右,后发出60~240us的低脉冲,主机CPU测试P1.0(DQ)端获低电平,说明DS18B20已复位(初始化),可通过DQ写命令到DS18B20并延时750ms待温度转换完成后,读取DS18B20的转换结果,获得的温度送显示器显示。
程序流程框图6-44如图所示。
(a)为主程序框图
(b)为读温度程序流程图
(c)为初始化DS18B20程序流程图
(d)为DS18B20程序流程图。
主程序:
B20MAIN:
ACALLINIT1820;调用复位DSB18B20子程序
MAIN1:
:
LCALLGET_TEMPER;调用读温度子程序
MOVA,56H;温度值送显示缓冲器
ANLA,#0FH
MOV61H,A
MOVA,56H
SWAPA
ANLA,#0FH
MOV62H,A
MOVA,55H
ANLA,0FH
MOV63H,A
MOVA,55H
SWAPA
ANLA,#0FH
MOV64H,A
LCALLDISPLAY;调用显示子程序
ACALLKSA;调用判有无*按下程序
CJNEA,#0AH,B20MAIN;有退出键按下,等待*键放开
ACALLRELEASE
LJMPMAIN0;*键放开转主程序
初始化程序:
INIT1820:
:
SETBP1.0;DS18B20复位初始化程序
NOP
CLRP1.0
MOVR0,#0FFH;主机发出延时53.3us的复位低脉冲
TSR1:
:
DJNZR0,TSR1
SETBP1.0;然后拉高数据线
NOP
NOP
NOP
MOVR0,#25H
TSR2:
JNBP1.0,TSR3;等待DS18B20回应
DJNZR0,TSR2;延时
LJMPTSR4
TSR3:
SETB70H;置标志位,表示DS18B20存在
LJMPTSR5
TSR4:
CLR70H;清标志位,表示DS18B20不存在
LJMPTSR7
TSR5:
MOVR0,#06BH
TSR6:
DJNZR0,TSR6;时序要求延时一段时间
TSR7:
SETBP1.0
RET
读温度程序:
GET:
SETBP1.0
LCALLINIT_1820;先复位DS18B20
JB70H,TSS2
RET;若DS18B20不存在则返回
TSS2:
MOVA,#0CCH;先复位DS18B20
LCALLWRITE_1820
MOVA,#44H;发出温度转换命令
LCALLWRITE_1820
MOV66H,#2
TSS3:
MOV67H,#250;等待A/D转换结束.12位750ms
TSS4:
DEC67H
LCALLDISPLAY
MOVA,67H
JNZTSS4
DEC66H
MOVA,66H
JNZTSS3
LCALLINIT_1820;准备读温度前先复位
MOVA,#0CCH;跳过ROM匹配
LCALLWRITE_1820
MOVA,#0BEH;读温度命令
LCALLWRITE_1820
LCALLREAD_1820;将读出的温度数据保存到RAM
RET
READ_1820:
MOVR4,#2;将温度高位和低位从DS18B20中读出
MOVR1.#56H;低位存人56H(TEMPER_L)
RE00:
MOVR2.#8
RE01:
CLRC
SETBP1.0
NOP
NOP
CLRP1.0
NOP
NOP
NOP
SETBP1.0
MOVR3,#5
RE10:
DJNZR3,RE10
MOVC,P1.0
MOVR3,#23
RE20:
DJNZR3,RE20
RRCA
DJNZR2,RE01
MOV@R1,A
DECR1
DJNZR4,RE00
RET
写程序:
WRITE_1820:
MOVR2,#8;写DS18B20的子程序(有具体的时序要求)
CLRC
WR1:
CLRP1.0
WR2:
MOVR3,#5
DJNZR3,WR2
RRCA
MOVP1.0,C
MOVR3,#23
WR3:
DJNZR3,WR3
SETBP1.0
NOP
DJNZR2,WR1
SETBP1.0
RET
(2)24C02存(写)/取(读)数据子程序
由图6可得24C02(256X8)E2PROM与AT89C51通过P1.0与24C02的SDA端相接作为数据输入/输出线,P1.1与24C02的SCL端相连,作为时钟输入线,24C02与CPU之间数据的存/取操作有严格的时序关系,分为写时序,读时序,本程序中以标号EEPW表示写数据程序段并设置R1作为内存地址,R2作为写入字节数,R3作为24C02的起始地址,以标号EEPR表示读数据程序段并设置R1作为内存地址,R2作为读出数据的字节数,R3作为24C02中被读取数据的首地址。
读/写程序流程框图如图10所示。
图6-45读/写程序流程框图
24C02E2PROM子程序:
EEPR:
MOVA,#0A0H;24C02写程序
CLRP1.0;把24C02中以R2为数长度,以R3为首地址的数读到
CLRP1.1;以R1位首地址的内存单元中
ACALLDD
MOVA,R3
ACALLDD
CLR.P1.1
CLR.P1.0
CPLP1.1
CPLP1.0
MOVA,#0A1H
CLRP1.0
CLRP1.1
ACALLDD
MOVR0,#08H;按位从24C02中读出
SETBP1.0
ER0:
NOP
NOP
CPLP1.1
NOP
MOVC,P1.0
RLCA
CLRP1.1
NOP
DJNZR0,ER0
MOV@R1,A
SETBP1.0
CPLP1.1
CPLP1.0
SETBP1.1
SETBP1.0
INCR1
INCR2
DJNZR2,EEPR
RET
EEPW:
MOVR4,#05H
MOVA,#0A0H
CLRP1.0
CLRP1.1
ACALLDD
MOVA,R3
ACALLDD
MOVA,@R1
ACALLDD
CLRP1.1
CLRP1.0
CPLP1.1
CPLP1.0
INCR1
INCR3
ACALLDEL10ms
DJNZR2,EEPW
RET
DEL10ms:
MOVR6,#10
DD10:
LCALLDISPLAY
DJNZR6,DD10
RET
DD:
MOVR0,#08H
D3:
MOVR4,#05H
RLCA
MOVP1.0,C
CPLPl.1
D4:
DJNZR4,D4
CLRPl.1
DJNZR0,D3
SETBP1.0
CPLPl.1
SETBPl.1
CPLPl.1
RET
END
4)A/D、D/A转换子程序
当键盘扫描查到A/D键闭合,即跳转到A/D、D/A转换子程序。
本程序用以调试系统中A/D、D/A工作的正确性。
把输入模拟量VX经A/D转换成数字量,并直接通过D/A转换成输出模拟量信号送示波器输入端,即可看到转换的真实性,并将结果送显示器显示及存入E2PROM。
A/D、D/A转换子程序流程图如图11所示。
图6-46A/DD/A转换程序图
A/DD/A转换子程序
ADC:
MOVR3,#00H;设置E2PROM首地址
MOVR6,#40H
ADC0:
MOVR7,#07H
CLRP1.1
CLRP1.2;启动A/D
MOVC,P1.0
CPLP1.1
RLCA
GET_7Bit:
CPLP1.1
MOVC,P1.0