内容正文:
项目八、电子体温计的制作与实现电子课件 高教版 中职 单片机c语言程序设计及仿真
项目八、电子体温计的制作与实现
任务1 模拟温度传感器LM35
任务描述:
利用温度传感器LM35检测外界环境温度,检测结果经LM358放大后,送到ADC0808中进行模数转换,转换结果送给单片机AT89C51,通过单片机控制1602显示模块将温度显示在显示屏上。
1.ADC0808工作原理
知识链接
2.LM35工作原理
知识链接
3.LM358放大器
知识链接
1.任务分析
任务实施
因为LM35的输出电压是毫伏级,而ADC0808的输入电压范围为0~5V,虽然在ADC0808的电压允许范围内,但电压信号较弱,直接进行模数转换会导致数字量太小、精度低等不足,因此需要经过放大后再输入到ADC0808进行转换。LM35的输出电压范围为0~0.8V,放大5倍后,输出电压为0~4V,在ADC0808的输入电压范围0~5V之内,而LM35温度传感器的测温范围为0~80℃,完全可以满足日常生活的需要,所以设计放大倍数为5倍。
2.程序流程
任务实施
3.程序编写——ADC模数转换函数
任务实施
void conv_start(void)
{
ALE = 1;
START = 1;
delay_ms(1);
ALE = 0;
START = 0;
}
3.程序编写——ADC转换的结果函数
任务实施
int read_data(void)
{
uchar i=0;
OE = 1;
conv_start();
while(!EOC);
i = P3;
OE = 0;
return i;
}
3.程序编写——定时器初始化函数
任务实施
void init_interrupt()
{
TMOD = 0x02;
TH0 = 0xfb;
TL0 = 0xfb;
EA = 1;
ET0 = 1;
TR0 = 1;
}
3.程序编写——定时器中断函数
任务实施
void timer_T0(void) interrupt 1
//定时器中断函数(产生500KHz的时钟信号)
{
clk = ~clk;
}
3.程序编写——主函数
任务实施
void main()
{
init_interrupt();
RS = 0;
LCDRW = 0;
EN = 0;
lcd_init();
while(1)
{
convers_temp();
}
}
4.程序电路仿真——绘制电路图
任务实施
4.程序电路仿真——绘制电路图
任务实施
4.程序电路仿真——仿真
任务实施
任务2 电子体温计的制作与实现
任务描述:
利用18B20制作一个电子体温计,要求能够测量人体温度,并在4位共阳数码管上显示出来。
1.DS18B20的结构
知识链接
2.DS18B20工作过程——初始化
知识链接
2.DS18B20工作过程——单总线读/写时序
知识链接
3.数据处理
知识链接
4.DS18B20的操作命令
知识链接
1.任务分析
任务实施
(1)根据电路分析可知:单片机的P0端口作为四位共阳数码管的数据总线,由两个74HC573锁存器分别控制段码和位码。单片机P2.2作为DS18B20数据传输端口。
(2)DS18B20驱动函数如下:
●DS18B20初始化函数void ds_reset();
●读DS18B20函数:首先读取一位bit ds_read_bit();再读取一个字节uchar ds_read_byte();
●读取温度实现温度转换函数:uint read_temp();
2.程序流程
任务实施
3.程序编写——18b20初始化
任务实施
void ds_reset()
{DQ=1;
delayus(5);
DQ=0;
delayus(80);
DQ=1;
delayus(14);
if(DQ==0)flag=1;
else flag=0;
delayus(20);
}
3.程序编写——读一位18b20
任务实施
bit ds_read_bit()
{
bit dat;
DQ=0;
_nop_();
_nop_();
DQ=1;
_nop_();
dat=DQ;
delayus(10);
return dat;
}
3.程序编写——读一个字节
任务实施
uchar ds_read_byte()
{
uchar i,j,k;
for(i=0;i<8;i++)
{
j=ds_read_bit();
k