藍橋杯單片機類第十一屆國賽代碼(國二)


//復習的都沒考,感覺沒有區分度,靠選擇題拿分,總體來說比較簡單,跟省賽差不多,結果是國二

#include "tim.h"
#include "seg.h"
#include "stdio.h"
#include "key.h"
#include "STC15F2K60S2.h"
#include "i2c.h"
#include "ds1302.h"
#include "onewire.h"
unsigned char ucSec, ucLed;
unsigned char ucKey_Dly, ucKey_Old;
unsigned char pucSeg_Buf[9], pucSeg_Code[8], ucSeg_Pos;//pucseg_buf儲存阿拉伯數字,code儲存16進制
unsigned long ulms,ulKey_Time;
unsigned int ulms1=0;
unsigned long ulms2=0;//判斷進入亮暗程度時間
unsigned int ulms3=0;//每250ms讀取時鍾
unsigned char pucRtc[3] = {16, 59, 50};//設置時間及讀取時間
unsigned int temp=0;//讀取的溫度
unsigned int liangan=0;//Pcf8591_adc讀取數據
unsigned char pucRtc_judge=17;//時間參數
unsigned int led_judge=4;//指示燈參數
unsigned int temp_judge=25;//溫度參數
unsigned char mode=0;//mode0用來判斷時間、溫度、亮暗界面
unsigned char mode1=0;//mode1用來判斷是否為參數設置界面
unsigned char mode2=0;//判斷是否3s結束
unsigned char mode3=0;//mode3用來判斷是否為遮擋狀態,分壓0.5V下判斷為暗數

