天天看點

藍橋杯單片機第五屆國賽題目-多功能事件記錄器前言效果代碼樹交流群

文章目錄

  • 前言
  • 效果
  • 代碼樹
    • init.c
    • main.c
    • onewire.c
    • iic.c
    • ds1302.c
    • init.h
    • onewire.h
    • iic.h
    • ds1302.h
    • type.h
  • 交流群

前言

功能全部實作,實話說,這屆國賽題的序列槽和eeprom還是很有挑戰的,關于這部分需要多加練習和注意;對于常見的一些操作要多加總結,才能夠在比賽的時候拿出來就用。在儲存資訊的時候,一定不要用儲存字元串的方式!直接采用儲存變量的方式(uchar)即可。我就想提幾個需要注意的地方吧。

  • 第一個是要注意strcpy和memcpy的差別,一個是字元串的複制,一個是記憶體的複制。字元串的複制不能用于數組的複制,因為一旦數組中出現了0,那麼就會被識别的空字元!
  • 注意數組的大小是否能夠裝的下格式化後的字元串!
  • 第二個是eeprom的處理,eeprom分為32頁,一頁有8Byte,是以可以采用頁寫的方式來儲存。比如你起始位址為0即為第一頁,起始位置為8則為第二頁,我發現采用頁寫的方式後,寫和讀都還是有點問題,是以采用了特殊的方式來進行處理。這部分可以看程式來了解
  • 序列槽資料的接收和判斷不要寫死了,比如我發送的資料不一定是6位,如果資料寬度不一樣,寫死的程式勢必會造成錯誤。這個也可以看我序列槽的處理部分來了解一下。
  • 題目我就不發了,網上都有。

效果

說了這麼多,看一下效果吧。

注意聲音有點大,不好意思錄進去了

藍橋杯單片機第五屆國賽題目-多功能事件記錄器示範

視訊連結

代碼樹

藍橋杯單片機第五屆國賽題目-多功能事件記錄器前言效果代碼樹交流群

init.c

#include "init.h"


extern uchar bf[8];


void SL(uchar _dev, uchar _data)
{
 P0 = _data; SEL(_dev);
}
 
void Timer1Init(void)		//2毫秒@12.000MHz
{
	AUXR |= 0x40;		//定時器時鐘1T模式
	TMOD &= 0x0F;		//設定定時器模式
	TL1 = 0x40;		//設定定時初值
	TH1 = 0xA2;		//設定定時初值
	TF1 = 0;		//清除TF1标志
	TR1 = 1;		//定時器1開始計時
 ET1 = 1;
 EA = 1;
}


uchar GetKey()
{
 if(K3 == 0) return 5;
 if(K4 == 0) return 4;
 return 0;
}


void TimeRun(t_delay* time)
{
 if(time->cnt++ < time->max);
 else
 {
  time->cnt = 0;
  time->ok = 1;
 }
}

uchar FR(float _data, uchar _dig)
{
 uint i = 1;
 while(_dig--)
 {
  i = i*10;
 }
 return((uint)_data/i%10);
}

void Bf(uchar _0, uchar _1, uchar _2, uchar _3, 
        uchar _4, uchar _5, uchar _6, uchar _7)
{
 bf[0] = _0; bf[1] = _1; bf[2] = _2; bf[3] = _3;
 bf[4] = _4; bf[5] = _5; bf[6] = _6; bf[7] = _7;
}



void UartInit(void)		//[email protected]MHz
{
	SCON = 0x50;		//8位資料,可變波特率
	AUXR |= 0x01;		//序列槽1選擇定時器2為波特率發生器
	AUXR |= 0x04;		//定時器2時鐘為Fosc,即1T
	T2L = 0x3C;		//設定定時初值
	T2H = 0xF6;		//設定定時初值
	AUXR |= 0x10;		//啟動定時器2
 ES = 1;
}


void print(uchar* string)
{
  ES = 0; TI = 1;
  printf("%s", string);
  TI = 0; ES = 1;
}

uchar LedChange(uchar _data, uchar _dig, uchar _state)
{
  //LED的狀态是反着來的
  if(!_state)
  {
   _data |= 1 << _dig;

  }
  else
  {
   _data &= ~(1 << _dig);
  }
  SL(4, _data);
  return _data;
}
           

main.c

#include "init.h"


