【冉冰的成长日记001】

咕咕咕,鸽了17天我他喵终于写了一篇省赛。写这篇文章的目的是用以复习和留念一下,如若能帮助到他人和下一届的学弟学妹自然是极好的。QAQ话不多说,上代码。

#include<STC15F2K60S2.h>
#include"onewire.h"unsigned char LED[]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0xBF,0xFF,0xC6
};                          //定义数码管
unsigned char LEDbuff[]={0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
};                          //数码管缓冲区
sbit S7=P3^0;
sbit S6=P3^1;
sbit S5=P3^2;
sbit S4=P3^3;
unsigned int num=0;            //用于定时器0计数,每一秒获取一次温度和工作剩余时间倒计时
unsigned char Temp,cnt=0;  //Temp用于获取DS18B20的温度。cnt用于风扇pwm输出占空比的计算
unsigned char S4_flag=1,S5_time=0; //S4_flag用于切换模式,S5_time用于S6按键计时和按键定时
bit MOTOR=0,Check_S4 = 0,Check_S5 = 0,Check_S6 = 0,Check_S7 = 0,S7_flag=0;
//MOTOR用于外设输出,Check_Sx用于检测按键按下,S7_flag用于切换模式四void Initial();      //初始化函数
void KEY();         //按键
void Display();     //数码管显示
void Timer0Init();  //定时器0
void Timer1Init();  //定时器1
void main()
{Initial();Timer0Init();Timer1Init();while(1){KEY();if(num>=10000)    //num每0.1ms加一,10000即1s{if(S5_time>0)  {S5_time--;//工作剩余时间}num=0;   DS18B20_Start();    //每一秒获取一次温度Temp=DS18B20_Get();}}
}void Initial()     //初始化函数
{P2 = (P2&0x1F)|0x80;P0 = 0xFF;       //初始化LEDP2 = (P2&0x1F)|0xA0;P0 = 0x00;        //初始化继电器和蜂鸣器P2 = (P2&0x1F)|0xC0;P0 = 0xFF;P2 = (P2&0x1F)|0xE0;P0 = 0xFF;      //初始化数码管
}void Timer0Init(void)      //100微秒@11.0592MHz
{AUXR |= 0x80;     //定时器时钟1T模式TMOD &= 0xF0;       //设置定时器模式TL0 = 0xAE;       //设置定时初值TH0 = 0xFB;        //设置定时初值TF0 = 0;       //清除TF0标志TR0 = 1;      //定时器0开始计时EA = 1;ET0 = 1;
}void Timer1Init(void)      //1毫秒@11.0592MHz
{AUXR |= 0x40;     //定时器时钟1T模式TMOD &= 0x0F;       //设置定时器模式TL1 = 0xCD;       //设置定时初值TH1 = 0xD4;        //设置定时初值TF1 = 0;       //清除TF1标志TR1 = 1;      //定时器1开始计时EA = 1;ET1 = 1;
}void delay(int ms)         //某up debug测的1s我借用了,也可以用定时器来写delay函数
{int X=0,Y=0;for(X=0;X<ms;X++){for(Y=846;Y>0;Y--);}
}void Display1()       //控制高四位数码管
{LEDbuff[7]=LED[10];LEDbuff[6]=LED[S4_flag];LEDbuff[5]=LED[10];LEDbuff[4]=LED[11];   //不显示}void Display2()     //控制低四位数码管
{LEDbuff[3]=LED[0];LEDbuff[2]=LED[S5_time/100];LEDbuff[1]=LED[S5_time/10%10];LEDbuff[0]=LED[S5_time%10];
}void Display3()
{LEDbuff[7]=LED[10];LEDbuff[6]=LED[4];LEDbuff[5]=LED[10];LEDbuff[4]=LED[11];LEDbuff[3]=LED[11];LEDbuff[2]=LED[Temp/10];LEDbuff[1]=LED[Temp%10];LEDbuff[0]=LED[12];     //题干摄氏度的C
}void Display()
{Display1();Display2();
}void KEY_S4()             //S4切换工作模式
{if(S4==0){delay(5);if(S4==0)Check_S4=1;   }if((S4==1)&&(Check_S4==1)){Check_S4=0;    S4_flag++;if(S4_flag>=4)S4_flag=1;}
}//设置计时
void KEY_S5()
{if(S5==0){delay(5);if(S5==0)Check_S5=1;   }if((S5==1)&&(Check_S5==1)){Check_S5=0;    S5_time = S5_time+60;if(S5_time>=60&&S5_time<120)  S5_time=60;if(S5_time>=120&&S5_time<180)    S5_time=120;if(S5_time>=180)               S5_time=0;}
}void KEY_S6()             //清零
{if(S6==0){delay(5);if(S6==0)Check_S6=1;   }if((S6==1)&&(Check_S6==1)){Check_S6=0;S5_time=0;MOTOR=0;}
}void KEY_S7()            //显示温度
{if(S7==0){delay(5);if(S7==0)Check_S7=1;   }if((S7==1)&&(Check_S7==1)){Check_S7=0;S7_flag = ~S7_flag;    }
}void KEY()
{KEY_S4();KEY_S5();KEY_S6();KEY_S7();
}void Show1()           //LED小灯随工作模式变化
{if(S4_flag==1){P2 = (P2&0x1F)|0x80;P0 = 0xFE;  }if(S4_flag==2){P2 = (P2&0x1F)|0x80;P0 = 0xFD;  }if(S4_flag==3){P2 = (P2&0x1F)|0x80;P0 = 0xFB;  }
}void Show2()                  //模式四关闭LED
{P2 = (P2&0x1F)|0x80;P0 = 0xFF;}void InterruptTimer0() interrupt 1
{TL0 = 0xAE;       //设置定时初值TH0 = 0xFB;        //设置定时初值cnt++;if(cnt>=10)     {cnt=0;}                      //各工作模式占空比if(S4_flag==1){if(cnt<=2)        MOTOR=1;else           MOTOR=0;}if(S4_flag==2){if(cnt<=3)       MOTOR=1;else           MOTOR=0;}if(S4_flag==3){if(cnt<=7)       MOTOR=1;else           MOTOR=0;}num++;
}void InterruptTimer1() interrupt 3
{static unsigned char i = 0;TL1 = 0xCD;       //设置定时初值TH1 = 0xD4;        //设置定时初值if(S7_flag==0)                       //S7切换温度显示页面{Display();Show1();}if(S7_flag==1)     {Display3();Show2();}switch(i)      //数码管动态刷新{case 0:P2=0xC0;P0=0x80;P2=0xE0;P0=LEDbuff[0];i++;break;case 1:P2=0xC0;P0=0x40;P2=0xE0;P0=LEDbuff[1];i++;break;case 2:P2=0xC0;P0=0x20;P2=0xE0;P0=LEDbuff[2];i++;break;case 3:P2=0xC0;P0=0x10;P2=0xE0;P0=LEDbuff[3];i++;break;case 4:P2=0xC0;P0=0x08;P2=0xE0;P0=LEDbuff[4];i++;break;case 5:P2=0xC0;P0=0x04;P2=0xE0;P0=LEDbuff[5];i++;break;case 6:P2=0xC0;P0=0x02;P2=0xE0;P0=LEDbuff[6];i++;break;case 7:P2=0xC0;P0=0x01;P2=0xE0;P0=LEDbuff[7];i=0;break;default :break;}
}

以上是main,身边的人喜欢把main.c中的key和displsy部分拆出来写成新的c文件,方便他人阅读。各有各的好处吧,我更喜欢放一起,方便调用和查阅。各位看官多多担待吧。

/*程序说明: 单总线驱动程序软件环境: Keil uVision 4.10 硬件环境: CT107单片机综合实训平台(外部晶振12MHz) STC89C52RC单片机日    期: 2011-8-9
*/
#include<STC15F2K60S2.h>
#include"onewire.h"sbit DQ = P1^4;  //单总线接口//单总线延时函数
void Delay_OneWire(unsigned int t)  //STC89C52RC
{t=10*t;     //stc的运行速度是传统51的7-12倍while(t--);
}//通过单总线向DS18B20写一个字节
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);
}//从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(5);}return dat;
}//DS18B20设备初始化
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;
}void DS18B20_Start()
{init_ds18b20();Write_DS18B20(0xCC);Write_DS18B20(0x44);Delay_OneWire(200);
}unsigned char DS18B20_Get()
{char temp = 0;unsigned char low=0,high=0;init_ds18b20();Write_DS18B20(0xCC);Write_DS18B20(0xBE);low= Read_DS18B20();high= Read_DS18B20();temp = (high<<4);temp |= (low>>4); return temp;}

