免费个人网站源码,wordpress做招聘网站,国外婚纱网站建设现状,网络营销的推广手段目录 前言
蓝桥杯大赛历届真题_蓝桥杯 - 蓝桥云课#xff08;点击查看#xff09;
单片机资源数据包_2023#xff08;点击下载#xff09;
一、第十二届比赛原题
1.比赛题目
2.题目解读
蓝桥杯第十四届电子类单片机组程序设计_蓝桥杯单片机哪一届最难-CSDN博客
二、…目录 前言
蓝桥杯大赛历届真题_蓝桥杯 - 蓝桥云课点击查看
单片机资源数据包_2023点击下载
一、第十二届比赛原题
1.比赛题目
2.题目解读
蓝桥杯第十四届电子类单片机组程序设计_蓝桥杯单片机哪一届最难-CSDN博客
二、代码实现
main.c
onewire.c
onewire.h
iic.c
iic.h 前言
完成了第14届的题目之后再看往些年的题目真的就太简单了现在年也过完了相比备战蓝桥杯的同学们也已经回到学校开启忙碌的学习了。但是学习之余也不要忘了做几道前几年简单的题目保持手感临近比赛时再做一些比较难的题目比如国赛题和最近的省赛题。
老规矩先放题目链接
蓝桥杯大赛历届真题_蓝桥杯 - 蓝桥云课点击查看
单片机资源数据包_2023点击下载
一、第十二届比赛原题
1.比赛题目 2.题目解读
第十二届的题目非常简单不管是按键和菜单还是LED灯都非常简单菜单只有三个没有子菜单每个按键都只有一个功能且没有长按短按LED灯只有简单的指示不涉及闪烁也不涉及满足特殊条件后才点亮。总之就是特别简单感兴趣的可以对比一下第十四届的省赛题目。
蓝桥杯第十四届电子类单片机组程序设计_蓝桥杯单片机哪一届最难-CSDN博客
至于刚才提到的长按短按和对小数的处理都在第四届的题目中提到过本篇文章在写代码时就不过多介绍了。
二、代码实现
main.c
#include stc15.h
#include intrins.h
#include iic.h
#include onewire.hcode unsigned char Seg_Table[]
{
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //90x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,
0xFF,//20 熄灭
0xC6,//21 C
0x8C,//22 P
0x88,//23 A
};
unsigned char Led_Num0xFF;
#define LED_ON(x) Led_Num~(0x01x); P0Led_Num;P2|0x80;P20x9F;P20x1F;
#define LED_OFF(x) Led_Num|0x01x; P0Led_Num;P2|0x80;P20x9F;P20x1F;#define NIXIE_CHECK() P2|0xC0;P20xDF;P20x1F;
#define NIXIE_ON() P2|0xE0;P20xFF;P20x1F;void Delay100ms(void); //12.000MHz
void Timer0_Init(void); //1毫秒12.000MHz
void get_key(void);//按键处理
void show_menu(void);//菜单显示
void led_run(void);//控制led灯
void DAC_out(void);//控制DAC输出unsigned char Nixie_num[]{20,20,20,20,20,20,20,20};
unsigned char location0;
unsigned char key_value0;
unsigned int temp0;
unsigned char mod0;
unsigned char wendu_canshu25;//温度参数默认为25
unsigned int DAC0;//DAC要求保留小数点后两位这里的DAC的值扩大了100倍bit mo_shi0;//0DAC输出模式1,1DAC输出模式2
void main()
{Timer0_Init();EA1;read_temp();//温度传感器初始化Delay100ms();while(1){get_key();tempread_temp();//读取温度led_run();//LED灯控制DAC_out();//DAC输出Delay100ms();show_menu();}
}
void Timer0_Isr(void) interrupt 1
{P00x01location;NIXIE_CHECK();P0Seg_Table[Nixie_num[location]];NIXIE_ON();if(location8)location0;
}void Timer0_Init(void) //1毫秒12.000MHz
{AUXR | 0x80; //定时器时钟1T模式TMOD 0xF0; //设置定时器模式TL0 0x20; //设置定时初始值TH0 0xD1; //设置定时初始值TF0 0; //清除TF0标志TR0 1; //定时器0开始计时ET0 1; //使能定时器0中断
}void Delay100ms(void) //12.000MHz
{unsigned char data i, j, k;_nop_();_nop_();i 5;j 144;k 71;do{do{while (--k);} while (--j);} while (--i);
}
void Delay5ms(void) //12.000MHz
{unsigned char data i, j;i 59;j 90;do{while (--j);} while (--i);
}
void get_key(void)
{unsigned char key_P3P3;unsigned char key_P4P4;P30xFF;P40xFF;P440;if(P320){Delay5ms();while(P320);Delay5ms();key_value5;}else if(P330){Delay5ms();while(P330);Delay5ms();key_value4;}P420;if(P320){Delay5ms();while(P320);Delay5ms();key_value9;}else if(P330){Delay5ms();while(P330);Delay5ms();key_value8;}//s4模式切换if(key_value4){if(mod0)//菜单0mod1;else if(mod1)//菜单1mod2;else if(mod2)//菜单2mod0;}//s8 减else if(key_value8){if(mod1){wendu_canshu--;}}//s9 加else if(key_value9){if(mod1){wendu_canshu;}}//s5 切换DAC输出模式else if(key_value5){mo_shi~mo_shi;//切换模式}key_value0;P3key_P3;P4key_P4;
}
void show_menu(void)
{if(mod0)//菜单0 显示温度{Nixie_num[0]21;Nixie_num[1]20;Nixie_num[2]20;Nixie_num[3]20;Nixie_num[4]temp/1000%10;Nixie_num[5]temp/100%1010;Nixie_num[6]temp/10%10;Nixie_num[7]temp/1%10;}else if(mod1)//菜单1 显示参数{Nixie_num[0]22;Nixie_num[1]20;Nixie_num[2]20;Nixie_num[3]20;Nixie_num[4]20;Nixie_num[5]20;Nixie_num[6]wendu_canshu/10%10;Nixie_num[7]wendu_canshu/1%10;}else if(mod2)//菜单2 显示DAC输出值{Nixie_num[0]23;Nixie_num[1]20;Nixie_num[2]20;Nixie_num[3]20;Nixie_num[4]20;Nixie_num[5]DAC/100%1010;//注意DAC的值是扩大100倍之后的Nixie_num[6]DAC/10%10;Nixie_num[7]DAC/1%10;}
}bit L1_is_on0;
bit L2_is_on0;
bit L3_is_on0;
bit L4_is_on0;
void led_run(void)
{if(mo_shi0L1_is_on0)//如果DAC处在模式1且L1未点亮{LED_ON(0);//则点亮L1L1_is_on1;}else if(mo_shi!0L1_is_on1)//如果DAC不处在模式1.且L1被点亮了{LED_OFF(0);//则熄灭L1L1_is_on0;}if(mod0L2_is_on0)//如果在温度显示界面且L2未点亮{LED_ON(1);//则点亮L2L2_is_on1;}else if(mod!0L2_is_on1)//如果不在温度显示界面且L2被点亮{LED_OFF(1);//则熄灭L2L2_is_on0;}if(mod1L3_is_on0)//如果在参数显示界面且L3未点亮{LED_ON(2);//则点亮L3L3_is_on1;}else if(mod!1L3_is_on1)//如果不在参数显示界面且L3被点亮{LED_OFF(2);//则熄灭L3L3_is_on0;}if(mod2L4_is_on0)//如果在DAC显示界面且L4未点亮{LED_ON(3);//则点亮L4L4_is_on1;}else if(mod!2L4_is_on1)//如果不在DAC显示界面且L4被点亮{LED_OFF(3);//则熄灭L4L4_is_on0;}
}
void DAC_out(void)
{if(mo_shi0mod!1)//如果是DAC输出模式1{//对于当前是否输出0V或者5V的判断是为了防止重复操作引起误差不判断也行if(temp/100wendu_canshuDAC!0)//如果温度大于阈值且没有输出0.00VDAC0;//输出0Velse if(temp/100wendu_canshuDAC!500)//如果温度大于阈值且没有输出5.00VDAC500;//则输出5.00V}else if(mo_shi1)//如果是DAC输出模式2{//拟合出直线并限制DAC取值范围在100到400之间//注意为方便操作DAC的小数DAC的值被扩大了100百100到400就对应1V到4V之间DACtemp*3/20-200100 ? temp*3/20-200:100;DACtemp*3/20-200400 ? temp*3/20-200:400;}write_pcf((unsigned char)(DAC/5*255/100));//将电压转化为0到255并输出注意DAC扩大了100倍)
}
onewire.c
/* # 单总线代码片段说明1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。2. 参赛选手可以自行编写相关代码或以该代码为基础根据所选单片机类型、运行速度和试题中对单片机时钟频率的要求进行代码调试和修改。
*/
#include stc15.h
#include intrins.h
#include onewire.h
sbit DQP1^4;//
void Delay_OneWire(unsigned int t)
{unsigned char i;while(t--){for(i0;i12;i);}
}//
void Write_DS18B20(unsigned char dat)
{unsigned char i;for(i0;i8;i){DQ 0;DQ dat0x01;Delay_OneWire(5);DQ 1;dat 1;}Delay_OneWire(5);
}//
unsigned char Read_DS18B20(void)
{unsigned char i;unsigned char dat;for(i0;i8;i){DQ 0;dat 1;DQ 1;if(DQ){dat | 0x80;} Delay_OneWire(5);}return dat;
}//
bit init_ds18b20(void)
{bit initflag 0;DQ 1;Delay_OneWire(12);DQ 0;Delay_OneWire(80);DQ 1;Delay_OneWire(10); initflag DQ; Delay_OneWire(5);return initflag;
}unsigned int read_temp(void)
{unsigned char low0;unsigned char high0;unsigned int temp0;unsigned char xiaoshu0;init_ds18b20();Write_DS18B20(0xCC);Write_DS18B20(0x44);Delay_OneWire(200);init_ds18b20();Write_DS18B20(0xCC);Write_DS18B20(0xBE);lowRead_DS18B20();highRead_DS18B20();temphigh;temp0x0F;temp8;temp|low;temp4;//处理小数部分xiaoshulow;xiaoshu0x0F;temptemp*100xiaoshu;//处理小数部分温度也扩大了100倍return temp;}
onewire.h
#ifndef _ONEWIRE_H_
#define _ONEWIRE_H_unsigned int read_temp(void);#endif
iic.c
/* # I2C代码片段说明1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。2. 参赛选手可以自行编写相关代码或以该代码为基础根据所选单片机类型、运行速度和试题中对单片机时钟频率的要求进行代码调试和修改。
*/#define DELAY_TIME 5
#include stc15.h
#include intrins.h
#include iic.h
sbit sdaP2^1;
sbit sclP2^0;
//
static void I2C_Delay(unsigned char n)
{do{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); }while(n--);
}//
void I2CStart(void)
{sda 1;scl 1;I2C_Delay(DELAY_TIME);sda 0;I2C_Delay(DELAY_TIME);scl 0;
}//
void I2CStop(void)
{sda 0;scl 1;I2C_Delay(DELAY_TIME);sda 1;I2C_Delay(DELAY_TIME);
}//
void I2CSendByte(unsigned char byt)
{unsigned char i;for(i0; i8; i){scl 0;I2C_Delay(DELAY_TIME);if(byt 0x80){sda 1;}else{sda 0;}I2C_Delay(DELAY_TIME);scl 1;byt 1;I2C_Delay(DELAY_TIME);}scl 0;
}//
unsigned char I2CReceiveByte(void)
{unsigned char da;unsigned char i;for(i0;i8;i){ scl 1;I2C_Delay(DELAY_TIME);da 1;if(sda) da | 0x01;scl 0;I2C_Delay(DELAY_TIME);}return da;
}//
unsigned char I2CWaitAck(void)
{unsigned char ackbit;scl 1;I2C_Delay(DELAY_TIME);ackbit sda; scl 0;I2C_Delay(DELAY_TIME);return ackbit;
}//
void I2CSendAck(unsigned char ackbit)
{scl 0;sda ackbit; I2C_Delay(DELAY_TIME);scl 1;I2C_Delay(DELAY_TIME);scl 0; sda 1;I2C_Delay(DELAY_TIME);
}void write_pcf(unsigned char dat)
{I2CStart();I2CSendByte(0x90);I2CWaitAck();I2CSendByte(0x40);I2CWaitAck();I2CSendByte(dat);I2CWaitAck();I2CStop();
}iic.h
#ifndef _IIC_H_
#define _IIC_H_void write_pcf(unsigned char dat);#endif
正在准备蓝桥杯的UU们这个时候也不能泄气如果你是寒假偷懒还没开始学习的话也不要担心后续我也会发几期开荒的文章供大家参考还有一个月多花点时间学学混个奖应该没什么问天。