enum{LED=4, EXT, SEL, CODE};
code uchar CA[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 
                   0x92, 0x82, 0xf8, 0x80, 0x90,
                   0xff, 0xc6, 0x89, 0xbf};
uchar bf[] = {1, 2, 3, 4, 5, 6, 7, 8};
uchar curDig = 0;
uchar enprint = 0;

uchar key, tmpKey, keyCnt;
enum{KS_GT, KS_AS, KS_WA};keyState=KS_GT;


t_delay delay_200 = {200, 0, 0};
t_delay tx_delay = {50, 0, 0};
t_delay cnt_65535 = {65535, 0, 0};

uchar index = 0;
uchar xdata rxBuf[20] = "0";
//發送緩沖不能小了,要避免出現其他異常情況将發送緩沖裝溢出了
uchar xdata txBuf[30] = "0";
uchar revCorrect = 0;
uchar time[3];
uchar jieJin = 0;
uchar Second = 255;
//事件接近的時間
uchar timeCnt = 0;
//模式
enum{S_AUTOT, S_AUTOR}gloSta = S_AUTOT;
//顯示模式
enum{DIS_WSD, DIS_TIME, DIS_ITEM}disMode = DIS_WSD;

uchar ledData = 0xfe;
float adcVal, adc1Val;
uchar storeData[5][7] = {0}; 
//調試使用
//uchar storeData1[5][6] = {{1,2,3, 4  ,5 ,25},
//                          {1,2,3, 4  ,5 ,25},
//                          {1,2,3, 4  ,5 ,25},
//                          {1,2,3, 4  ,5 ,25},
//                          {1,2,3, 4  ,5 ,25}};
void Timer1Hanle() interrupt 3
{
 SL(CODE, 0xff);SL(SEL, 1 << curDig); SL(CODE, CA[bf[curDig]]);
 curDig = (curDig + 1)%8;
 switch(keyState)
 {
  case KS_GT:
   keyCnt = 0; tmpKey =GetKey(); keyState = KS_AS;
  break;
  
  case KS_AS:
   if(keyCnt++ < 10);
   else if(tmpKey == GetKey())
   {
    if(tmpKey != key)
    {
     key = tmpKey;keyState = KS_WA;
    }
    else
    {
     keyState = KS_GT;
    }
   }
   else
   {
    keyState = KS_GT;
   }
  break;
 }
 TimeRun(&delay_200);
 if(tx_delay.ok == 2)
  TimeRun(&tx_delay);
 //如果允許計算時間
 if(cnt_65535.ok == 2)
  TimeRun(&cnt_65535); 
}

void Sensor()
{
 if(delay_200.ok == 1)
 {
  delay_200.ok = 0;
  Temp_Read();
  adcVal = ADC_Read(0x43, 0);
  adc1Val = ADC_Read(0x41, 0);
  if(adc1Val < 50)
  {
   jieJin = 1;
   ledData = LedChange(ledData, 2, 1);
   //如果計時沒有開始,那麼讓計時開始
   if(cnt_65535.cnt == 0)
    cnt_65535.ok = 2;
  } 
  else
  {
   jieJin = 0;
   ledData = LedChange(ledData, 2, 0);
   //如果已經開始計時,那麼停止
   if(cnt_65535.cnt != 0)
   {
    uchar tmpString[7];
    cnt_65535.ok = 0;
    timeCnt = cnt_65535.cnt*2/1000;
    tmpString[0] = (uint)tempVal/100;
    tmpString[1] = (uint)adcVal;
    tmpString[2] = time[2];
    tmpString[3] = time[1];
    tmpString[4] = time[0];
    tmpString[5] = timeCnt; 
    stack(tmpString);
    cnt_65535.cnt = 0;
   }  
  }
  DS1302_Read();
 }
}
void UartHandle() interrupt 4
{
 if(TI) TI = 0;
 if(RI)
 {
  RI = 0;
  //如果進來的時候是第一次,是以開啟計時
  if(tx_delay.ok == 0)
  tx_delay.ok = 2;
  //進來是因為序列槽接收中斷
  if(index < 20)
  {
   rxBuf[index++] = SBUF;
  }
 }
}
void UartProcess()
{
 //如果接收逾時,觸發檢查事件
  //如果進來的時候是因為計時結束
  if(tx_delay.ok == 1)
  {
   //結束标志清零
   tx_delay.ok = 0; 
   //如果接收的資料是6位
   if(index == 6)
   {
   	//如果密碼正确
    if(strncmp(rxBuf, "AAASSS", 6) == 0)
    {
     enprint = 1;
    }
   }
   //如果密碼不是正确的,那麼就是錯誤的
   else
   {
    enprint = 2;
   }
   //不管哪種情況,都需要将index清空
   index = 0;
  }
 //如果密碼正确
 if(enprint == 1)
 {
  uchar i;
  enprint = 0;
  //根據狀态來選擇序列槽的輸出
  switch(gloSta)
  {
   case S_AUTOT:
    //開啟序列槽輸出
    revCorrect = 1;
   break;
   
   case S_AUTOR:
    for(i = 0; i < 5; i++)
    {
     uchar temp[25] = {0};
     sprintf(temp, "{%bu-%bu%%}-{%bu-%bu-%bu}{%bu}\r\n",
                storeData[i][0], storeData[i][1], storeData[i][2], storeData[i][3], storeData[i][4], storeData[i][5]);
     print(temp);
     //很重要,不然會聯結
     Delay8ms();
    }
   break;
  }
  //如果密碼不正确關閉輸出      
 }
 else if(enprint == 2)
 {
  enprint = 0;
  revCorrect = 0;
 }
}

