这是我自己在学习蓝桥杯过程中总结的一些知识,希望对今后的学习和备战蓝桥的同学能够提供一些帮助吧,一起加油哦,预祝各位在比赛中取得优异成绩。
蓝桥杯-第三届(自动售水机)
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