cpubbs 发表于 2004-11-6 02:39:36

一个CVAVR的18B20控温例子可读8个18B20 不闪烁

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


Project : LRYFUJIANAVR
Version : 1.0
Date    : 2003-10-27
Author: 王向阳制作
Comments:
本程序用于利用DS18B20控制量热
温度的附件的分程序。
援用ATMEGA8 ,4MRC震荡器。CVAVR1。23
。8D编译通过。


Chip type         : ATmega8L
Program type      : Application
Memory model      : Small
External SRAM size: 0
Data Stack size   : 256
*********************************************/

#include <mega8.h>   
#include <math.h>
#define uchar unsigned char
#define schar signed char
#define ulong unsigned long
#define slong signed long
#define uint unsigned int
#define sint signed int   
#define ON 0
#define OFF 1
#define LABA PORTC.5   
#define ZhiLengControl PORTD.6   
#define JiaReControl PORTD.7
//以下定义键盘键值。
#define NOKEY 0
#define SHEZHI 0x10
#define QUEDING 0x11
#define PIPEI 0x12
#define BEIYONG 0x13
//以下定义显示相关
#define A 10
#define B 11
#define C 12
#define D 13
#define E 14
#define F 15
#define G 16
#define H 17
#define I 18
#define J 19
#define K 20
#define L 21
#define M 22
#define N 23
#define O 24
#define P 25
#define Q 26
#define R 27
#define S 28
#define T 29
#define U 30
#define V 31
#define W 32
#define X 33
#define Y 34
#define Z 35   
#define GANG 36   


// 1 Wire Bus functions
#asm
   .equ __w1_port=0x12
   .equ __w1_bit=4
#endasm
#include <1wire.h>

// DS1820 Temperature Sensor functions
#include <ds1820.h>

// maximum number of DS1820 devices
// connected to the 1 Wire bus
#define MAX_DS1820 8
// number of DS1820 devices
// connected to the 1 Wire bus
unsigned char ds1820_devices;
// DS1820 devices ROM code storage area,
// 9 bytes are used for each device
// (see the w1_search function description in the help)
unsigned char ds1820_rom_codes;   
//给发生温度报警的器件分配ROM码存储空间。      
//unsigned char alarm_rom_codes;
eeprom unsigned char eep_rom_codes;
eeprom int eepSheDingWD;
#define eepZhiLengTongSheDing eepSheDingWD
#define eepJiaReTongSheDing eepSheDingWD
#define eepneitongBSheDing eepSheDingWD
int SheDingWD;
#define ZhiLengTongSheDing SheDingWD
#define JiaReTongSheDing SheDingWD
#define neitongBSheDing SheDingWD
int wendu;
#define ZhiLengTong wendu
#define JiaReTong wendu
#define neitongB wendu
#define waitongB wendu

// unsigned char err;      
unsigned int shijian;   
bit bitshijian=0;
// Standard Input/Output functions
#include <stdio.h>


// Timer 2 overflow interrupt service routine
interrupt void timer2_ovf_isr(void)
{
    static uchar a ;
    a++;
    if (a>30)
       { a=0;
      bitshijian=1;
      shijian++;
       }unsigned charled_buff={0,1,L,R};
uchar DpBit=02;
unsigned char flash DisSeg[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
,
                            //"0"   "1""2""3"'4''5''6''7''8''9'
'A''B''C''D''E'F'
                  
0X3D,0X76,0X0F,0X0E,0X36,0X38,0X37,0X54,0X5C,0X73,0X67,0X50,0X6D,0X78,0X3E,0X1C,
                   //'G' 'H'   'I''J''K''L''M' 'N'   'O''P''Q''R'
'S''T''U''V'
                  0X7E,0X00,0X6E,0X48,0X40,0X25};      
                   //'W''X''Y''Z''-' 'off'   
#include <delay.h>


//键盘子程序开始处

/*   毫秒级延时程序   */   


void led_display(void)
         {unsigned char i=0;
for(i=0;i<4;i++)
    {   
PORTB=DisSeg]|(0x80&(DpBit<<(i+4)));
PORTC&=~(1<<i);
delay_ms(2);
PORTC|=(1<<i);
}   
          }
   
unsigned char Scan_key_led_display(void)
{
unsigned char i,key=0;
for(i=0;i<4;i++)
    {   
PORTB=DisSeg]|(0x80&(DpBit<<(i+4)));
PORTC&=~(1<<i);
delay_ms(2);
if((PINC&(1<<4))==0)key=i+0x10;//读取键盘扫描信号有键
执行
PORTC|=(1<<i);
}   
         return(key);
}   
unsigned char Scan_key(void)    //键盘扫描函数,注意本函数不作按键释放检查
         { unsigned char key=0;
         key=Scan_key_led_display();
         if(key)
            {
               led_display();
               led_display();
               if(key!=Scan_key_led_display())return 0;
                return key;
               }
         else
               return 0;                        
          }
unsigned char keypad(void)//键盘扫描函数,注意本函数作按键释放检查
{ unsigned char temp1,temp2;
    temp1=Scan_key();
    if (temp1)
       {   do
         
          temp2=Scan_key();
         while(temp1==temp2);
         LABA=ON;
         led_display();
         led_display();
         LABA=OFF;
       }
    return(temp1);
}