void EventProcess()
{
 if(revCorrect)
 {
  //如果一秒到了
  if(Second != time[0])
  {
   //發送相應指令
   Second =  time[0];
   sprintf(txBuf, "{%.0f-%.0f%%}-{%bu-%bu-%bu}{%bu}\r\n",
                tempVal/100.0, adcVal, time[2], time[1], time[0], jieJin);
   print(txBuf);
  }
 }
}

//按鍵處理
void keyProcess()
{
 switch(key)
  {
   case 4:
    gloSta = (gloSta == S_AUTOT)?S_AUTOR:S_AUTOT;
    //互鎖的先關閉所有,再根據條件開啟響應的led
    ledData = LedChange(ledData, 1, 0);
    ledData = LedChange(ledData, 0, 0);
    if(gloSta == S_AUTOR)
    {
     revCorrect = 0;
     ledData = LedChange(ledData, 1, 1);
    }
    else
    {
     ledData = LedChange(ledData, 0, 1);
    }
   break;
   case 5:
    if(disMode == DIS_WSD)
     disMode = DIS_TIME;
    else if(disMode == DIS_TIME)
     disMode = DIS_ITEM;
    else
     disMode = DIS_WSD;
   break;
  }
}


void DisProcess()
{
 switch(disMode)
 {
  case DIS_WSD:
   Bf(FR(tempVal, 3), FR(tempVal, 2), F_CC, F_C, F_C, FR(adcVal, 1), FR(adcVal, 0), F_H);   
  break;
  
  case DIS_TIME:
   Bf(FR(time[2], 1), FR(time[2], 0), F_SEP, 
      FR(time[1], 1), FR(time[1], 0), F_SEP, 
      FR(time[0], 1), FR(time[0], 0));   
  break;
  
  case DIS_ITEM:
   Bf(F_C, F_C, F_C, 
      F_SEP, FR(timeCnt, 3), FR(timeCnt, 2), 
      FR(timeCnt, 1), FR(timeCnt, 0));
  break;
 }
}
//非常重要
void Delay8ms()		//@12.000MHz
{
	unsigned char i, j;

	i = 94;
	j = 95;
	do
	{
		while (--j);
	} while (--i);
}

void stack(uchar* string)
{
 uchar i = 0;
 for(; i < 4; i++)
 {
  memcpy(storeData[i], storeData[i+1], 6);
 }
 memcpy(storeData[i], string, 6); 
 for(i = 0; i < 5; i++)
 {
  EEPROM_Write(i*8, storeData[i], 6);
  EEPROM_Write(i*8, storeData[i], 6);
  EEPROM_Write(i*8, storeData[i], 6);
 }
}
void StoreInit()
{
  uchar i = 0;
//調試使用
// for(i = 0; i < 5; i++)
// {
//  EEPROM_Write(i*8, storeData1[i], 7);
//  EEPROM_Write(i*8, storeData1[i], 7);
//  EEPROM_Write(i*8, storeData1[i], 7);
// }
 for(i = 0; i < 5; i++)
 {
  uchar tmpData[6];
  EEPROM_Read(i*8, 6, storeData[i]);
  EEPROM_Read(i*8, 6, tmpData);
  while(strncmp(tmpData,storeData[i],6) != 0)
  {
   EEPROM_Read(i*8, 6, storeData[i]);
   EEPROM_Read(i*8, 6, tmpData);
  } 
 }
//調試使用
// for(i = 0; i < 5; i++)
// {
//  uchar temp[20] = {0};
//  sprintf(temp, "%bu%bu%bu%bu%bu%bu\r\n", storeData[i][0],storeData[i][1],storeData[i][2],storeData[i][3],storeData[i][4],storeData[i][5]);
//  print(temp);
//  //很重要,不然會聯結
//  Delay8ms();
// }
}
void main()
{
 //初始化
 BPOFF;RLOFF;
 SL(LED, ledData);
 //清屏
 memset(bf, F_C, 8);
 Timer1Init();
 UartInit();
 DS1302_init(23, 59, 55);
 StoreInit();
 while(1)
 {
  Sensor();
  UartProcess();
  EventProcess();
  DisProcess();
  if(keyState == KS_WA)
  {
   keyProcess();
   keyState = KS_GT;
  }
 }
}
           

onewire.c

/*
  程式說明: 單總線驅動程式
  軟體環境: Keil uVision 4.10 
  硬體環境: CT107單片機綜合實訓平台(外部晶振12MHz) STC89C52RC單片機
  日    期: 2011-8-9
*/
#include "reg52.h"
#include "type.h"
sbit DQ = P1^4;  //單總線接口
float tempVal;
//單總線延時函數
void Delay_OneWire(unsigned int t)  //STC89C52RC
{
 t = t * 10;
	while(t--);
}

//通過單總線向DS18B20寫一個位元組
void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		DQ = 0;
		DQ = dat&0x01;
		Delay_OneWire(5);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(5);
}

//從DS18B20讀取一個位元組
unsigned char Read_DS18B20(void)
{
	unsigned char i;
	unsigned char dat;
  
	for(i=0;i<8;i++)
	{
		DQ = 0;
		dat >>= 1;
  Delay_OneWire(1);
		DQ = 1;
		if(DQ)
		{
			dat |= 0x80;
		}	    
		Delay_OneWire(1);
	}
	return dat;
}

//DS18B20裝置初始化
bit init_ds18b20(void)
{
  	bit initflag = 0;
  	
  	DQ = 1;
  	Delay_OneWire(12);
  	DQ = 0;
  	Delay_OneWire(80);
  	DQ = 1;
  	Delay_OneWire(8); 
   initflag = DQ;     
  	Delay_OneWire(5);
  	return initflag;
}


void Temp_Read()
{
 uint tmpVal;
 init_ds18b20();
 Write_DS18B20(0xcc);
 Write_DS18B20(0x44);
 while(!DQ);
 init_ds18b20();
 Write_DS18B20(0xcc);
 Write_DS18B20(0xbe);
 tmpVal = Read_DS18B20();
 tmpVal = ((uint)Read_DS18B20() << 8) | tmpVal;
 //防止亂跳
 if(tmpVal*6.25 < 5000)
 tempVal = tmpVal*6.25;
}
           

iic.c

/*
  程式說明: IIC總線驅動程式
  軟體環境: Keil uVision 4.10 
  硬體環境: CT107單片機綜合實訓平台 8051,12MHz
  日    期: 2011-8-9
*/

#include "reg52.h"
#include "intrins.h"
#include "type.h"
#define DELAY_TIME 5

#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
//總線引腳定義
sbit SDA = P2^1;  /* 資料線 */
sbit SCL = P2^0;  /* 時鐘線 */

void IIC_Delay(unsigned char i)
{
    do{_nop_();}
    while(i--);        
}
//總線啟動條件
void IIC_Start(void)
{
    SDA = 1;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 0;
    IIC_Delay(DELAY_TIME);
    SCL = 0;	
}

//總線停止條件
void IIC_Stop(void)
{
    SDA = 0;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 1;
    IIC_Delay(DELAY_TIME);
}

//發送應答
void IIC_SendAck(bit ackbit)
{
    SCL = 0;
    SDA = ackbit;  					// 0:應答,1:非應答
    IIC_Delay(DELAY_TIME);
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SCL = 0; 
    SDA = 1;
    IIC_Delay(DELAY_TIME);
}

//等待應答
bit IIC_WaitAck(void)
{
    bit ackbit;
	
    SCL  = 1;
    IIC_Delay(DELAY_TIME);
    ackbit = SDA;
    SCL = 0;
    IIC_Delay(DELAY_TIME);
    return ackbit;
}

