

因為最近參加比賽藍橋杯大賽,所以把歷年省賽試題做了個遍,每套試題功能也已全部實作,分享出來供大家參考學習,
這次分享的是第三屆藍橋杯單片機省賽的程式題,同樣也是第四屆藍橋杯單片機的模擬題,



直接上代碼吧,里面注釋很清晰,

main.c程式
#include<stc15f2k60s2.h>
#include "iic.h"
#define uchar unsigned char //定義無符號字符型別uchar
#define uint unsigned int //定義無符號整型型別uint
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};//數字0~9,“-”,“關”
uchar yi,er,san,si,wu,liu,qi,ba; //定義字符型變數yi,er,san,si,wu,liu,qi,ba,當作數碼管顯示控制變數
uchar guang;
uint ML_10=0,money=0,tt=0;
void delayms(int ms); //延時函式
void allinit(); //初始化函式
void keyscan(); //獨立按鍵函式
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 Timer0Init(void); //5毫秒@11.0592MHz
void main()//主函式
{
allinit(); //初始化函式
Timer0Init(); //初始化定時器0
yi=11;er=0;san=5;si=0;wu=0;liu=1;qi=0;ba=0;
while(1)
{
guang=IIC_read(0x01); //獲取光敏電阻的值賦給變數guang
if(guang<64) //判斷光敏電阻通道輸入電壓是否小于1.25V
{
P2=0X80;P0=0XFE; //L1點亮
}
else //如果不小于
{
P2=0X80;P0=0XFF; //L1熄滅
}
keyscan(); //獨立按鍵函式
display1(yi,er); //第一、二段數碼管函式
display2(san,si); //第三、四段數碼管函式
display3(wu,liu); //第五、六段數碼管函式
display4(qi,ba); //第七、八段數碼管函式
}
}
void Timer0Init(void) //5毫秒@11.0592MHz
{
AUXR |= 0x80; //定時器時鐘1T模式
TMOD &= 0xF0; //設定定時器模式
TL0 = 0x00; //設定定時初值
TH0 = 0x28; //設定定時初值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
}
void tm0_isr() interrupt 1 //定時器中斷函式
{
tt++; //tt++;
if(tt==20) //判斷是否到0.1s
{
ML_10=ML_10+1; //出水量+1,即0.1s加10ML,符合題意100ML/秒
wu=ML_10/1000;liu=ML_10%1000/100;qi=ML_10%100/10;ba=ML_10%10;//顯示出水量
tt=0; //tt清零
if(ML_10>=9999) //判斷是否達到99.99L
{
P2=0XA0;P0=0X00; //關繼電器
money=ML_10*0.5; //計算水費
wu=money/1000;liu=money%1000/100;qi=money%100/10;ba=money%10; //顯示水費價格
ML_10=0; //出水量清零
}
}
}
void keyscan()//獨立按鍵函式
{
if(P30==0) //判斷P30是否等于0
{
delayms(5); //延時5ms
if(P30==0) //再次判斷P30是否等于0
{
EA=1;ET0=1; //打開定時器0
P2=0XA0;P0=0X10; //打開繼電器
}
while(!P30); //如果按鍵不松開,則一直回圈
}
else if(P31==0) //判斷P31是否等于0
{
delayms(5); //延時5ms
if(P31==0) //再次判斷P31是否等于0
{
EA=0;ET0=0; //關閉定時器0
P2=0XA0;P0=0X00;//關閉繼電器
money=ML_10*0.5;//計算水費
wu=money/1000;liu=money%1000/100;qi=money%100/10;ba=money%10;//用來顯示水費
ML_10=0; //出水量清零
}
while(!P31); //如果按鍵不松開,則一直回圈
}
}
void delayms(int ms)//延時函式
{
uint i,j;
for(i=ms;i>0;i--)
for(j=845;j>0;j--);
}
void allinit()//初始化函式
{
P2=0XA0;P0=0X00; //關閉蜂鳴器繼電器
P2=0X80;P0=0XFF; //關閉所有LED燈
P2=0XC0;P0=0XFF; //選中所有數碼管段選
P2=0XFF;P0=0XFF; //關閉所有數碼管
}
void display1(uchar yi,uchar er)//第一、二段數碼管函式
{
P2=0XC0;P0=0X01; //選中第一個數碼管位選
P2=0XFF;P0=tab[yi]; //讓第一個數碼管顯示yi指向的值
delayms(1); //延時1ms
P2=0XC0;P0=0X02; //選中第二個數碼管位選
P2=0XFF;P0=tab[er]&0x7f; //讓第一個數碼管顯示er指向的值
delayms(1); //延時1ms
}
void display2(uchar san,uchar si)//第三、四段數碼管函式
{
P2=0XC0;P0=0X04; //選中第s三個數碼管位選
P2=0XFF;P0=tab[san]; //讓第一個數碼管顯示san指向的值
delayms(1); //延時1ms
P2=0XC0;P0=0X08; //選中第四個數碼管位選
P2=0XFF;P0=tab[si]; //讓第一個數碼管顯示si指向的值
delayms(1); //延時1ms
}
void display3(uchar wu,uchar liu)//第五、六段數碼管函式
{
P2=0XC0;P0=0X10; //選中第五個數碼管位選
P2=0XFF;P0=tab[wu]; //讓第一個數碼管顯示wu指向的值
delayms(1); //延時1ms
P2=0XC0;P0=0X20; //選中第六個數碼管位選
P2=0XFF;P0=tab[liu]&0x7f; //讓第一個數碼管顯示liu指向的值
delayms(1); //延時1ms
}
void display4(uchar qi,uchar ba)//第七、八段數碼管函式
{
P2=0XC0;P0=0X40; //選中第七個數碼管位選
P2=0XFF;P0=tab[qi]; //讓第一個數碼管顯示qi指向的值
delayms(1); //延時1ms
P2=0XC0;P0=0X80; //選中第八個數碼管位選
P2=0XFF;P0=tab[ba]; //讓第一個數碼管顯示ba指向的值
delayms(1); //延時1ms
P2=0XC0;P0=0X80; //選中第八個數碼管位選
P2=0XFF;P0=0XFF; //讓第八個數碼管熄滅
}
iic.c程式
#include<stc15f2k60s2.h>
#include "intrins.h"
#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
//總線引腳定義
sbit SDA = P2^1; /* 資料線 */
sbit SCL = P2^0; /* 時鐘線 */
//總線啟動條件
void IIC_Start(void)
{
SDA = 1;
SCL = 1;
somenop;
SDA = 0;
somenop;
SCL = 0;
}
//總線停止條件
void IIC_Stop(void)
{
SDA = 0;
SCL = 1;
somenop;
SDA = 1;
}
//等待應答
bit IIC_WaitAck(void)
{
SDA = 1;
somenop;
SCL = 1;
somenop;
if(SDA)
{
SCL = 0;
IIC_Stop();
return 0;
}
else
{
SCL = 0;
return 1;
}
}
//通過I2C總線發送資料
void IIC_SendByte(unsigned char byt)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(byt&0x80)
{
SDA = 1;
}
else
{
SDA = 0;
}
somenop;
SCL = 1;
byt <<= 1;
somenop;
SCL = 0;
}
}
//從I2C總線上接收資料
unsigned char IIC_RecByte(void)
{
unsigned char da;
unsigned char i;
for(i=0;i<8;i++)
{
SCL = 1;
somenop;
da <<= 1;
if(SDA)
da |= 0x01;
SCL = 0;
somenop;
}
return da;
}
unsigned char IIC_read(unsigned char add)
{
unsigned char temp;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_Start();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
temp=IIC_RecByte();
IIC_Start();
return temp;
}
iic.h程式
#ifndef _IIC_H
#define _IIC_H
//函式宣告
void IIC_Start(void);
void IIC_Stop(void);
void IIC_SendByte(unsigned char byt);
bit IIC_WaitAck(void);
unsigned char IIC_RecByte(void);
unsigned char IIC_read(unsigned char add);
#endif

第三屆藍橋杯單片機省賽作品演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/279325.html
標籤:其他
上一篇:MaixPy/openmv原始碼分析--bitmap
下一篇:線索二叉樹(作業二)