unsigned char ds18b20_select(unsigned char *addr)
{
unsigned char i;
if (w1_init()==0) return 0;   
//led_display();
//led_display();
if (addr)
   {
   w1_write(0x55);   
   i=0;
   do
   {
   w1_write(*(addr++)); }
   while (++i<8);
// led_display();
// led_display();
   }
else w1_write(0xcc);
return 1;
}





uchar start_all_ds18b20(void)
{   
if (w1_init()==0) return 0;
//for(k=0;k<20;k++)
//led_display();
//Scan_key();
w1_write(0xcc);
w1_write(0x44);
//for(k=0;k<10;k++)
//led_display();

//Scan_key();
//for(k=0;k<70;k++)led_display();
//delay_ms(550);
return 1;
}
int ds1820_temperature_12(unsigned char *addr)
{
if (ds18b20_select(addr)==0) return -9999;
//w1_write(0x44);
//delay_ms(550);
//for(k=0;k<10;k++)
//led_display();
//Scan_key();
if (ds1820_read_spd(addr)==0) return -9999;   

//for(k=0;k<10;k++)
//led_display();
w1_init();
return (((int)__ds1820_scratch_pad.temp_msb<<8)|
       __ds1820_scratch_pad.temp_lsb)*5;   
led_display();
}
union
   {
   uchar c;   
   int x;
   }temp;
int Read_Temperature(void)
{

   // Read Scratch Pad
   temp.c=w1_read();
   temp.c=w1_read(); ;
   return temp.x*5;
}


uchar QDwdled_display(void)
{uchar i=0,j=0;
PORTB=DisSeg]|(0x80&(DpBit<<(i+4)));
PORTC&=~(1<<i);
   if (w1_init()==0)j=0;
// j=start_all_ds18b20();
delay_ms(1);
PORTC|=(1<<i);
i=1;
PORTB=DisSeg]|(0x80&(DpBit<<(i+4)));
PORTC&=~(1<<i);
delay_ms(2);
w1_write(0xcc);
PORTC|=(1<<i);
i=2;
PORTB=DisSeg]|(0x80&(DpBit<<(i+4)));
PORTC&=~(1<<i);
w1_write(0x44);
delay_ms(2);
PORTC|=(1<<i);
i=3;
PORTB=DisSeg]|(0x80&(DpBit<<(i+4)));
PORTC&=~(1<<i);
delay_ms(2);
PORTC|=(1<<i);
return 1 ;   
}
int duwdled_display(unsigned char *addr)
{   int lswd;
uchar i=0;
PORTB=DisSeg]|(0x80&(DpBit<<(i+4)));
PORTC&=~(1<<i);
if (ds18b20_select(addr)==0) lswd=-9999;//return -9999;
//delay_ms(2);
PORTC|=(1<<i);
i=1;
PORTB=DisSeg]|(0x80&(DpBit<<(i+4)));
PORTC&=~(1<<i);
//if (ds1820_read_spd(addr)==0) return -9999;
   
delay_ms(2);
w1_write(0xBE);
PORTC|=(1<<i);
i=2;
PORTB=DisSeg]|(0x80&(DpBit<<(i+4)));
PORTC&=~(1<<i);
lswd=Read_Temperature();
delay_ms(2);
PORTC|=(1<<i);
i=3;
PORTB=DisSeg]|(0x80&(DpBit<<(i+4)));
PORTC&=~(1<<i);
w1_init();
delay_ms(2);
PORTC|=(1<<i);
return lswd;
//return (((int)__ds1820_scratch_pad.temp_msb<<8)|
//   __ds1820_scratch_pad.temp_lsb)*5;   

}      


void pipei(void)
{
uchar flag=0;
uchar i;
int temp;
led_buff=0;
led_buff=0;
led_buff=0;
led_buff=0;
while (flag==0)
      {if(bitshijian)bitshijian=0;
      {
         //for(k=0;k<100;k++)led_display();               
          ds1820_devices=w1_search(0xf0,&ds1820_rom_codes,0]);
         //for(k=0;k<100;k++)led_display();
          if(ds1820_devices!=1)
            {temp=9999;}
             else
            {
            temp=(ds1820_temperature_12(&ds1820_rom_codes,0]))>>3;
            //for(k=0;k<100;k++)led_display();
               };//当匹配时18B20个数不为1个则错误1
         }
          for(i=0;i<3;i++)
            {
            led_buff<i>=temp%10;
            temp=temp/10;
            };
          switch(keypad())
             {
             case NOKEY:;break;
             case SHEZHI:if(++led_buff&gt;=MAX_DS1820)led_buff=0;break;
             case QUEDING:for(i=0;i&lt;9;i++)eep_rom_codes,i]
=ds1820_rom_codes,i];
                         flag=1;break;
             case BEIYONG:flag=1;break;
             default : ;
             } ;
      }                     
}      
   
void WriteLedBuff(int temp,uchar tongdao)
{uchar i;
if(temp&lt;0)
    {
   led_buff=GANG;//'-'
    }
else led_buff=tongdao;
temp=abs(temp);
for(i=0;i&lt;3;i++)
            {
            led_buff<i>=(temp%10);
            temp=temp/10;
            };

}   
页: [1]
查看完整版本: 一个CVAVR的18B20控温例子可读8个18B20 不闪烁