這是我自己在學習藍橋杯過程中總結的一些知識,希望對今後的學習和備戰藍橋的同學能夠提供一些幫助吧,一起加油哦,預祝各位在比賽中取得優異成績。
藍橋杯-第三屆(自動售水機)
1.
試題要求如下
2.題目要點分析
1) 上電後各部分要初始化(關閉蜂嚀器、數碼管、led燈、繼電器),並且數碼管要顯示題目要求初始的數(含格式)
2)按下 S7 清屏開始計數(計數器中斷)流水顯示,S6停止流水計數並且計算顯示出流水價格
3) 通過光敏電阻讀取環境的亮度,當其發生改變時,做出不同的響應
4)掌握IIC
3.注意事項
1)數碼管小數的顯示,需要重新計算數碼管段選數組 tab_spot[] ,都加上h,使其顯示出小數點
2)S7按鍵不會改變流水的狀態,唯有S6可以改變, S7作用只有一個,就是清屏開始流水計數
3)通過流水量計算出價格這方法要注意
4)光敏電阻讀取數據與顯示的轉換要注意( IIC 寫0x90, 讀0x91)
5) 引用頭文件並且定義無符號類型
#include "STC15f2k60S2.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
4.代碼實現
首先是進行初始化
void allinit()
{
P2=0XA0;
P0=0X00;
P2=0X80;
P0=0XFF;
P2=0XC0;
P0=0XFF;
P2=0XFF;
P0=0XFF;
}
延時函數
void delayms(uchar a)
{
uint b;
for(;a>0;a--)
{
for(b=845;b>0;b--)
{
}
}
}
數碼管顯示(雙重----正常不加小數點和加小數點)
uchar tab[]={0xc0,
0xf9,0xa4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90,
0xff};
uchar tab_spot[]={0x40,
0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,
0xff};
void display(uchar channel,uchar num)
{
P2=0XC0;
P0=0X01<<channel;
P2=0XE0;
P0=tab[num];
delayms(2);
}
void display_spot(uchar channel,uchar num)
{
P2=0XC0;
P0=0X01<<channel;
P2=0XE0;
P0=tab_spot[num];
delayms(2);
}
題目要求的數碼管顯示格式
uchar yi,er,san,si,wu,liu,qi,ba;
void display_SMG()
{
display(0,yi);
display_spot(1,er);
display(2,san);
display(3,si);
display(4,wu);
display_spot(5,liu);
display(6,qi);
display(7,ba);
}
中斷
void Timer0Init(void)
{
AUXR |= 0x80;
TMOD &= 0xF0;
TL0 = 0x00;
TH0 = 0x28;
TF0 = 0;
TR0 = 1;
}
uint aa=0;
uint bb=0;
uint money=0;
void time0 () interrupt 1
{
aa++;
if(aa==20)
{
bb++;
aa=0;
ba=bb%10;
qi=bb%100/10;
liu=bb%1000/100;
wu=bb/1000;
}
if(bb==9999)
{
bb=0;
money=bb*0.5;
ba=money%10;
qi=money%100/10;
liu=money%1000/100;
wu=money/1000;
}
}
按鍵操作
void start()
{
wu=liu=qi=ba=0;
P2=0XA0;
P0=0X10;
ET0=1;
EA=1;
}
void off()
{
P2=0XA0;
P0=0X00;
EA=0;
ET0=0;
money=bb*0.5;
ba=money%10;
qi=money%100/10;
liu=money%1000/100;
wu=money/1000;
bb=0;
}
void keyscan()
{
if(P30==0)
{
delayms(2);
if(P30==0)
{
start();
}
while(!P30);
}
if(P31==0)
{
delayms(2);
if(P31==0)
{
off();
}
while(!P31);
}
}
實現光敏電阻的各項功能 (要利用給的IIC文件夾,稍加修改即可)
#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();}
#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;
}
}
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;
}
}
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;
}
uchar iic_read(uchar add)
{
uchar temp;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_Stop();
IIC_Start(0x91);
IIC_SendByte(0x91);
IIC_WaitAck();
temp=IIC_RecByte();
IIC_WaitAck();
IIC_Stop();
return temp;
}
主函數
void main()
{
uchar guangmin;
all_init();
Timer0Init();
yi=10,er=0,san=5,si=0,wu=0,liu=1,qi=0,ba=0;
while(1)
{
display_SMG();
keyscan();
guangmin=iic_read(0x01);
if(guangmin<64)
{
P0=0XFF;
P2=0X80;
P00=0;
}
else
{
P2=0X80;
P0=0XFF;
}
}
}
注: 本文爲原創,未經允許,禁止轉載!
有什麼問題歡迎給我留言哦
hexo博客:https:www.ho-brother.ltd