《EDA课程设计》
课程设计题目:
基于单片机的温湿度采集系统
姓
名:
xxx
学
班
时
地
号:
xxxx
级:
xxxx
间:
2014.4.21~ 2013.5.5
点:
xxxxx
指 导
老
师:
xxxxx
目
录
一、电路原理图 ..................................................................................2
二、电路PCB图(或实物图) .........................................................2
三、电路效果图 ..................................................................................3
四、设计总结 ......................................................................................3 附录(单片机源代码) ......................................................................4
1
一、电路原理图
二、电路PCB图(或实物图)
2
三、电路效果图
四、设计总结
EDA的实验还是挺有趣的,比较讲究动手能力,当然也不能忽略团体合作。总的来说本次实验还是成功了,虽然每个环节都遇到了困难。在生成原理图的过程中,就曾把导线画成了Placeline而不是Placewire,还有芯片的引脚应该用NET符号而不是用文本符号,所以这些错误都导致我花在原理图上的时间多了点。而在生成PCB电路图的过程中遇到的困难则是自动布线之后,还有电源的几个脚需要手动布线,所以各个元件之间的位置要布置好,以免发生短路。腐蚀的时候,由于腐蚀的时间太长了,有些碳都化开了,导致里面的铜被腐蚀掉了,所以又为我的工作增加了困难。在焊接的时候,要注意元件的正负极,还要检测锡是否都与那些铜连接上了。最终把LED和
3 DHT11的程序烧进去就行了。
本次实验我还是能多多少少学到点什么的,总的来说还是希望能有多一点这样的实习。
附录(单片机源代码)
//51单片机控制温湿度传感器DHT11
LCD1602上显示当前机最小系统。 //LCD 读进去 写出来 #include #include typedef unsigned char BYTE; typedef unsigned int WORD; #define uint unsigned int
//定义无符号整型 #define uchar unsigned char typedef bit BOOL;
//此声明一个布尔型变量即真或假// uchar data_byte,num,i; uchar RH,RL,TH,TL,flag; uchar shuzi[4]; unsigned char code num1[11]={0xc0,0xf9,0xa4,0xb0,0x99,
4
0x92,0x82,0xf8,0x80,0x90,0x7f} ;
sbit dht=P2^4;
//dht11data端接单片机的P2^4口//
//***************
延
时
函
数************************************* void delay(uchar ms) //延时模块//延时1毫秒
{
}
void delay1()
//一个for循环大概需要8个多机器周期
//一个机器周期为1us晶振为12MHz也就是说本函数延时8us{
}
5 uchar i;
while(ms--)
for(i=0;i
uchar i;
for(i=0;i
P2=0x07;
P0=num1[shuzi[2]]; delay(1); // }
// if(flag==1) // {
P2=0x0b;
P0=num1[shuzi[3]]; delay(1); // } // if(flag==2) // {
P2=0x0d;
P0=num1[shuzi[0]]; delay(1); // } // if(flag==3)
6 // {
P2=0x0e; P0=num1[shuzi[1]]; delay(1); // } }
//**************************dht11
测
试
某
块*************************************// void start()//开始信号
{
dht=1;
delay1();
//主机发出8us高电平,开始信号开始发出 dht=0;
delay(25);
// 主机把总线拉低必须大于18ms
DHT11能检测到起始信号
dht=1;
//delay1();
//以下三个延时函数差不多为24usdelay1(); delay1();
20-40us
}
uchar receive_byte()
//接收一个字节 8位// {
uchar i,temp;
for(i=0;i
{
while(!dht);
//等待40-50us的低电平开始信号结束
delay1();
//开始信号结束之后延时26us-28us
delay1(); delay1();
temp=0;
//时间为26us-28usif(dht==1)
temp=1;
//如果26us-28us
\'0\'
数据为\'1\'
while(dht);
//
\'0\'为26us-28us
\'1\'为70us
} data_byte
//data_byte|=temp;
//接收每一位的数据,相或保存数据
return data_byte;
8 }
void receive() //接收数据// {
uchar T_H,T_L,R_H,R_L,check,num_check,i; start();
//开始信号//调用开始信号子函数
dht=1;
//主机设为输入判断从机DHT11响应信号
if(!dht)
//判断从机是否有低电平响应信号// {
while(!dht); //判断从机发出 40us 的低电平响应信号是否结束//
while(dht);
//判断从机发出 40us 的高电平是否结束 如结束则从机进入发送数据状态,主机进入数据接收状态
数
//两个while语句加起来就是DHT11的响应信号
R_H=receive_byte(); //湿度高位
调用接受一个字节的子函
R_L=receive_byte(); //湿度低位
T_H=receive_byte(); //温度高位
T_L=receive_byte(); //温度低位
check=receive_byte(); //校验位
//结束信号
dht=0;
//当最后一bit数据接完毕后主机拉低电平50us// for(i=0;i
delay1();
dht=1;
//总线由上拉电阻拉高进入空闲状态
num_check=R_H+R_L+T_H+T_L;
if(num_check==check) //判断读到的四个数据之和是否与校验位相同
{
RH=R_H;
RL=R_L;
TH=T_H;
TL=T_L;
check=num_check; }
shuzi[0]=RH/10; shuzi[1]=RH%10; shuzi[2]=TH/10; shuzi[3]=TH%10;
} }
void main()//主函数模块// {
10 while(1)
//进入死循环
{
receive();
//接收数据
display();
} }