单片机课程设计——温度采集电路

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机课程设计报告
————温度采集电路设计与仿真
一、设计目的
1、通过单片机课程设计,熟练掌握C语言与汇编语言的编程方法,将理论联系到实践中去,提高我们的动脑和动手的能力。

2、通过数字采集与控制系统的设计,掌握如何采集数据并在LCD上显示采集的数据合如何控制电机的使用方法,和简单程序的编写,最终提高我们的逻辑抽象能力。

二、设计任务和要求
任务:设计一个能够采集数据和控制电机的系统.
具体要求:
(1)通过I/O口扩展5个按键
(2)单片机的P口外接8个拨码开关,作为8位数据输入
(3)通过I/O口外接DS18B20温度传感器,进行温度采集
(4)外接一步进电机,作为控制部分
(5)外接一LCM1602液晶屏,进行数据显示
(6)在PROTEUS软件中设计实现上述功能的电路,然后编写源程序实现如下功能:
按下按键“1”时在液晶屏上显示“DAN PIAN JI KE CHENG SHE JI”。

按下按键“2”时在液晶屏上显示自己的学号和姓名(拼音)。

按下按键“3”时进行温度采集并显示在液晶屏上。

按下按键“4”时通过拨码开关采集8位数据并显示在液晶屏上,数据大于200控制步进电机反转,小于50步进电机正转。

按下按键“5”时步进电机停止转动。

三、设计原理分析
1、显示“DAN PIAN JI KE CHENG SHE JI”与自己的学号和姓名(拼音)直接定义字符串然后送入1602LCD显示。

2、采集温度通过DS18B20温度传感器将采集的温度通过硬件电路转送入单片机内部,单片机内部将采集的温度转换成字符串然后送入1602LCD显示。

3、通过控制ULN2003来控制电机的正反转。

(ULN2003是另一款电机脉冲分配芯片,由于其结构简单,价格低廉,而且无需外接功率放大电路,因此也常用来作为步进电机的驱动芯片)。

4、该电路系统采用“一线总线”数字传感器DS18B20实现温度的采集,采用液晶显示器进行数据显示。

首先启动Proteus并从Proteus元件库中选择需要的元件绘制电路图并设置相应元件的参数值。

5、电路绘制完成以后,打开KeilμVision 2新建一个项目,命名为cewen.uv2。

选择Project 菜单下的Select Device forTarget选择A T89C51。

然后单击Project菜单下的Optionfor Target ‘Target1’项,选择Debug,使用Proteus VSM Em-ulator仿真。

