单片机温度传感器及无线传输
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
通信与测控系统课程设计
报告
一、课程设计目的及要求
①通过一个具体的项目实例,熟悉项目开发的流程,学习与通信相关的测控系统开发,包括基本知识、技术、技巧
②锻炼硬件编程能力(C51),积累编程经验,形成代码风格,理解软件层次结构
③常用外围器件(接口)的操作、驱动
一、实习主要任务
①采集远端温度信息,无线收集,上位机显示信息
②硬件配置:51系统板、DS18B20、无线数传模块IA4421、数码管
③编程、调试,完成作品
二、硬件电路的原理框图
图一、AT89S51、数码管硬件原理图
图二、IA4421硬件原理图图三、DS18B20硬件原理图最终实现的功能:
三、软件设计及原理
1、读主程序流程图
主程序代码:
#include
#include
#include
#include
#include
#include
#define uint unsigned int
#define uchar unsigned char
unsigned char m;
unsigned char n;
void zhuanhuan();
void delay_led(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uint aa;
uchar wei_1,wei_2,wei_3,v,wei_4,wei_5,wei_6;
uint shuju;//得到的温度值
uchar temp[2]={0,0}; //存放DS18B20的温度寄存器值
uint value = 0;
sbit DQ=P3^3; //数据线
void ReadSerialNumber(void);
uchar sn1,sn2,sn3,sn4,sn5,sn6,sn7,sn8; //存放DS18B20的64位序列号void ow_reset(void);
void tmstart (void);
void ReadSerialNumber(void);
void Read_Temperature(void);
void write_byte(char);
uint read_byte(void);
void delay_18B20(uint);
//void baojing();
/*******主函数**********/
void main()
{ m=0;
//init_led();//初始化子程序
tmstart ();
delay_18B20(50); /*等待转换结束*/
while(1)
{ m++;
Read_Temperature();
delay_18B20(50);
tmstart();
delay_18B20(50); /*等待转换结束*/
zhuanhuan();
ia4421();
n=wei_4;
wei_4<<=4;
txdata[4]=wei_5|wei_4;
if(m==50)
{m=0;
UART_Init();
P1=0xfc;
txdata[0]=0x2d;
txdata[1]=0xd4;
txdata[2]=0xfa;
txdata[3]=0x01;
ia442xinit();
spirevtwobyte();
spisendcommand(0x8288);
txregframe();
}
P2=0xff;
P0=table[n];
P2_4=0;
delay1s();
P2_4=1;
P0=table[wei_5];
P2_5=0;
delay1s();
P2_5=1;
P0=~0x80;
P2_6=0;
delay1s();
P2_6=1;
P0=~0x39;
P2_7=0;
delay1s();
P2_7=1;
}
}
/******转换************/
void zhuanhuan()
{
aa=shuju;
wei_1=aa/100000;
wei_2=aa/10000%10;
wei_3=aa/1000%100%10;
wei_4=aa/100%1000%100%10;
wei_5=aa/10%10000%1000%100%10;
wei_6=aa/1%100000%10000%1000%100%10;
}
/******延时函数*********/
//========18b20程序=================*/
void delay_18B20(uint seconds) //延时
{
for(;seconds>0;seconds--);
}
/******************************************
18b20程序
******************************************/
//===============复位===========
void ow_reset(void)
{
uchar presence;
DQ = 0; //pull DQ line low
delay_18B20(44); //至少480微秒,leave it low for 501us
DQ = 1; // allow line to return high?
delay_18B20(3); // wait for presence18b20 36us
presence = DQ; // get presence signal // 0= DS18B20 ready, 1= busy
//if(!presence)P1_0=0;
delay_18B20(12); // wait for end of timeslot
}
//=========从总线上读取一个字节========
uint read_byte(void)
{
uchar i;
for (i=8;i>0;i--)
{
value>>=1;
DQ = 0; // pull DQ low to start timeslot
_nop_();_nop_();_nop_();_nop_();
DQ = 1; // then return high
if(DQ)
{
value|=0x80;
}
delay_18B20(4); // wait for rest of timeslot