如图芯片引脚图
Vcc:
电源
Vss:
地
P(端口(P0.0〜P0.7,39〜32引脚):
P0口是一个漏极开路的8位双向I/O口。
作为输出端口,每个引脚能驱动8个TTL负载,对端口P0写入1”时,可以作为高阻抗输入。
在访问外部程序和数据存储器时,P0口也可以提供低8位地址和8位数据的复用总线。
此时,P0口内部上拉电阻有效。
在FlashRO编程时,P0端口接收指令字节;而在校验程序时,则输出指令字节。
验证时,要求外接上拉电阻。
P1端口(P1.0〜P1.7,1〜8引脚):
P1口是一个带内部上拉电阻的8位双向I/O口。
P1的输出缓冲器可驱动(吸收或者输出电流方式)4个TTL输入。
对端口写入1时,通过内部的上拉电阻把端口拉到高电位,这是可用作输入口。
P1口作输入口使
用时,因为有内部上拉电阻,那些被外部拉低的引脚会输出一个电流。
此外,P1.0和P1.1还可以作为定时器/计数器2的外部技术输入(P1.0/T2)和定时器/计数器2的触发输入(P1.1/T2EX)。
P2端口(P2.0〜P2.7,21〜28引脚):
P2口是一个带内部上拉电阻的8位双向I/O端口。
P2的输出缓冲器可以驱动(吸收或输出电流方式)4个TTL俞入。
对端口写入1时,通过内部的上拉电阻把端口拉到高电平,这时可用作输入口。
P2作为输入口使
用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流。
在访问外部程序存储器和16位地址的外部数据存储器(如执行MOVX@DF”R令)时,P2送出高8位地址。
在访问8位地址的外部数据存储器(如执行MOVX@R1指令)时,P2口引脚上的内容(就是专用寄存器(SFR区中的P2寄存器的内容),在整个访问期间不会改变。
在对FlashROM编程和程序校验期间,P2也接收高位地址和一些控制信号。
P3端口(P3.0〜P3.7,10〜17引脚):
P3是一个带内部上拉电阻的8位双向I/O端口。
P3的输出缓冲器可驱动(吸收或输出电流方式)4个TTL俞入。
对端口写入1时,通过内部的上拉电阻把端口拉到高电位,这时可用作输入口。
P3做输入口使用
时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输入一个电流。
在对FlashROM编程或程序校验时,P3还接收一些控制信号。
RST(9引脚):
复位输入。
当输入连续两个机器周期以上高电平时为有效,用来完成单片机的复位初始化操作。
看门狗计时完成后,RST引脚输出96个晶振周期的高电平。
特殊寄存器AUXFR地址8EH上的DISRTO位可以使此功能无效。
DISRT(默认状态下,复位高电平有效。
ALE/PROG(30引脚):
地址锁存控制信号(ALE是访问外部程序存储器时,锁存低8位地址的输出脉冲。
在Flash编程时,此引脚也用作编程输入脉冲。
在一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。
然而,特别强调,在每次访问外部数据存储器时,ALE永冲将会跳过。
如果需要,通过将地址位8EH勺SFR勺第0位置1”,ALE操作将无效。
这一位置1”,ALE仅在执行MOV或MO指令时有效。
否则,ALE各被微弱拉高。
这个ALE使能标志位(地址位8EH勺SFR勺第0位)的设置对微控制器处于外部执行模式下无效。
PSEN(29引脚):
外部程序存储器选通信号是外部程序存储器选通信号。
当AT89C51R从外部程序存储器执行外部代码时,PSEN在每个机器周期被激活两次,而访问外部数据存储器时,PSEN将不被激活。
EA/VPP(31引脚):
访问外部程序存储器控制信号。
为使能从0000H到FFFFH勺外部程序存储器读取指令,EA必须接GND注意加密方式1时,EA将内部锁定位
RESET为了执行内部程序指令,EA应该接VCC在Flash编程期间,EA也接收12伏VPP电压。
XTAL1(19引脚):
振荡器反相放大器和内部时钟发生电路的输入端。
XTAL2(18引脚):
振荡器反相放大器的输入端。
第2章系统的硬件设计和连接
2.1、时钟电路
STC89C5内部有一个用于构成振荡器的高增益反相放大器,引脚RXD叮XD分别
是此放大器的输入端和输出端。
时钟可以由内部方式产生或外部方式产生。
如下:
C3
Cap
30pF
22、复位电路
RST引脚是单片机复位端,高电频有效。
在引脚端输入至少连续两个单片
机周期的高电频,单片机复位。
使用时,在引脚与VSS引脚之间接一个10KQ的
下拉电阻,与VCC引脚之间接一个约10疗的电解电容,即可保证上电自动复位。
如下:
2.2、显示模块
||*GND
4-VJEIs9Qs吕scnEoa
AUMsu
200>
*azo
9
10
VCC
寸gcjUIXI巴:
弐二-一M壬01G
8一〔二L0|°一
|pGND
GND<|
E:
1(
RPOT
IK
vcc
LCD160引脚功能图:
引脚号
引脚名
电平
输入/输出
作用
1
Uss
电沁
2
Ucc
电源(*5«)
3
Uee
对比调整电压
4
RS
0/1|
输入
"端入数据
5
R/W
0/1|
输入
丽向L怕写入韻今或数据"从LC醮取曙盒
6
E
1,1-*0
输入
使能信号J哎诱甲信息,—肌下虑沿)换厅指茅
1
DEB
0/1
输入席i出
数据总銭肌最低位>
e
DU1
0/1
输入/输岀
数据总线UnM
9
DB2
0/1
输入/输出
数据总线line2
10
0/1
输入/输出
数据总线lines
11
DB4
0/1
输入箱出
数据总线llnZ
12
DBS
0/1
输入/输岀
数据总|
15
DBA
0/1
输入/输岀
数据总线15"|
14
DB7
0/1
输入/输岀
数据总线linM(最高位〉
15
A
+Vcc
LCD背光电源正极
16
K
接地
LU)背光电源负极
vcc
R4
2.3、传感器模块
第3章总结
回顾起此次单片机课程设计,我仍感慨颇多,从理论到实践,在接近二星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,难免会遇到过各种各样的问题。
首先,说说焊接的美观程度,这是我所骄傲的,我焊接的很美观、明了。
但在设计的过程中也发现了自己的不足之处,对以前所学过的知识理解得不够深,把硬件焊接出来后,由于编程不熟,导致推迟了对硬件功能的检测,最终在指导老师的耐心指导下完成所有功能检测,两位老师的耐心指导,使我意识到专业知识的重要性,以后会更加努力!
第4章
程序:
U8codetable2[]="wendushidu"
U8codetable3[]="
sbitRS=P2A6;
sbitRW=P2A5;
sbitE=P2A7;
voidwrite_com(U8com)
{
E=0;
RS=0;
RW=0;
Delay(5);
E=1;
PO=com;
E=0;
}
voidwrite_date(U8date)
{
E=0;
RS=1;
RW=0;
Delay(5);
E=1;
P0=date;
E=0;
P0=0;
}
voidinit()
{
U8num;
Delay(15);
write_com(0x38);
write_com(0x38);
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
for(num=0;num<15;num++)
{
write_date(table2[num]);
Delay
(1);
}
write_com(0x80+0x40);
for(num=0;num<15;num++)
{
write_date(table3[num]);
Delay
(1);
}
}
voidwrite_dht11(U8add,U8date)
{
U8shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
typedefunsignedcharU8;
typedefunsignedintU16;
sbitP1_0=P2A0;
U8U8FLAG,k;
U8U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8
U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8U8comdata;
voidDelay(U16z)
{
U8x,y;
for(x=z;x>0;x__)
for(y=110;y>0;y--);
}
voiddelay_10us()
{
U8i;
i--;
i--;
i--;
i--;
i--;
i--;
}
voidCOM(void)//数据01确认
{
U8i;
{
U8FLAG=2;
while((!
P1_0)&&U8FLAG++);〃1bit是否结束
delay_10us();
delay_10us();
delay_10us();
U8temp=0;〃26us~28us表示为0
if(P1_0)U8temp=1;//超过28us依然为高电平表示为1
U8FLAG=2;
while((P1_0)&&U8FLAG++);
if(U8FLAG==1)break;//U8FLAG溢出超时则跳出for循环
//判断数据位是0还是1
//如果高电平高过预定0高电平值则数据位为1
U8comdata<<=1;
U8comdata|=U8temp;
}
}
voidRH(void)//-----湿温度读取子程序
{
//总线由上拉电阻拉高主机延时20us
delay_10us();
delay_10us();
delay_10us();
delay_10us();
P1_0=1;〃主机设为输入判断从机响应信号
if(!
P1_0)〃判断从机是否有低电平响应信号如不响应则跳出,响应则向
下运行
{
U8FLAG=2;
while((!
P1_0)&&U8FLAG++);//判断从机是否发出80us的低电平响应
信号是否结束
U8FLAG=2;
while((P1_0)&&U8FLAG++);//判断从机是否发出80us的高电平,如发出则进入数据接收状态
COM();〃数据接收状态
U8RH_data_H_temp=U8comdata;〃湿度整数8位
COM();
U8RH_data_L_temp=U8comdata;//湿度小数8位
COM();
U8T_data_H_temp=U8comdata;//温度整数8位
COM();
U8T_data_L_temp=U8comdata;//温度小数8位
COM();
U8checkdata_temp=U8comdata;//校验位
P1_0=1;
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_tem
P);
if(U8temp==U8checkdata_temp)//数据校验正确执行
{
U8RH_data_H=U8RH_data_H_temp;
U8RH_data_L=U8RH_data_L_temp;
U8T_data_H=U8T_data_H_temp;
U8T_data_L=U8T_data_L_temp;
U8checkdata=U8checkdata_temp;
}
#include
#include
U16a,b,t;
U8flag,i;voidmain()
{
RW=1;
t=0;
flag=O;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
init();
P1_0=1;
P2=0xff;
Delay(40);
while
(1)
{
RH();
write_dht11(0,U8T_data_H);
write_dht11(3,U8T_data_L);
write_dht11(9,U8RH_data_H);
write_dht11(12,U8RH_data_L);
if(flag==2)//100后flag为2,进行比较
{
if(a==U8T_data_H&&b==U8RH_data_H)Buzzer=0;
while(a==U8T_data_H&&b==U8RH_data_H);flag=0;
}
test();
voidtimerO()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
if(t==2000)//100秒检测一次
{
t=0;
flag=2;//100秒后flag为2
}
if(flag==0)//最开始flag为0赋值
{
a=U8T_data_H;
b=U8RH_data_H;
flag=1;//flag变化
}
}
电路原理图:
TO
n|
JnAL
IP—
;3tF
电路PC图:
Lil
二丄
;?
jz
m-j
XIiClvk
J匸■=■BC5]
GN2
Hv?
P
AH
ISTAll^5AD-MtAHPi^AE72JAII圉二AE
MJJU
i.;-rllnF-二IL<一工OHS
MB»ineUhlt
.-F"rj
Jr
l±r二
元件参数表:
Oorment
□escriptior
DesiquatoT
Footprint
LibRef
QjarW
DHT
HDR1X4
DHT11
B9C5I
39C51
勺
89C52
Cap2
O(i[Mci(or
c7
CAPRS4誉
Cflp2
Cap
WgGlkK
C2,C3.t^
CAPH^.M-51x32
LEDI
DI
RAD3.4
LEDI
1
DC
DC
DC1
DC
DC
KEY-E
KEY-1
KEY-1
KEY-1
key-i
KEY-C
KEY-G
KLY-2
KEY-G
KEY-6
LDClfO?
LDCi602
ICD1
LCOTen2
LCD1602
Headw2
Header,2-FTi
円