【蓝桥杯单片机】工厂灯光控制系统案例解析(小蜜蜂老师基础综合实训)
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
工厂灯光控制系统案例解析
题目
流程图
关键点复盘
- 设备检测——移位
L1~L8在板子上是从左至右但是在对P0口赋值时是16进制从高位(L8)—>低位(L0)
根据原理图LED赋值0亮1灭
为了方便赋值可以把板子转一下让LED排序与赋值顺序相同
左移<< 右移>> 控制移位补0
使LED依次点亮、依次熄灭
unsigned char i 作为下文表格中的循环变量
赋值 | L8 | L7 | L6 | L5 | L4 | L3 | L2 | L1 | 备注 |
---|
0xff | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 全灭 |
0xff << i | | | | | | | | | for(i = 1;i <= 8;i++) 左移补0 |
~ (0xff) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 全亮 |
~ (0xff) << i | | | | | | | | | for(i = 1;i <= 8;i++) 左移补1 |
- 运行时间的逻辑处理——if语句
- if语句嵌套秒——>分——>时
- 定义unsigned chat count = 0; 将50ms作为计数初值20次为1s
- 判断 秒、分 是否到60而不是59
- 与或关系
0 | any = any 用作取数
1 | any = 1 用作置1
0 & any = 0 用作置0
1 & any = any 用作取数
为了使“本地控制”(高位)与“远程控制”(低位)互不干扰引入状态变量stat_led = 0xff
- 本地控制
- S5控制L7判断S5按下后
Select_HC573(4);
stat_led = (stat_led | 0x40) & (~stat_led | 0xbf);
P0 = stat_led;
- 远程控制判断为case 0xa0以后
Select_HC573(4);
stat_led = (stat_led | 0x0f) & (~command | 0xf0);
P0 = stat_led;
- 读取时间——发送数据HEX16进制的BCD码格式(0xMM)
(hour / 10) << 4 | (hour % 10)
(min / 10) << 4 | (min % 10)
(sec / 10) << 4 | (sec % 10)
原数取整放高位(左移4位
)原数取余放低位
- 注释规范性
- 标明定义变量
- 定义辅助寄存器使用串口时
- 定义独立按键管脚使用独立按键时
- 定义状态机LED状态变量
- 定义数码管段码表有无小数点
- 表明定义函数
/* ==================== XXX函数 =======================
功能XXX
参数XXX
返回XXX
设计XXX20XX年XX月XX日
======================================================= */
参考代码IO模式
J13接2~3
J5接2~3
#include "reg52.h"
sfr AUXR = 0x8e;
sbit S5 = P3^2;
sbit S4 = P3^3;
unsigned char count = 0;
unsigned char sec = 0;
unsigned char min = 0;
unsigned char hour = 0;
unsigned char command = 0x00;
unsigned char stat_led = 0xff;
code unsigned char SMG_NoDot[10] = {0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};
void Select_HC573(unsigned char channel)
{
switch(channel)
{
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;
case 0: P2 = P2 & 0x1f | 0x00; break;
}
}
void SMG_Delay(unsigned char t)
{
while(t--);
}
void SMG_Bit(unsigned char pos,unsigned char dat)
{
Select_HC573(7);
P0 = 0xff;
Select_HC573(6);
P0 = 0x01 << pos;
Select_HC573(7);
P0 = dat;
}
void SMG_All(unsigned char dat)
{
Select_HC573(6);
P0 = 0xff;
Select_HC573(7);
P0 = dat;
}
void Delay(unsigned int t)
{
while(t--);
while(t--);
}
void Device_Detect()
{
unsigned char i;
Select_HC573(4);
for(i = 1;i <= 8;i++)
{
P0 = 0xff << i;
Delay(60000);
}
for(i = 1;i <= 8;i++)
{
P0 = ~(0xff << i);
Delay(60000);
}
Select_HC573(0);
Select_HC573(7);
P0 = 0x00;
for(i = 0;i <= 7;i++)
{
Select_HC573(6);
P0 = ~(0xfe << i);
Delay(60000);
}
for(i = 0;i <= 7;i++)
{
Select_HC573(6);
P0 = (0xfe << i);
Delay(60000);
}
Select_HC573(0);
}
void Init_Time0()
{
TMOD = 0x20;
TH0 = (65535 - 50000) / 256;
TL0 = (65535 - 50000) % 256;
ET0 = 1;
EA = 1;
TR0 = 1;
}
void Service_Time0() interrupt 1
{
count++;
if(count == 20)
{
count = 0;
sec++;
if(sec == 60)
{
sec = 0;
min++;
if(min == 60)
{
min = 0;
hour++;
{
if(hour == 99)
hour = 0;
}
}
}
}
}
void Init_Uart()
{
TMOD = 0x20;
TH1 = 0xfd;
TH1 = 0xfd;
SCON = 0x50;
AUXR = 0x00;
ES = 1;
EA = 1;
TR1 = 1;
}
void Service_Uart() interrupt 4
{
if(RI == 1)
{
command = SBUF;
RI = 0;
}
}
void Sent_Byte(unsigned char dat)
{
SBUF = dat;
while(TI == 0);
TI = 0;
}
void SMG_Display()
{
SMG_Bit(0,SMG_NoDot[hour / 10]);
SMG_Delay(500);
SMG_Bit(1,SMG_NoDot[hour % 10]);
SMG_Delay(500);
SMG_Bit(2,0xbf);
SMG_Delay(500);
SMG_Bit(3,SMG_NoDot[min / 10]);
SMG_Delay(500);
SMG_Bit(4,SMG_NoDot[min % 10]);
SMG_Delay(500);
SMG_Bit(5,0xbf);
SMG_Delay(500);
SMG_Bit(6,SMG_NoDot[sec / 10]);
SMG_Delay(500);
SMG_Bit(7,SMG_NoDot[sec % 10]);
SMG_Delay(500);
SMG_All(0xff);
}
void Key_LED()
{
if(S5 == 0)
{
SMG_Display();
if(S5 == 0)
{
while(S5 == 0)
{
SMG_Display();
}
Select_HC573(4);
stat_led = (stat_led | 0x40) & (~stat_led | 0xbf);
P0 = stat_led;
Select_HC573(0);
}
}
if(S4 == 0)
{
SMG_Display();
if(S4 == 0)
{
while(S4 == 0)
{
SMG_Display();
}
Select_HC573(4);
stat_led = (stat_led | 0x80) & (~stat_led | 0x7f);
P0 = stat_led;
Select_HC573(0);
}
}
}
void Execute_Command()
{
if(command != 0x00)
{
switch(command & 0xf0)
{
case 0xa0:
Select_HC573(4);
stat_led = (stat_led | 0x0f) & (~command | 0xf0);
P0 = stat_led;
Select_HC573(0);
command = 0x00;
break;
case 0xb0:
Sent_Byte((hour / 10) << 4 | (hour % 10));
Sent_Byte((min / 10) << 4 | (min % 10));
Sent_Byte((sec / 10) << 4 | (sec % 10));
command = 0x00;
break;
}
}
}
void Init_System()
{
Select_HC573(5);
P0 = 0x00;
Select_HC573(4);
P0 = 0xff;
Select_HC573(0);
}
void main()
{
Init_System();
Device_Detect();
Init_Time0();
Init_Uart();
while(1)
{
Execute_Command();
SMG_Display();
Key_LED();
}
}