找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3961|回复: 3
收起左侧

AVR单片机C语言程序

[复制链接]
ID:76127 发表于 2015-4-8 21:16 | 显示全部楼层 |阅读模式
单片机 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);
  }
}

}



回复

使用道具 举报

ID:64696 发表于 2015-4-9 10:55 | 显示全部楼层
谢谢分享!!!
回复

使用道具 举报

ID:76704 发表于 2015-4-18 22:07 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:78178 发表于 2015-4-29 06:43 | 显示全部楼层
楼主写程序都不带释义的么?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表