蓝桥杯单片机省赛第十一届赛题二
生活随笔
收集整理的這篇文章主要介紹了
蓝桥杯单片机省赛第十一届赛题二
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 前言
- 一、題目??
- 二、代碼部分
- 1.IIC.C
- 2.IIC.H
- 3.onewire.h
- 4.onewire.h
- 5. main.c
- 總結
前言
藍橋杯單片機——第十一屆省賽賽題二解析
今年我也參加了第十三屆的藍橋杯單片機組省賽題,分享一下我在練習時寫的代碼,因為我是第一次
參加,如果有錯誤的地方歡迎大家指出來。我們大家一起加油進步,打造美好的明天!
一、題目??
這次題目,就我個人而言難度還是比較簡單的,沒有什么特別難的地方,賽題總體難度中規中矩,考
的都是一些經常用到并考到的模塊。
比如獨立鍵盤、LED指示燈、數碼管顯示模塊、DS18B20、PCF8591,這些都是藍橋杯板子中基礎的
模塊,相信大家在平時的練習中都經常寫過,都唯一需要注意的地方就是DAC輸出,因為比賽考的比
較少,難免有可能一下子忘了怎么寫。
其中那個按S4進行界面切換的時候,需要檢測參數合理性,大家可以直接在進入參數界面時,將溫度最大值和溫度最小值分別賦給一個變量儲存起來,在進入數據界面顯示時在進行判定,不合理則分別將參數賦值回來。
二、代碼部分
1.IIC.C
根據官方給出的驅動代碼進行修改并加入自己的執行代碼。(其中的ad_read函數在試題中并沒有什
么大用,因為這套題根本用不了讀取函數,純粹是我在寫代碼時沒怎么審題、直接就把這個給寫出來
了。。。。。我也懶的刪除了,大家直接忽略便是)
代碼如下(示例):
#include "iic.h"#define DELAY_TIME 5//I2C總線內部延時函數 void IIC_Delay(unsigned char i) {do{_nop_();}while(i--); }//I2C總線啟動信號 void IIC_Start(void) {SDA = 1;SCL = 1;IIC_Delay(DELAY_TIME);SDA = 0;IIC_Delay(DELAY_TIME);SCL = 0; }//I2C總線停止信號 void IIC_Stop(void) {SDA = 0;SCL = 1;IIC_Delay(DELAY_TIME);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; }unsigned char ad_read(unsigned char add) {unsigned char temp;IIC_Start();IIC_SendByte(0x90);IIC_WaitAck();IIC_SendByte(add);IIC_WaitAck();IIC_Stop();IIC_Start();IIC_SendByte(0x91);IIC_WaitAck();temp=IIC_RecByte();IIC_WaitAck(); IIC_Stop();return temp; }void ad_write(unsigned char dat) {EA=0;IIC_Start();IIC_SendByte(0x90);IIC_WaitAck();IIC_SendByte(0x40);IIC_WaitAck();IIC_SendByte(dat);IIC_WaitAck();IIC_Stop();EA=1; }2.IIC.H
代碼如下(示例):
#ifndef _IIC_H #define _IIC_H#include "stc15f2k60s2.h" #include "intrins.h"sbit SDA = P2^1; sbit SCL = P2^0;void IIC_Start(void); void IIC_Stop(void); bit IIC_WaitAck(void); void IIC_SendByte(unsigned char byt); unsigned char IIC_RecByte(void); void IIC_Delay(unsigned char i); unsigned char ad_read(unsigned char add); void ad_write(unsigned char dat);#endif3.onewire.h
#include "onewire.h"//單總線內部延時函數 void Delay_OneWire(unsigned int t) {while(t--); }//單總線寫操作 void Write_DS18B20(unsigned char dat) {unsigned char i;for(i=0;i<8;i++){DQ = 0;DQ = dat&0x01;Delay_OneWire(50);DQ = 1;dat >>= 1;}Delay_OneWire(50); }//單總線讀操作 unsigned char Read_DS18B20(void) {unsigned char i;unsigned char dat;for(i=0;i<8;i++){DQ = 0;dat >>= 1;DQ = 1;Delay_OneWire(1);if(DQ){dat |= 0x80;} Delay_OneWire(50);}return dat; }//DS18B20初始化 bit init_ds18b20(void) {bit initflag = 0;DQ = 1;Delay_OneWire(120);DQ = 0;Delay_OneWire(800);DQ = 1;Delay_OneWire(100); initflag = DQ; Delay_OneWire(50);return initflag; }unsigned char ds_read() {unsigned char temp;unsigned char low,high;init_ds18b20();Write_DS18B20(0xcc);Write_DS18B20(0x44);Delay_OneWire(200);init_ds18b20();Write_DS18B20(0xcc);Write_DS18B20(0xbe);Delay_OneWire(200);low=Read_DS18B20();high=Read_DS18B20();temp=(high<<4)|(low>>4);return temp; }4.onewire.h
#ifndef __ONEWIRE_H #define __ONEWIRE_H#include "stc15f2k60s2.h"sbit DQ = P1^4; unsigned char ds_read(); void Delay_OneWire(unsigned int t); void Write_DS18B20(unsigned char dat); unsigned char Read_DS18B20(void); bit init_ds18b20(void);#endif5. main.c
#include "IIC.H" #include "onewire.h"sbit S7=P3^0; sbit S6=P3^1; sbit S5=P3^2; sbit S4=P3^3;#define uchar unsigned charuchar temp[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0XFF,0xc6,0x8c}; //12c,13P uchar yi,er,san,si,wu,liu,qi,ba; unsigned char tempare; unsigned int voltage,mode=0,team=0,TMAX;TMIN,jia=30,jian=20,mode_tt=0,tempare_tt=0,sflg=1;void delayms(int ms); void us_waishe(); void display1(uchar yi,uchar er); void display2(uchar san,uchar si); void display3(uchar wu,uchar liu); void display4(uchar qi,uchar ba); void discan(); void Timer0Init(void); void mode0_dis(); void mode1_dis(); void display();void main() {Timer0Init();us_waishe();while(1){voltage=ad_read(0x03);mode1_dis();mode0_dis();display1(yi,er);display2(san,si);display3(wu,liu);display4(qi,ba);discan();display();} } void display() {if((jia>jian)||(jia=jian)){if(tempare>jia){ad_write(204);P2=0X80;P0=0XFE;}else if((tempare>=jian)&&(tempare<=jia)){ad_write(153);P2=0X80;P0=0XFD;}else if(tempare<jian){ad_write(102);P2=0X80;P0=0XFB;}}else{P2=0X80;P0=0XFF;} } void Timer0Init(void) //1毫秒@12.000MHz {AUXR |= 0x80; //定時器時鐘1T模式TMOD &= 0xF0; //設置定時器模式TL0 = 0x20; //設置定時初值TH0 = 0xD1; //設置定時初值TF0 = 0; //清除TF0標志TR0 = 1; //定時器0開始計時ET0=1;EA=1; }void Timer0() interrupt 1 {mode_tt++;tempare_tt++;if(mode_tt==200) //每200ms選中的模塊閃一次{if(mode==1)sflg=1; //sflg==1時全顯}else if(mode_tt==400){mode_tt=0;if(mode==1)sflg=0;}if(tempare_tt==400) //每400ms刷新一次溫度{tempare_tt=0;tempare=ds_read();} }void mode0_dis() {if(mode==0) //數據界面{yi=12;er=11;san=11;si=11;wu=11;liu=11;qi=tempare/10;ba=tempare%10;}} void mode1_dis() //參數界面顯示函數 {if(mode==1){if(sflg==1){if((jia/10!=0)&&(jian/10!=0)) //判斷是兩位數還是一位數{yi=13;er=11;san=11;si=jia/10;wu=jia%10;liu=11;qi=jian/10;ba=jian%10;}else if((jia/10==0)&&(jian/10==0)){yi=13;er=11;san=11;si=11;wu=jia;liu=11;qi=11;ba=jian;}else if((jia/10!=0)&&(jian/10==0)){yi=13;er=11;san=11;si=jia/10;wu=jia%10;liu=11;qi=11;ba=jian;}else if((jia/10==0)&&(jian/10!=0)){yi=13;er=11;san=11;si=11;wu=jia;liu=11;qi=jian/10;ba=jian%10;}}else if(sflg==0){if(team==1) //TMIN{if(jia/10!=0) //判斷是兩位數還是一位數{yi=13;er=11;san=11;si=jia/10;wu=jia%10;liu=11;qi=11;ba=11;}else if(jia/10==0){yi=13;er=11;san=11;si=11;wu=jia;liu=11;qi=11;ba=11;}}else if(team==0) //TMAX{if(jian/10!=0) //判斷是兩位數還是一位數{yi=13;er=11;san=11;si=11;wu=11;liu=11;qi=jian/10;ba=jian%10;}else if(jian/10==0){yi=13;er=11;san=11;si=11;wu=11;liu=11;qi=11;ba=jian;}}}} } void discan() {if(S4==0){delayms(5);if(S4==0){ if(mode==0){TMAX=jia;TMIN=jian;mode=1;team=1;} //mode=0進入數據界面,mode=1進入參數界面。(有問題)else if(mode==1){mode=0;if(jia<jian) //參數不合理則賦值;{jia=TMAX;jian=TMIN;} // else if(jia>=jian) // { // jia=jia;jian=jian; // }}}while(!S4);}else if(S5==0){delayms(5);if(S5==0){if(team==0)team=1; //team=0時,選擇TMAX,team=1時,選擇TMINelse if(team==1)team=0;}while(!S5);}else if(S6==0){delayms(5);if(S6==0){if(mode==1){if(team==0){if((jia<100)&&(jia>=0))jia=jia+1;}else if(team==1){if((jian>=0)&&(jian<100))jian=jian+1;}}}while(!S6);}else if(S7==0){delayms(5);if(S7==0){if(mode==1){if(team==0){if((jia<100)&&(jia>0))jia=jia-1;}else if(team==1){if((jian<100)&&(jian>0))jian=jian-1;}}}while(!S7);} }void us_waishe() {P2=0X80;P0=0XFF;P2=0XA0;P0=0X00;P2=0XC0;P0=0XFF;P2=0XFF;P0=0XFF; }void delayms(int ms) {unsigned int i,j;for(i=ms;i>0;i--)for(j=845;j>0;j--); } void display1(uchar yi,uchar er) {P2=0XC0;P0=0X01;P2=0XE0;P0=temp[yi];delayms(1);P2=0XC0;P0=0X02;P2=0XE0;P0=temp[er];delayms(1); } void display2(uchar san,uchar si) {P2=0XC0;P0=0X04;P2=0XE0;P0=temp[san];delayms(1);P2=0XC0;P0=0X08;P2=0XE0;P0=temp[si];delayms(1); }void display3(uchar wu,uchar liu) {P2=0XC0;P0=0X10;P2=0XE0;P0=temp[wu];delayms(1);P2=0XC0;P0=0X20;P2=0XE0;P0=temp[liu];delayms(1); } void display4(uchar qi,uchar ba) {P2=0XC0;P0=0X40;P2=0XE0;P0=temp[qi];delayms(1);P2=0XC0;P0=0X80;P2=0XE0;P0=temp[ba];delayms(1);P2=0XC0;P0=0XFF;P2=0XFF;P0=0XFF; }總結
這些就是藍橋杯單片機第十一屆省賽題賽題二的解析部分,祝大家都能進郭賽!!!!!!!!!!!!
總結
以上是生活随笔為你收集整理的蓝桥杯单片机省赛第十一届赛题二的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php石头剪刀布源码,剪刀石头布微信小程
- 下一篇: android将apk生成的二维码放到本