unsigned char led1=0;//決定led1是否亮滅
unsigned char led2=0;//決定led2是否亮滅
unsigned char led3=0;//決定led3是否亮滅
void Key_Proc(void);//按鍵檢測函數
void show();//數碼管顯示函數
void leddo()//led工作
{
unsigned char ledshow=0;//傳遞led參數
led1=0;
led2=0;
if(pucRtc_judge<=8)//時間應在兩者之間
{
if(pucRtc[0]>=pucRtc_judge&&pucRtc[0]<=8)
{
led1=1;
}
}
else if(pucRtc_judge>8)
{
if(pucRtc[0]>=pucRtc_judge&&pucRtc[0]<=32)//第二天8點
{
led1=1;
}
}
if(temp<temp_judge*16)
{
led2=1;
}
if(mode3==1)
{
ledshow=led1|(led2<<1)|(led3<<2)|(1<<led_judge-1);
}
else
{
ledshow=led1|(led2<<1)|(led3<<2);
}
Led_Disp(ledshow);
}
void show()
{
int i=0;
for(;i<10;i++)//將數據清空,防止存儲錯誤
{
pucSeg_Buf[i]=' ';
}
leddo();
if(mode1==0)//數據界面
{
if(mode==0)//時鍾顯示界面
{
sprintf(pucSeg_Buf, "%2u-%2u-%2u", (unsigned int)pucRtc[0],(unsigned int)pucRtc[1],(unsigned int)pucRtc[2]);
}
if(mode==1)//溫度顯示界面
{
pucSeg_Buf[0]='C';
sprintf(pucSeg_Buf+4, " %03.1f", (int)temp/16.0);//打入字符串,以字符形式儲存
}
if(mode==2)//adc光亮暗程度顯示界面,分壓0.5V下判斷為暗
{
pucSeg_Buf[0]='E';
sprintf(pucSeg_Buf+2, "%03.2f %u", (float)(liangan*5.0/256.0),(unsigned int)mode3);//打入字符串,以字符形式儲存
}
}
else if(mode1==1)//參數設置界面
{
if(mode==0)//時鍾參數界面
{
sprintf(pucSeg_Buf, "P%u %2u",(unsigned int)mode+1,(unsigned int)pucRtc_judge);
}
if(mode==1)//溫度參數界面
{
sprintf(pucSeg_Buf, "P%u %2u",(unsigned int)mode+1,(unsigned int)temp_judge);
}
if(mode==2)//指示燈參數界面
{
sprintf(pucSeg_Buf, "P%u %u",(unsigned int)mode+1,(unsigned int)led_judge);
}
}
Seg_Tran(pucSeg_Buf, pucSeg_Code);//將阿拉伯數字轉換成16進制
}
void key_do(unsigned char key_value)
{
if(key_value==4&&mode1==0)//進入參數設置界面
{
mode=0;
mode1=1;
}
else if(key_value==4&&mode1==1)//進入顯示界面
{
mode=0;
mode1=0;
}
else if(key_value==5)//切換
{
mode+=1;
if(mode>2)
{
mode=0;
}
}
else if(key_value==8&&mode1==1)//參數減
{
if(mode==0)//時間參數
{
if(pucRtc_judge==0)//減到23點
{
pucRtc_judge=23;
}
else
{
pucRtc_judge-=1;
}
}
else if(mode==1)//溫度參數
{
if(temp_judge!=0)//最小為01
{
temp_judge-=1;
}
}
else if(mode==2)//LED參數
{
if(led_judge!=4)//最小為01
{
led_judge-=1;
}
}
}
else if(key_value==9&&mode1==1)//參數加
{
if(mode==0)//時間參數
{
if(pucRtc_judge==23)//加到0點
{
pucRtc_judge=0;
}
else
{
pucRtc_judge+=1;
}
}
else if(mode==1)//溫度參數
{
if(temp_judge<99)//最大為99
{
temp_judge+=1;
}
else
{
temp_judge=99;
}
}
else if(mode==2)//LED參數
{
if(led_judge!=8)//最小為01
{
led_judge+=1;
}
}
}
}
void main(void)
{
Cls_Peripheral();
Timer1Init();
sprintf(pucSeg_Buf, "%2u-%2u-%2u", (unsigned int)pucRtc[0],(unsigned int)pucRtc[1],(unsigned int)pucRtc[2]);
Seg_Tran(pucSeg_Buf, pucSeg_Code);//將阿拉伯數字轉換成16進制
TR1=1;
Set_RTC(pucRtc);

while(1)
{
if(ulms==150)
{
show();//數碼管顯示
}
Key_Proc();//按鍵檢測

if(ulms1==150)
{
temp=DS18B20_Read();//讀取溫度
}
if(ulms1==50)
{
liangan=Pcf8591_adc();//讀取亮暗程度
if(liangan<26)
{
if(mode3==0)
{
mode2=1;//計時標志位
ulms2=0;
}
mode3=1;
}
else
{
if(mode3==1)
{
mode2=1;//計時標志位
ulms2=0;
}
mode3=0;
}
}
}
}
void Time_1(void) interrupt 3
{
if(++ucKey_Dly == 10)
ucKey_Dly = 0;
ulms++;
ulms1++;
ulms3++;
if(ulms3==150)
{
Read_RTC(pucRtc);//讀取時鍾
}
if(ulms3>300)
{
ulms3=0;
}
if(mode2==1&&ulms2<1801)
{
ulms2++;
}
if(ulms2>1900)
{
ulms2=0;
mode2=0;
if(mode3==0)
{
led3=0;
}
else
{
led3=1;
}
}
if(ulms1>201)
{
ulms1=0;
}
if(ulms==200)
{
ulms=0;
}
Seg_Disp(pucSeg_Code, ucSeg_Pos);
if(++ucSeg_Pos == 8) ucSeg_Pos = 0;
}
void Key_Proc(void)
{
unsigned char ucKey_Val, ucKey_Down;
if(ucKey_Dly) return;
ucKey_Dly = 1;
ucKey_Val = Key_Read();
ucKey_Down = ucKey_Val & (ucKey_Old ^ ucKey_Val);//^按位異或
ucKey_Old = ucKey_Val;
if(ucKey_Down)//判斷old是否和新的一樣,一樣說明是同一個,不會進入
{
ulKey_Time = ulms;
key_do(ucKey_Down);
}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM