📄 2262.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 + -