搜索
bottom↓
回复: 47

我做的万年历(m8 1302 18b20 1602)

[复制链接]

出0入0汤圆

发表于 2010-4-4 21:34:09 | 显示全部楼层 |阅读模式
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)

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入134汤圆

发表于 2010-4-5 00:35:50 | 显示全部楼层
棒est!

出0入0汤圆

发表于 2010-4-5 06:37:55 | 显示全部楼层
记号

出0入0汤圆

发表于 2010-4-5 09:01:42 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-6 11:04:42 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-6 11:42:42 | 显示全部楼层
记号

出0入0汤圆

发表于 2010-4-6 12:50:16 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-6 16:06:06 | 显示全部楼层
记下!

出0入0汤圆

发表于 2010-4-6 16:15:16 | 显示全部楼层
楼主 很猛啊, 我也想做一个,不知楼主可否指教一二呢?
  先谢谢啦。

出0入21汤圆

发表于 2010-4-6 16:16:11 | 显示全部楼层
楼主真有钱,下载器都做俩,用一个看一个!

出0入0汤圆

发表于 2010-4-6 16:19:40 | 显示全部楼层
不错!Mark!

出0入0汤圆

发表于 2010-4-6 20:13:51 | 显示全部楼层
回复【楼主位】b57203493
-----------------------------------------------------------------------

牛》

出0入0汤圆

发表于 2010-4-6 20:22:31 | 显示全部楼层
mark!!!
热转印做得很漂亮

出0入0汤圆

发表于 2010-4-6 23:17:53 | 显示全部楼层
void set_ds1302()
{
    wr_ds1302(0x8e,0x80);  //这里应该写0x00吧
    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);      
}

出0入0汤圆

 楼主| 发表于 2010-4-7 08:20:18 | 显示全部楼层
回复【13楼】zj_t
void set_ds1302()  
{  
    wr_ds1302(0x8e,0x80);  //这里应该写0x00吧
    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 set_ds1302()  
{  
    wr_ds1302(0x8e,0x00);    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);      
}

出0入0汤圆

发表于 2010-4-8 18:10:32 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-8 22:02:25 | 显示全部楼层
日期后面再加个星期比较好。

出0入0汤圆

发表于 2010-4-8 22:03:48 | 显示全部楼层
刚刚完成1302的编程,正需要CV写的18B20程序,谢谢楼主。

出0入0汤圆

发表于 2010-4-13 21:41:37 | 显示全部楼层
我也是再弄按键程序啊 很难弄

出70入0汤圆

发表于 2010-4-15 10:33:20 | 显示全部楼层
楼主,wr_lcd_inf(1,223); wr_lcd_inf(1,'C'); 这是温度单位吗?223好像已经超出ASCII的值了吧?

出0入0汤圆

 楼主| 发表于 2010-4-16 14:58:12 | 显示全部楼层
回复【19楼】gshuang1
-----------------------------------------------------------------------


(原文件名:截图1271400896.png)
233是是温度符号的那个圈,它与字母“c”组成温度符号

出0入0汤圆

发表于 2010-4-16 15:09:59 | 显示全部楼层
楼主:那个蜂鸣器下面的IC是做什么的? 与按键预处理有关?

出0入0汤圆

 楼主| 发表于 2010-4-16 19:51:14 | 显示全部楼层
回复【21楼】ldj7501
-----------------------------------------------------------------------

148是编码器,8线3线。
gs触发中断,中断扫描按键。

出0入0汤圆

发表于 2010-4-17 09:51:20 | 显示全部楼层
不错,顶一下。

出0入0汤圆

发表于 2010-4-17 12:57:41 | 显示全部楼层
楼主能否给下载器的资料我

出0入0汤圆

发表于 2010-4-18 00:08:20 | 显示全部楼层
真是强悍啊 顶

出0入0汤圆

发表于 2010-4-21 18:09:27 | 显示全部楼层
猛泰太!

出0入0汤圆

发表于 2010-4-22 12:03:39 | 显示全部楼层
楼主,pcb能不能转一下格式啊,我用的protel99se打不开啊

出0入0汤圆

发表于 2010-4-22 12:27:59 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-22 12:40:08 | 显示全部楼层
时间精确么

出0入0汤圆

发表于 2010-4-27 17:07:46 | 显示全部楼层
这个覆铜板做的太漂亮了

出0入0汤圆

 楼主| 发表于 2010-5-2 19:35:55 | 显示全部楼层
终于写完了
2级菜单+调时+温度报警+高低温记录+闹铃+闹铃设定+报警温度设定
献丑
点击此处下载 ourdev_551131.rar(文件大小:184K) (原文件名:mega8.rar)

