蓝桥杯第十二届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;

}

}

相关推荐
小张的博客之旅1 天前
2026年第十七届蓝桥杯网络安全赛项WriteUp
安全·web安全·蓝桥杯
EnCi Zheng2 天前
S10-蓝桥杯 17822 乐乐的积木塔
职场和发展·蓝桥杯
The Chosen One9852 天前
算法题目分享(二分算法)
算法·职场和发展·蓝桥杯
酉鬼女又兒2 天前
Leetcode 26.删除有序数组中的重复项 双指针巧解有序数组去重:从快慢指针到原地修改算法的精髓
java·数据结构·算法·leetcode·职场和发展·蓝桥杯·排序算法
糯米团子7497 天前
蓝桥杯javaB组赛前四天复习-1
java·windows·蓝桥杯
CoderYanger10 天前
14届蓝桥杯省赛Java A 组Q1~Q3
java·开发语言·线性代数·算法·职场和发展·蓝桥杯
云泽80810 天前
第十五届蓝桥杯大赛软件赛省赛C/C++大学B组
c语言·c++·算法·蓝桥杯
fysuccess10 天前
Ubuntu 22.04 零基础安装 Hermes 完整入门指南
linux·ubuntu·蓝桥杯
j_xxx404_11 天前
C++算法:哈希表(简介|两数之和|判断是否互为字符重排)
数据结构·c++·算法·leetcode·蓝桥杯·力扣·散列表
门左有棵树12 天前
蓝桥杯C++组算法知识点整理(考前急救)
c++·算法·蓝桥杯