📄 main.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 + -