//通過I2C總線發送資料
void IIC_SendByte(unsigned char byt)
{
    unsigned char i;

    for(i=0; i<8; i++)
    {
        SCL  = 0;
        IIC_Delay(DELAY_TIME);
        if(byt & 0x80) SDA  = 1;
        else SDA  = 0;
        IIC_Delay(DELAY_TIME);
        SCL = 1;
        byt <<= 1;
        IIC_Delay(DELAY_TIME);
    }
    SCL  = 0;  
}

//從I2C總線上接收資料
unsigned char IIC_RecByte(void)
{
    unsigned char i, da;
    for(i=0; i<8; i++)
    {   
    	SCL = 1;
     IIC_Delay(DELAY_TIME);
     da <<= 1;
     if(SDA) da |= 1;
     SCL = 0;
     IIC_Delay(DELAY_TIME);
    }
    return da;    
}

float ADC_Read(uchar _addr, uchar _data)
{
  uchar tmpVal;
  IIC_Start();
  IIC_SendByte(0x90);
  IIC_WaitAck();
  IIC_SendByte(_addr);
  IIC_WaitAck();
  IIC_SendByte(_data);
  IIC_WaitAck();
  IIC_Stop();
  IIC_Start();
  IIC_SendByte(0x91);
  IIC_WaitAck();
  tmpVal = IIC_RecByte();//每次一開始讀的是128
  IIC_SendAck(0);
  return(IIC_RecByte()*99.0/255);
 //光敏是陽光越大,電壓越大,電阻越小
}

void EEPROM_Write(uchar _addr, uchar* _data, uchar _dig)
{
  EA = 0;
  IIC_Start();
  IIC_SendByte(0xa0);
  IIC_WaitAck();
  IIC_SendByte(_addr);
  IIC_WaitAck();
  while(_dig--)
  {
   IIC_SendByte(*_data++);
   IIC_WaitAck();
  }
  IIC_Stop();
  EA = 1;
}
void EEPROM_Read(uchar _addr, uchar _dig, uchar* _des)
{
  EA = 0;
  IIC_Start();
  IIC_SendByte(0xa0);
  IIC_WaitAck();
  IIC_SendByte(_addr);
  IIC_WaitAck();
  IIC_Start();
  IIC_SendByte(0xa1);
  IIC_WaitAck();
   _dig--;
  while(_dig--)
  {
   *_des++ = IIC_RecByte();
   IIC_SendAck(0);
  }
  *_des++ = IIC_RecByte();
  IIC_Stop();
   EA = 1;
}
           

ds1302.c

/*
  程式說明: DS1302驅動程式
  軟體環境: Keil uVision 4.10 
  硬體環境: CT107單片機綜合實訓平台 8051,12MHz
  日    期: 2011-8-9
*/

#include <reg52.h>
#include <intrins.h>
#include "type.h"
sbit SCK=P1^7;		
sbit SDA=P2^3;		
sbit RST = P1^3;   // DS1302複位												
extern uchar time[3];
void Write_Ds1302(unsigned  char temp) 
{
	unsigned char i;
	for (i=0;i<8;i++)     	
	{ 
		SCK=0;
		SDA=temp&0x01;
		temp>>=1; 
		SCK=1;
	}
}   

void Write_Ds1302_Byte( unsigned char address,unsigned char dat )     
{
 	RST=0;	_nop_();
 	SCK=0;	_nop_();
 	RST=1; 	_nop_();  
 	Write_Ds1302(address);	
 	Write_Ds1302(dat);		
 	RST=0; 
}

