找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2867|回复: 0
打印 上一主题 下一主题
收起左侧

TINY13+HC163+18B20温度显示与控制

[复制链接]
跳转到指定楼层
楼主
//ICC-AVR application builder : 2012/6/19 下午 10:43:42
// Target : T13
// Crystal: 4.8000Mhz

#include <iot13v.h>
#include <macros.h>
#include "ds18b20.h"
#define CPL  PORTB &= ~(1<<PB4)
#define CPH  PORTB |=(1<<PB4)
#define DAL  PORTB &= ~(1<<PB3)
#define DAH  PORTB |=(1<<PB3)
#define FSL  PORTB &= ~(1<<PB1)
#define FSH  PORTB |=(1<<PB1)
char dsp,tdsp;
char adcdata=0;
flash char LED[]={
               0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F
                                //0xed,0x21,0x8f,0xab,0x63,0xea,0xee,0xa1,0xef,0xeb
                                };
void delay1ms(void)   //误差 0us
{
     unsigned char a,b;
    for(b=4;b>0;b--)
        for(a=248;a>0;a--);
}

void delay10ms(void)   //误差 0us
{
    unsigned char a,b;
    for(b=215;b>0;b--)
        for(a=45;a>0;a--);
}
void beep(void)  //蜂鸣器响一声函数
{
  unsigned char i;
  for (i=0;i<100;i++)
   {
   FSH;
   delay1ms();
   FSL;       //BEEP取反
   delay1ms();
   }
   for (i=0;i<100;i++)
   {
   FSH;
   //delay1ms();
   //FSL;       //BEEP取反
   delay1ms();
   }
}

void send(char a)
{
  char i;
  for(i=8;i>0;i--)
        {
                  CPL;delay(1);
                  if(a&0x80)
                  {
                   DAH;
                   }
                   else
                   {
                    DAL;
                        }
                       
          CPH;delay(1);

                   a=a<<1;
         }
}

void disp(void)
{
  //FSH;
  send(LED[dsp%10]+tdsp);
  send(LED[dsp/10]+tdsp);
  //delay(255);
  //delay(255);FSL;
}

void port_init(void)
{
PORTB = 0x00;
DDRB  = 0x1B;
}
void  adcstar(void)