/*****************************************************
This program was produced by the
CodeWizardAVR V2.03.4 Standard
Automatic Program Generator
?Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    : 2010-5-1
Author  : bianbo
Company :
Comments:


Chip type           : ATmega8L
Program type        : Application
Clock frequency     : 8.000000 MHz
Memory model        : Small
External RAM size   : 0
Data Stack size     : 256
//PB0-PB7:PB0-DS1302_SCLK,PB1-DS1302_/RST,PB2-DS1302_I/O,PB3-MOSI,PB4-MISO,PB5-SCK
//PC0-PC6:PC0-LCM1602_D4,PC1-LCM1602_D5,PC2-LCM1602_D6,PC3-LCM1602_D7,PC4-BEEP,PC6-REST
//PD0-PD7:PD0-LCM1602_LED,PD1-OUT1,PD2-OUT0,PD3-GS,PD4-TEMP_DAT,PD5-LCM1602_RE,PD6-LCM1602_RW,PD7-LCM1602_RS
*****************************************************/

#include <mega8.h>
#include <delay.h>
#include <stdio.h>
#include <lcd1602.c>
#include <ds18b20.c>
#include <ds1302.c>


unsigned char menu_num,num2,num3,i,start,page,point,select,max_time[7],min_time[7],MAX=31,MIN=29,alarm_hour=19,alarm_minute=22;
unsigned int max_temper,min_temper;
unsigned char key();//键盘扫描


interrupt [EXT_INT1] void ext_int1_isr(void)
{
    delay_ms(80);//消除毛刺
    if( start==0)
    {
        start=1;
        while(PIND.3==0);
    }
    else
    {
        if(PIND.3==0)
        {
            switch(key())
            {  
            case 0b00000110:
                while(PIND.3==0);
                PORTD.0=~PORTD.0;
                break;
            case 0b00000010:
                while(PIND.3==0);
                num2++;
                break;
            case 0b00000100:
                while(PIND.3==0);
                num3++;
                break;
            case 0b00000000:
                while(PIND.3==0);
                select=0;
                break;
            }
        };  
    }
}


unsigned char key()//键盘扫描
{
    unsigned char temp_portd;
    DDRD=DDRD&0b111110011;
    temp_portd=PIND&0b00000110;
    return (temp_portd);
}

void temper_warning()
{
    unsigned char tem;
    tem=(temper[1]-48)*10+(temper[2]-48);
    if(temper[0]==49)
    {
        sprintf(lcd_buffer,"hot");
        wr_lcd_string(13,1,lcd_buffer);
        PORTC.4=1;   
    }
    else
    {
        if(temper[0]==50)
        {
            sprintf(lcd_buffer,"cold");
            wr_lcd_string(12,1,lcd_buffer);
            PORTC.4=1;
        }
        else
        {
            if(tem<MAX&tem>MIN)
            {
                sprintf(lcd_buffer,"    ");
                wr_lcd_string(12,1,lcd_buffer);
                 PORTC.4=0;
            }
            else
            {
                if(tem>=MAX)
                {
                    sprintf(lcd_buffer,"hot");
                    wr_lcd_string(13,1,lcd_buffer);
                    PORTC.4=1;
                }
                else
                {
                    sprintf(lcd_buffer,"cold");
                    wr_lcd_string(12,1,lcd_buffer);
                    PORTC.4=1;   
                }
            }
        }
                           
    }      
}

void time_alarm()
{
    trans_ds1302();
    if(tr_time[2]==alarm_hour&&tr_time[1]==alarm_minute)
    PORTC.4=1;
}

void dis_time()
{
    unsigned char TH,TL;
    wr_lcd_word(1,0,'2');
    wr_lcd_word(2,0,'0');
    wr_lcd_word(5,0,'-');
    wr_lcd_word(8,0,'-');
    wr_lcd_word(6,1,':');
    wr_lcd_word(9,1,':');                     
    TH=((time[0]&0x70)>>4)%10+48;//秒译码,消除CH
    TL=(time[0]&0x0f)%10+48;
    wr_address(10,1);
    wr_lcd_inf(1,TH);
    wr_lcd_inf(1,TL);
    TH=((time[1]&0xf0)>>4)%10+48;//分译码
    TL=(time[1]&0x0f)%10+48;
    wr_address(7,1);
    wr_lcd_inf(1,TH);
    wr_lcd_inf(1,TL);
    TH=((time[2]&0xf0)>>4)%10+48;//时译码
    TL=(time[2]&0x0f)%10+48;
    wr_address(4,1);
    wr_lcd_inf(1,TH);
    wr_lcd_inf(1,TL);
    TH=((time[3]&0xf0)>>4)%10+48;//日译码
    TL=(time[3]&0x0f)%10+48;
    wr_address(9,0);
    wr_lcd_inf(1,TH);
    wr_lcd_inf(1,TL);
    TH=((time[4]&0xf0)>>4)%10+48;//月译码
    TL=(time[4]&0x0f)%10+48;
    wr_address(6,0);
    wr_lcd_inf(1,TH);
    wr_lcd_inf(1,TL);
    TL=(time[5]&0x0f)%10+48;//星期译码
    wr_address(12,0);
    switch(TL)
    {
        case '7':
            sprintf(lcd_buffer,"SUN");
            wr_lcd_string(12,0,lcd_buffer);
            break;
        case '1':
            sprintf(lcd_buffer,"MON");
            wr_lcd_string(12,0,lcd_buffer);
            break;
        case '2':
            sprintf(lcd_buffer,"TUES");
            wr_lcd_string(12,0,lcd_buffer);
            break;
        case '3':
            sprintf(lcd_buffer,"WED");
            wr_lcd_string(12,0,lcd_buffer);
            break;
        case '4':
            sprintf(lcd_buffer,"THURS");
            wr_lcd_string(12,0,lcd_buffer);
            break;
        case '5':
            sprintf(lcd_buffer,"FRI");
            wr_lcd_string(12,0,lcd_buffer);
            break;
        case '6':
            sprintf(lcd_buffer,"SAT");
            wr_lcd_string(12,0,lcd_buffer);
            break;
    }
    TH=((time[6]&0xf0)>>4)%10+48;//年译码
    TL=(time[6]&0x0f)%10+48;
    wr_address(3,0);
    wr_lcd_inf(1,TH);
    wr_lcd_inf(1,TL);   
}

