蓝桥杯第十二届4t满分

main.c

#include <STC15F2K60S2.H>

#include <intrins.h>

#include <seg.h>

#include <ds18b20.h>

#include <key.h>

#include <pcf8591.h>

#include <led.h>

unsigned int seg_slow_down;//0-65535

unsigned char key_slow_down;

unsigned char key_down,key_old,key_val;

unsigned char segmode=0;

unsigned char ucled[8]={0,0,0,0,0,0,0,0};

unsigned char seg_pos;

unsigned char seg_buf[8]={10,10,10,10,10,10,10,10};

unsigned char seg_point[8]={0,0,0,0,0,0,0,0};

float temperature;

unsigned char seg_wen=25;//0-255

unsigned char sta_wen=25;

float seg_v=0;

bit mode;

void system_init(void)

{

P0=0xff;

P2=P2&0x1f|0x80;

P2&=0x1f;

P0=0x00;

P2=P2&0x1f|0xa0;

P2&=0x1f;

}

void key_proc()

{

if(key_slow_down<10)return;

key_slow_down=0;

key_val= key_read();

key_down=key_val&(key_old^key_val);

key_old=key_val;

switch(key_down)

{

case 4:

if(++segmode==3)segmode=0;

if(segmode==1)seg_wen=sta_wen;

if(segmode==2)sta_wen=seg_wen;

break;

case 8:

if(segmode==1)

{

if(--seg_wen==255)seg_wen=0;

}

break;

case 9:

if(segmode==1)

{

if(++seg_wen==100)seg_wen=99;

}

break;

case 5:

mode^=1;

break;

}

}

void working()

{

if(mode==0)//模式1

{

if(temperature<sta_wen)seg_v=0;

else seg_v=5;

}

else//模式2

{

if(temperature<20)seg_v=1;

else if(temperature>40)seg_v=4;

else

seg_v=0.15*temperature-2;

}

DA_zhuanhua(seg_v*51);

if(mode==0)ucled[0]=1;

else ucled[0]=0;

if(segmode==0)ucled[1]=1;

else ucled[1]=0;

if(segmode==1)ucled[2]=1;

else ucled[2]=0;

if(segmode==2)ucled[3]=1;

else ucled[3]=0;

}

void seg_proc()

{

if(seg_slow_down<500)return;

seg_slow_down=0;

temperature=rd_temperature();

switch(segmode)

{

case 0:

seg_buf[0]=11;

seg_point[5]=1;

seg_buf[4]=(unsigned char)temperature/10;

seg_buf[5]=(unsigned char)temperature%10;

seg_buf[6]=(unsigned int)(temperature*100)%100/10;

seg_buf[7]=(unsigned int)(temperature*100)%10;

break;

case 1:

seg_buf[0]=12;

seg_point[5]=0;

seg_buf[4]=10;

seg_buf[5]=10;

seg_buf[6]=seg_wen/10;

seg_buf[7]=seg_wen%10;

break;

case 2:

seg_buf[0]=13;

seg_point[5]=1;

seg_buf[4]=10;

seg_buf[5]=(unsigned char)seg_v;

seg_buf[6]=(unsigned int)(seg_v*100)%100/10;

seg_buf[7]=(unsigned int)(seg_v*100)%10;

break;

}

}

void Timer0Init(void) //1毫秒@12.000MHz

{

AUXR &= 0x7F; //定时器时钟12T模式

TMOD &= 0xF0; //设置定时器模式

TL0 = 0x18; //设置定时初值

TH0 = 0xFC; //设置定时初值

TF0 = 0; //清除TF0标志

TR0 = 1; //定时器0开始计时

ET0=1;

EA=1;

}

void ServiceT0() interrupt 1

{

seg_slow_down++;

key_slow_down++;

if(++seg_pos==8)seg_pos=0;

seg_disp(seg_pos,seg_buf[seg_pos],seg_point[seg_pos]);

led_disp(seg_pos,ucled[seg_pos]);

}

void Delay750ms() //@12.000MHz

{

unsigned char i, j, k;

nop();

nop();

i = 35;

j = 51;

k = 182;

do

{

do

{

while (--k);

} while (--j);

} while (--i);

}

void main()

{

Delay750ms();

rd_temperature();

Timer0Init();

system_init();

while(1)

{

seg_proc();

key_proc();

working();

}

}

seg.c

#include <seg.h>

unsigned char seg_wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

unsigned char seg_duan[]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90 ,0xff,

