蓝桥杯—第八届省赛试题-电子钟程序设计

题目:




思路

1.显示温度使用大赛提供的onewire.c,只需自己添加读取函数。
2.设计时钟程序,或者使用DS1302.c(这里使用的是自己写的函数)
3.键扫描函数
4.进行逻辑判断,都是if语句。哪个按键和模式同时满足,执行相应的操作。
代码中注释很清楚相信大家能看懂

main.c

#include <stc15f2k60s2.h>
#include <onewire.h>
#define uchar unsigned char
#define uint unsigned int
code unsigned char tab[] = { 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xff, 0xbf };
uchar dspbuf[8] = { 10, 10, 10, 10, 10, 10, 10, 10 };
uchar temper_flag = 0; //温度扫描标志位
uchar hour, minute, sec, alarmHour, alarmMinute, alarmSec;      //时分秒 闹钟的时分秒
uint count = 0, miao = 0;     //count == 25则为5秒, miao == 200 0.2秒
uchar temperature, key_value;       //温度数值 ;键扫描返回值
uchar mode = 0;    //模式
uchar tt = 0;  //显示转变温度的标志
uchar tn = 0;  //时钟和闹钟转换的标志位
uchar ledshan = 0, ledflag = 0;       //时钟 == 闹钟,led闪烁void display();
void init();
unsigned char read_key();
void load();
void tempera();
//关闭蜂鸣器和LED灯
void cls_buzz()
{P2 = (P2 & 0x1f) | 0xa0;P0 = 0x00;P2 = 0x1f;
}void cls_led()
{P2 = (P2 & 0x1f) | 0x80;P0 = 0xff;P2 = 0x1f;
}//主函数
void main()
{cls_buzz();cls_led();AUXR = 0x80;TMOD = 0xf0;TL0 = 0xcd;TH0 = 0xd4;TF0 = 0;TR0 = 1;ET0 = 1;EA = 1;init();while (1){if (temper_flag){temper_flag = 0;temperature = rd_temperature();  //读温度         }key_value = read_key();}
}
//温度赋值函数
void tempera()
{uchar i;for (i = 0; i < 6; i++)dspbuf[i] = 10;dspbuf[7] = temperature % 10;dspbuf[6] = (temperature - dspbuf[7]) / 10;
}void time0(void) interrupt 1
{static unsigned char intr;if (++intr == 10)  //1ms执行一次{intr = 0;temper_flag = 1;  //10ms温度读取标志位置1}if (count == 1000)       //1s{sec++;count = 0;miao = (miao + 1) % 2;}count += 1;
//时钟时间限制条件if (sec == 60) {    sec = 0;minute += 1;}if (minute == 60) {minute = 0;hour += 1;}if (hour == 24) {hour = 0;}//闹钟时间限制条件if (alarmSec == 60) {alarmSec = 0;alarmMinute += 1;}if (alarmMinute == 60) {alarmMinute = 0;alarmHour += 1;}if (alarmHour == 24) {alarmHour = 0;}if (ledshan == 200){ledshan = 0;ledflag = (ledflag + 1) % 2;}ledshan += 1;display();
}void load()
{if (key_value == 7) {mode += 1;}if (tt == 0) {   if (tn == 0){//模式1段码值赋值if (mode == 1){dspbuf[2] = dspbuf[5] = 11;dspbuf[1] = hour % 10;dspbuf[0] = hour / 10;dspbuf[4] = minute % 10;dspbuf[3] = minute / 10;if (miao == 1)dspbuf[6] = dspbuf[7] = 10;else{dspbuf[7] = sec % 10;dspbuf[6] = sec / 10;}}if (mode == 2){dspbuf[2] = dspbuf[5] = 11;dspbuf[1] = hour % 10;dspbuf[0] = hour / 10;dspbuf[7] = sec % 10;dspbuf[6] = sec / 10;if (miao == 1)dspbuf[3] = dspbuf[4] = 10;else{dspbuf[4] = minute % 10;dspbuf[3] = minute / 10;}}if (mode == 3){dspbuf[2] = dspbuf[5] = 11;dspbuf[4] = minute % 10;dspbuf[3] = minute / 10;dspbuf[7] = sec % 10;dspbuf[6] = sec / 10;if (miao == 1)dspbuf[1] = dspbuf[0] = 10;else{dspbuf[1] = hour % 10;dspbuf[0] = hour / 10;}}//时钟+设置if (key_value == 4 && mode == 1){key_value = 0;sec += 1;}if (key_value == 4 && mode == 2){key_value = 0;minute++;}if (key_value == 4 && mode == 3){key_value = 0;hour += 1;}//时钟-设置if (key_value == 5 && mode == 1){key_value = 0;if (sec == 0)sec = 59;elsesec -= 1;}if (key_value == 5 && mode == 2){key_value = 0;if (minute == 0)minute = 59;elseminute--;}if (key_value == 5 && mode == 3){key_value = 0;if (hour == 0)hour = 23;elsehour -= 1;}if (mode == 0) {dspbuf[2] = dspbuf[5] = 11;dspbuf[1] = hour % 10;dspbuf[0] = hour / 10;dspbuf[4] = minute % 10;dspbuf[3] = minute / 10;dspbuf[7] = sec % 10;dspbuf[6] = sec  / 10;}}if (tn == 1)     //时钟转闹钟标志位{if (mode == 1){dspbuf[2] = dspbuf[5] = 11;dspbuf[1] = alarmHour % 10;dspbuf[0] = alarmHour / 10;dspbuf[4] = alarmMinute % 10;dspbuf[3] = alarmMinute / 10;if (miao == 1)dspbuf[6] = dspbuf[7] = 10;else{dspbuf[7] = alarmSec % 10;dspbuf[6] = alarmSec / 10;}}if (mode == 2){dspbuf[2] = dspbuf[5] = 11;dspbuf[1] = alarmHour % 10;dspbuf[0] = alarmHour / 10;dspbuf[7] = alarmSec % 10;dspbuf[6] = alarmSec / 10;if (miao == 1)dspbuf[3] = dspbuf[4] = 10;else{dspbuf[4] = alarmMinute % 10;dspbuf[3] = alarmMinute / 10;}}if (mode == 3){dspbuf[2] = dspbuf[5] = 11;dspbuf[4] = alarmMinute % 10;dspbuf[3] = alarmMinute / 10;dspbuf[7] = alarmSec % 10;dspbuf[6] = alarmSec / 10;if (miao == 1)dspbuf[1] = dspbuf[0] = 10;else{dspbuf[1] = alarmHour % 10;dspbuf[0] = alarmHour / 10;}}if (key_value == 4 && mode == 1){key_value = 0;alarmSec += 1;}if (key_value == 4 && mode == 2){key_value = 0;alarmMinute++;}if (key_value == 4 && mode == 3){key_value = 0;alarmHour += 1;}if (key_value == 5 && mode == 1){key_value = 0;if (alarmSec == 0)alarmSec = 59;elsealarmSec -= 1;}if (key_value == 5 && mode == 2){key_value = 0;if (alarmMinute == 0)alarmMinute = 59;elsealarmMinute--;}if (key_value == 5 && mode == 3){key_value = 0;if (alarmHour == 0)alarmHour = 23;elsealarmHour -= 1;}if (mode == 0) {dspbuf[2] = dspbuf[5] = 11;dspbuf[1] = alarmHour % 10;dspbuf[0] = alarmHour / 10;dspbuf[4] = alarmMinute % 10;dspbuf[3] = alarmMinute  / 10;dspbuf[7] = alarmSec % 10;dspbuf[6] = alarmSec / 10;}}if (hour == alarmHour && minute == alarmMinute && sec <= (alarmSec + 4))       //到达闹钟时间led闪烁五秒{if (ledflag == 1)     // == 1 L1亮{P2 = (P2 & 0x1f) | 0x80;P0 = 0xfe;P2 = 0x1f;}else{P2 = (P2 & 0x1f) | 0x80;P0 = 0xff;P2 = 0x1f;}}else{P2 = (P2 & 0x1f) | 0x80;P0 = 0xff;P2 = 0x1f;}}else if (mode == 0 && key_value == 4 && tt == 1)    //条件满足显示温度{tempera();}if (mode > 3) mode = 0; //模式转换
}void init()    //初始赋值 时分秒 闹钟时分秒
{hour = 23;minute = 59;sec = 50;alarmHour = 0;alarmMinute = 0;alarmSec = 0;
}
//键扫描
unsigned char read_key(void)
{   //state0:充当消抖 state1:有按键按下 state2:检查按键是否松开uchar temp;static unsigned char state = 0;uchar key_value = 0;temp = P3 & 0x0f;switch (state){case 0:{if (P3 != 0x0f) //有按键按下state = 1;}break;case 1:{if (P3 != 0x0f) {switch (temp){case 0x0e:{key_value = 7; state = 2;  //S7}break;case 0x0d:{key_value = 6; state = 2;                     //S6tn = (tn + 1) % 2;}break;case 0x0b:{key_value = 5; state = 2;           //S5}break;case 0x07:{key_value = 4; state = 2;                       //S4 if(mode == 0)tt = 1;}break;}}elsestate = 0;}break;case 2:{if (P3 == 0xff){tt = 0;state = 0;key_value = 0;}}break;}return key_value;
}//显示函数
void display()
{static unsigned char dspcom = 0;load();P2 = (P2 & 0x1f) | 0xe0;  //消影P0 = 0xff;P2 = 0x1f;P2 = (P2 & 0x1f) | 0xc0; //位选P0 = 1 << dspcom;P2 = 0x1f;P2 = (P2 & 0x1f) | 0xe0;    //显示P0 = tab[dspbuf[dspcom]];P2 = 0x1f;if (++dspcom == 8) dspcom = 0;}

onewire.h

#include "reg52.h"sbit DQ = P1^4;  //单总线接口//单总线延时函数
void Delay_OneWire(unsigned int t)
{unsigned char i;while(t--){for(i=0;i<12;i++);}
}//通过单总线向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;
}unsigned char rd_temperature(void)
{unsigned char high,low;char temp;init_ds18b20();Write_DS18B20(0xCC);Write_DS18B20(0x44); //启动温度转换Delay_OneWire(200);init_ds18b20();Write_DS18B20(0xCC);Write_DS18B20(0xBE); //读取寄存器low = Read_DS18B20(); //低字节high = Read_DS18B20(); //高字节temp = high<<4;   //只取了整数部分和符号位temp |= (low>>4);return temp;
}

感谢丁莉老师的指导!!!

蓝桥杯--第八届省赛试题-电子钟程序设计相关推荐

  1. 【蓝桥杯第八届省赛_电子钟】

    蓝桥杯第八届省赛_电子钟 修改版本 基础知识学习来自小蜜蜂老师 yyds 下面代码功能没有完全实现 有误还望大佬指正 总结分析: 第八届题目难度从我个人来说明显会比第七届难了很多,当然也可能是我自己这 ...

  2. c++判断奇偶_第十一届(今年)蓝桥杯省模拟赛 试题+源码 C/C++详解

    后台回复开发工具,免费获取C语言常用编译器 本文章来源:CSDN|亓官劼 本文是第十一届蓝桥杯省模拟赛的试题和部分题解,博主参加的是4.13日的下午场,也就是本次模拟赛的第一天了吧,不知道有没有上午场 ...

  3. 蓝桥杯第八届省赛JAVA真题----k倍区间

    标题: k倍区间 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍 ...

  4. 蓝桥杯第八届省赛JAVA真题----油漆面积

    标题:油漆面积 X星球的一批考古机器人正在一片废墟上考古. 该区域的地面坚硬如石.平整如镜. 管理人员为方便,建立了标准的直角坐标系. 每个机器人都各有特长.身怀绝技.它们感兴趣的内容也不相同. 经过 ...

  5. 蓝桥杯——第八届省赛_基于单片机的电子钟程序设计与调试

    一.使用到的模块 数码管,独立按键,LED,DS1302,ds18b20 二.代码部分 实验平台:CT107D 实验芯片:stc15f2k60s2 实验现象:完成题目要求 代码如下 onewire.c ...

  6. 24行代码AC_蓝桥杯2019省赛 试题 D: 数的分解

    问题描述 把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包 含数字 2 和 4,一共有多少种不同的分解方法? 注意交换 3 个整数的顺序被视为同一种方法,例如 1000+10 ...

  7. 蓝桥杯第八届省赛JAVA真题----9数算式

    标题:9数算式 观察如下的算式: 9213 x 85674 = 789314562 左边的乘数和被乘数正好用到了1~9的所有数字,每个1次. 而乘积恰好也是用到了1~9的所有数字,并且每个1次. 请你 ...

  8. 蓝桥杯第八届省赛JAVA真题----字母组串

    标题:字母组串 由 A,B,C 这3个字母就可以组成许多串. 比如:"A","AB","ABC","ABA"," ...

  9. 蓝桥杯第八届省赛JAVA真题----包子凑数

    标题:包子凑数 小明几乎每天早晨都会在一家包子铺吃早餐.他发现这家包子铺有N种蒸笼,其中第i种蒸笼恰好能放Ai个包子.每种蒸笼都有非常多笼,可以认为是无限笼. 每当有顾客想买X个包子,卖包子的大叔就会 ...

最新文章

  1. debounce实现 js_javascript防抖函数debounce详解
  2. 如何将JavaScript数组信息导出到csv(在客户端)?
  3. AFAB折旧运行的几种情况
  4. linux中的opencv多版本共存切换的问题
  5. Centos7 amp;amp; Docker amp;amp; Jenkins amp;amp; ASP.NET Core
  6. 电梯里为什么放镜子?90%的人都不知道
  7. adsense三种广告要屏蔽
  8. uni-app 七牛云上传文件
  9. Linux中的Docker容器的数据卷
  10. ESP32开发 0.windows Vscode开发环境搭建,基于esp-idf-V4.2 | Cmake | Vscode插件
  11. 空间换时间--程序策略
  12. 北航教授王田苗:中国机器人的发展机遇与挑战是什么?
  13. 国家标准《软件工程 软件开发成本度量规范》GB/T 36964-2018正式发布
  14. wordpress采集插件自动采集伪原创免费插件
  15. java中token什么意思_java中Token验证用法 什么是Token
  16. Mixly实现秒表功能
  17. 如何去掉CSDN中图片水印
  18. Java基础 —— 编程入门
  19. 智慧树\知到——程序设计基础(C语言)入门篇第六章到第十章测试答案
  20. 前端多次绑定click的坑

热门文章

  1. 【SSL】勇闯黄金十二宫---射手宫
  2. 老兄xee的大作--迅雷协议分析--多链接资源获取
  3. 如何语音翻译?我推荐这三个语音翻译软件,真的好用
  4. vba关于查找方法(Find方法)的应用(一)
  5. 由于找不到qt5core.dll,无法继续执行代码
  6. Pico+UnityXR实现简单移动和交互
  7. 【例10.6】在磁盘文件上存有10个学生的数据。要求将第1,3,5,7,9个学生数据输入计算机,并在屏幕上显示出来。
  8. 实战检测北大青鸟某地方学校网站
  9. java取上一个月_java获取当前上一周、上一月、上一年的时间
  10. 移动开发者最爱的9个优秀Android代码编辑器