#include "STC89C52RC.h"
#define BIT(x) 0x01<<x
#define FLAG_RECV_TITLE 0xA5
#define FLAG_RECV_END 0x5A
#define PLED1 P1
#define PLED2 P2
sbit KEY_MODE=P4^2; //MODE按钮
sbit KEY_UP =P3^4; //+按钮
sbit KEY_DOWN=P3^5; //-按钮
sbit K_X=P3^3; //重力感应X
sbit K_Y=P3^2; //重力感应Y
sbit HRD=P4^3; //红外接收脚
unsigned char flag_step=0;
unsigned char flag_dir=0; //重力感测变量 0-左横放 1-倒置 2-正置 3-右横放
unsigned char flag_dir_last=0;//上次重力感测值
unsigned char var_TMAX=10; //控制沙漏速度变量,越大速度越慢 =10时为1S一格
unsigned char var_key=0; //按钮变量
//基本的LED显示笔段表
unsigned char code Disp0[]={
0x00,0x00,0x00,0x00, 0x08,0x00,0x00,0x00, 0x0C,0x00,0x00,0x00, 0x1C,0x00,0x00,0x00,
0x1E,0x00,0x00,0x00, 0x3E,0x00,0x00,0x00, 0x3F,0x00,0x00,0x00, 0x7F,0x00,0x00,0x00,
0x7F,0x04,0x00,0x00, 0x7F,0x0C,0x00,0x00, 0x7F,0x0E,0x00,0x00, 0x7F,0x1E,0x00,0x00,
0x7F,0x1F,0x00,0x00, 0x7F,0x3F,0x00,0x00, 0x7F,0x3F,0x04,0x00, 0x7F,0x3F,0x06,0x00,
0x7F,0x3F,0x0E,0x00, 0x7F,0x3F,0x0F,0x00, 0x7F,0x3F,0x1F,0x00, 0x7F,0x3F,0x1F,0x02,
0x7F,0x3F,0x1F,0x06, 0x7F,0x3F,0x1F,0x07, 0x7F,0x3F,0x1F,0x0F, 0x7F,0x3F,0x5F,0x0F,
0x7F,0x3F,0x7F,0x0F, 0x7F,0x3F,0xFF,0x0F, 0x7F,0x7F,0xFF,0x0F, 0x7F,0xFF,0xFF,0x0F,
0xFF,0xFF,0xFF,0x0F
};
//显示函数1
void ShowDisp1()
{
unsigned char i;
P0=0x00;
for(i=0;i<4;i++)
{
P1=Disp0[flag_step*4+i];
P2=~Disp0[flag_step*4+i];
P0=BIT(i);
P0=0x00;
}
}
//显示函数2
void ShowDisp2()
{
unsigned char i;
P0=0x00;
for(i=0;i<4;i++)
{
P2=Disp0[flag_step*4+i];
P1=~Disp0[flag_step*4+i];
P0=BIT(i);
P0=0x00;
}
}
void Key_Scan(void)
{
if(KEY_UP==0)
{
var_key=1;
while(KEY_UP==0);
}
else if(KEY_DOWN==0)
{
var_key=2;
while(KEY_DOWN==0);
}
else if(KEY_MODE==0)
{
var_key=3;
while(KEY_MODE==0);
}
else
var_key=0;
}
void T0_Init(void) //1毫秒@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //开启定时器
}
void T1_Init(void) //50毫秒定时 12MHZ
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x10; //设置定时器模式
TL1 = 0xB0; //设置定时初值
TH1 = 0x3C; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1 = 1; //开启定时器
}
//定时器中断服务函数
void T0_ISR(void) interrupt 1
{
static unsigned char i=0;
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
i++;
if(i>7)
i=0;
//SBUF = P1;
}
void T1_ISR(void) interrupt 3
{
static unsigned char i=0;
TL1 = 0xB0;
TH1 = 0x3C;
i++;
if(i>=var_TMAX)
{
i=0;
//执行1s操作
switch(flag_dir)
{
case 0:
case 3:
return;
break;
case 1:
if(flag_dir_last==2)
flag_step=28-flag_step;
ShowDisp2();
flag_dir_last=1;
break;
case 2:
if(flag_dir_last==1)
flag_step=28-flag_step;
ShowDisp1();
flag_dir_last=2;
break;
}
flag_step++;
if(flag_step>28)
flag_step=28;
}
}
void UART_Init(void)
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xF3; //设定定时初值
TH1 = 0xF3; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ES = 1; //启用串口中断
}
//串口中断服务函数
void UART_INT(void) interrupt 4
{
static RecvPos=0;
unsigned char temp;
if(RI) //有接收信号
{
RI = 0;
temp = SBUF;
SBUF = temp;
if(temp==FLAG_RECV_TITLE) //接收到起始信号
{
RecvPos=1;
}
else
{
switch(RecvPos)
{
case 1:
P1=temp;
RecvPos++;
break;
case 2:
P2=temp;
RecvPos++;
break;
case 3:
P0=temp;
RecvPos++;
break;
case 4:
RecvPos=0;
break;
}
}
}
if(TI)
{
TI = 0;
}
}
void main(void)
{
UART_Init();
T0_Init();
T1_Init();
//开总中断
EA=1;
while(1)
{
flag_dir = K_X | K_Y * 2; //获取方向
Key_Scan();
switch(var_key)
{
case 1:
if(var_TMAX>1) var_TMAX--;
break;
case 2:
if(var_TMAX<20) var_TMAX++;
break;
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
基于C51单片机设计的LED灯电子沙漏电路设计ALTIUM硬件(原理图+PCB)+软件程序源码.zip
共30个文件
c:4个
h:4个
htm:3个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 161 浏览量
2024-04-25
19:27:35
上传
评论
收藏 1.87MB ZIP 举报
温馨提示
基于C51单片机设计的LED灯电子沙漏电路设计ALTIUM硬件(原理图+PCB)+软件程序源码, void main(void) { UART_Init(); T0_Init(); T1_Init(); //开总中断 EA=1; while(1) { flag_dir = K_X | K_Y * 2; //获取方向 Key_Scan(); switch(var_key) { case 1: if(var_TMAX>1) var_TMAX--; break; case 2: if(var_TMAX<20) var_TMAX++; break; }
资源推荐
资源详情
资源评论
收起资源包目录
基于C51单片机设计的LED灯电子沙漏电路设计ALTIUM硬件(原理图+PCB)+软件程序源码.zip (30个子文件)
电子沙漏V2.0 软件源码
stc-isp-15xx-v6.70.exe 938KB
TIMER.h 94B
ComDef.h 844B
电子沙漏V2.hex 3KB
main.OBJ 9KB
电子沙漏V2.build_log.htm 1KB
电子沙漏V2.0.plg 171B
ComDef.c 644B
STC89C52RC.h 4KB
main.LST 9KB
电子沙漏V2.0.uvopt 5KB
电子沙漏V2.lnp 72B
UART.h 203B
TIMER.c 950B
电子沙漏V2.M51 13KB
UART.c 989B
电子沙漏V2.0_uvproj.bak 13KB
电子沙漏V2.0_uvopt.bak 55KB
电子沙漏V2.0.uvgui.junzh 69KB
main.c 4KB
电子沙漏V2.0 8KB
电子沙漏V2.0.uvproj 14KB
电子沙漏V2.0原理图PCB
电子沙漏V2.0_LED版面.PcbDoc 1.34MB
电子沙漏V2.0_LED版面.PcbDoc.htm 7KB
电子沙漏V2.0.PcbDocPreview 123KB
电子沙漏V2.0.PcbDoc 1.21MB
电子沙漏V2.0.SchDocPreview 125KB
电子沙漏V2.0_LED版面.PcbDocPreview 74KB
电子沙漏V2.0.PcbDoc.htm 7KB
电子沙漏V2.0.SchDoc 1.04MB
共 30 条
- 1
资源评论
GJZGRB
- 粉丝: 2955
- 资源: 7736
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- G309菜篮三维最终_3.x_t..bin
- 基于xilinx k7 325t实现的千兆网udp协议,只需要设置好IP,端口,就可以直接给数据,基本等同于透传,可以不用管底层协议 可以 # FPGA 实现udp模块说明 ## udp-proto
- Keil C51 插件 检测变量名引用不统一
- jsp代码技术的实现与结果
- 基于 PyTorch 实现的生成对抗网络(GAN)代码,用于特定的图像生成任务(斑马和马的图像转换相关任务)
- 一个基于递归下降解析算法的C++程序
- mysql和sqlserver语法有什么区别.txt
- linux常用命令大全.txt
- linux常用命令大全.txt
- linux常用命令大全.txt
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功