#include "reg52.h"
sfr AUXR = 0x8e; //定义辅助寄存器
sbit S5 = P3^2; //定义按键S5引脚
sbit S4 = P3^3; //定义按键S4引脚
unsigned char count = 0; //定义50ms定时中断累计变量
unsigned char t_h = 0; //定义运行时间的时变量
unsigned char t_m = 0; //定义运行时间的分变量
unsigned char t_s = 0; //定义运行时间的秒变量
unsigned char command = 0; //定义串口命令字接收变量
unsigned char stat_led = 0xff; //定义LED灯当前开关状态
//-----共阳数码管的段码编码表(无小数点)----
unsigned char code SMG_NoDot[18]={0xc0,0xf9,
0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};
/*==================普通的延时函数======================
功能:普通的非精确延时函数。
参数:t--延时长度。
返回:空。
设计:欧浩源(2018年3月11日)
=======================================================*/
void Delay(unsigned int t)
{
while(t--);
while(t--);
}
/*================数码管专用延时函数====================
功能:数码管动态显示专用延时函数。
参数:t--延时长度。
返回:空。
设计:欧浩源(2018年3月11日)
=======================================================*/
void DelaySMG(unsigned int t)
{
while(t--);
}
/*=================锁存器选择函数======================
功能:选择要打通的锁存器。
参数:t--延时长度。
返回:空。
设计:欧浩源(2018年3月11日)
=======================================================*/
void SelectHC573(unsigned channel)
{
switch(channel)
{
case 4:
P2 = (P2 & 0x1f) | 0x80; //Y4输出0,选择LED控制
break;
case 5:
P2 = (P2 & 0x1f) | 0xa0; //Y5输出0,选择蜂鸣器和继电器控制
break;
case 6:
P2 = (P2 & 0x1f) | 0xc0; //Y6输出0,选择数码管位选
break;
case 7:
P2 = (P2 & 0x1f) | 0xe0; //Y7输出0,选择数码管段码
break;
case 0:
P2 = (P2 & 0x1f) | 0x00; //所有锁存器不选择
break;
}
}
/*=================单个数码管显示函数====================
功能:在指定的数码管位置上显示指定的内容。
参数value--数码管显示的内容
pos--数码管位选,即要点亮的数码管位置。
返回:空。
设计:欧浩源(2018年3月11日)
=======================================================*/
void DisplaySMG_Bit(unsigned char value, unsigned char pos)
{
P0 = 0xff; //消隐
SelectHC573(6);
P0 = 0x01 << pos; //数码管的段位
SelectHC573(7);
P0 = value; //数码管显示内容
}
/*===============系统运行时间显示函数===================
功能:在数码管上显示系统运行的时间。
参数:无。
返回:空。
设计:欧浩源(2018年3月11日)
=======================================================*/
void DisplayTime()
{
DisplaySMG_Bit(SMG_NoDot[t_s%10],7); //秒个位
DelaySMG(500);
DisplaySMG_Bit(SMG_NoDot[t_s/10],6); //秒十位
DelaySMG(500);
DisplaySMG_Bit(SMG_NoDot[16],5); //分隔符
DelaySMG(500);
DisplaySMG_Bit(SMG_NoDot[t_m%10],4); //分个位
DelaySMG(500);
DisplaySMG_Bit(SMG_NoDot[t_m/10],3); //分十位
DelaySMG(500);
DisplaySMG_Bit(SMG_NoDot[16],2); //分隔符
DelaySMG(500);
DisplaySMG_Bit(SMG_NoDot[t_h%10],1); //时个位
DelaySMG(500);
DisplaySMG_Bit(SMG_NoDot[t_h/10],0); //时十位
DelaySMG(500);
}
/*================定时器T0初始化函数====================
功能:将定时器T0设置为16位模式,计数初值为50ms。
参数:无。
返回:空。
设计:欧浩源(2018年3月11日)
=======================================================*/
void InitTimer0()
{
TMOD = 0x21; //必须注意,T0和T1的工作模式一起赋值
TH0 = (65535 - 50000) / 256;
TL0 = (65535 - 50000) % 256;
ET0 = 1; //使能定时器T0
EA = 1; //使能总中断
TR0 = 1; //启动定时器T0
}
/*===============定时器T0中断服务函数===================
功能:进行系统运行时间的逻辑处理。
参数:无。
返回:空。
设计:欧浩源(2018年3月11日)
=======================================================*/
void ServiceTimer0() interrupt 1
{
TH0 = (65535 - 50000) / 256;
TL0 = (65535 - 50000) % 256;
count++;
if(count == 20)
{
count = 0;
t_s++;
}
if(t_s == 60)
{
t_s = 0;
t_m++;
if(t_m == 60)
{
t_m = 0;
t_h++;
}
}
}
/*=================串口初始化函数========================
功能:将串口初始化为模式1,波特率为9600,允许接收。
参数:无。
返回:空。
设计:欧浩源(2018年3月11日)
=======================================================*/
void InitUart()
{
TMOD = 0x21; //必须注意,T0和T1的工作模式一起赋值
TH1 = 0xfd; //设置9600波特率的参数
TL1 = 0xfd;
TR1 = 1; //启动定时器T1
SCON = 0x50; //8位UART模式,允许接收
AUXR = 0x00; //辅助寄存器设置(89C82系列不需要)
ES = 1; //使能串口中断
EA = 1; //使能总中断
}
/*=================串口中断服务函数====================
功能:接收上位机的数据并保持在command变量中。
参数:无。
返回:空。
设计:欧浩源(2018年3月11日)
=======================================================*/
void ServiceUart() interrupt 4
{
if(RI == 1)
{
command = SBUF; //将接收到的数据保存到command变量
RI = 0; //将接收完成标志RI清0
}
}
/*=================串口发送单字节函数====================
功能:串口向上位机发生一个字节。
参数:dat--要发送到内容。
返回:空。
设计:欧浩源(2018年3月11日)
=======================================================*/
void SendByte(unsigned char dat)
{
SBUF = dat;
while(TI == 0);
TI = 0;
}
/*===============上位机命令解析执行函数==================
功能:接收上位机的数据并保持在command变量中。
参数:无。
返回:空。
设计:欧浩源(2018年3月11日)
=======================================================*/
void ExecuteCommand()
{
if(command != 0x00) //接收到一个上位机命令
{
switch(command & 0xf0) //将命令类型取出来
{
case 0xa0: //远程灯光控制命令
SelectHC573(4);
stat_led = (stat_led | 0x0f) & (~command | 0xf0);
P0 = stat_led;
SelectHC573(0);
command = 0x00;
break;
case 0xb0: //读取现场系统运行时间命令
SendByte((t_h / 10 << 4) | (t_h % 10));
SendByte((t_m / 10 << 4) | (t_m % 10));
SendByte((t_s / 10 << 4) | (t_s % 10));
command = 0x00;
break;
}
}
}
/*=================独立按键扫描函数====================
功能:扫描S5和S4按键并执行现场灯光控制。
参数:无。
返回:空。
设计:欧浩源(2018年3月11日)
=======================================================*/
void ScanKeys()
{
if(S5 == 0) //发现按键S5信号
{
DisplayTime(); //去抖动处理
if(S5 == 0) //确认按键S5信号
{
while(S5 == 0) //等待按键S5松开
{
DisplayTime();
}
SelectHC573(4);
stat_led = (stat_led | 0x40) & (~stat_led | 0xbf);
P0 = stat_led; //执行现场灯光控制
SelectHC573(0);
}
}
if(S4 == 0) //发现按键S4信号
{
DisplayTime(); //去抖动处理
if(S4 == 0) //确认按键S4信号
{
while(S4 == 0) //等待按键S4松开
{
DisplayTime();
}
SelectHC573(4);
stat_led = (stat_led | 0x80) & (~stat_led | 0x7f);
P0 = stat_led; //执行现场灯光控制
SelectHC573(0);
}
}
}
/*=================工厂灯光检测函数====================
功能:逐个检测工厂灯光的工作状态。
参数:无。
返回:空。
设计:欧浩源(2018年3月11日)
=======================================================*/
void CheckLED()
{
char i;
SelectHC573(4);
for(i = 0; i < 9; i++)
{
stat_led = 0xfe << i; //逐个点亮LED灯
P0 = stat_led;
Delay(60000);
}
for(i = 0; i < 9; i++)
{
stat_led = ~(0xfe << i); //逐个熄灭LED灯
P0 = stat_led;
Delay(60000);
}
SelectHC573(0);
}
/*================时间显示模块检测函数==================
功能:逐个检测数码管的工作状态。
参数:无。
返回:空。
设计:欧浩源(2018年3月11日)
=======================================================*/
void CheckSMG()
{
char i;
SelectHC573(7);
P0 = 0x00;
for(i = 0; i < 9; i++)
{
SelectHC573(6);
P0 = ~(0xfe << i); //逐个点亮数码管
Delay(60000);
}
for(i = 0; i < 9; i++)
{
SelectHC573(6);
P0 = 0xfe << i; //逐个熄灭数码管
Delay(60000);
}
SelectHC573(0);
}
/*==================系统初始化函数======================
功能:将蜂鸣器和继电器等无关设备关闭。
参数:无。
返回:空。
设计:欧浩源(2018年3月11日)
=======================================================*/
void InitSystem()
{
SelectHC573(5);
P0 = 0x00;
SelectHC573(4);
P0 = stat_led;
SelectHC573(0);
}
/*======================主函数===========================
功能:整个�
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
蓝桥杯51单片机训练代码.zip (782个子文件)
21521840727 81KB
21521840727 79KB
Timer0.__i 146B
Timer0.__i 146B
Timer0.__i 146B
DS18B20.__i 144B
SMG.__i 132B
key.__i 132B
SMG.__i 132B
key.__i 132B
SMG.__i 132B
LED.__i 128B
数码管动态显示.__i 63B
秒表.__i 53B
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STATUP.A51 0B
STATUP.A51 0B
STATUP.A51 0B
STATUP.A51 0B
STATUP.A51 0B
STATUP.A51 0B
STATUP.A51 0B
STATUP.A51 0B
STATUP.A51 0B
STATUP.A51 0B
STATUP.A51 0B
test.uvgui.AAA 95KB
test.uvgui.AAA 95KB
test.uvgui.AAA 95KB
test.uvgui.AAA 95KB
test.uvgui.AAA 95KB
test.uvgui.AAA 94KB
test.uvgui.AAA 93KB
test.uvgui.AAA 93KB
21521840727.uvgui.AAA 93KB
test.uvgui.AAA 93KB
test.uvgui.AAA 93KB
21521840727.uvgui.AAA 92KB
test.uvgui.AAA 92KB
独立按键的基本操作.uvgui.AAA 90KB
数码管静态显示.uvgui.AAA 90KB
蜂鸣器与继电器.uvgui.AAA 90KB
矩阵键盘.uvgui.AAA 90KB
定时器实现秒闪功能.uvgui.AAA 90KB
数码管动态显示.uvgui.AAA 90KB
LED跑马灯.uvgui.AAA 90KB
定时器进阶综合案例.uvgui.AAA 90KB
利用PWM控制灯光亮度.uvgui.AAA 90KB
外部中断的基本操作.uvgui.AAA 83KB
矩阵键盘.uvgui_OHY.bak 70KB
工厂灯光控制系统(存储器映射扩展).uvgui_OHY.bak 70KB
工厂灯光控制系统.uvgui_OHY.bak 70KB
定时器实现秒闪功能.uvgui_OHY.bak 70KB
独立按键的基本操作.uvgui_OHY.bak 70KB
独立按键的扩展应用.uvgui_OHY.bak 70KB
串口进阶应用案例.uvgui_OHY.bak 70KB
数码管动态显示.uvgui_OHY.bak 70KB
数码管静态显示.uvgui_OHY.bak 70KB
存储器的映射扩展.uvgui_OHY.bak 70KB
外部中断的基本操作.uvgui_OHY.bak 70KB
定时器进阶综合案例.uvgui_OHY.bak 70KB
工厂灯光控制系统(IO版).c 8KB
工厂灯光控制系统(存储器版).c 7KB
main.c 4KB
main.c 3KB
DS1302.c 3KB
DS1302.c 3KB
矩阵键盘的基本操作.c 2KB
key.c 2KB
秒表.c 2KB
key.c 2KB
数码管动态显示.C 2KB
sys.c 2KB
sys.c 2KB
sys.c 2KB
sys.c 2KB
sys.c 2KB
sys.c 2KB
sys.c 2KB
sys.c 2KB
sys.c 2KB
sys.c 2KB
LED.c 2KB
SMG.c 2KB
IIC.c 2KB
共 782 条
- 1
- 2
- 3
- 4
- 5
- 6
- 8
资源评论
学术菜鸟小晨
- 粉丝: 2w+
- 资源: 5610
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 两相步进电机FOC矢量控制Simulink仿真模型 1.采用针对两相步进电机的SVPWM控制算法,实现FOC矢量控制,DQ轴解耦控制~ 2.转速电流双闭环控制,电流环采用PI控制,转速环分别采用PI和
- VMware虚拟机USB驱动
- Halcon手眼标定简介(1)
- (175128050)c&c++课程设计-图书管理系统
- 视频美学多任务学习中PyTorch的多回归实现-含代码及解释
- 基于ssh员工管理系统
- 5G SRM815模组原理框图.jpg
- T型3电平逆变器,lcl滤波器滤波器参数计算,半导体损耗计算,逆变电感参数设计损耗计算 mathcad格式输出,方便修改 同时支持plecs损耗仿真,基于plecs的闭环仿真,电压外环,电流内环
- 毒舌(解锁版).apk
- 显示HEX、S19、Bin、VBF等其他汽车制造商特定的文件格式
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功