|
这次分享的是蓝桥杯单片机第六届国赛考题的程序源码
单片机程序带有完整注释(一些简单的地方我就没注释)- #include "main.h"
- #include "display.h"
- #include "iic.h"
- #include "key.h"
- #include "time.h"
- #include "sonic.h"
- #include "delay.h"
- u8 dis_buf[]={" "};
- u8 con_temp = 0X00;
- u16 dis_mode=1;//当前显示模式
- u16 hw_flag = 1;//货物类型标志,1:一类货物;2:二类货物
- u16 y_time=2,e_time=4;//一类货物和二类货物传送时间标志
- bit ssbz=0;//LED闪烁标志
- bit job1_flag=0;
- bit job2_flag=0;
- bit job3_flag=0;
- bit job4_flag=0;
- bit job5_flag=0;
- u16 time=0;//传送时间标志
- u16 yz_flag = 1;//当前运载类型标志,0:空载;1:非空载;2:过载;
- bit qdcs_flag=0;//启动传送标志
- bit ztcs_flag=0;//暂停传送标志
- u8 led_temp=0xff;
- bit relay_flag = 0;//继电器开关标志
- bit buzz_flag = 0;//蜂鸣器开关标志
- bit ts_flag = 0;//是否进入调节时间模式标志
- u16 ts_temp = 0;//1:调节1类货物传送时间;2:调节2类货物传送时间
- void System_init();
- void job1();
- void job2();
- void job3();
- void job4();
- void job5();
- void cc_sj();
- void dq_sj();
- void main()
- {
- System_init();
- pcf_init();
- t0_init();
- t1_init();
- t2_init();
- //cc_sj();
- dq_sj();
- while(1)
- {
- if(job1_flag)//数码管显示
- {
- job1();
- job1_flag=0;
- }
- if(job2_flag)//按键扫描与处理
- {
- job2();
- job2_flag=0;
- }
- if(job3_flag)//数码管显示模式与LED显示模式处理
- {
- job3();
- job3_flag=0;
- }
- if(job4_flag)//电压测量与超声波测距
- {
- if(!qdcs_flag & !ts_flag)//启动传送之后不再测量电压与距离
- job4();
- job4_flag=0;
- }
- if(job5_flag)//传送时间计算
- {
- job5();
- job5_flag=0;
- }
- }
- }
- void System_init()
- {
- all_off;
- led_set=0xff;
- }
- void job1()//数码管显示
- {
- display_seg(dis_buf);
- }
- void job2()//按键处理
- {
- u8 key_num;
- key_num = read_key();
- if(s4_flag)
- {
- if(yz_flag!=0&&!qdcs_flag)//非空载,传送标志为0能进入判断
- {
- dis_mode = 2;
- qdcs_flag = 1;
- relay_flag = 1;
- if(hw_flag==1)
- {
- time = y_time;
- }
- else
- {
- time = e_time;
- }
- }
- s4_flag=0;
- }
- if(s5_flag)
- {
- if(qdcs_flag)
- {
- ztcs_flag = ~ztcs_flag;
- if(ztcs_flag)
- {
- relay_flag = 0;
- }
- if(!ztcs_flag)
- {
- relay_flag = 1;
- }
- }
- s5_flag=0;
- }
- if(s6_flag)
- {
- ts_flag = 1;
- ts_temp++;
- dis_mode = 3;
- if(ts_temp == 3)
- {
- cc_sj();
- dq_sj();
- ts_temp = 0;
- ts_flag = 0;
- dis_mode = 4;
- }
- s6_flag = 0;
- }
- if(s7_flag)
- {
- if(ts_flag)
- {
- switch(ts_temp)
- {
- case 1:y_time++;if(y_time== 11)y_time = 1;break;
- case 2:e_time++;if(e_time== 11)e_time = 1;break;
- }
- }
- s7_flag = 0;
- }
- }
- void job3()//显示模式处理(数码管显示与LED显示)
- {
- //数码管显示处理
- switch(dis_mode)
- {
- case 1:
- {
- sprintf(dis_buf,"%1d %02d %1d",dis_mode,juli,hw_flag);
- }break;
- case 2:
- {
- sprintf(dis_buf,"%1d %02d",dis_mode,time);
- }break;
- case 3:
- {
- if(!ssbz)
- {
- sprintf(dis_buf,"%1d %02d %02d",dis_mode,y_time,e_time);
- }
- else
- {
- switch(ts_temp)
- {
- case 1:sprintf(dis_buf,"%1d %02d",dis_mode,e_time);break;
- case 2:sprintf(dis_buf,"%1d %02d ",dis_mode,y_time);break;
- }
- }
-
- }break;
- case 4:
- {
- sprintf(dis_buf," ");
- }break;
- }
- //LED显示处理
- if(yz_flag == 2)//过载,蜂鸣器响
- {
- led_temp = 0x04;
- buzz_flag = 1;//打开蜂鸣器响标志
- }
- else
- {
- led_temp = 0x00;
- buzz_flag = 0;//关闭蜂鸣器响标志
- }
- if(ztcs_flag)led_temp = led_temp|0x08;
- if(ssbz)led_set = ~led_temp;
- else led_set = 0xff;
- //继电器与蜂鸣器处理
- con_temp = 0x00;
- if(relay_flag)con_temp |= 0x10;
- else con_temp &= 0XEF;
- if(buzz_flag)con_temp |= 0x40;
- else con_temp &= 0xbf;
- con_set = con_temp;
- }
- void job4()//电压测量与测距处理
- {
- u16 adc=0;//模数转换返回值
- f32 dy=0;//电压值
- adc = pcf_adc();//调用模数转换函数
- dy = (f32)adc/255.0*5.0;//计算当前电压为多少
- if(dy>0.0&&dy<1.0)//空载数码管熄灭
- {
- yz_flag=0;//空载
- if(!ts_flag)
- dis_mode = 4;//显示模式4:数码管全灭
- }
- else if(dy>=1.0&&dy<4.0)//非空载
- {
- yz_flag=1;//非空载
- if(!ts_flag)
- dis_mode = 1;//显示模式1:数码管显示
- }
- else if(dy>=4.0)//过载
- {
- yz_flag=2;//过载
- if(!ts_flag)
- dis_mode = 1;
- }
- //测量距离
- if(yz_flag!=0)//如果非空载
- {
- ceju();//测量距离
- // juli =31;//测试
- if(juli<=30)//判断货物类型
- {
- hw_flag=1;//一类货物
- }
- else
- {
- hw_flag=2;//二类货物
- }
- }
- }
- void job5()//时间计算函数
- {
- if(!ztcs_flag)time--;//如果没有暂停
- if(time == 0)//时间等于零
- {
- qdcs_flag = 0;
- ztcs_flag = 0;
- relay_flag = 0;
- }
- }
- void cc_sj()
- {
- write_eeprom(0,y_time);
- write_eeprom(1,e_time);
- }
- void dq_sj()
- {
- y_time = read_eeprom(0);
- e_time = read_eeprom(1);
- }
复制代码 工程文件请到51hei附件里面下载
|
评分
-
查看全部评分
|