⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2262.c

📁 //ICC-AVR application builder : 2006-2-20 14:58:34 // Target : M8 // Crystal: 1.0000Mhz //模拟PT226
💻 C
字号:
 //ICC-AVR application builder : 2006-2-20 14:58:34
// Target : M8
// Crystal: 1.0000Mhz
//模拟PT2262 本模拟发4.7M对820K接收  (
//在具体的应用中,外接振荡电阻可根据需要进行适当的调节,阻值越大振荡频率越慢,编码的宽度越大,发码一帧的时间越长.
//推荐值:2262/4.7M/2272/820K    2262/3.3M/2272/680K     2262/1.2M/2272/200K
//振荡频率 f=2*1000*16/Rosc(kΩ)   kHz    其中Rosc为振荡电阻
//a=R/32000=146us  1位宽=32a=47ms
/*a暂时定为145us  
0:  580us和1740us
一个位宽=32a=4.64ms
55.680ms(编码)+18.560ms(同步)
编码=4位地址码(暂定全0)+8位数据码
*/

//PB0~7 8位数据 PD2 发送开关,低电平有效 中断处理  PD1 18B20_DAT
//PD5 DOUT  PD6 DISP_SEG PD7 CLK 

#include <iom8v.h>
#include <macros.h>
#define D0 PORTD &=~ (1<<5)
#define D1 PORTD |= (1<<5)
#define uchar unsigned char

#define DS18B20_DQ_SET   (PORTD = PIND | (1<<PD1))
#define DS18B20_DQ_CLE   (PORTD = PIND & (~(1 << PD1)))
#define DS18B20_DQ_DAT   PIND & (1<<PD1)
#define DS18B20_READ_ROM           0x33
#define DS18B20_MATCH_ROM          0x55
#define DS18B20_SKIP_ROM           0xCC
#define DS18B20_SEARCH_ROM         0xF0
#define DS18B20_ALARM_SEARCH_ROM   0xEC
#define DS18B20_WRITE_RAM          0x4E
#define DS18B20_READ_RAM           0xBE
#define DS18B20_COPY_RAM           0x48
#define DS18B20_CONVERT_TEM        0x44
#define DS18B20_EECALL_EEPROM      0xB8
#define DS18B20_READ_POWER_SUPPLY  0xB4
const uchar seg_table[11]={0x11,0xd7,0x32,0x92,0xd4,0x98,0x18,0xd3,0x10,0x90,0xff};//共阳

unsigned char t_disp[4]={0,0,0,0};   //存放格式为  F/o,0,3,4
unsigned char temp;		
unsigned char count=100;
	

void port_init(void)
{
 PORTB = 0x00;
 DDRB  = 0x00;
 PORTD = 0x00;
 DDRD  = 0xE0;
}

//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;
 GICR  = 0x40;
 TIMSK = 0x00; //timer interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}
///////////////////////////////////////////////////////////////////////
void delay_us(int time)
	 {     
  	  do
	  	{
		 time--;
		}	
  	  while (time>1);
	 }	   
void delay_ms(unsigned int time)
	 {
	   while(time!=0)
	  	  {		
		   delay_us(30);
		   time--;
		  }
	 } 