void main(void)
{   
    PORTB=0x00;
    DDRB=0x00;
    PORTC=0x00;
    DDRC=0x00;
    PORTD=0x00;
    DDRD=0x00;
    PORTD.0=0;
    DDRD.0=1;//背光i/o设为输入输出口
    DDRC.4=1;//蜂鸣器i/o设为输入输出口
    PORTD.0=0;
//************************************************************************************************   
    GICR|=0x80;//中断开
    MCUCR=0x80;//中断触发方式
    GIFR=0x80;//中断标志位
    #asm("sei")//开放全局中断
    set_ds1302();
    lcd_init();
    start=0;
    sprintf(lcd_buffer,"HELLO!");
    wr_lcd_string(5,0,lcd_buffer);
    sprintf(lcd_buffer,"Press Any Key To Continue! ");
    while(1)
    {
        unsigned char i,j=0;
        for(i=0;i<28;i++)
        {   
            wr_address(0,1);
            while(lcd_buffer[j])
            {
                wr_lcd_inf(1,lcd_buffer[j++]);
                if(start==1)
                {
                    break;
                }
            }
            delay_ms(500);
            j=i;
            if(start==1)
                break;
        };
        if(start==1)
        {
            wr_lcd_inf(0,0x01);//清屏
            break;
        }
    };
//************************************************************************************************
    #asm("cli");//关闭全局中断

    sprintf(lcd_buffer," By Ma Zhanwang");
    wr_lcd_string(0,0,lcd_buffer);
    sprintf(lcd_buffer,"Wait!");
    wr_lcd_string(0,1,lcd_buffer);
    wr_address(5,1);
    for(i=0;i<12;i++)
    {
        wr_lcd_inf(1,0xa5);
        delay_ms(500);   
    }
    wr_lcd_inf(0,0x01);//清屏
//************************************************************************************************
    sprintf(lcd_buffer,"1.Temperature  2.Time         3.Tem Recorder 4.Time Set     5.Tem Alarm S  6.Time Alarm S ");
    page=0;
    point=0;
    menu_num=1;
    select=0;   
    while(1)
    {
        wr_lcd_full(1,15,lcd_buffer+page);
        wr_lcd_word(0,point,'*');
        wr_lcd_word(0,~point,' ');
        if(select==1)
        {
            wr_lcd_inf(0,0x01);//清屏
            if(menu_num==1)//菜单1
            {
                sprintf(lcd_buffer,"Temperature");
                wr_lcd_string(2,0,lcd_buffer);
                num2=0;
                num3=0;
                GICR|=0x80;//中断开
                MCUCR=0x80;//中断触发方式
                GIFR=0x80;//中断标志位
                #asm("sei")//开放全局中断
                while(1)
                {
                    trans_ds18b20(get_ds18b20());
                    if(num2==1)
                    {
                        wr_lcd_word(1,1,'^');
                        temper_warning();
                    }
                    if(num2==2)
                    {
                        PORTC.4=0;
                        num2=0;
                        wr_lcd_word(1,1,' ');
                        wr_address(12,1);
                        wr_lcd_inf(1,' ');
                        wr_lcd_inf(1,' ');
                        wr_lcd_inf(1,' ');
                        wr_lcd_inf(1,' ');
                    }
                    wr_address(3,1);
                    if(temper[0]==49)
                        wr_lcd_inf(1,temper[0]);
                    else
                    {
                        if(temper[0]==50)
                            wr_lcd_inf(1,'-');
                        else
                            wr_lcd_inf(1,' ');
                    }   
                    wr_lcd_inf(1,temper[1]);
                    wr_lcd_inf(1,temper[2]);
                    wr_lcd_inf(1,'.');//小数点
                    wr_lcd_inf(1,temper[3]);
                    wr_lcd_inf(1,temper[4]);
                    wr_lcd_inf(1,223);
                    wr_lcd_inf(1,'C');
                    if(select==0)
                    {
                        #asm("cli");//关闭全局中断
                        PORTC.4=0;
                        wr_lcd_inf(0,0x01);//清屏
                        sprintf(lcd_buffer,"1.Temperature  2.Time         3.Tem Recorder 4.Time Set     5.Tem Alarm S  6.Time Alarm S ");
                        break;   
                    }
                }
            }
            else if(menu_num==2)//菜单2
            {
                num2=0;
                num3=0;
                GICR|=0x80;//中断开
                MCUCR=0x80;//中断触发方式
                GIFR=0x80;//中断标志位
                #asm("sei")//开放全局中断
                while(1)
                {
                    read_ds1302();
                    if(num2==1)
                    {
                        wr_lcd_word(2,1,'&');
                        time_alarm();
                        if(num3==1)
                        {
                            num3=0;
                            ++alarm_minute;
                            PORTC.4=0;
                        }
                    }
                    if(num2==2)
                    {
                        PORTC.4=0;
                        wr_lcd_word(2,1,' ');
                        num2=0;
                    }
                    
                    dis_time();
                    if(select==0)
                    {
                        #asm("cli");//关闭全局中断
                        wr_lcd_inf(0,0x01);//清屏
                        sprintf(lcd_buffer,"1.Temperature  2.Time         3.Tem Recorder 4.Time Set     5.Tem Alarm S  6.Time Alarm S ");
                        break;   
                    }
                }
            }
            else if(menu_num==3)//菜单3
            {
                GICR|=0x80;//中断开
                MCUCR=0x80;//中断触发方式
                GIFR=0x80;//中断标志位
                #asm("sei")//开放全局中断
                sprintf(lcd_buffer,"MAX:");
                wr_lcd_string(0,0,lcd_buffer);
                sprintf(lcd_buffer,"MIN:");
                wr_lcd_string(0,1,lcd_buffer);
                max_temper=get_ds18b20();
                min_temper=get_ds18b20();
                read_ds1302();
                for(i=0;i<6;i++)
                {
                    max_time=time;     
                };
                for(i=0;i<6;i++)
                {
                    min_time=time;     
                };
                num2=0;
                num3=0;
                while(1)
                {
                    unsigned int T;
                    T=get_ds18b20();
                    if(T>max_temper)
                    {
                        max_temper=T;
                        read_ds1302();
                        for(i=0;i<6;i++)
                        {
                            max_time=time;   
                        }
                    };
                    if(T<min_temper)
                    {
                        min_temper=T;
                        for(i=0;i<6;i++)
                        {
                            min_time=time;   
                        }   
                    };
                    for(i=0;i<2;i++)
                    {
                        if(!i)
                            trans_ds18b20(max_temper);
                        else
                            trans_ds18b20(min_temper);
                        wr_address(4,i);
                        if(temper[0]==49)
                            wr_lcd_inf(1,temper[0]);
                        else if(temper[0]==50)
                            wr_lcd_inf(1,'-');
                        else
                            wr_lcd_inf(1,' ');   
                        wr_lcd_inf(1,temper[1]);
                        wr_lcd_inf(1,temper[2]);
                        wr_lcd_inf(1,'.');//小数点
                        wr_lcd_inf(1,temper[3]);
                        wr_lcd_inf(1,temper[4]);
                        wr_lcd_inf(1,223);
                        wr_lcd_inf(1,'C');
                    }
                    if(num2)
                    {
                        wr_lcd_inf(0,0x01);//清屏
                        for(i=0;i<6;i++)
                        {
                            time=max_time;   
                        }
                        while(num2)
                        {
                            dis_time();
                            if(num2==2)
                                num2=0;
                                num3=0;
                        }
                        wr_lcd_inf(0,0x01);//清屏
                    }
                    if(num3)
                    {
                        wr_lcd_inf(0,0x01);//清屏
                        for(i=0;i<6;i++)
                        {
                            time=min_time;   
                        }
                        while(num3)
                        {
                            dis_time();
                            if(num3==2)
                                num3=0;
                                num2=0;
                        }
                        wr_lcd_inf(0,0x01);//清屏
                    }
                    sprintf(lcd_buffer,"MAX:");
                    wr_lcd_string(0,0,lcd_buffer);
                    sprintf(lcd_buffer,"MIN:");
                    wr_lcd_string(0,1,lcd_buffer);
                    if(select==0)
                    {
                        #asm("cli");//关闭全局中断
                        wr_lcd_inf(0,0x01);//清屏
                        sprintf(lcd_buffer,"1.Temperature  2.Time         3.Tem Recorder 4.Time Set     5.Tem Alarm S  6.Time Alarm S ");
                        break;   
                    }
                }            
            }
            else if(menu_num==4)//菜单4
            {
                unsigned char TH,TL;
                wr_ds1302(0x8e,0x00);//0x80禁止写入,0x00允许写入
                read_ds1302();
                trans_ds1302();
                dis_time();
                num2=0;
                num3=0;
                GICR|=0x80;//中断开
                MCUCR=0x80;//中断触发方式
                GIFR=0x80;//中断标志位
                #asm("sei")//开放全局中断
                while(1)
                {
                    if(num2==1)//年
                    {
                        time[0]=re_ds1302(0x81);//秒
                        wr_ds1302(0x80,time[0]|0x80);//停止振荡
                        num3=tr_time[6];
                        while(num2==1)
                        {
                            wr_lcd_word(3,0,' ');
                            wr_lcd_word(4,0,' ');
                            delay_ms(300);
                            if(num3>99) num3=1;
                            tr_time[6]=num3;
                            TH=tr_time[6]/10+48;//年译码
                            TL=tr_time[6]%10+48;
                            wr_address(3,0);
                            wr_lcd_inf(1,TH);
                            wr_lcd_inf(1,TL);
                            delay_ms(200);
                        }
                        time[6]=((TH-48)<<4)|(TL-48);
                        wr_ds1302(0x8c,time[6]);//年,高四位年十位,第四位年个位
                    }
                    else if(num2==2)//月
                    {
                        num3=tr_time[4];
                        while(num2==2)
                        {
                            wr_lcd_word(6,0,' ');
                            wr_lcd_word(7,0,' ');
                            delay_ms(300);
                            if(num3>12) num3=1;
                            tr_time[4]=num3;
                            TH=tr_time[4]/10+48;//月译码
                            TL=tr_time[4]%10+48;
                            wr_address(6,0);
                            wr_lcd_inf(1,TH);
                            wr_lcd_inf(1,TL);
                            delay_ms(200);
                        }
                        time[4]=((TH-48)<<4)|(TL-48);
                        wr_ds1302(0x88,time[4]);//月,第4秒十位,后四月分个位   
                    }
                    else if(num2==3)//日
                    {
                        unsigned char max_dat;
                        time[4]=re_ds1302(0x89);//月份
                        time[6]=re_ds1302(0x8d);//年份
                        tr_time[4]=((time[4]&0x10)>>4)*10+(time[4]&0x0f);//月份
                        tr_time[6]=((time[6]&0xf0)>>4)*10+(time[6]&0x0f);//年份
                        switch(tr_time[4])
                        {
                            case 1:
                                max_dat=31;
                                break;
                            case 2:
                                if(tr_time[6]%4==0)
                                    max_dat=29;
                                else
                                    max_dat=28;
                                break;
                            case 3:
                                max_dat=31;
                                break;
                            case 4:
                                max_dat=30;
                                break;
                            case 5:
                                max_dat=31;
                                break;
                            case 6:
                                max_dat=30;
                                break;
                            case 7:
                                max_dat=31;
                                break;
                            case 8:
                                max_dat=31;
                                break;
                            case 9:
                                max_dat=30;
                                break;
                            case 10:
                                max_dat=31;
                                break;
                            case 11:
                                max_dat=30;
                                break;
                            case 12:
                                max_dat=31;
                                break;
                        }
                        num3=tr_time[3];
                        while(num2==3)
                        {
                            wr_lcd_word(9,0,' ');
                            wr_lcd_word(10,0,' ');
                            delay_ms(300);
                            if(num3>max_dat) num3=1;
                            tr_time[3]=num3;
                            TH=tr_time[3]/10+48;//月译码
                            TL=tr_time[3]%10+48;
                            wr_address(9,0);
                            wr_lcd_inf(1,TH);
                            wr_lcd_inf(1,TL);
                            delay_ms(200);
                        }
                        time[3]=((TH-48)<<4)|(TL-48);
                        wr_ds1302(0x86,time[3]);//日,第5,4秒十位,后四位日个位        
                    }
                    else if(num2==4)//星期
                    {
                        num3=tr_time[5];
                        while(num2==4)
                        {
                            wr_lcd_word(12,0,' ');
                            wr_lcd_word(13,0,' ');
                            wr_lcd_word(14,0,' ');
                            wr_lcd_word(15,0,' ');
                            delay_ms(300);
                            if(num3>7) num3=1;
                            tr_time[5]=num3;
                            TH=tr_time[5]/10+48;
                            TL=tr_time[5]%10+48;
                            switch(tr_time[5])
                            {
                                case 7:
                                    sprintf(lcd_buffer,"SUN");
                                    wr_lcd_string(12,0,lcd_buffer);
                                    break;
                                case 1:
                                    sprintf(lcd_buffer,"MON");
                                    wr_lcd_string(12,0,lcd_buffer);
                                    break;
                                case 2:
                                    sprintf(lcd_buffer,"TUES");
                                    wr_lcd_string(12,0,lcd_buffer);
                                    break;
                                case 3:
                                    sprintf(lcd_buffer,"WED");
                                    wr_lcd_string(12,0,lcd_buffer);
                                    break;
                                case 4:
                                    sprintf(lcd_buffer,"THURS");
                                    wr_lcd_string(12,0,lcd_buffer);
                                    break;
                                case 5:
                                    sprintf(lcd_buffer,"FRI");
                                    wr_lcd_string(12,0,lcd_buffer);
                                    break;
                                case 6:
                                    sprintf(lcd_buffer,"SAT");
                                    wr_lcd_string(12,0,lcd_buffer);
                                    break;
                            }
                            delay_ms(200);
                        }
                        time[5]=((TH-48)<<4)|(TL-48);
                        wr_ds1302(0x8a,time[5]);//星期,后三位   
                    }
                    else if(num2==5)//时
                    {
                        num3=tr_time[2];
                        while(num2==5)
                        {
                            wr_lcd_word(4,1,' ');
                            wr_lcd_word(5,1,' ');
                            delay_ms(300);
                            if(num3>23) num3=0;
                            tr_time[2]=num3;
                            TH=tr_time[2]/10+48;
                            TL=tr_time[2]%10+48;
                            wr_address(4,1);
                            wr_lcd_inf(1,TH);
                            wr_lcd_inf(1,TL);
                            delay_ms(200);
                        }
                        time[2]=((TH-48)<<4)|(TL-48);
                        wr_ds1302(0x84,time[2]);//时,第7 位12/24 小时标志,bit7=1,12 小时模式,bit7=0,24 小时模式,第5 位:AM/PM 定义,AP=1 下午模式,AP=0 上午模式
                    }
                    else if(num2==6)//分
                    {
                        num3=tr_time[1];
                        while(num2==6)
                        {
                            wr_lcd_word(7,1,' ');
                            wr_lcd_word(8,1,' ');
                            delay_ms(300);
                            if(num3>59) num3=0;
                            tr_time[1]=num3;
                            TH=tr_time[1]/10+48;
                            TL=tr_time[1]%10+48;
                            wr_address(7,1);
                            wr_lcd_inf(1,TH);
                            wr_lcd_inf(1,TL);
                            delay_ms(200);
                        }
                        time[1]=((TH-48)<<4)|(TL-48);
                        wr_ds1302(0x82,time[1]);//分,第6,5,4秒十位,后四位分个位
                    }
                    else if(num2==7)//秒
                    {
                        num3=tr_time[0]&0x7f;
                        while(num2==7)
                        {
                            wr_lcd_word(10,1,' ');
                            wr_lcd_word(11,1,' ');
                            delay_ms(300);
                            if(num3>59) num3=0;
                            tr_time[0]=num3;
                            TH=tr_time[0]/10+48;
                            TL=tr_time[0]%10+48;
                            wr_address(10,1);
                            wr_lcd_inf(1,TH);
                            wr_lcd_inf(1,TL);
                            delay_ms(200);
                        }
                        time[0]=((TH-48)<<4)|(TL-48)|0x80;
                        wr_ds1302(0x80,time[0]);//秒,第7位ch=0工作允许,第6,5,4秒十位,后四位秒个位            
                    }
                    else if(num2==8)
                    {
                        time[0]=re_ds1302(0x81);//秒
                        wr_ds1302(0x80,time[0]&0x7f);//开始振荡
                        num2=0;
                    }
                    read_ds1302();
                    dis_time();
                    if(select==0)
                    {
                        #asm("cli");//关闭全局中断
                        wr_lcd_inf(0,0x01);//清屏
                        time[0]=re_ds1302(0x81);//秒
                        wr_ds1302(0x80,time[0]&0x7f);//开始振荡
                        wr_ds1302(0x8e,0x80);//0x80禁止写入,0x00允许写入
                        sprintf(lcd_buffer,"1.Temperature  2.Time         3.Tem Recorder 4.Time Set     5.Tem Alarm S  6.Time Alarm S ");
                        break;   
                    }
                }   
            }
            else if(menu_num==5)//菜单5
            {
                unsigned char MAX_TH,MAX_TL,MIN_TH,MIN_TL;
                sprintf(lcd_buffer,"Alarm Temperatue");
                wr_lcd_string(0,0,lcd_buffer);
                sprintf(lcd_buffer,"MAX:");
                wr_lcd_string(0,1,lcd_buffer);
                sprintf(lcd_buffer,"MIN:");
                wr_lcd_string(8,1,lcd_buffer);
                num2=0;
                num3=0;
                MAX_TH=MAX/10+48;
                MAX_TL=MAX%10+48;
                MIN_TH=MIN/10+48;
                MIN_TL=MIN%10+48;
                wr_address(5,1);
                wr_lcd_inf(1,MAX_TH);
                wr_lcd_inf(1,MAX_TL);
                wr_address(13,1);
                wr_lcd_inf(1,MIN_TH);
                wr_lcd_inf(1,MIN_TL);
                GICR|=0x80;//中断开
                MCUCR=0x80;//中断触发方式
                GIFR=0x80;//中断标志位
                #asm("sei")//开放全局中断
                while(1)
                {
                    if(num2==1)
                    {
                        num3=MAX_TH;
                        while(num2==1)
                        {
                            wr_lcd_word(5,1,' ');
                            delay_ms(300);
                            if(num3>57) num3=48;
                            MAX_TH=num3;
                            wr_lcd_word(5,1,MAX_TH);
                            delay_ms(200);
                        }
                        MAX=(MAX_TH-48)*10+(MAX_TL-48);
                    }
                    else if(num2==2)
                    {
                        num3=MAX_TL;
                        while(num2==2)
                        {
                            wr_lcd_word(6,1,' ');
                            delay_ms(300);
                            if(num3>57) num3=48;
                            MAX_TL=num3;
                            wr_lcd_word(6,1,MAX_TL);
                            delay_ms(200);
                        }
                        MAX=(MAX_TH-48)*10+(MAX_TL-48);
                    }
                    else if(num2==3)
                    {
                        num3=MIN_TH;
                        while(num2==3)
                        {
                            wr_lcd_word(13,1,' ');
                            delay_ms(300);
                            if(num3>57) num3=48;
                            MIN_TH=num3;
                            wr_lcd_word(13,1,MIN_TH);
                            delay_ms(200);
                        }
                        MIN=(MIN_TH-48)*10+(MIN_TL-48);
                    }
                    else if(num2==4)
                    {
                        num3=MIN_TL;
                        while(num2==4)
                        {
                            wr_lcd_word(14,1,' ');
                            delay_ms(300);
                            if(num3>57) num3=48;
                            MIN_TL=num3;
                            wr_lcd_word(14,1,MIN_TL);
                            delay_ms(200);
                        }
                        MIN=(MIN_TH-48)*10+(MIN_TL-48);
                    }
                    else if(num2==5)
                    {
                        num2=0;   
                    }
                    if(select==0)
                    {
                        #asm("cli");//关闭全局中断
                        wr_lcd_inf(0,0x01);//清屏
                        sprintf(lcd_buffer,"1.Temperature  2.Time         3.Tem Recorder 4.Time Set     5.Tem Alarm S  6.Time Alarm S ");
                        break;   
                    }
                }   
            }
            else if(menu_num==6)//菜单6
            {
                unsigned char H_TH,H_TL,M_TH,M_TL,H;
                sprintf(lcd_buffer,"Alarm Time");
                wr_lcd_string(3,0,lcd_buffer);
                wr_lcd_word(7,1,':');
                H_TH=alarm_hour/10+48;
                H_TL=alarm_hour%10+48;
                M_TH=alarm_minute/10+48;
                M_TL=alarm_minute%10+48;
                wr_lcd_word(5,1,H_TH);
                wr_lcd_word(6,1,H_TL);
                wr_lcd_word(8,1,M_TH);
                wr_lcd_word(9,1,M_TL);
                num2=0;
                num3=0;
                GICR|=0x80;//中断开
                MCUCR=0x80;//中断触发方式
                GIFR=0x80;//中断标志位
                #asm("sei")//开放全局中断
                while(1)
                {
                    if(num2==1)
                    {
                        num3=H_TH;
                        while(num2==1)
                        {
                            wr_lcd_word(5,1,' ');
                            delay_ms(300);
                            if(num3>50) num3=48;
                            H_TH=num3;
                            wr_lcd_word(5,1,H_TH);
                            delay_ms(200);
                        }
                        alarm_hour=(H_TH-48)*10+(H_TL-48);
                    }
                    else if(num2==2)
                    {
                        if(H_TH==50)
                            H=51;
                        else
                            H=57;
                        num3=H_TL;
                        while(num2==2)
                        {
                            wr_lcd_word(6,1,' ');
                            delay_ms(300);
                            if(num3>H) num3=48;
                            H_TL=num3;
                            wr_lcd_word(6,1,H_TL);
                            delay_ms(200);
                        }
                        alarm_hour=(H_TH-48)*10+(H_TL-48);
                    }
                    else if(num2==3)
                    {
                        num3=M_TH;
                        while(num2==3)
                        {
                            wr_lcd_word(8,1,' ');
                            delay_ms(300);
                            if(num3>53) num3=48;
                            M_TH=num3;
                            wr_lcd_word(8,1,M_TH);
                            delay_ms(200);
                        }
                        alarm_minute=(M_TH-48)*10+(M_TL-48);
                    }
                    else if(num2==4)
                    {
                        while(num2==4)
                        {
                            wr_lcd_word(9,1,' ');
                            delay_ms(300);
                            if(num3>57) num3=48;
                            M_TL=num3;
                            wr_lcd_word(9,1,M_TL);
                            delay_ms(200);
                        }
                        alarm_minute=(M_TH-48)*10+(M_TL-48);
                    }
                    else if(num2==5)
                    {
                        num2=0;   
                    }   
                    if(select==0)
                    {                                         
                        #asm("cli");//关闭全局中断
                        wr_lcd_inf(0,0x01);//清屏
                        sprintf(lcd_buffer,"1.Temperature  2.Time         3.Tem Recorder 4.Time Set     5.Tem Alarm S  6.Time Alarm S ");
                        break;   
                    }
                }   
            }
        }            
        else
        {
            if(PIND.3==0)
            {
                switch(key())
                {  
                    case 0b00000110:
                        while(PIND.3==0);
                        PORTD.0=~PORTD.0;
                        break;
                    case 0b00000010:
                        while(PIND.3==0);
                        page+=30;
                        menu_num+=2;
                        if(page>60)
                        {   
                            page=0;
                            menu_num-=6;
                        }
                        break;
                    case 0b00000100:
                        while(PIND.3==0);
                        menu_num++;
                        point=~point;
                        if(menu_num>(page/30+1)*2)
                        menu_num-=2;
                        break;
                    case 0b00000000:
                        while(PIND.3==0);
                        select=1;
                        //wr_lcd_word(0,point,menu_num+48);
                        //delay_ms(1000);
                        break;
                }
            }
        }   
    }
}

出0入0汤圆

发表于 2010-5-2 23:32:16 | 显示全部楼层
牛!!

出0入0汤圆

发表于 2010-8-11 19:52:06 | 显示全部楼层
回复【楼主位】b57203493
-----------------------------------------------------------------------

楼主能不能重新发一份pcb的图啊,附件里的pcb没办法用,急用,感谢

出0入0汤圆

发表于 2010-12-8 19:03:34 | 显示全部楼层
LZ能发个原理图来看看,三极管是干啥用的?

出0入0汤圆

发表于 2010-12-9 08:53:04 | 显示全部楼层
真不错。支持

出0入0汤圆

发表于 2010-12-14 16:42:25 | 显示全部楼层
回复【楼主位】b57203493
-----------------------------------------------------------------------
为啥我照做显示不了,能指教一下不

出0入0汤圆

发表于 2010-12-14 21:05:58 | 显示全部楼层
嗯哈

出0入0汤圆

发表于 2010-12-14 22:31:36 | 显示全部楼层
WANCHANG

出0入0汤圆

 楼主| 发表于 2010-12-15 09:30:57 | 显示全部楼层
调一下1602的电阻

出0入0汤圆

发表于 2010-12-15 14:53:13 | 显示全部楼层
实验成功,谢谢

出0入0汤圆

发表于 2010-12-16 13:22:29 | 显示全部楼层
看看

出0入0汤圆

发表于 2010-12-16 15:04:29 | 显示全部楼层
检测不到18b20,这是啥原因?

出0入0汤圆

发表于 2010-12-16 15:45:15 | 显示全部楼层
回复【39楼】b57203493
-----------------------------------------------------------------------

检测不到18b20,这是啥原因?谢谢。。。

出0入0汤圆

发表于 2010-12-16 17:56:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-20 13:47:30 | 显示全部楼层
排阻是10K还是470欧??

出0入0汤圆

发表于 2010-12-20 15:33:21 | 显示全部楼层
温度出来了,就是不变,问题挺多的,0.0

出0入0汤圆

发表于 2013-5-2 13:01:54 | 显示全部楼层
热转印做得很漂亮
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 11:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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