以上是iic通信的c文件

#include<STC15F2K60S2.h>#ifndef __ONEWIRE_H
#define __ONEWIRE_Hunsigned char rd_temperature(void);
void Delay_OneWire(unsigned int t);
void Write_DS18B20(unsigned char dat);
unsigned char Read_DS18B20(void);
bit init_ds18b20(void);
void DS18B20_Start();
unsigned char DS18B20_Get();#endif

以上是.h文件

结束

立个flag,下一篇12号之前写出来,如果没发,请私信骂我,谢谢

蓝桥杯第七届省赛 风扇模拟系统相关推荐

  1. 蓝桥杯第七届省赛java组大题解析(“取球博弈”??难度,“压缩变换”三星难度)

    第六题 题目: 方格填数 如下的10个格子    +--+--+--+    | 0| 1| 2| +--+--+--+--+ | 3| 4| 5| 6| +--+--+--+--+ | 7| 8| ...

  2. 蓝桥杯第七届省赛JAVA真题----剪邮票

    剪邮票 如[图1.jpg], 有12张连在一起的12生肖的邮票. 现在你要从中剪下5张来,要求必须是连着的. (仅仅连接一个角不算相连) 比如,[图2.jpg],[图3.jpg]中,粉红色所示部分就是 ...

  3. 蓝桥杯第七届省赛JAVA真题----压缩变换

    压缩变换 小明最近在研究压缩算法. 他知道,压缩的时候如果能够使得数值很小,就能通过熵编码得到较高的压缩比. 然而,要使数值很小是一个挑战. 最近,小明需要压缩一些正整数的序列,这些序列的特点是,后面 ...

  4. 蓝桥杯第七届省赛JavaB组题解

    第一题 /** 煤球数目有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), .... 如果一共有100层,共 ...

  5. 蓝桥杯第七届国赛JAVA真题----七星填数

    七星填数 如图[图1.png]所示. 在七角星的14个节点上填入1~14 的数字,不重复,不遗漏. 要求每条直线上的四个数字之和必须相等. 图中已经给出了3个数字. 请计算其它位置要填充的数字,答案唯 ...

  6. 蓝桥杯第七届国赛JAVA真题----平方末尾

    平方末尾 能够表示为某个整数的平方的数字称为"平方数" 比如,25,64 虽然无法立即说出某个数是平方数,但经常可以断定某个数不是平方数. 因为平方数的末位只可能是:[0, 1, ...

  7. 蓝桥杯第七届国赛JAVA真题----机器人塔

    机器人塔 X星球的机器人表演拉拉队有两种服装,A和B. 他们这次表演的是搭机器人塔. 类似: 队内的组塔规则是: A 只能站在 AA 或 BB 的肩上.     B 只能站在 AB 或 BA 的肩上. ...

  8. 蓝桥杯第七届决赛真题大全题解(java版本)

    文章推荐 精选java等全套学习资源 精选java电子图书资源 精选大数据学习资源 java项目练习精选 >蓝桥杯第七届决赛第一题[(详情(愤怒小鸟))](http://blog.csdn.ne ...

  9. 蓝桥杯第十三届国赛PythonB组题解

    蓝桥杯第十三届国赛PythonB组题解 [写在前边] 这次的题还是比较难的,只做出来7道,交上去6道,还有一半是暴力做的

最新文章

  1. eclipse 3.55安装j2ee开发工具
  2. opencv 自带库Canny边缘检测
  3. ASP.NET MVC: EF 没有创建数据库表
  4. 从微信红包的春节活动运营方案中,必读的运营策略
  5. CentOS7中Docker的安装与配置
  6. java new url 带密码_获取密码重置URL
  7. 【性能优化】 之AWR 报告分析
  8. 摘自《Java工程师成神之路》2018修订版,自我勉励
  9. seo伪原创工具_文章伪原创工具哪个好用(伪原创工具有哪些)
  10. 801. 二进制中1的个数
  11. 2017.9.10 连续攻击游戏 思考记录
  12. 机器学习:样本去中心化目的
  13. MacOS怎样启用悬停文本功能的具体操作方法!
  14. 最长公共子串——python
  15. python爬虫-计算机要点
  16. 发现了个神奇的图片压缩工具
  17. Python绘制太阳花
  18. 融云出海洞察,海外社交市场地区篇
  19. java 导出数据设置进度条_java控制台输出百分比进度条示例
  20. 为什么说C++太复杂(复杂到哪了?)

热门文章

  1. 2022年软件行业就业分析及如何准备面试应聘
  2. linux定时备份到邮箱,定时任务备份数据库并发送邮箱
  3. 初学者之路——————水下通信
  4. Mirco2440核心板设计思考
  5. OPPO2019春季校园招聘C/C++开发(手机方向)面试总结
  6. 基于Matlab的Vander Lugt相关算法车牌汉字识别系统
  7. 解决:R软件中不能导入包和Word中新输入的字覆盖后面字的情况
  8. 江南大学计算机有博士点吗,江南大学博士点具体是哪些啊?
  9. STM32三种方法设计LED翻转——软件、系统SysTick()、TIM
  10. 计算机等考宝典登陆显示网络无法连接,电脑不能上网显示无法连接到Internet怎么处理...