void disp(void)
{
  uchar i,n,m;
  t_disp[0]=seg_table[temp%10];
  t_disp[1]=seg_table[(temp/10)%10];
  t_disp[2]=seg_table[(temp/100)%10];
  t_disp[3]=seg_table[0]; 	
 for(i=0;i<4;i++)
  {
    m=0x01;
	for(n=0;n<8;n++)
	{
	  PORTD&=~0x80;	 
	  if((t_disp[i]&m))
	 	  {PORTD|=0x40;}
	  else
	 	  {PORTD&=~0x40;}
	  m<<=1;
	  PORTD|=0x80;
	}
  }
  PORTD&=~0x80;
}
///////////////////////////////////////////////
//---------------------------------------------
//name:Ds18b20Reset
//description:复位ds18b20芯片进行初始化
//---------------------------------------------
void Ds18b20Reset(void)
{	 
	DDRD|=(1<<PD1);
    DS18B20_DQ_CLE;
    delay_us(100);    //100us
    delay_us(100);  
    delay_us(100);
    delay_us(100);
    DS18B20_DQ_SET;
	delay_us(10);   //20us
}
//---------------------------------------------
//name:Ds18b20Ack
//description:应答单总线
//---------------------------------------------
void Ds18b20Ack(void)
{
 	DDRD&=~(1<<1);_NOP();_NOP();_NOP();_NOP();_NOP();
    while(DS18B20_DQ_DAT);_NOP();_NOP();_NOP();
    while(!DS18B20_DQ_DAT);
    delay_us(10);   //20us         
}
//---------------------------------------------
//name:Ds18b20Write
//description:   写一个字节
//parameter: dat 要写入的数据,无符号字符型
//---------------------------------------------
void Ds18b20Write(uchar data)
{ 
    unsigned char i;
	DDRD|=(1<<1);
    for(i=0;i<8;i++) 
	{
        if(data & 0x01) 
		{     // 写 1
            DS18B20_DQ_CLE;
             _NOP();
	         _NOP();
             _NOP();
             _NOP();
             _NOP();
             _NOP();
             _NOP();
             _NOP();//8us
            DS18B20_DQ_SET;
            delay_us(20);     //55us  
        }
		else
		{                     // 写 0 
            DS18B20_DQ_CLE;
            delay_us(20);     //55us
            DS18B20_DQ_SET;
            _NOP(); 
            _NOP();
            _NOP();
            _NOP();
            _NOP();
            _NOP();
            _NOP();
            _NOP();//8us
        }
       data = data>>1;
    }
}
//---------------------------------------------
//name:Ds18b20ReadBit
//description:   读一个位
uchar Ds18b20ReadBit(void)
{	  
    uchar data;
	DDRD|=(1<<1);
        DS18B20_DQ_CLE;
	_NOP();               //延时1个us      
        DS18B20_DQ_SET;
        _NOP();        //延时2个us
    //delay_us(1);
	DDRD&=~(1<<1);
        data = DS18B20_DQ_DAT;
        delay_us(30);         //60us
        return data;
}
//---------------------------------------------
//name:Ds18b20ReadByte
//description:   读一个字节
//---------------------------------------------
uchar Ds18b20ReadByte(void)
{
    uchar i,data;
	data = 0;
    for(i=0;i<8;i++)
	{
        data = data >> 1;    
        if(Ds18b20ReadBit())
            {data |= 0x80;}
		else
		   {data |= 0x00;}
    }
    return data;
}
//---------------------------------------------
//name:Ds18b20Convert
//description:   命令Ds18b20开始转换温度
//---------------------------------------------
void Ds18b20Convert(void)
{
    Ds18b20Reset();
    Ds18b20Ack();
    delay_ms(20);
    Ds18b20Write(DS18B20_SKIP_ROM);
    Ds18b20Write(DS18B20_CONVERT_TEM);
}
//---------------------------------------------
//name:Ds18b20ReadTem
//description:   从Ds18b20读取温度
//---------------------------------------------
void Ds18b20ReadTem(void)
{
    uchar Height,Low;
	Ds18b20Reset();                                   // 初始化
    Ds18b20Ack();                                      
    delay_ms(20);                                         
    Ds18b20Write(DS18B20_SKIP_ROM);                   // 跳过ROM
    Ds18b20Write(DS18B20_READ_RAM);                   // 读存储器
    Low    = (Ds18b20ReadByte())>>4;
    Height = (Ds18b20ReadByte())<<4;
    temp   = Height + Low;
}






//////////////////////////////////////////////////////////////////////////////
void delay_us2(unsigned char dt)//33对应145us  142对应581
    {
	while(dt)
	   dt--;
	asm("nop");
	}

void send0(void)//发送数据0
{
  D1;
  delay_us2(142);
  D0;
  delay_us2(142);
  delay_us2(142);
  delay_us2(142);
  D1;
  delay_us2(142);
  D0;
  delay_us2(142);
  delay_us2(142);
  delay_us2(142);
}

void send1(void)//1
{
  D1;
  delay_us2(142);
  delay_us2(142);
  delay_us2(142);
  D0;  
  delay_us2(142);////////////////////////////
  D1;
  delay_us2(142);
  delay_us2(142);
  delay_us2(142);
  D0;  
  delay_us2(142);//////////////////////////////
}
void send9(void)//发送同步码
{ uchar i;
  D1;
  delay_us2(142);
  D0;  
  for(i=31;i>0;i--)
  {
  delay_us2(142);
  }
  
}

#pragma interrupt_handler int0_isr:2
void int0_isr(void)//中断,发送数据,先低后高
{
  uchar t,i,j,data_in;
  GICR  = 0;
  
//  Ds18b20Convert();
//  delay_ms(1000);
 // Ds18b20ReadTem();
 // disp();
  
   temp=count++;//////////
  for(j=4;j>0;j--)
  {
   t = temp;
 
    for (i=4;i>0;i--)//4位地址码
    {
       send0();
    }
    for(i=8;i>0;i--)//8位数据码
      {
	    if(t & 0x01)
	       send1();
	    else  
	       send0();
	   t>>=1;
	  }
    send9();//同步信号
  
  }
  delay_ms(5000);
    GICR  = 0x40;
  
}
void main(void)
{
  init_devices();
  for(;;)
  ;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -