久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3311|回復: 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, 下載次數: 156)

11.png

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的積分獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美视频1区 | 狠狠爱一区二区三区 | 日韩欧美亚洲 | 精品久久久一区 | 亚洲精品国产电影 | 精品人伦一区二区三区蜜桃网站 | 国产精品日日摸夜夜添夜夜av | 国产精品国产精品国产专区不片 | 色婷婷久久久久swag精品 | 亚洲欧美一区二区三区国产精品 | 中文字幕乱码一区二区三区 | 一区二区三区视频在线观看 | 久久高清 | 久久日韩粉嫩一区二区三区 | 91高清在线观看 | 日本精品一区二区三区视频 | 午夜免费福利电影 | 日韩成人影院 | 国产情侣久久 | 亚欧洲精品在线视频免费观看 | 亚洲 日本 欧美 中文幕 | 综合自拍| 网站黄色在线 | 国产精品高潮呻吟久久 | 亚洲欧美一区二区三区国产精品 | 一区二区三区四区国产精品 | 国产欧美精品一区二区 | 国产精品久久久久久久久久久久久久 | 超碰国产在线 | 日韩在线一区二区三区 | 精品久久久久国产免费第一页 | 在线不卡av | 偷派自拍 | 粉嫩一区二区三区四区公司1 | 有码一区 | 精品视频一区二区三区 | 成人影院av | 天天射天天干 | 一区二区成人 | 国产国拍亚洲精品av | 中文字幕av亚洲精品一部二部 |