0xc6,0x8c,0x88};

void seg_disp(unsigned char wei,duan,point)

{

P0=0xff;

P2=P2&0x1f|0xe0;

P2&=0x1f;

P0=seg_wei[wei];

P2=P2&0X1f|0xc0;

P2&=0x1f;

P0=seg_duan[duan];

if(point==1)P0&=0x7f;

P2=P2&0X1f|0xe0;

P2&=0x1f;

}

ds18b20.c

#include <ds18b20.h>

sbit DQ=P1^4;

void Delay_OneWire(unsigned int t)

{

unsigned char i;

while(t--){

for(i=0;i<12;i++);

}

}

//

void Write_DS18B20(unsigned char dat)

{

unsigned char i;

for(i=0;i<8;i++)

{

DQ = 0;

DQ = dat&0x01;

Delay_OneWire(5);

DQ = 1;

dat >>= 1;

}

Delay_OneWire(5);

}

//

unsigned char Read_DS18B20(void)

{

unsigned char i;

unsigned char dat;

for(i=0;i<8;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;

}

float rd_temperature(void)

{

unsigned char high;

unsigned char low;

init_ds18b20();

Write_DS18B20(0xcc);

Write_DS18B20(0x44);

init_ds18b20();

Write_DS18B20(0xcc);

Write_DS18B20(0xbe);

low=Read_DS18B20();

high=Read_DS18B20();

return ((high<<8)|low)/16.0;

}

key.c

#include <key.h>

unsigned char key_read(void)

{

unsigned char temp=0;

P44=0;P42=1;P35=1;P34=1;

if(P30==0)temp=7;

if(P31==0)temp=6;

if(P32==0)temp=5;

if(P33==0)temp=4;

P44=1;P42=0;P35=1;P34=1;

if(P30==0)temp=11;

if(P31==0)temp=10;

if(P32==0)temp=9;

if(P33==0)temp=8;

P44=1;P42=1;P35=0;P34=1;

if(P30==0)temp=15;

if(P31==0)temp=14;

if(P32==0)temp=13;

if(P33==0)temp=12;

P44=1;P42=1;P35=1;P34=0;

if(P30==0)temp=19;

if(P31==0)temp=18;

if(P32==0)temp=17;

if(P33==0)temp=16;

return temp;

}

pcf8591.c

#include <pcf8591.h>

#include <intrins.h>

#define DELAY_TIME 5

sbit scl=P2^0;

sbit sda=P2^1;

//

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(i=0; i<8; 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(i=0;i<8;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 DA_zhuanhua(unsigned char dat)

{

I2CStart();

I2CSendByte(0x90);

I2CWaitAck();

I2CSendByte(0x41);

I2CWaitAck();

I2CSendByte(dat);

I2CWaitAck();

I2CStop();

}

led.c

#include <led.h>

void led_disp(unsigned char pos,enable)

{

static unsigned char temp=0x00;

static unsigned char temp_old=0xff;

if(enable==1)

{

temp |=(0x01<<pos);

}

else

{

temp &=~(0x01<<pos);

}

if(temp!=temp_old)

{

P0=~temp;

P2=P2&0X1F|0X80;

P2&=0X1F;

temp_old=temp;

}

}

相关推荐
念越2 小时前
蓝桥杯自动化测试模拟1期答案及代码解析(完整版)
自动化测试·软件测试·selenium·蓝桥杯
你撅嘴真丑12 小时前
[蓝桥杯 2025 省 B] 生产车间 与 装修报价
职场和发展·蓝桥杯
Tanecious.13 小时前
蓝桥杯备赛:Day4-P9749 公路
c++·蓝桥杯
Tanecious.14 小时前
蓝桥杯备赛:Day3-P1102 A-B 数对
c++·蓝桥杯
Tanecious.14 小时前
蓝桥杯备赛:Day3-P1918 保龄球
c++·蓝桥杯
Tanecious.19 小时前
蓝桥杯备赛:Day1-P1101 单词方阵
c语言·c++·蓝桥杯
进击的确定20 小时前
蓝桥杯BFS/DFS
蓝桥杯·深度优先·宽度优先
仟濹1 天前
【算法打卡day37(2026-04-04 周六)】DFS专项训练4-枚举专项训练 1-全部是蓝桥杯真题
算法·蓝桥杯·深度优先
沙雕不是雕又菜又爱玩1 天前
P12121 [蓝桥杯 2024 省 B 第二场] 进制(C++)
蓝桥杯