前言
这套题不难,相对于第六套题这一套比较简单了,但是还是有些小细节要抓
题目
OK,以上就是全部的题目了,这套题目相对来说逻辑比较简单,四个按键,S4控制pwm占空比,S5控制计时时间,S6控制开关,S7控制界面的切换,用到了定时器,按键,数码管,led(代码中未体现),DS18B20温度采集,逻辑相对简单,下面看看代码
代码
main.c
#include <REGX52.H>
#include "intrins.h"
#include <onewire.h>
sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;unsigned char code SMG_duanma[18]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0xff};void Chushi()//初始化
{P2 = 0XA0;P0 = 0X00;P2 = 0X80;P0 = 0XFF;P2 = 0XC0;P0 = 0XFF;P2 = 0XFF;P0 = 0XFF;
}void HC138(unsigned char n)//138译码器
{switch(n){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;}
}void display(unsigned int pos,m)//数码管基础显示
{HC138(6);P0 = 0X01 << pos;HC138(7);P0 = SMG_duanma[m];
}void delay(unsigned int t)//延时1ms
{unsigned char data i, j;while(t--){_nop_();_nop_();_nop_();i = 11;j = 190;do{while (--j);} while (--i); }}
unsigned int temp;
void wendu()//温度采集
{int LSB,MSB;Init_DS18B20();Write_DS18B20(0xcc);Write_DS18B20(0x44);delay(100);Init_DS18B20();Write_DS18B20(0xcc);Write_DS18B20(0xbe);LSB=Read_DS18B20();MSB=Read_DS18B20();Init_DS18B20();temp=MSB;temp=(temp<<8)|LSB;if((temp&0xf800)==0x0000){temp>>=4;temp=temp+(LSB&0x0f)*0.0625;}
}unsigned int count_pwm,count_time;
unsigned int K4 = 1,K5 = 1,K7;unsigned int pwm,time = 60;
void key()//按键控制
{if(S7 == 0){delay(20);if(S7 == 0){K7++;}while(!S7);}if(S6 == 0){delay(20);if(S6 == 0){time = 0;K5 = 1;}while(!S6);}if(S5 == 0){delay(20);if(S5 == 0){K5++;switch(K5){case 1:time = 60;break;case 2:time = 120;break;case 3:time = 0;break;case 4:K5 = 1;break;} }while(!S5);}if(S4 == 0){delay(20);if(S4 == 0){K4++;}while(!S4);}switch(K4){case 1:pwm = 20;break;case 2:pwm = 30;break;case 3:pwm = 70;break;case 4:K4 = 1;break;
}
}void Timer0_Init(void) //5毫秒@11.0592MHz
{TMOD &= 0xF0; //设置定时器模式TMOD |= 0x01; //设置定时器模式TL0 = 10240/256; //设置定时初始值TH0 = 10240%256; //设置定时初始值TF0 = 0; //清除TF0标志TR0 = 1; //定时器0开始计时ET0=1;EA=1;
}void Timer0_Isr(void) interrupt 1
{TL0 = 10240/256; //设置定时初始值TH0 = 10240%256; //设置定时初始值count_time++;count_pwm++;if(time != 0){if(count_time >= 20){time--;count_time = 0;}else {if(count_pwm < pwm)P3_4 = 1;else if(count_pwm>=pwm&&count_pwm <100)P3_4 = 0;else if(count_pwm >= 100)count_pwm = 0;}}else if(time == 0){P3_4 = 0;}
}
void display_f()//显示模块1
{display(0,16);delay(1);display(1,K4);delay(1);display(2,16);delay(1);display(3,17);delay(1);display(4,0);delay(1);display(5,time/100);delay(1);display(6,time%100/10);delay(1);display(7,time%10);delay(1);
}void display_wd()//温度显示模块
{ display(0,16);delay(1);display(1,4);delay(1);display(2,16);delay(1);display(3,17);delay(1);display(4,17);delay(1);display(5,temp/10);delay(1);display(6,temp%10);delay(1);display(7,12);delay(1);
}void main()
{Chushi();Timer0_Init();while(1){ key();wendu();switch(K7){case 0:display_f();break;case 1:display_wd();break;case 2:K7 = 0;break;}}
}
onewire.h
#ifndef _ONEWIRE_H
#define _ONEWIRE_H#include "regx52.h"#define OW_SKIP_ROM 0xcc
#define DS18B20_CONVERT 0x44
#define DS18B20_READ 0xbe//IC引脚定义
sbit DQ = P1^4;//函数声明
void Delay_OneWire(unsigned int t);
void Write_DS18B20(unsigned char dat);
bit Init_DS18B20(void);
unsigned char Read_DS18B20(void);#endif
onewire.c
#include "onewire.h"//单总线延时函数
void Delay_OneWire(unsigned int t)
{while(t--);
}//DS18B20芯片初始化
bit Init_DS18B20(void)
{bit initflag = 0;DQ = 1;Delay_OneWire(120);DQ = 0;Delay_OneWire(800); DQ = 1;Delay_OneWire(100); initflag = DQ; Delay_OneWire(50);return initflag;
}//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{unsigned char i;for(i=0;i<8;i++){DQ = 0;DQ = dat&0x01;Delay_OneWire(50);DQ = 1;dat >>= 1;}Delay_OneWire(50);
}//从DS18B20读取一个字节
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(50);}return dat;
}
这道题以上的代码有点bug,大家可以烧写到自己的板子上面看一下,视频不太好上传
这一套题的难度不算很大,但是博主水平有限,大家先凑合着看,如果对大家有什么帮助那是最好的以上所有代码均为自己编写,肯定会有更好的解法,肯定会有,本人水平有限,如果有哪里出错或者有更好的解法可以与我私信或在评论区里进行讨论
上一题:蓝桥杯单片机第六届省赛