代码如下:

#include <STC15F2K60S2.H>
#include "iic.h"
#include "onewire.h"
#include "intrins.h"
#include "string.h"
#include "math.h"
unsigned char code duan[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};unsigned char command[6];
unsigned char a=0;
sbit tx=P1^0;
sbit rx=P1^1;unsigned int temp;//温度
unsigned int distance;//距离
unsigned int chishu=0;//变更次数
unsigned char dat_temp=30;//温度参数
unsigned char dat_distance=35;//距离参数
unsigned char stat_s13=0;//界面按键标志位
unsigned char stat_s12=0;//切换按键标志位
unsigned int k=0;//延时计数
bit open_dac=0;//dac启停标志位
char cs_1=0,cs_2=0;//按键加减次数
unsigned char count_t=0;void select_hc573(unsigned char channel)
{switch(channel){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;case 0:P2=(P2&0x1f)|0x00;break;}
}void delay(unsigned int i)
{while(i--);
}void smg_bit(unsigned char pos,unsigned char value)
{select_hc573(7);P0=0xff;select_hc573(6);P0=0x01<<pos;select_hc573(7);P0=value;
}
void close_all_smg()
{select_hc573(7);P0=0xff;select_hc573(6);P0=0xff;
}void display_smg_temp()
{smg_bit(0,0xc6);delay(500);smg_bit(4,duan[temp/1000]);delay(500);smg_bit(6,duan[temp/10%10]);delay(500);smg_bit(5,duan[temp/100%10]+0x80);delay(500);smg_bit(7,duan[temp%10]);delay(500);close_all_smg();
}void display_smg_distance()
{smg_bit(0,0xc7);delay(500);smg_bit(6,duan[distance%100/10]);delay(500);smg_bit(7,duan[distance%10]);delay(500);close_all_smg();
}void display_smg_n()
{smg_bit(0,0xc8);delay(500);if(chishu>9999)smg_bit(3,duan[chishu/10000]);delay(500);if(chishu>999)smg_bit(4,duan[chishu/1000%10]);delay(500);if(chishu>99)smg_bit(5,duan[chishu/100%10]);delay(500);if(chishu>9)smg_bit(6,duan[chishu/10%10]);delay(500);smg_bit(7,duan[chishu%10]);delay(500);close_all_smg();
}void display_smg_dat_temp()
{smg_bit(0,0x8c);delay(500);smg_bit(3,duan[1]);delay(500);smg_bit(6,duan[dat_temp/10]);delay(500);smg_bit(7,duan[dat_temp%10]);delay(500);close_all_smg();
}void display_smg_dat_distance()
{smg_bit(0,0x8c);delay(500);smg_bit(3,duan[2]);delay(500);smg_bit(6,duan[dat_distance/10]);delay(500);smg_bit(7,duan[dat_distance%10]);delay(500);close_all_smg();
}void smg()
{if(stat_s13==0){if(stat_s12==0){display_smg_temp();}else if(stat_s12==1){display_smg_distance();}else if(stat_s12==2){display_smg_n();}}else{if(stat_s12==0){display_smg_dat_temp();}else if(stat_s12==1){display_smg_dat_distance();}}
}void led()                                                 //LED等部分
{select_hc573(4);P0=0xff;if(temp>dat_temp*100){P00=0;}if(distance<dat_distance){P01=0;}if(open_dac==0){P02=0;}
}void Delay1ms()        //@12.000MHz
{unsigned char i, j;i = 12;j = 169;do{while (--j);} while (--i);
}
void key()
{P32=0;P33=P34=P35=1;if(P35==0)                   //界面按键       S13{delay(100);if(P35==0){k=0;while(P35==0){Delay1ms();k++;smg();}if(k>100){open_dac=~open_dac;}else{stat_s13++;if(stat_s13==2)stat_s13=0;stat_s12=0;}}}else if(P34==0)                //加按键        S17{delay(100);if(P34==0){while(P34==0){smg();}if(stat_s13==1){if(stat_s12==0&&dat_temp<97){dat_temp= dat_temp+2;cs_1++;}else if(stat_s12==1&&dat_distance<50){dat_distance=dat_distance+5;cs_2++;}}}}P33=0;P32=P34=P35=1;if(P35==0)                       //切换按键         S12{delay(100);if(P35==0)               {k=0;while(P35==0){Delay1ms();k++;smg();}if(k>100){chishu=0;write_at24c02(0x01,chishu);delay(10000);write_at24c02(0x02,chishu>>8);delay(10000);}else{stat_s12++;if(stat_s13==0){if(stat_s12==3)stat_s12=0;}else{if(stat_s12==2)stat_s12=0;}}}}else if(P34==0)                  //减按键           S16{delay(100);if(P34==0){while(P34==0){smg();}if(stat_s13==1){if(stat_s12==0&&dat_temp>1){dat_temp= dat_temp-2;cs_1--;}else if(stat_s12==1&&dat_distance>10){dat_distance=dat_distance-5;cs_2--;}}}}
}void get_chishu()                           //获得数据变动次数
{if(stat_s13==0){if(cs_1!=0||cs_2!=0){chishu++;write_at24c02(0x01,chishu);write_at24c02(0x02,chishu>>8);cs_1=cs_2=0;}}
}void Delay12us()       //@12.000MHz
{unsigned char i;_nop_();_nop_();i = 33;while (--i);
}void send_wave()
{char i;for(i=0;i<8;i++){tx=1;Delay12us();tx=0;Delay12us();}
}void get_distance()
{unsigned int time=0;TMOD &=0X0F;TH1=0;TL1=0;TR1=0;send_wave();TR1=1;while(rx==1&&TF1==0);TR1=0;if(TF1==0){time=TH1;time=time<<8|TL1;distance=time*0.017;}else{TF1=0;distance=99;}
}void UartInit(void)        //4800bps@12.000MHz
{SCON = 0x50;      //8???,?????AUXR |= 0x01;      //??1?????2???????AUXR |= 0x04;        //?????1T??T2L = 0x8F;     //???????T2H = 0xFD;       //???????AUXR |= 0x10;     //???2????EA=1;ES=1;
}void send_byte(unsigned char dat)
{SBUF=dat;while(TI==0);TI=0;
}void send_string(unsigned char *str)
{while(*str!='\0'){send_byte(*str++);}
}void service_uart() interrupt 4
{if(RI==1){RI=0;command[a++]=SBUF;}
}void send_command_1()
{send_byte('$');send_byte((distance/10)+0x30);send_byte((distance%10)+0x30);send_byte(',');send_byte((temp/1000)+0x30);send_byte((temp/100%10)+0x30);send_byte('.');send_byte((temp/10%10)+0x30);send_byte((temp%10)+0x30);send_string("\r\n");
}
void send_command_2()
{send_byte('#');send_byte((dat_distance/10)+0x30);send_byte((dat_distance%10)+0x30);send_byte(',');send_byte((dat_temp/10)+0x30);send_byte((dat_temp%10)+0x30);send_string("\r\n");
}void send_error()
{send_string("ERROR\r\n");
}void send_huiying()
{if(a==4&&strcmp(command,"ST\r\n")==0){send_command_1();memset  (command,0,a);a=0;}else if(a==6&&strcmp(command,"PARA\r\n")==0){send_command_2();memset  (command,0,a);a=0;}else if(a>0&&strcmp(command,"PARA\r\n")==1||strcmp(command,"ST\r\n")==1){send_error();memset  (command,0,a);a=0;}
}
void Timer0Init(void)       //1??@12.000MHz
{AUXR |= 0x80;     //?????1T??TMOD &= 0xF0;       //???????TL0 = 0x20;       //???????TH0 = 0xD1;       //???????TF0 = 0;      //??TF0??TR0 = 1;      //???0????ET0=1;EA=1;
}void service_time0() interrupt 1
{count_t++;if(count_t==100){count_t=0;send_huiying();}
}void output_dac()
{if(open_dac==0){if(distance<=dat_distance){write_pcf8591(102);}else {write_pcf8591(204);}}elsewrite_pcf8591(20.4);
}void init_system()
{select_hc573(5);P0=0x00;select_hc573(4);P0=0xff;ET1=1;TR1=0;UartInit();Timer0Init();
}void main()
{init_system();chishu=read_at24c02(0x01)+read_at24c02(0x02)*256;while(1){key();temp=read_18b20_temp();
//      if(stat_s13==0&&stat_s12==1)get_distance();get_chishu(); output_dac();smg();led();
//      send_huiying();}
}

具体实现我也忘了,只是为了提供给大家做个参考。相信能看到这篇文章的人的实力应该能够读懂我代码的逻辑思维,所以我也就不介绍了。

最后我想说蓝桥杯单片机比赛比较简单,希望大家能取得一个令自己满意的成绩。

需要源代码链接如下:

第十届蓝桥杯国赛.zip - 蓝奏云

代码几乎无bug,如有问题请留言。

第十届蓝桥杯单片机国赛代码实现相关推荐

  1. 【蓝桥杯】第十三届蓝桥杯单片机国赛 代码程序

    第十三届蓝桥杯单片机国赛 程序 题目 hex文件 代码 工程文件 B站视频 更多资料 题目 历届的省赛和国赛的题目我已经在前面的文章(点击查看)里给大家分享了(网盘资源),需要的话,直接去下载,我在这 ...

  2. 【蓝桥杯】第九届蓝桥杯单片机国赛 代码程序

    第九届蓝桥杯单片机国赛 程序 题目 hex文件 代码 工程文件 B站视频 更多资料 题目 历届的省赛和国赛的题目我已经在前面的文章(点击查看)里给大家分享了(网盘资源),需要的话,直接去下载,我在这里 ...

  3. 第十届蓝桥杯(国赛)——大胖子走迷宫

    题目描述 小明是个大胖子,或者说是个大大胖子,如果说正常人占用 1×11 × 11×1 的面积,小明要占用 5×55 × 55×5 的面积. 由于小明太胖了,所以他行动起来很不方便.当玩一些游戏时,小 ...

  4. 第十届蓝桥杯(国赛)——拼接

    问题描述 小明要把一根木头切成两段,然后拼接成一个直角. 如下图所示,他把中间部分分成了 n × n n × n n×n 的小正方形,他标记了每个小正方形属于左边还是右边. 然后沿两边的分界线将木头切 ...

  5. 第十届蓝桥杯单片机省赛题目解析

    话不多说,我们一起来看看第十届(2019)的题目吧. 题目 这次的题目还是三大模块(数码管.LED.按键),还用到了ADC.DAC.NE555,除了NE555之前没有见过,其他也都是一些常见的外设,只 ...

  6. 2019年第十届蓝桥杯决赛(国赛) C++大学A组 D题 序列求和【全网找不到的题解?】

    题面 试题 D: 序列求和 本题总分:10 分 [问题描述] 学习了约数后,小明对于约数很好奇,他发现,给定一个正整数 t,总是可以找到含有 t 个约数的整数.小明对于含有 t 个约数的最小数非常感兴 ...

  7. 第十届蓝桥杯单片机省赛

    直接复制粘贴然后运行 然后打开stc烧录到开发板上面就能用 程序哪里不懂的话问我,我闲的蛋疼! 由于没有万用表就没查DA输出的电压 所以就不知道DA输出写的对不对,不过其他应该都没问题. 电压测量那边 ...

  8. 蓝桥杯嵌入式——第十二届蓝桥杯嵌入式国赛

    蓝桥杯嵌入式--第十二届蓝桥杯嵌入式国赛 之前准备省赛的时候用的是旧版的STM32F103,从准备国赛开始就用新版STM32G431平台了,主要是想经过新版的准备学习一下HAL库以及CubeMX的使用 ...

  9. 密室逃脱-第12届蓝桥杯Scratch国赛真题第5题

    本文转自于"超平的编程课"公众号,查看更多教程,可以移步至公众号. [导读]:超平老师计划推出Scratch蓝桥杯真题解析100讲,这是超平老师解读Scratch蓝桥真题系列的第3 ...

最新文章

  1. perl语言编程 第四版_2020年,5 种 将死的编程语言!
  2. JProfiler 11中文版
  3. 32岁被裁,拿N+1,我高兴地失业了
  4. redis集群的三种模式
  5. java 8 排序反转_Java 8 排序小结
  6. 小白都能看懂的干货!大数据这朵“后浪”,能卷起多大的风浪?
  7. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_10-webpack研究-安装nodejs
  8. vasp 模拟退火_vasp的分子动力学模拟
  9. CATIA常用的26个小技巧
  10. 固体核磁共振技术简介
  11. 云锁安装Linux服务器云锁安装说明
  12. pandas使用速查表
  13. QQ群龙王快速获得代码以及方法
  14. 超出三行部分用省略号显示_如何用三行数学建立神经网络
  15. 2022,这些大屏可视化素材,够你用一整年了(附可视化素材包)
  16. Conditional Positional Encodings for Vision Transformers(论文阅读笔记)
  17. CISP知识大纲思维导图
  18. JS获取各种屏幕的宽度和高度
  19. 反射内存交换机 LDF-2195 8口 兼容GE VMIC 5565 VMIC 5595
  20. android百度地图定位,改变MyLocationOverlay默认图标(原始为蓝色点)(两种方法)

热门文章

  1. IDEA添加子Module的正确姿势
  2. git-reflog用法回顾
  3. Android中GridView(网络视图)使用
  4. 2021全国特种设备-G1工业锅炉司炉模拟考试题库一[安考星]
  5. 3.3V降压1.2V,3V降压1.2V电源芯片和LDO选型表
  6. LeetCode 753. Cracking the Safe
  7. ios12后获取iOS设备WiFi名字和mac地址
  8. 遥感图像中的小样本目标检测:Few-shot Object Detection on Remote SensingImages
  9. hydra 暴力破解
  10. 常用的53款免费软件