<>蓝桥杯单片机第8届省赛_电子钟
修改版本
基础知识学习来自小蜜蜂老师 yyds
下面代码功能没有完全实现 有误还望大佬指正
总结分析:
第八届题目难度从我个人来说明显会比第七届难了很多,当然也可能是我自己这方面相关程序编程没有掌握好 从我个人在编程中遇到的问题进行分析。
首先在开始编程的时候一定要先把题目读清楚搞懂 让自己大脑里面有一个基础框架,然后分模块化编程 在进行相应的逻辑组合 ,切记一定不要全部写完了再来调式
写部分功能就调试一下 这样即使出错也可能快速定位错误并解决 ,其次在自己进行练习时 对程序的调试一定要有耐心,这一点也是成功至关重要的一个因素
,从我自己来说解决Bug的时间花了很久时间即使是一个小错误 有时候都反复调试了好多遍 好在没有放弃最终还是成功解决。
在第八届题目练习过程一开始就遇到了一些问题,然后就想去找一下网上其他大佬写的代码,从内心来说他们写的是真的好
但是可能我自己功力太浅很多看不懂,然后就只能靠自己一点一点慢慢实现 所花时间将近比赛时间2倍说到底还是自己练习的不够 嗯 只能说继续努力了。
下面程序的功能在我开发板上测试 进行按键各种模式切换显示都没有问题 当时不知道为什么进行修改时钟和设置闹钟时 显示的数字就有点问题了
然后Led操作的功能还没有写 ,后面会继续完善 。
路漫漫其修远兮 加油
#include "reg52.h" #include "onewire.h" #include "absacc.h"
/*=================================================================
Date:2022-1-14 Author:小殷同学 Version:1.1 IO方式
==================================================================*/ sbit S7 =
P3^0; sbit S6 = P3^1; sbit S5 = P3^2; sbit S4 = P3^3; sbit Led1 = P0^0; unsigned
char T_Hour = 23,T_Min= 59,T_Sec = 50; unsigned char C_Hour = 0,C_Min = 0,C_Sec
= 0; unsigned char Temperature = 0;//温度存储 unsigned char time_set = 0,clock_set =
0,mode_set = 0;//时间设置和闹钟时钟标志 unsigned char t_count0 = 0,t_flag = 0,t_count1,
c_count= 0;//计时和闪烁标志 unsigned char t_led = 0,led_flag = 0;//分别标记0.2s 和5s
unsigned char code smg_duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
,0xbf,0xff}; //------------------------------简单延时----------------------------
void Delay(unsigned int t) { while(t--); }
//--------------------------74CHC138初始化------------------------- void
Init_74HC138(unsigned char n) { switch(n) { case 0:P2 = (P2 & 0x1f) | 0x00;break
; 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 InitSyetem(
void) { Init_74HC138(4); P0 = 0xff; //关闭LED Init_74HC138(5); P0 = 0x00;
//关闭继电器和蜂鸣器 } //-------------------------数码管安位显示------------------------- void
SMG_DisplayBit(unsigned char pos,unsigned char dat) { Init_74HC138(6); P0 = (
0x01 << pos); Init_74HC138(7); P0 = dat; } void SMG_Close(void) { Init_74HC138(6
); P0 = 0xff; Init_74HC138(7); P0 = 0xff; }
//-----------------------数码管显示------------------------------ void SMG_Display(
unsigned char hour,unsigned char min,unsigned char sec) { SMG_DisplayBit(0,
smg_duan[hour/10]); Delay(200); SMG_DisplayBit(1,smg_duan[hour%10]); Delay(200);
SMG_DisplayBit(2,smg_duan[10]); Delay(200); SMG_DisplayBit(3,smg_duan[min/10]);
Delay(200); SMG_DisplayBit(4,smg_duan[min%10]); Delay(200); SMG_DisplayBit(5,
smg_duan[10]); Delay(200); SMG_DisplayBit(6,smg_duan[sec/10]); Delay(200);
SMG_DisplayBit(7,smg_duan[sec%10]); Delay(200); SMG_Close(); } void
SMG_Hour_Flash(unsigned char hour,unsigned char min,unsigned char sec) {
SMG_DisplayBit(2,smg_duan[10]); Delay(200); SMG_DisplayBit(3,smg_duan[min/10]);
Delay(200); SMG_DisplayBit(4,smg_duan[min%10]); Delay(200); SMG_DisplayBit(5,
smg_duan[10]); Delay(200); SMG_DisplayBit(6,smg_duan[sec/10]); Delay(200);
SMG_DisplayBit(7,smg_duan[sec%10]); Delay(200); if(t_flag == 0) { SMG_DisplayBit
(0,smg_duan[hour/10]); Delay(200); SMG_DisplayBit(1,smg_duan[hour%10]); Delay(
200); } else { SMG_DisplayBit(0,smg_duan[11]); Delay(200); SMG_DisplayBit(1,
smg_duan[11]); Delay(200); } SMG_Close(); } void SMG_Min_Flash(unsigned char
hour,unsigned char min,unsigned char sec) { SMG_DisplayBit(0,smg_duan[hour/10]);
Delay(200); SMG_DisplayBit(1,smg_duan[hour%10]); Delay(200); SMG_DisplayBit(2,
smg_duan[10]); Delay(200); SMG_DisplayBit(5,smg_duan[10]); Delay(200);
SMG_DisplayBit(6,smg_duan[sec/10]); Delay(200); SMG_DisplayBit(7,smg_duan[sec%10
]); Delay(200); if(t_flag == 0) { SMG_DisplayBit(3,smg_duan[min/10]); Delay(200)
; SMG_DisplayBit(4,smg_duan[min%10]); Delay(200); } else { SMG_DisplayBit(3,
smg_duan[11]); Delay(200); SMG_DisplayBit(4,smg_duan[11]); Delay(200); }
SMG_Close(); } void SMG_Sec_Flash(unsigned char hour,unsigned char min,unsigned
char sec) { SMG_DisplayBit(0,smg_duan[hour/10]); Delay(200); SMG_DisplayBit(1,
smg_duan[hour%10]); Delay(200); SMG_DisplayBit(2,smg_duan[10]); Delay(200);
SMG_DisplayBit(3,smg_duan[min/10]); Delay(200); SMG_DisplayBit(4,smg_duan[min%10
]); Delay(200); SMG_DisplayBit(5,smg_duan[10]); Delay(200); if(t_flag == 0) {
SMG_DisplayBit(6,smg_duan[sec/10]); Delay(200); SMG_DisplayBit(7,smg_duan[sec%10
]); Delay(200); } else { SMG_DisplayBit(6,smg_duan[11]); Delay(200);
SMG_DisplayBit(7,smg_duan[11]); Delay(200); } SMG_Close(); }
//---------------------------------温度读取------------------------ void
Read_Temperature(void) { unsigned char LSB = 0,MSB = 0; init_ds18b20();
Write_DS18B20(0xcc);//跳过Rom Write_DS18B20(0x44);//开始转换 Delay(500); init_ds18b20(
); Write_DS18B20(0xcc);//跳过Rom Write_DS18B20(0xbe);//读取温度到暂存区 LSB = Read_DS18B20
();//读取第0字节 MSB = Read_DS18B20();//读取第1字节 Temperature = (MSB << 8)| LSB;
Temperature= Temperature >> 4;//保留整数 /* 小数处理 if((Temperature & 0x1f) != 0x0000)
//高五位为符号 全零为+ { Temperature = Temperature >> 4; Temperature = Temperature * 10;
Temperature = Temperature + (LSB & 0x0f) *0.625; } */ }
//-------------------------------温度显示--------------------------- void
Temperature_Display(void) { SMG_DisplayBit(0,smg_duan[11]); Delay(200);
SMG_DisplayBit(1,smg_duan[11]); Delay(200); SMG_DisplayBit(2,smg_duan[11]);
Delay(200); SMG_DisplayBit(3,smg_duan[11]); Delay(200); SMG_DisplayBit(4,
smg_duan[11]); Delay(200); SMG_DisplayBit(5,smg_duan[Temperature/10]); Delay(200
); SMG_DisplayBit(6,smg_duan[Temperature%10]); Delay(200); SMG_DisplayBit(7,0xC6
); // C Delay(200); SMG_Close(); }
//----------------------------------按键处理------------------------ void KeyScans(
void) { if(S7 == 0) { Delay(20); if(S7 == 0) { mode_set = 1; while(S7 == 0);
time_set++; ET0 = 0,TR0 = 0; if(time_set == 1) { //时设置 SMG_Hour_Flash(T_Hour,
T_Min,T_Sec); } else if(time_set == 2) { //分设置 SMG_Min_Flash(T_Hour,T_Min,T_Sec)
; } else if(time_set > 3) { //秒 SMG_Sec_Flash(T_Hour,T_Min,T_Sec); time_set = 0;
ET0= 1,TR0 = 1; } } } // s6 闹钟时分秒选择 if(S6 == 0) { Delay(20); if(S6 == 0) {
clock_set++; mode_set = 2; ET0 = 0,TR0 = 0; while(S6 == 0); //等待按键松开 if(
clock_set== 1) //选择时 { SMG_Hour_Flash(C_Hour,C_Min,C_Sec); } else if(clock_set
== 2) //选择分 { SMG_Min_Flash(C_Hour,C_Min,C_Sec); } else if(clock_set == 3) {
SMG_Sec_Flash(C_Hour,C_Min,C_Sec); } else if(clock_set == 4) { SMG_Display(
T_Hour,T_Min,T_Sec); //时间实时显示 clock_set = 0; ET0 = 1,TR0 = 1; } } } if(S5 == 0)
{ Delay(20); if(S5 == 0) { while(S5 == 0); if(time_set == 1) //小时进行加 { T_Hour++;
if(T_Hour >= 24) //边界处理 { T_Hour = 0; } } else if(time_set == 2) //分钟进行加 { T_Min
++; if(T_Min >= 60) //边界处理 { T_Min = 0; } } else if(time_set == 3)//秒进行加 { T_Sec
++; if(T_Sec >= 60) //边界处理 { T_Sec = 0; } } else if(clock_set == 1) { C_Hour++;
if(C_Hour == 24) //边界处理 { C_Hour = 0; } } else if(clock_set == 2) { C_Min++; if(
C_Min== 60) { C_Min = 0; } } else if(clock_set == 3) { C_Sec++; if(C_Sec == 60)
{ C_Sec = 0; } } } } if(S4 == 0) { Delay(20); if(S4 == 0) { while(S4 == 0); if(
time_set== 1)//时进行减 { T_Hour--; if(T_Hour == 0)//边界处理 { T_Hour = 24; } } else if
(time_set == 2) //分钟减 { T_Min--; if(T_Min == 0) //边界处理 { T_Min = 60; } } else if
(time_set == 3) //秒进行减 { T_Sec--; if(T_Sec == 0)//边界处理 { T_Sec = 60; } } else if
(clock_set == 1) { C_Hour--; if(C_Hour == 0) //边界处理 { C_Hour = 24; } } else if(
clock_set== 2) { C_Min--; if(C_Min == 0) { C_Min = 60; } } else if(clock_set ==
3) { C_Sec--; if(C_Sec == 0) { C_Sec = 60; } } } } }
//-------------------------------------定时器初始化------------------- void
Init_Timer0(void) { TMOD = 0x11; //定时器0 定时器1 方式一16 TH0 = (65535-50000)/256;
//50ms TL0 = (65535-50000)%256; TH1 = (65535-50000)/256;//50ms TL1 = (65535-
50000)%256; ET1 = 1; TR1 = 1; ET0 = 1; TR0 = 1; EA = 1; }
//-----------------------------主函数------------------------------- void main(void
) { InitSyetem(); Init_Timer0(); while(1) { //读取温度 Read_Temperature(); if((
time_set== 0) && (clock_set == 0)) { if(S4 == 0) { Delay(20); if(S4 == 0) {
while(S4 == 0) { Delay(200); //显示温度 Temperature_Display(); } } } SMG_Display(
T_Hour,T_Min,T_Sec); //时间实时显示 // SMG_Display(C_Hour,C_Min,C_Sec); //闹钟实时显示 }
KeyScans(); if(mode_set == 1) { switch(time_set) { case 1:SMG_Hour_Flash(T_Hour,
T_Min,T_Sec);break; case 2:SMG_Min_Flash(T_Hour,T_Min,T_Sec);break; case 3:
SMG_Sec_Flash(T_Hour,T_Min,T_Sec);break; } } else if(mode_set == 2) { switch(
clock_set) { case 1:SMG_Hour_Flash(C_Hour,C_Min,C_Sec);break; case 2:
SMG_Min_Flash(C_Hour,C_Min,C_Sec);break; case 3:SMG_Sec_Flash(C_Hour,C_Min,C_Sec
);break; } } //闹钟到时响应 led1 0.2s闪烁 5s else if(((T_Hour == 0) && (T_Min == 0) && (
T_Sec== 0))|| ((T_Hour == C_Hour) && (T_Min == C_Min) && (T_Sec == C_Sec))) {
Init_74HC138(4); if(led_flag == 0) { P0 = 0xfe; } else if(led_flag == 1) { P0 =
0xff; } Delay(50000); Delay(50000); P0 = 0xff; } } }
//-----------------------------定时器中断服务------------------------- void
Server_Timero() interrupt 1 { TH0 = (65535-50000)/256; TL0 = (65535-50000)%256;
t_count0++; c_count++; if(t_count0 == 4) // 0.2s { led_flag = ~led_flag; } else
if(t_count0 == 20) // 1s 时间计数标志 { t_count0 = 0; if(T_Sec++ == 60) { T_Sec = 0;
T_Min++; if(T_Min == 60) { T_Min = 0; T_Hour++; if(T_Hour == 24) { T_Hour = 0; }
} } } if(c_count == 20) //闹钟计时1s { c_count = 0; C_Sec++; if(C_Sec == 60) { C_Sec
= 0; C_Min++; if(C_Min == 60) { C_Min = 0; C_Hour++; if(C_Hour == 24) { C_Hour =
0; } } } } } void Server_Timer1() interrupt 3 { TH1 = (65535-50000)/256;//50ms
TL1= (65535-50000)%256; t_count1++; if(t_count1 == 20) //1s { t_count1 = 0;
t_flag= ~t_flag; } }