//unsigned char Read_Ds1302_Byte ( unsigned char address )
//{
// 	unsigned char i,temp=0x00;
// 	RST=0;	_nop_();
// 	SCK=0;	_nop_();
// 	RST=1;	_nop_();
// 	Write_Ds1302(address);
// 	for (i=0;i<8;i++) 	
// 	{		
//		SCK=0;
//		temp>>=1;	
// 		if(SDA)
// 		temp|=0x80;	
// 		SCK=1;
//	} 
// 	RST=0;	_nop_();
// 	SCK=0;	_nop_();
//	SCK=1;	_nop_();
//	SDA=0;	_nop_();
//	SDA=1;	_nop_();
//	return (temp);			
//}
uchar Read(){
	 unsigned char i,temp=0x00;
 	for (i=0;i<8;i++){		
			SCK=0;
			temp>>=1;	
			if(SDA)
				temp|=0x80;	
				SCK=1;
	}
	return (temp);		
}
void DS1302_init(uchar _h, uchar _m, uchar _s){
	uchar i;
	_h = (_h/10%10 << 4) | _h%10;
	_m = (_m/10%10 << 4) | _m%10;
	_s = (_s/10%10 << 4) | _s%10;
	Write_Ds1302_Byte(0x8e, 0);
	RST=0;	_nop_();
	SCK=0;	_nop_();
	RST=1; 	_nop_();
	Write_Ds1302(0xbe);
	Write_Ds1302(_s);	
	Write_Ds1302(_m);	
	Write_Ds1302(_h);	
	for(i = 0; i < 5; i++){
		Write_Ds1302(0);	
	}
	RST=0;
	Write_Ds1302_Byte(0x8e, 0x80);
}
void DS1302_Read(){
		Write_Ds1302_Byte(0x8e, 0);
 	RST=0;	_nop_();
 	SCK=0;	_nop_();
 	RST=1;	_nop_();
 	Write_Ds1302(0xbf);
  time[0] = Read();
		time[1] = Read();
		time[2] = Read();
		time[0] = (time[0] >> 4)*10 + (time[0] & 0x0f);
		time[1] = (time[1] >> 4)*10 + (time[1] & 0x0f);
		time[2] = (time[2] >> 4)*10 + (time[2] & 0x0f);
 	RST=0;	_nop_();
 	SCK=0;	_nop_();
		SCK=1;	_nop_();
		SDA=0;	_nop_();
		SDA=1;	_nop_();
		Write_Ds1302_Byte(0x8e, 0x80);
}
           

init.h

#ifndef _INIT_H
#define _INIT_H
#include "stc15f2k60s2.h"
#include "stdio.h"
#include "intrins.h"
#include "type.h"
#include "onewire.h"
#include "iic.h"
#include "string.h"
#include "ds1302.h"

#define SEL(x) P2=P2&0x1f|x<<5;P2=P2&0x1f
sbit BP = P0^6; sbit RL = P0^4;
#define BPON BP = 1; SEL(5)
#define BPOFF BP = 0; SEL(5)
#define RLON RL = 1; SEL(5)
#define RLOFF RL = 0; SEL(5)
#define F_C 10
#define F_CC 11
#define F_H 12
#define F_SEP 13
sbit K1 = P3^0; sbit K2 = P3^1; sbit K3 = P3^2; sbit K4 = P3^3;

typedef struct delay
{
 uint max;
 uint cnt;
 uchar ok;
}t_delay;


void SL(uchar _dev, uchar _data);
void Timer1Init(void);
uchar GetKey();
void TimeRun(t_delay* time);
uchar FR(float _data, uchar _dig);
void Bf(uchar _0, uchar _1, uchar _2, uchar _3, 
        uchar _4, uchar _5, uchar _6, uchar _7);
void UartInit(void);
void print(uchar* string);
uchar LedChange(uchar _data, uchar _dig, uchar _state);
void stack(uchar* string);
void Delay8ms();		//@12.000MHz
#endif	
           

onewire.h

#ifndef __ONEWIRE_H
#define __ONEWIRE_H
extern float tempVal;
void Temp_Read();
#endif
           

iic.h

#ifndef _IIC_H
#define _IIC_H

void IIC_Start(void); 
void IIC_Stop(void);  
bit IIC_WaitAck(void);  
void IIC_SendAck(bit ackbit); 
void IIC_SendByte(unsigned char byt); 
unsigned char IIC_RecByte(void); 
float ADC_Read(uchar _addr, uchar _data);
void EEPROM_Write(uchar _addr, uchar* _data, uchar _dig);
void EEPROM_Read(uchar _addr, uchar _dig, uchar* _des);
#endif
           

ds1302.h

#ifndef __DS1302_H
#define __DS1302_H

void Write_Ds1302(unsigned char temp);
void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302_Byte( unsigned char address );
void DS1302_Read();
void DS1302_init(uchar _h, uchar _m, uchar _s);
#endif
           

type.h

#ifndef _TYPE_H
#define _TYPE_H

#define uchar unsigned char
#define uint unsigned int
#endif
           

交流群

藍橋杯單片機第五屆國賽題目-多功能事件記錄器前言效果代碼樹交流群

繼續閱讀