|
频率为外部晶振16M,我实验通过了!挺高兴的,但是始终觉得有点不理想,所以拿来跟大家分享一下,希望各位给点意见!
一、主程序
//温度传感器DS18B20试验
//间隔2s采集一次温度值
//使用1602的液晶作为显示
#include <iom16v.h>
#include <macros.h>
#include "18B20.h"
#include "1602.h"
uchar adc_0[]={"wendu:"};
uchar adc_1[]={0xdf,0x43};
uchar adc_2[]={0x2b};//正号
uchar adc_3[]={0x2d};//负号
uchar adc_4[]={0x2e};//小数点
//延时函数在16M时延时1ms
void s_1ms(unsigned int ms)
{
unsigned int aa;
for(;ms>=1;ms--)
{
for(aa=0;aa<=2000;aa++)
{;}
}
}
void main()
{
unsigned int i,j,tem3,tem2,tem1,tem0;
//int TCC;
//float TC,t;
unsigned char buffer3[5];
//端口初始化
DDRA = 0xff;
PORTA = 0x00;
DDRB = 0xFF;
PORTB = 0xF0;
DDRC = 0x00;
PORTC = 0xFF;
DDRD = 0xff;
PORTD = 0xff;
//延时200ms
s_1ms(200);
//DS18B20复位
ds1820_reset();
//1602 初始化
LcdInit();
WriteChar(1,0,6,adc_0);
WriteChar(1,11,2,adc_1);
WriteChar(1,9,1,adc_4);
while (1)
{
ds1820_start(); //进行一次转换
s_1ms(2);
i = ds1820_read_temp(); //读取温度数值f
j=i&0xf000;
if(j)
{
i=~i+1;
WriteChar(1,6,2,adc_3);
}
else
{
WriteChar(1,6,2,adc_2);
}
i = (i * 10) / 16; //数值处理
//第3位没有显示
i = i % 1000;
//显示第2位
tem2= i / 100;
WriteNum(1,7,tem2);
i = i % 100;
//显示第1位
tem1= i / 10;
WriteNum(1,8,tem1);
tem0= i % 10;
WriteNum(1,10,tem0);
}
}
二、18B20
//DS18B20连接在端口C的第7引脚
//设置成输入
#define DQ_INPUT DDRC &= ~(1 << PC7)
//设置成输出
#define DQ_OUT DDRC |= (1 << PC7)
//设置成低电平
#define DQ_LO PORTC &= ~(1 << PC7)
//设置成高电平
#define DQ_HI PORTC |= (1 << PC7)
//读出
#define DQ_R PINC & (1 << PC7)
//中断标志
unsigned char init_f;
//延时函数
void s_10us(unsigned int ms)
{
unsigned int aa;
for(;ms>=1;ms--)
{
for(aa=0;aa<=17;aa++)
{;}
}
}
//DS18B20复位
void ds1820_reset(void)
{
unsigned char i;
//中断保护
init_f = SREG;
//关中断
CLI();
DQ_OUT;
DQ_LO;
s_10us(50); //延时500us
DQ_HI;
DQ_INPUT;
s_10us(8); //延时80us
i = DQ_R;
s_10us(50); //延时500us
if (init_f & 0x80) //恢复中断状态
{
SEI();
}
}
//DS18B20字节读取
unsigned char ds1820_read_byte(void)
{
unsigned char i;
unsigned char value = 0;
//中断保护
init_f = SREG;
//关中断
CLI();
for (i = 8; i != 0; i--) {
value >>= 1;
DQ_OUT;
DQ_LO;
s_10us(1);
DQ_HI;
DQ_INPUT;
s_10us(1);
if (DQ_R) {
value|=0x80;
}
s_10us(5); //延时60us
}
if (init_f & 0x80) //恢复中断状态
{
SEI();
}
return(value);
}
//DS18B20字节写入
void ds1820_write_byte(unsigned char value)
{
unsigned char i;
//中断保护
init_f = SREG;
//关中断
CLI();
for (i = 8; i != 0; i--) {
DQ_OUT;
DQ_LO;
s_10us(1);
if (value & 0x01) {
DQ_HI;
}
s_10us(8); //延时80us
DQ_HI;
value >>= 1;
}
if (init_f & 0x80)//恢复中断状态
{
SEI();
}
}
//启动ds1820转换
void ds1820_start(void)
{
ds1820_reset();
ds1820_write_byte(0xCC); //勿略ROM
ds1820_write_byte(0x44); //启动转换
}
//读温度
unsigned int ds1820_read_temp(void)
{
unsigned int i;
unsigned char buf[9];
ds1820_reset();
ds1820_write_byte(0xCC); //勿略ROM
ds1820_write_byte(0xBE); //读温度
for (i = 0; i < 8; i++)
{
buf = ds1820_read_byte();
}
i = buf[1];
i <<= 8;
i |= buf[0];
return i;
}
三、1602液晶
这个就不用了吧! |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|