{

        DIDR0=0x04;   
                /*

        ADMUX (ADC Multiplexer Select Register) PDF86?

        bit7  Res                 ??

        bit6  REFS0                0=VCC????????;1=??????

        bit5  ADLAR                0=???;1=???(8bit??ADCH??)

        bit4:2  Res                 ??

        bit1:0  MUX1,MUX0        ????,00=ADC0(PB5);01=ADC1(PB2);10=ADC2(PB4);11=ADC3 (PB3)

*/   
        ADMUX=(1<<REFS0)|(0<<ADLAR)|(0<<MUX1)|(1<<MUX0);
        ADCSRA=(1<<ADEN)|(1<<ADSC)|(0<<ADATE)|(0<<ADIF)|(0<<ADIE)|(0<<ADPS2)|(1<<ADPS1)|(0<<ADPS0);

/*   

        ADCSRA (ADC Control and Status Register A) PDF 87?

        bit7   ADEN ADC??=1

        bit6   ADSC ??ADC????=1

        bit5   ADATE ?????

        bit4   ADIF ADC????

        bit3   ADIE ADC????

        bit2:0 ADC ??????

*/   

}
#pragma interrupt_handler eeprom_ready_isr:iv_EE_RDY
void eeprom_ready_isr(void)//内部EEPROM读写初始化
{
//eeprom ready event
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();

MCUCR = 0x00;
TIMSK0 = 0x00; //timer interrupt sources
GIMSK = 0x00; //interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
char key(void)
{

  if (ADCSRA&(1<<ADIF))

        {

           adcdata=ADC/4;

           ADCSRA|=(1<<ADSC)|(1<<ADIF); // ???ADC ???? ADIF?1???????1??0

        }//delay(100);
                return(adcdata);
}

void main(void)
{
  char stmp,mode=0;
  init_devices();
  Init_DS18B20();
  adcstar();
  ReadTemp();
  stmp=EEPROMread(0);//读取EEPROM预设温度数据
     FSH;
        // delay10ms();
        //tmp=0;
   while(1)
   {



   if(key()==0)
   {
   mode++;
   if(mode>1)
   {
   mode=0;
   }
   while(key()==0);
   }
   delay10ms();

   if(mode==1)
   {
   tdsp=0x80;
   delay10ms();
   if(key()==101)
   {
   stmp++;
   if(stmp>99)
   {
   stmp=99;
   }
   EEPROMwrite(0,stmp);//向EEPROM写入预设温度数据
   while(key()==101);
   }
   delay10ms();
   if(key()==173)
   {
   stmp--;
   if(stmp<1)
   {
   stmp=1;
   }
   EEPROMwrite(0,stmp);//向EEPROM写入预设温度数据
   while(key()==173);
   }
   if(dsp!=stmp)
   {
   dsp=stmp;
   disp();
   }
  }
   ReadTemp();
  delay10ms();
  if(mode==0)
   {
   tdsp=0x00;
   if(tmp>stmp)
    {
     beep();
     }
     else
     {
     FSH;
     }
         
   if(dsp!=tmp)
   {
   dsp=tmp;
   disp();
   }
   }
  //delay10ms();
   }
}



/**************************************************************************

                                   THE ds18b20 LIB
   
   File Name:       ds18b20.h

***************************************************************************/

#ifndef ds18b20_2005_4_9
#define ds18b20_2005_4_9
#define uchar unsigned char
#define DQL  PORTB &= ~(1<<PB0)
#define DQH  PORTB |=(1<<PB0)
#define DQ  PINB&(1<<PB0)
#define DO DDRB|= (1<<PB0)         //PB0定义成输出
#define DI DDRB&=~(1<<PB0)         //PB0定义成输入
uchar tmp;              //


/***********ds18b20延迟子函数(晶振12MHz )*******/
/*
void delay_18B20(unsigned int i)
{
         unsigned char a,b;
    for(b=9;b>0;b--)
        for(a=i;a>0;a--);
}
*/
void delay(unsigned char i)
{
         unsigned char a,b;
    for(b=2;b>0;b--)
        for(a=i;a>0;a--);
}

/**********ds18b20初始化函数**********************/

void Init_DS18B20(void)
{
         unsigned char x=0;
         DO;
         DQH;          //拉高总线
         delay(30);
         DQL;          //单片机将DQ拉低
         delay(255);delay(50); //精确延时 大于 480us
         DQH;          //拉高总线
         DI;
        if(DQ)
        {x=0;}else{x=1;}
                DO;
        DQL;delay(55);
        DQH;          //拉高总线
        delay(55);
}

/***********ds18b20读一个字节**************/  

unsigned char ReadOneChar(void)
{
        uchar i=0;
        uchar dat = 0;
        for (i=8;i>0;i--)
         {
                 
                 DO;
                  DQL;      // 给脉冲信号
                  delay(1);
                  dat>>=1;     //数据右移一位
                  DQH;
                  DI;
                  if(DQ)
                 { dat|=0x80;}   //按位或,取最高位
                  delay(20);
         }
        return(dat);
}

/*************ds18b20写一个字节****************/  

void WriteOneChar(uchar dat)
{
        unsigned char i=0;
        DO;
        for (i=8; i>0; i--)
        {
                  DQL;
                delay(0);
                if(dat&0x01)
                {DQH;}
                else
                {DQL;}
            delay(25);
                DQH;            //上升沿将数据送入
               
            dat>>=1;delay(1);
}//DQH;delay(1);
}

/**************读取ds18b20当前温度************/

void ReadTemp(void)
{
        unsigned char a=0;
        unsigned char b=0;
        //unsigned char t=0;

        Init_DS18B20();
        WriteOneChar(0xCC);            // 跳过读序号列号的操作
        WriteOneChar(0x44);         // 启动温度转换

        delay(255);delay(150);     // this message is wery important

        Init_DS18B20();
        WriteOneChar(0xCC);         //跳过读序号列号的操作
        WriteOneChar(0xBE);         //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

        delay(255);delay(150);

        a=ReadOneChar();            //读取温度值低位
        b=ReadOneChar();                   //读取温度值高位
        //temp_value=b<<4;        //左移四位,扩大16倍,变为一个字节的高四位
        //temp_value+=(a&0xf0)>>4;//取温度值的地位的高四位,右移四位后与温度的高四位相加得到温度值   
    //delay(150);
        tmp=(b<<4)+((a&0xf0)>>4);
}
//void temp_to_str()   //温度数据转换成液晶字符显示
//{

//tmp=temp_value;

//}
#endif


11.png (25 KB, 下载次数: 130)

11.png

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的积分奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表