然后新建一个源文件cewen.c,
写入源程序(只给出读取温度函数):
四、硬件图
D5D0D2D3D4D6D7
D 7
D 6D 5D 4D 2D 1D 0AL
E p3.3
D0D1D2D3D4D5D6D7
D1D 3ALE P2.0P2.1P2.2P2.3P2.4P2.5P2.6P2.7p2.0p2.1p2.2p2.3p2.4p2.5p2.6p2.7
p3.3p3.4p3.2p3.1p3.0
p3.0p3.1p3.2p3.4
XTAL2
18
XTAL1
19
ALE 30
EA
31
PSEN 29RST
9
P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78
P3.0/RXD 10P3.1/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD
17
P3.6/WR 16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1
AT89C51
D0
3Q02D14Q15D27Q26D38Q39D413Q412D514Q515D617Q616D718Q7
19
OE 1LE 11
U2
74LS373
D 7
14D 613D 512D 411D 310D 29D 18D 07E
6
R W 5R S 4V S S 1V D D 2V E E
3
LCD1
LM016L
1
2
3
U3:A
74LS00
GND
GND 55.0
DQ 2VCC 3
GND 1
U4
DS18B20
GND
VCC
A
B C D R1
10k
p3.3
V=4.99503GND
VCC
12345678161514131211109
1k
12345678
161514131211109
RN2
1k OFF
ON
12345678
161514131211109
DSW1
DIPSW_8
0.00
VCC
1B 11C 162B 22C 153B 33C 144B 44C 135B 55C 126B 66C 117B
7
7C
10
COM 9U5
ULN2003A
GND
VCC
D5D0D2D3D4D6D7
D 7
D 6D 5D 4D 2D 1D 0AL
E p3.3
D0D1D2D3D4D5D6D7
D1D 3ALE P2.0P2.1P2.2P2.3P2.4P2.5P2.6P2.7p2.0p2.1p2.2p2.3p2.4p2.5p2.6p2.7
p3.3p3.4p3.2p3.1p3.0
p3.0p3.1p3.2p3.4
XTAL2
18
XTAL1
19
ALE 30
EA
31
PSEN 29RST
9
P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78
P3.0/RXD 10P3.1/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD
17
P3.6/WR 16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1
AT89C51
D0
3Q02D14Q15D27Q26D38Q39D413Q412D514Q515D617Q616D718Q7
19
OE 1LE 11
U2
74LS373
D 7
14D 613D 512D 411D 310D 29D 18D 07E
6
R W 5R S 4V S S 1V D D 2V E E
3
LCD1
LM016L
1
2
3
U3:A
74LS00
GND
GND 55.0
DQ 2VCC 3
GND 1
U4
DS18B20
GND
VCC
A
B C D R1
10k
p3.3
V=4.99503GND
VCC
12345678161514131211109
1k
12345678
161514131211109
RN2
1k OFF
ON
12345678
161514131211109
DSW1
DIPSW_8
0.00
VCC
1B 11C 162B 22C 153B 33C 144B 44C 135B 55C 126B 66C 117B
7
7C
10
COM 9U5
ULN2003A
GND
VCC
D5D0D2D3D4D6D7
D 7
D 6D 5D 4D 2D 1D 0AL
E p3.3
D0D1D2D3D4D5D6D7
D1D 3ALE P2.0P2.1P2.2P2.3P2.4P2.5P2.6P2.7p2.0p2.1p2.2p2.3p2.4p2.5p2.6p2.7
p3.3p3.4p3.2p3.1p3.0
p3.0p3.1p3.2p3.4
XTAL2
18
XTAL1
19
ALE 30
EA
31
PSEN 29RST
9
P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78
P3.0/RXD 10P3.1/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD
17
P3.6/WR 16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1
AT89C51
D0
3Q02D14Q15D27Q26D38Q39D413Q412D514Q515D617Q616D718Q7
19
OE 1LE 11
U2
74LS373
D 7
14D 613D 512D 411D 310D 29D 18D 07E
6
R W 5R S 4V S S 1V D D 2V E E
3
LCD1
LM016L
1
2
3
U3:A
74LS00
GND
GND 55.0
DQ 2VCC 3
GND 1
U4
DS18B20
GND
VCC
A
B C D R1
10k
p3.3
V=4.99503GND
VCC
12345678161514131211109
1k
12345678
161514131211109
RN2
1k OFF
ON
12345678
161514131211109
DSW1
DIPSW_8
VCC
1B 11C 162B 22C 153B 33C 144B 44C 135B 55C 126B 66C 117B
7
7C
10
COM 9U5
ULN2003A
GND
VCC
D5D0D2D3D4D6D7
D 7
D 6D 5D 4D 2D 1D 0AL
E p3.3
D0D1D2D3D4D5D6D7
D1D 3ALE P2.0P2.1P2.2P2.3P2.4P2.5P2.6P2.7p2.0p2.1p2.2p2.3p2.4p2.5p2.6p2.7
p3.3p3.4p3.2p3.1p3.0
p3.0p3.1p3.2p3.4
XTAL2
18
XTAL1
19
ALE 30
EA
31
PSEN 29RST
9
P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78
P3.0/RXD 10P3.1/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD
17
P3.6/WR 16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1
AT89C51
D0
3Q02D14Q15D27Q26D38Q39D413Q412D514Q515D617Q616D718Q7
19
OE 1LE 11
U2
74LS373
D 7
14D 613D 512D 411D 310D 29D 18D 07E
6
R W 5R S 4V S S 1V D D 2V E E
3
LCD1
LM016L
1
2
3
U3:A
74LS00
GND
GND 55.0
DQ 2VCC 3
GND 1
U4
DS18B20
GND
VCC
A
B C D R1
10k
p3.3
V=4.99503GND
VCC
12345678161514131211109
1k
12345678
161514131211109
RN2
1k OFF
ON
12345678
161514131211109
DSW1
DIPSW_8
+98.5
VCC
1B 11C 162B 22C 153B 33C 144B 44C 135B 55C 126B 66C 117B
7
7C
10
COM 9U5
ULN2003A
GND
VCC
五、源程序
//////////ds18b20///////// #include <reg51.h> #include <INTRINS.h>
#include <absacc.h>
unsigned char readdata[2];
sbit DQ=P3^3;
////////////end of ds18b20 variable///////
/////////////lcd variable/////////////////
#include <reg51.h>
#include <absacc.h>
#define REG0 XBYTE[0x0000]
#define REG1 XBYTE[0x0001]
#define REG2 XBYTE[0x0002]
#define REG3 XBYTE[0x0003]
#define UP 20
#define DOWN 30
#define STOP 40
unsigned char bdata busyflag;
unsigned char dat,datn,count;
unsigned char word1[16]={" T= "};
code unsigned char word2[16]={" by KeTingTing "}; code unsigned char word3[16]={"DAN PIN JI "}; code unsigned char word4[16]={"KE CHENG SHE JI"}; code unsigned char word5[16]={" Wellcome To "}; code unsigned char word6[16]={" Proteus Tools!"}; code unsigned char word7[16]={" 204799218 ” "}; code unsigned char word8[16]={" by KeTingTing "}; data unsigned char word9[16]={" P2= "}; sbit busyflag_7=busyflag^7;
sbit p10=P1^0;
sbit p11=P1^1;
sbit p12=P1^2;
sbit p13=P1^3;
sbit p14=P1^4;
sbit p20=P2^0;
sbit p21=P2^1;
sbit p22=P2^2;
sbit p23=P2^3;
sbit p24=P2^4;
sbit p25=P2^5;
sbit p26=P2^6;
sbit p27=P2^7;
/////////////////end of lcd variable////////////
///////////////ds18b20/////////////////////
//延时函数
void delay(unsigned int i)
{
while(i--);
}
//初始化函数
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(80); //精确延时大于480us
DQ = 1; //拉高总线
delay(14);
x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay(20);
}
//读一个字节
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
//写一个字节
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(5);
DQ = 1;
dat>>=1;
}
delay(4);
}
//读取温度
void ReadTemperature(void)
{
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度readdata[0]=ReadOneChar();
readdata[1]=ReadOneChar();
}
void Tempprocess() //温度转换
{
unsigned int t;
float tt;
unsigned char temp;
if((readdata[1]&0x80)!=0)
{
word1[3]='-';
t=readdata[1];
t<<=8;
t=t|readdata[0];
t=t-1;
t=~t;
t>>=4;
word1[4]=t/100+48;
word1[5]=((t/10)%10)+48;
word1[6]=t%10+48;
temp=readdata[0];
temp=temp-1;
temp=~temp;
temp=temp&0x0f;
tt=temp*0.0625;
word1[7]='.';
word1[8]=(unsigned char )(tt*10);
word1[9]=(unsigned char )(tt*100-word1[8]*10);
word1[10]=(unsigned char )(tt*1000-word1[8]*100-word1[9]*10);
word1[11]=(unsigned char )(tt*10000-word1[8]*1000-word1[9]*100-word1[10]*10);
word1[8]+=48;
word1[9]+=48;
word1[10]+=48;
word1[11]+=48;
word1[12]='C';
}
else
{
word1[3]='+';
t=readdata[1];
t<<=8;
t=t|readdata[0];
t>>=4;
word1[4]=t/100+48;
word1[5]=((t/10)%10)+48;
word1[6]=t%10+48;
temp=readdata[0];
temp=temp&0x0f;
tt=temp*0.0625;
word1[7]='.';
word1[8]=(unsigned char )(tt*10);
word1[9]=(unsigned char )(tt*100-word1[8]*10);
word1[10]=(unsigned char )(tt*1000-word1[8]*100-word1[9]*10);
word1[11]=(unsigned char )(tt*10000-word1[8]*1000-word1[9]*100-word1[10]*10);
word1[8]+=48;
word1[9]+=48;
word1[10]+=48;
word1[11]+=48;
word1[12]='C';
}
}
////////////////////P2 shu ju xian shi ////////////////
void xie()
{
// if (p13==0) {
if(p27==1) {word9[4]='1'; }
else
{word9[4]='0'; }
if(p26==1) {
word9[5]='1'; }
else
{word9[5]='0'; }
if(p25==1) {
word9[6]='1'; }
else
{word9[6]='0'; }
if(p24==1)
{
word9[7]='1'; }
else
{word9[7]='0'; }
if(p23==1) {
word9[8]='1'; }
else
{word9[8]='0'; }
if(p22==1) {
word9[9]='1';
}
else
{word9[9]='0';
}
if(p21==1)
{
word9[10]='1';
}
else
{word9[10]='0';
}
if(p20==1)
{
word9[11]='1';
}
else
{word9[11]='0';
}
}
}
/////////////////////end of ds18b20////////////////// ///////////////start of lcd 1602///////////////// void busy()
{
do
{
busyflag=REG1;
}while(busyflag_7);
}
void wrc(unsigned char wcon)
{
busy();
REG0=wcon;
}
void wrd(unsigned char wdat)
{
busy();
REG2=wdat;
}
void rdd()
{
busy();
dat=REG3;
}
void lcdint()
{
wrc(0x38);
wrc(0x01);
wrc(0x06);
wrc(0x0c);
}
void wrn(unsigned char word[])
{
unsigned char i;
for(i=0;i<16;i++)
{
wrd(word[i]);
}
}
//////////////end of lcd 1602///////////////////////
void main()
{ unsigned char temp;
unsigned char cout;
lcdint();//初始化液晶
wrc(0x80);
wrn(word5);
wrc(0xc0);
wrn(word6);
while(1)
{
if(p10==0) //判断P1.0是否按下
{
ReadTemperature();
Tempprocess();
wrc(0x80);
wrn(word1);
wrc(0xc0);
wrn(word2);
}
if(p11==0) //判断P1.1是否按下
{
wrc(0x80);
wrn(word3);
wrc(0xc0);
wrn(word4);
}
if(p12==0) //判断P1.2是否按下{
wrc(0x80);
wrn(word7);
wrc(0xc0);
wrn(word8);
}
{ P2=0xff;
cout=P2;
if(p13==0)
{
xie();
wrc(0x80);
wrn(word9);
wrc(0xc0);
wrn(word8);
if(cout>200)
{
temp=UP; //控制正转
P3=0X00;
delay(1000);
}
if (cout<50)
{
temp=DOWN;//控制反转
P3=0X00;
delay(1000);
}
}
if(p14==0)
{
temp=STOP; //控制停止
}
}
switch(temp)
{
case DOWN : P3=0X01; //控制反转//0011
delay(1000);
delay(1000);
P3=0X02;//0110
delay(1000);
delay(1000);
P3=0X10;//1100
delay(1000);
delay(1000);
P3=0X20;//1001
delay(1000);
delay(1000);
break;
case UP : P3=0X20; //控制正转
delay(1000);
delay(1000);
P3=0X10;
delay(1000);
delay(1000);
P3=0X02;
delay(1000);
delay(1000);
P3=0X01;
delay(1000);
delay(1000);
break;
case STOP : //控制停止
P3=0X00;
delay(1000);
delay(1000);
break;
}
}
}。

相关文档
最新文档