蓝桥杯单片机第六届国赛(智能物料传送系统)
Posted 一心向月
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥杯单片机第六届国赛(智能物料传送系统)相关的知识,希望对你有一定的参考价值。
先看题目。
全部文件:提取码:azxy
main.c
#include "stc15f2k60s2.h"
#include "intrins.h"
#include "iic.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit TX=P1^0;//超声波发射
sbit RX=P1^1;//超声波接收
u8 code duan[12]=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf;//0~9
u16 rb2=0;//电位器2的电压
u8 model=1;//数码管界面
u16 distance=0;//超声波测得距离
u8 kind=0;//货物类型
u8 time=1,time1=4,time2=6;//数码管显示的倒计时间 货物1传输时间 货物2传输时间
u8 stat=0;//空载 非空载 过载
u8 flag=0;//传输标志 0:未开始传输 1:开始传输
u8 time_setup=0;//货物传输时间设置区分
u8 relay=0;//继电器标志
u16 count=0,count1=0;//定时器时间累加变量
u8 Led_flag=0;//LED 0.5s 标志
u8 aa=0;//保证第一次上电 货物1时间为2S 货物2时间为4S
void delay(u16 i)//延迟函数
while(i--);
void Chan_hc573(u8 chose)//锁存器选择
switch(chose)
case 4:
P2 = (P2 & 0x1f) | 0x80; break;
case 5:
P2 = (P2 & 0x1f) | 0xa0; break;
case 6:
P2 = (P2 & 0x1f) | 0xc0; break;
case 7:
P2 = (P2 & 0x1f) | 0xe0; break;
P2 = (P2 & 0x1f) | 0x00;
void Init_system()//初始化关闭LED 蜂鸣器和继电器
P0=0x00;
Chan_hc573(5);
P0=0xff;
Chan_hc573(4);
void Smg_display(u8 com,u8 dat)//数码管选择
P0=0xff;
Chan_hc573(7);
P0=0x01<<com;
Chan_hc573(6);
P0=dat;
Chan_hc573(7);
delay(1000);
void Close_smg()//数码管消隐
P0=0x00;
Chan_hc573(6);
P0=0xff;
Chan_hc573(7);
void Display_model(u8 t)//数码管显示界面
if(stat!=0)//不是空载的时候
if(model==1)//界面1
while(t--)//因为是超声波显示界面,这一句是为了防止数码管闪烁太严重
Smg_display(0,duan[1]);
Smg_display(1,duan[10]);
Smg_display(2,duan[10]);
Smg_display(3,duan[distance/10%10]);
Smg_display(4,duan[distance%10]);
Smg_display(5,duan[10]);
Smg_display(6,duan[10]);
Smg_display(7,duan[kind]);
Close_smg();
else if(model==2)//界面2
Smg_display(0,duan[2]);
Smg_display(1,duan[10]);
Smg_display(2,duan[10]);
Smg_display(3,duan[10]);
Smg_display(4,duan[10]);
Smg_display(5,duan[10]);
Smg_display(6,duan[time/10]);
Smg_display(7,duan[time%10]);
Close_smg();
else //空载的时候
if(time_setup==0) Close_smg();//处于空载时,没有按S6时数码管熄灭
else //界面3
Smg_display(0,duan[3]);
Smg_display(1,duan[10]);
Smg_display(2,duan[10]);
Smg_display(3,duan[time1/10]);
Smg_display(4,duan[time1%10]);
Smg_display(5,duan[10]);
Smg_display(6,duan[time2/10]);
Smg_display(7,duan[time2%10]);
Close_smg();
/*******************超声波模块***********************/
void Delay12us() //延迟12us
unsigned char i;
_nop_();
_nop_();
i = 36;
while (--i);
void launch_csb()//超声波发射
u8 i=0;
for(i=0;i<8;i++)
TX=1;
Delay12us();
TX=0;
Delay12us();
void count_distane()//超声波测距
TMOD &= 0x0F;
TL0 = 0x00;
TH0 = 0x00;
TF0 = 0;
ET0 = 1;
launch_csb();
TR0=1;
while((TF0==0)&&(RX==1));
TR0=0;
if(TF0==1)
TF0=0;
distance=999;
else
distance = (TH0<<8)|TL0;
distance = distance*0.017+3;
if(distance>99) distance=99;
if(distance<=30) kind=1;//小于等于30cm,为货物1
else kind=2;//大于30cm为货物2
/********************************过载监测***************************/
void survey()//过载监测
rb2=Read_Rb2(0x03)/0.51;//读取电压
if(rb2<100) stat=0;//空载
else if((rb2>=100)&&(rb2<400)) stat=1;//非空载
else if(rb2>=400) stat=2;//过载
/*******************************存储时间***************************/
void Delay5ms() //延迟5ms
unsigned char i, j;
i = 59;
j = 90;
do
while (--j);
while (--i);
void store_time()//把设置好的货物1和货物2时间存储到EEPROM里
Wire_dat(0x01,time1);Delay5ms();//连续写要延迟5ms
Wire_dat(0x02,time2);Delay5ms();
/*******************************按键模块***************************/
void Key_down()//按键判断
if(P33==0) //S4
delay(1000);
if(P33==0)
while(P33==0) Display_model(10);
if((stat==1)&&(flag==0))//判断是否不处于空载 过载 传输过程
model=2;flag=1;relay=1;
if(kind==1) time=time1;
if(kind==2) time=time2;
else if(P32==0) //S5
delay(1000);
if(P32==0)
while(P32==0) Display_model(10);
if(flag==1) //判断是否处于传输过程
if(relay==1) relay=0;
else if(relay==0) relay=1;
else if(P31==0) //S6
delay(1000);
if(P31==0)
while(P31==0) Display_model(10);
if(stat==0) //判断是否处于空载状态
model=3;
time_setup++;
if(time_setup==3) store_time();time_setup=0;model=1;
else if(P30==0) //S7
delay(1000);
if(P30==0)
while(P30==0) Display_model(10);
if(stat==0) //判断是否处于空载状态
if(time_setup==1) //货物1时间设置
time1++;
if(time1==11) time1=1;
else if(time_setup==2) //货物2时间设置
time2++;
if(time2==11) time2=1;
/*************************************定时器0*******************************/
void Timer1Init(void) //定时器1 1ms 12.000MHz
AUXR |= 0x40;
TMOD &= 0x0F;
TL1 = 0x20;
TH1 = 0xD1;
TF1 = 0;
ET1 = 1;
TR1 = 1;
EA = 1;
void service_t0() interrupt 3//中断服务函数
if(relay==1) count++;
if(relay==0) count1++;
if(count==1000)
count=0;
time--;
if(time==0) model=1;flag=0;relay=0;
if(count1==500)
count1=0;
if(Led_flag==0) Led_flag=1;
else if(Led_flag==1) Led_flag=0;
/************************继电器状态************************/
void Relay_stat()//继电器设置
if(flag==1)//如果处于传输过程
if(relay==1)
P04=1;P06=0;//继电器打开
Chan_hc573(5);
else
if(Led_flag==1)//L4点亮
P03=0;
Chan_hc573(4);
else //L4熄灭
P03=1;
Chan_hc573(4);
P04=0;P06=0;//继电器关闭
Chan_hc573(5);
if(stat==2)//如果过载
P04=0;P06=1;//蜂鸣器打开
Chan_hc573(5);
else //不处于过载的时候
if(flag==0)//这个条件是防止在传输过程时关闭继电器
P04=0;P06=0;//蜂鸣器关闭
Chan_hc573(5);
/**************************LED状态**********************/
void Led_stat()//LED设置
if(stat==0) P00=0;Chan_hc573(4); //空载状态下L1点亮
else if(stat==1) P01=0;Chan_hc573(4);//非空载状态下L2点亮
else if(stat==2) //过载的时候
if(Led_flag==1)//L3点亮
P02=0;
Chan_hc573(4);
else //L3熄灭
P02=1;
Chan_hc573(4);
void First_dat()//保证第一次上电时间,只会运行一次。
aa=time1=Read_dat(0x03);
if(aa!=131)
Wire_dat(0x01,2);Delay5ms();
Wire_dat(0x02,4);Delay5ms();
Wire_dat(0x03,131)以上是关于蓝桥杯单片机第六届国赛(智能物料传送系统)的主要内容,如果未能解决你的问题,请参考以下文章
蓝桥杯国赛真题24Scratch货物运输 第十三届蓝桥杯 图形化编程scratch国赛真题和答案讲解