| | mega8+1602+1302+18b20做的电子万年历 编程环境是cvavr
 还望各位高手多多指点
 
 先上图
 
  (原文件名:20100404001.jpg)
 
 
  (原文件名:20100404002.jpg)
 
 
  (原文件名:20100404003.jpg)
 
 
  (原文件名:20100404009.jpg)
 
 
  (原文件名:20100404010.jpg)
 
 
  (原文件名:20100404011.jpg)
 
 
  (原文件名:20100404012.jpg)
 
 
 
 
 
 1602
 
 
 #define RS  PORTD.7
 #define RW  PORTD.6
 #define EN  PORTD.5
 #define LCD_DAT PORTC
 
 
 unsigned char lcd_buffer[];
 void wr_lcd_inf(unsigned char com,unsigned char inf)
 {
 unsigned char com_temp,data_temp;
 DDRD=0b11100001;//lcd控制引脚
 if(com==0)
 {
 delay_ms(3);
 RS=0;
 RW=0;
 EN=0;
 DDRC=0x0f;//lcd数据引脚
 com_temp=inf;
 LCD_DAT=0x0f&com_temp>>4;//消除对PORTC.4的影响
 EN=1;
 EN=0;
 com_temp=inf;
 LCD_DAT=0x0f&com_temp;
 EN=1;
 EN=0;
 }
 else
 {
 delay_ms(3);
 RS=1;
 RW=0;
 EN=0;
 DDRC=0x0f;//lcd数据引脚
 data_temp=inf;
 LCD_DAT=0x0f&data_temp>>4;
 EN=1;
 EN=0;
 data_temp=inf;
 LCD_DAT=0x0f&data_temp;
 EN=1;
 EN=0;
 }
 }
 
 void wr_address(unsigned char x,unsigned char y)
 {
 unsigned char address;
 if(y>0)
 address=0xc0+x;
 else
 address=0x80+x;
 wr_lcd_inf(0,address);
 }
 
 void wr_lcd_word(unsigned char x,unsigned char y,unsigned char s)
 {
 wr_address(x,y);
 wr_lcd_inf(1,s);
 }
 
 void wr_lcd_string(unsigned char x,unsigned char y,unsigned char *s)
 {
 wr_address(x,y);
 while(*s)
 {
 wr_lcd_inf(1,*s);
 s++;
 }
 }
 
 void lcd_init()
 {
 wr_lcd_inf(0,0x28);//设置为4线,2行,5*7字型
 wr_lcd_inf(0,0x06);//AC+1
 wr_lcd_inf(0,0x0c);//开启显示屏,光标关闭,不闪烁
 wr_lcd_inf(0,0x01);//清楚显示屏
 }
 
 
 18b20
 
 
 
 #define  TEMP_DAT PORTD.4
 
 unsigned char buffer[];//显示字符串缓存
 unsigned char temper[5];
 
 void ds18b20_init(void)
 {
 TEMP_DAT=1;
 DDRD.4=0;
 delay_us(50);
 TEMP_DAT=0;
 DDRD.4=1;//设置输出口
 delay_us(900);
 TEMP_DAT=1;
 DDRD.4=0;//设置输出口
 delay_us(50);
 while(PIND.4)
 {
 wr_lcd_inf(0,0x01);
 sprintf(buffer,"no ds18b20");
 wr_lcd_string(2,0,buffer);
 }
 delay_us(500);
 TEMP_DAT=1;
 DDRD.4=0;
 }
 
 void wr_ds18b20_dat(unsigned char ds18b20_dat)//写数据
 {
 unsigned char i;
 for(i=0;i<8;i++)
 {
 TEMP_DAT=1;
 DDRD.4=1;
 delay_us(10);
 TEMP_DAT=0;
 delay_us(10);
 TEMP_DAT=0x1&ds18b20_dat;//与
 delay_us(60);
 ds18b20_dat=ds18b20_dat>>1;
 }
 TEMP_DAT=1;
 DDRD.4=1;
 delay_us(30);
 }
 
 unsigned char re_ds18b20_dat()
 {
 unsigned char i,ds18b20_dat=0;
 for(i=0;i<8;i++)
 {
 TEMP_DAT=1;
 DDRD.4=1;
 delay_us(10);
 ds18b20_dat=ds18b20_dat>>1;
 TEMP_DAT=0;
 DDRD.4=1;
 delay_us(10);
 TEMP_DAT=1;
 DDRD.4=0;
 delay_us(10);
 if(PIND.4)
 {
 ds18b20_dat=0x80|ds18b20_dat;
 }
 delay_us(60);
 }
 TEMP_DAT=1;
 DDRD.4=1;
 delay_us(30);
 return ds18b20_dat;
 }
 
 void set_ds18b20()//设定精度
 {
 ds18b20_init();
 wr_ds18b20_dat(0xcc);
 wr_ds18b20_dat(0x4e);
 wr_ds18b20_dat(0x00);
 wr_ds18b20_dat(0x00);
 wr_ds18b20_dat(0x7f);//精度为12位
 }
 
 unsigned int get_ds18b20()
 {
 unsigned char teml,temh,wm;
 unsigned int warm, cold;
 set_ds18b20();
 ds18b20_init();
 wr_ds18b20_dat(0xcc);
 wr_ds18b20_dat(0x44);//开始转换
 delay_ms(1000);
 ds18b20_init();
 wr_ds18b20_dat(0xcc);//跳过ROM
 wr_ds18b20_dat(0xbe);//读可擦写芯片(9 byte)
 teml=re_ds18b20_dat();//低8位
 temh=re_ds18b20_dat();//高8位
 wm=temh;
 wm=wm>>7;
 if(!wm)
 {
 temh&=0b00000111;
 warm=(unsigned int)((temh*256+teml)*0.0625*100);
 return warm;
 
 }
 else
 {
 temh&=0b00000111;
 cold=(unsigned int)((~(temh*256+teml)+1)*0.0625*100);
 cold+=20000; //0下-号显示标记
 return cold;
 }
 
 }
 
 void trans_ds18b20()
 {
 unsigned int T;
 T=get_ds18b20();
 temper[0]=T/10000+48;
 temper[1]=T/1000%10+48;
 temper[2]=T/100%10+48;
 temper[3]=T/10%10+48;
 temper[4]=T%10+48;
 }
 
 
 
 1302
 
 
 #define SCLK PORTB.0
 #define RST PORTB.1
 #define IO PORTB.2
 
 unsigned char time[8];
 
 void ds1302_wdat(unsigned char ds1302_wdat)
 {
 unsigned char i;
 for(i=0;i<8;i++)
 {
 IO=0;
 DDRB.2=1;
 SCLK=0;
 DDRB.0=1;
 if(ds1302_wdat&0x01)//与
 IO=1;
 SCLK=1;
 ds1302_wdat=ds1302_wdat>>1;
 }
 }
 
 unsigned char ds1302_rdat()
 {
 unsigned char i,ds1302_dat=0;
 for(i=0;i<8;i++)
 {
 DDRB.2=0;
 IO=1;
 DDRB.0=1;
 SCLK=1;
 SCLK=0;
 ds1302_dat=ds1302_dat>>1;
 if(PINB.2)
 ds1302_dat=ds1302_dat|0b10000000;//或
 }
 return(ds1302_dat);
 }
 
 unsigned char re_ds1302(unsigned char ds1302_address)
 {
 unsigned char ds1302_dat;
 DDRB.1=1;
 RST=0;
 DDRB.0=1;
 SCLK=0;
 RST=1;
 ds1302_wdat(ds1302_address);
 ds1302_dat=ds1302_rdat();
 RST=0;
 return(ds1302_dat);
 }
 
 void wr_ds1302(unsigned char ds1302_address,unsigned char ds1302_dat)
 {
 DDRB.1=1;
 RST=0;
 DDRB.0=1;
 SCLK=0;
 RST=1;
 ds1302_wdat(ds1302_address);
 ds1302_wdat(ds1302_dat);
 RST=0;
 }
 
 /*
 void set_ds1302()
 {
 wr_ds1302(0x8e,0x00);
 ds1302_wdat(0xbe);
 ds1302_wdat(0x50);
 ds1302_wdat(0x00);
 ds1302_wdat(0x00);
 ds1302_wdat(0x02);
 ds1302_wdat(0x04);
 ds1302_wdat(0x05);
 ds1302_wdat(0x10);
 ds1302_wdat(0x8e);
 }
 */
 
 void set_ds1302()
 {
 wr_ds1302(0x8e,0x80);
 wr_ds1302(0x80,0x50);
 wr_ds1302(0x82,0x59);
 wr_ds1302(0x84,0x22);
 wr_ds1302(0x86,0x02);
 wr_ds1302(0x88,0x04);
 wr_ds1302(0x8a,0x05);
 wr_ds1302(0x8c,0x10);
 wr_ds1302(0x8e,0x80);
 wr_ds1302(0x90,0xab);
 }
 
 
 void read_ds1302()
 {
 time[0]=re_ds1302(0x81);//秒
 time[1]=re_ds1302(0x83);//分
 time[2]=re_ds1302(0x85);//小时
 time[3]=re_ds1302(0x87);//日期
 time[4]=re_ds1302(0x89);//月份
 time[5]=re_ds1302(0x8b);//星期
 time[6]=re_ds1302(0x8d);//年份
 }
 
 还没有写按键程序
 
 下面是pcb和程序
 点击此处下载 ourdev_543690.rar(文件大小:17K) (原文件名:avr mega8数字表.rar)
 点击此处下载 ourdev_543691.rar(文件大小:94K) (原文件名:mega8.rar)
 | 
 
 
 
 
 
 |