|
單片機 ATmega16
單片機外接晶振為了11.059M
LCD 1602
時間芯片 DS1302
溫度傳感器 DS 18B20
DA AD 。。。。。。
EEPROM AT2402 IIC總線器件
編譯器為ICC AVR
# include<iom16v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
#define CLK0 PORTD&=~BIT(5)
#define CLK1 PORTD|=BIT(5)
#define IO0 PORTD&=~BIT(6)
#define IO1 PORTD|=BIT(6)
#define RST0 PORTD&=~BIT(7)
#define RST1 PORTD|=BIT(7)
#define IO_in PIND&BIT(6)
#define DQOFF() DDRC|=BIT(6)
#define DQNO() DDRC&=~BIT(6)
#define DQIN() PINC&BIT(6)
uchar suzhu[]="0123456789";
void delay_us(uint a)
{
while(a--);
}
//////////////////// LCD1602///////////////
void LCDwritecom(uchar com)
{
DDRA|=0xe0;
PORTA&=~BIT(5);
PORTA&=~BIT(6);
PORTB=com;
PORTA&=~BIT(7);
delay_us(10);
PORTA|=BIT(7);
delay_us(10000);
}
void LCDwritedat(uchar dat)
{
DDRA|=0xe0;
PORTA|=BIT(5);
PORTA&=~BIT(6);
PORTB=dat;
PORTA&=~BIT(7);
delay_us(2);
PORTA|=BIT(7);
delay_us(10000);
}
void LCDinit()
{
DDRB=0XFF;
DDRA|=0xe0;
LCDwritecom(0x01);
delay_us(20000);
LCDwritecom(0x38);
LCDwritecom(0x0c);
LCDwritecom(0x06);
}
//////////////////////ds1302/////////////
uchar ds1302read(uchar dat)
{
uchar j,a=0;
DDRD|=0XE0;
CLK0;
RST1;
for(j=0;j<8;j++)
{
CLK0;
delay_us(1);
if(dat&BIT(j))IO1;
else IO0;
CLK1;
}
DDRD&=~BIT(6);
PORTD&=~BIT(6);
for(j=0;j<8;j++)
{
CLK0;
delay_us(1);
if(IO_in)a|=BIT(j);
CLK1;
delay_us(1);
}
RST0;
delay_us(2000);
return a;
}
///////////////18b20/////////////////////
uchar b20rtset()
{
uchar x;
DQNO();
delay_us(1);
DQOFF();
delay_us(1020);
DQNO();
delay_us(111);
x=DQIN();
return x;
}
uchar b20read()
{
uchar a,j;
a=0;
for(j=0;j<8;j++)
{
DQNO();
delay_us(1);
DQOFF();
delay_us(1);
DQNO();
delay_us(17);
if(DQIN())a|=BIT(j);
delay_us(120);
}
return a;
}
void b20write(uchar dat)
{
uchar j;
for(j=0;j<8;j++)
{
DQNO();
delay_us(1);
DQOFF();
delay_us(1);
if(dat&BIT(j))DQNO();
else DQOFF();
delay_us(120);
}
DQNO();
}
uint b20readdat()
{
uchar a;
uint b;
if(!b20rtset())
while(!(DQIN()));
b20write(0xcc);
b20write(0x44);
delay_us(60);
while(!(DQIN()));
if(!b20rtset())
while(!(DQIN()));
b20write(0xcc);
b20write(0xbe);
delay_us(2);
a=b20read();
b=b20read();
b=b<<8|a;
b=b&0x07ff;
return b;
}
/////////////////////AD DA,IIC////////////////
void adcinit()
{
ADMUX=0X43;//設置AD多工選擇寄存器;
ADCSRA=0XA7;//設置AD控制和狀態寄存器;
SFIOR&=0X0F;//設置AD特殊功能IO寄存器為連續轉換模式;
ADCSRA|=0X40;
}
uint readadcdata()
{
uchar a;
uint b;
DDRA&=~BIT(3);
PORTA&=~BIT(3);
a=ADCL;
b=ADCH;
b=b<<8|a;
return(b);
}
/////////////IIC 24c02///////////
void iicinit() //IIC總線初始化;
{
TWBR=12;
TWSR=1;
TWCR|=0X04;
}
void iic24c02_write(uchar com,uchar com1,uchar dat)
{
uchar j;
TWCR = (1<<TWINT)|(1<<TWSTA)|
(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
//if ((TWSR & 0xF8) != START)
//ERROR();
TWDR=com;
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
//if ((TWSR & 0xF8) != MT_SLA_ACK)
//ERROR();
TWDR = com1;
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
//if ((TWSR & 0xF8) != MT_DATA_ACK)
//ERROR();
for(j=0;j<4;j++)
{
TWDR =dat;
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
}
TWCR = (1<<TWINT)|(1<<TWEN)|
(1<<TWSTO);
}
uchar iic24c02_read(uchar com1)
{
uchar j,dat;
TWCR = (1<<TWINT)|(1<<TWSTA)|
(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
TWDR=0xae;
TWCR = (1<<TWINT) | (1<<TWEN)|(1<<TWEA);
while (!(TWCR & (1<<TWINT)));
TWDR =com1;
TWCR = (1<<TWINT) | (1<<TWEN)|(1<<TWEA);
while (!(TWCR & (1<<TWINT)));
TWCR|= (1<<TWINT)|(1<<TWSTA)|
(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
TWDR=0xaf;
TWCR = (1<<TWINT) | (1<<TWEN)|(1<<TWEA);
while (!(TWCR & (1<<TWINT)));
for(j=0;j<4;j++)
{
TWCR = (1<<TWINT) | (1<<TWEN)|(1<<TWEA);
while (!(TWCR & (1<<TWINT)));
dat=TWDR;
}
TWCR = (1<<TWINT)|(1<<TWEN)|
(1<<TWSTO);
return dat;
}
//////////// IIC PCF8591 /////////
void PCF8591DA(uchar com,uchar com1,uchar dat)
{
uchar j;
TWCR = (1<<TWINT)|(1<<TWSTA)|
(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
//if ((TWSR & 0xF8) != START)
//ERROR();
TWDR=com;
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
//if ((TWSR & 0xF8) != MT_SLA_ACK)
//ERROR();
TWDR = com1;
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
//if ((TWSR & 0xF8) != MT_DATA_ACK)
//ERROR();
for(j=0;j<4;j++)
{
TWDR =dat;
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
}
TWCR = (1<<TWINT)|(1<<TWEN)|
(1<<TWSTO);
}
void main()
{
uchar out,yue,ri,si,peng,miao;
uint wandu,v;
uint dat=352;
dat/=315;
DDRC|=BIT(7);
PORTC&=~BIT(7);
adcinit();
LCDinit();
iicinit();
if(!b20rtset())
while(!(DQIN()));
b20write(0xcc);
b20write(0x4e);
b20write(0xff);
b20write(0xff);
b20write(0x7f);
out=iic24c02_read(0);
while(1)
{
//yue=ds1302read(0x89);
//ri=ds1302read(0x87);
si=ds1302read(0x85);
peng=ds1302read(0x83);
miao=ds1302read(0x81);
wandu=b20readdat();
v=readadcdata();
PCF8591DA(0x90,0x40,out);
LCDwritecom(0x80);
LCDwritedat(' ');
LCDwritedat(suzhu[(si>>4)&0x03]);
LCDwritedat(suzhu[si&0x0f]);
LCDwritedat(':');
LCDwritedat(suzhu[(peng>>4)&0x07]);
LCDwritedat(suzhu[peng&0x0f]);
LCDwritedat(':');
LCDwritedat(suzhu[(miao>>4)&0x07]);
LCDwritedat(suzhu[miao&0x0f]);
LCDwritedat(' ');
LCDwritedat(suzhu[((wandu>>4)&0x7f)%100/10]);
LCDwritedat(suzhu[((wandu>>4)&0x7f)%10]);
LCDwritedat('.');
LCDwritedat(suzhu[(wandu&0x0f)*6/10]);
LCDwritedat('C');
LCDwritedat(' ');
LCDwritecom(0x80+0x40);
LCDwritedat(' ');
LCDwritedat('o');
LCDwritedat('u');
LCDwritedat('t');
LCDwritedat(suzhu[out/50]);
LCDwritedat('.');
LCDwritedat(suzhu[out%50/5]);
LCDwritedat('v');
LCDwritedat(' ');
LCDwritedat('i');
LCDwritedat('n');
LCDwritedat(suzhu[v/204]);
LCDwritedat('.');
LCDwritedat(suzhu[v%204/20]);
LCDwritedat('v');
LCDwritedat(' ');
asm("nop");
if(PIND&BIT(2)&&out<255)
{
out++;
if(out%50%5==0)
iic24c02_write(0xae,0,out);
}
if(PIND&BIT(3)&&out>0)
{
out--;
if(out%50%5==0)
iic24c02_write(0xae,0,out);
}
}
}
|
|