第十一届 蓝桥杯 单片机设计与开发项目 决赛
生活随笔
收集整理的這篇文章主要介紹了
第十一届 蓝桥杯 单片机设计与开发项目 决赛
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
第十一屆 藍(lán)橋杯 單片機設(shè)計與開發(fā)項目 決賽
- 題目
- 源碼
- 賽題總結(jié)
- 1.界面切換
- 2.參數(shù)生效
- 3.LED顯示
題目
源碼
#include <STC15F2K60S2.H> #include <intrins.h> #include "iic.h" #include "ds1302.h" #include "onewire.h" #define KEYPORT P3 #define u8 unsigned char #define u16 unsigned intu8 code t_display[]={ //標(biāo)準(zhǔn)字庫 // 0 1 2 3 4 5 6 7 8 9 A B C D E F0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71, //black - H J K L N o P U t G Q r M y0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位碼u8 key_table[] = {0x88,0x84,0x48,0x44};u8 screen_table[] = {16,16,16,16,16,16,16,16};sbit buzzer = P0^6; sbit relay = P0^4;u8 readdata,keypress; u8 Cont,Trg; u8 shi,fen,miao; u8 shi_BCD,fen_BCD,miao_BCD; u8 mode_flag;//模式切換標(biāo)志位 u8 adc_val;//電壓值0-255 u8 LED;//默認(rèn)參數(shù) char time_set = 17; char temperature_set = 25; char led_set = 4;//變化參數(shù)中間值 char time_temp = 17; char temperature_temp = 25; char led_temp = 4;float temperature;//溫度值 float volt;//電壓值0-5Vbit key_flag; bit read_flag; bit set_flag;//數(shù)據(jù)和參數(shù)界面切換標(biāo)志位 bit light_flag;//亮暗等級 bit change_flag;//切換界面標(biāo)志位void Init()//初始化 {P2=0x80;P0=0xff;P2=0x00;P2=0xe0;P0=0xff;P2=0x00;P2=0xa0;buzzer = 0; relay = 0;P2=0x00; }void key_read()//矩陣鍵盤 {KEYPORT = 0xf0;P44 = 1;P42 = 1;P36 = P42;P37 = P44;keypress = KEYPORT;KEYPORT = 0x0f;P44 = 0;P42 = 0;readdata = (KEYPORT | keypress) ^ 0xff;Trg = readdata & (readdata ^ Cont);Cont = readdata ; }//T0初始化 void Timer0Init(void) //1毫秒@12.000MHz {AUXR |= 0x80; //定時器時鐘1T模式TMOD &= 0xF0; //設(shè)置定時器模式TL0 = 0x20; //設(shè)置定時初值TH0 = 0xD1; //設(shè)置定時初值TF0 = 0; //清除TF0標(biāo)志TR0 = 1; //定時器0開始計時ET0 = 1;EA = 1; }/* Timer0 interrupt routine */ void tm0_isr() interrupt 1 {static int smg_count = 0, key_count = 0,read_count = 0,light_count = 0,i = 0;smg_count++;key_count++;read_count++;if(smg_count == 1){smg_count = 0;P2=0xe0;P0=~t_display[screen_table[i]];P2=0x00;P2=0xc0;P0=T_COM[i];P2=0x00;i++;if(i==8)i=0;}if(key_count == 10){key_count = 0;key_flag =1;}if(read_count == 200){read_count =0 ;read_flag = 1;}if(light_flag){if(++light_count == 3000){light_count =0;LED |= 4;}}else{if(++light_count == 3000){light_count = 0;LED &= ~4;}} }void main() {Init();Timer0Init();set_sfm(16,59,50);//RTC時鐘上電默認(rèn)時間while(1){EA = 0;//讀取時鐘數(shù)據(jù)shi_BCD = Read_Ds1302_Byte ( 0x85 );fen_BCD = Read_Ds1302_Byte ( 0x83 );miao_BCD = Read_Ds1302_Byte ( 0x81 );EA = 1;shi = (((shi_BCD >> 4) & 0x07) * 10 ) + (shi_BCD & 0x0f);fen = (((fen_BCD >> 4) & 0x07) * 10 ) + (fen_BCD & 0x0f);miao = (((miao_BCD >> 4) & 0x07) * 10 ) + (miao_BCD & 0x0f);if(read_flag){read_flag = 0;temperature = rd_temperature();EA = 0;adc_val = read_adc(0x01);EA = 1;if(adc_val < 255 / 2)//暗{light_flag = 1;}else//亮light_flag = 0;volt = adc_val / 255.0 * 5;}if(key_flag){key_flag = 0;key_read();if(Trg == key_table[0])//s4{if(set_flag == 1)//當(dāng)前處于參數(shù)界面{change_flag = 1;}set_flag = ~set_flag;//數(shù)據(jù)和參數(shù)界面切換if(change_flag == 1 && set_flag == 0)//參數(shù)界面->數(shù)據(jù)界面:變化后的參數(shù)生效{time_set = time_temp;temperature_set = temperature_temp;led_set = led_temp;}mode_flag = 0;}if(Trg == key_table[1])//s5{mode_flag++;if(mode_flag == 3)mode_flag = 0;}if(Trg == key_table[2])//s8:-{if(set_flag == 1){if(mode_flag == 0){time_temp--;if(time_temp < 0){time_temp = 23;}}else if(mode_flag == 1){temperature_temp--;if(temperature_temp < 0){temperature_temp = 99;}}else if(mode_flag == 2){led_temp--;if(led_temp < 4){led_temp = 8;}} }}if(Trg == key_table[3])//s9:+{if(mode_flag == 0){time_temp++;if(time_temp > 23){time_temp = 0;}}else if(mode_flag == 1){temperature_temp++;if(temperature_temp > 99){temperature_temp = 0;}}else if(mode_flag == 2){led_temp++;if(led_temp > 8){led_temp = 4;}} }}if(set_flag == 0)//數(shù)據(jù)界面{if(mode_flag == 0)//時鐘顯示{screen_table[0] = shi / 10;screen_table[1] = shi % 10;screen_table[2] = 17;screen_table[3] = fen / 10;screen_table[4] = fen % 10;screen_table[5] = 17;screen_table[6] = miao / 10;screen_table[7] = miao % 10;}else if(mode_flag == 1)//溫度顯示{screen_table[0] = 12;screen_table[1] = 16;screen_table[2] = 16;screen_table[3] = 16;screen_table[4] = 16;screen_table[5] = ((u8)temperature) / 10;screen_table[6] = (((u8)temperature) % 10) + 32;screen_table[7] = ((u8)(temperature * 10)) % 10;}else if(mode_flag == 2)//LED顯示{screen_table[0] = 14;screen_table[1] = 16;screen_table[2] = (u8)volt + 32;screen_table[3] = ((u8)(volt * 10)) % 10 ;screen_table[4] = ((u16)(volt * 100)) % 10;screen_table[5] = 16;screen_table[6] = 16;screen_table[7] = light_flag;}}else//參數(shù)界面{if(mode_flag == 0)//時鐘參數(shù){screen_table[0] = 24;screen_table[1] = 1;screen_table[2] = 16;screen_table[3] = 16;screen_table[4] = 16;screen_table[5] = 16;screen_table[6] = time_temp / 10;screen_table[7] = time_temp % 10;}else if(mode_flag == 1)//溫度參數(shù){screen_table[0] = 24;screen_table[1] = 2;screen_table[2] = 16;screen_table[3] = 16;screen_table[4] = 16;screen_table[5] = 16;screen_table[6] = temperature_temp / 10;screen_table[7] = temperature_temp % 10;}else if(mode_flag == 2)//LED參數(shù){screen_table[0] = 24;screen_table[1] = 3;screen_table[2] = 16;screen_table[3] = 16;screen_table[4] = 16;screen_table[5] = 16;screen_table[6] = 16;screen_table[7] = led_temp;} }/*************************LED顯示**************************/if(shi >= 8){if(shi >= time_set && shi <= 23){LED |= 1;}else{LED &= ~1;}}else{if(shi >= time_set && shi < 8){LED |= 1;}else{LED &= ~1;}}if(temperature < temperature_set){LED |= 2;}else{LED &= ~2;}if(light_flag == 1){if(led_set == 4){LED |= 8;LED &= ~0x10;LED &= ~0x20;LED &= ~0x40;LED &= ~0x80;}else if(led_set == 5){LED &= ~8;LED |= 0x10;LED &= ~0x20;LED &= ~0x40;LED &= ~0x80;}else if(led_set == 6){LED &= ~8;LED &= ~0x10;LED |= 0x20;LED &= ~0x40;LED &= ~0x80;}else if(led_set == 7){LED &= ~8;LED &= ~0x10;LED &= ~0x20;LED |= 0x40;LED &= ~0x80;}else if(led_set == 8){LED &= ~8;LED &= ~0x10;LED &= ~0x20;LED &= ~0x40;LED |= 0x80;}}else{LED &= ~8;LED &= ~0x10;LED &= ~0x20;LED &= ~0x40;LED &= ~0x80;}P2=0x80;P0 = ~LED ; P2=0x00;//點亮LED} }賽題總結(jié)
1.界面切換
解法代碼
2.參數(shù)生效
解法代碼
關(guān)鍵在于記錄從參數(shù)界面到數(shù)據(jù)界面切換的標(biāo)志位,按下s4時當(dāng)前處于參數(shù)界面,按下后切換為數(shù)據(jù)界面
3.LED顯示
代碼接法
分為兩種情況:
(1)當(dāng)前時間大于8:00,即就是處于8:00-23:59之間,需要判斷(shi >= time_set && shi <= 23);
(2)當(dāng)前時間小于8:00,即就是處于0:00-8:00之間,則判斷(shi >= time_set && shi < 8);
特殊情況
當(dāng)shi_set和shi相等時,簡單理解可以這樣說:從今天的8:00到下一天的8:00,全天L1都是點亮的。
總結(jié)
以上是生活随笔為你收集整理的第十一届 蓝桥杯 单片机设计与开发项目 决赛的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个功能超全的「登录认证」神器!
- 下一篇: OsmocomBB SMS Sniffe