⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 利用ATmega64实现了对测温芯片DS18B20
💻 C
字号:
//************************************************************
//功能:温度记录监控程序
//硬件:Atmega64、DS18B20、DS1302、RT1602C
//时钟:外部11M
//作者
//************************************************************
#include "main.h"
#include "Uart.h"
#include "display.h"
#include "hardware.h"
#include "temperread.h"
#include "SetData.h"

uint8 ASCIItab[]={"0123456789"};                    //ASCII码表 
        
uint8 FRAME_BUF[2][14]={{'T','I','M','E',' ','0','0',':','0','0',':','0','0',' '},{'T','E','M','P',' ','X','0','0','0','.','0',0x20,'C','\n'}}; //待发送的数据帧

uint8 RX_BUF[RX_BUFLENGTH]={0x7E,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08};           //接受缓冲区

uint8 R_POSI,R_IDX,R_FULL,R_EMPTY;    //接收缓冲区下一数据存储位置及当前待读出数据的位置

uint8 ROM_CODE[8];                    //DS18B20序列号

uint8 DDram_Adr=0x00;                 //当前DD ram 的地址

uint8 REFRESH=1;                      //刷新数据标志

uint16 g_Second=0;                     //秒计数




//********ms延时函数**************
void DelayMs(uint16 t)
{
	uint16 i; 

	for (i = 0; i < t; i++)
		_delay_loop_2(250 * FREQ);
}
//********************************




SIGNAL(SIG_UART1_RECV)       //串口接收中断程序
{ 
   
   if(R_FULL==0)
   {
    R_EMPTY=0;
    RX_BUF[R_POSI]=UDR1;
    R_POSI++;

	if(R_POSI==RX_BUFLENGTH)
     R_POSI=0;
    if(R_POSI==R_IDX)
	 R_FULL=1;
	}

}



SIGNAL(SIG_OUTPUT_COMPARE0)                 //定时器0中断程序
{
  //add code here

  TCNT0 = 0x00;


  if(g_Second==42)	//42大约一秒钟,用于全局秒表
	{
		g_Second=0;

		REFRESH=1;
	}
	else
	{
		g_Second++;
	}	 
 
}




void inint_all(void)     //全局的初始化
{
  //add code here
  //call all the initial function and initial some register
  uint8 i;

  cli();

  port_init();
  
  uart_init();

  LCD_init();

  SET_LCD_LIGHT;

  DelayMs(1);

  Welcome();

  DS_init();

  DS18B20_init();

  DelayMs(2000);

  sei();

  while(R_FULL==0);  //wait for data set 

  settime_date();

  rbuffer_clr();

  timer0_init();

  TIMSK |= (1 << OCIE0); //开始计时

  LCD_clear();
  DelayMs(1);

  gotoxy(0,1);//设置显示日历位置

   for(i=0;i<5;i++)
     LCD_display(FRAME_BUF[0][i]);

   gotoxy(1,1);       //设置显示温度位置

   for(i=0;i<5;i++)
     LCD_display(FRAME_BUF[1][i]);

 
}


int main(void)
{
   inint_all();

   while(1)
   {
     if(REFRESH==0)
	    continue;
     
	 REFRESH=0;         //清除刷新标志

     TMread();          //读取温度数据

     gettime_date();    //读取时间数据

	 RF_LCD();          //刷新LCD数据

     sendframe();       //刷新PC数据

	 if(R_FULL==1)     //是否需要重新设置日历数据
	 {
	    settime_date();
        rbuffer_clr();
	 }

   }; 

}






void RF_LCD()      //刷新LCD数据
{
   //add code here
   uint8 i; 

   gotoxy(0,6);       //设置显示日历位置

   for(i=5;i<13;i++)
     LCD_display(FRAME_BUF[0][i]);

   gotoxy(1,6);       //设置显示温度位置

   for(i=5;i<13;i++)
     LCD_display(FRAME_BUF[1][i]);
}





uint8 framecheck()  //简单校验帧数据
{
   uint8 datalen;
   uint8 checklen;
   if(RX_BUF[R_IDX]==0x7E)
      {
	   datalen=RX_BUF[R_IDX+1];
	   checklen=R_POSI-R_IDX;
	   if(checklen<=0)
	   checklen=checklen+RX_BUFLENGTH;
	   if(datalen==checklen)
	   return 1;
	   }

	   return 0;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -