#include "timer0.h"
#define LED P0
#define SEG P0
#define LED_Time_Max 2
#define SEG_Time_Max 2 //每隔2ms选择进入LED 或者SEG
#define LED_ON() LED_KEY = 0;
#define LED_OFF() LED_KEY = 1;
sfr P4=0xe8; //reg52.h 无p4口定义 需自行定义
sbit LSA=P4^0;
sbit LSB=P4^1;
sbit LSC=P4^2;
sbit LSD=P3^7;
sbit LED_KEY = P2^7;
sbit Warning = P4^3;
sbit BZ = P2^6;
sbit k1=P3^2;
sbit k2=P3^3;
sbit B1=P2^2;
sbit B2=P2^3;
sbit B3=P2^4;
sbit B4=P2^5;
unsigned char state = 0x80;
char flag = 0;
char move_clock = 0;//控制是按一下走一下 还是移位
char INT0_flag = 0;
char INT1_flag = 0;
unsigned int n_time = 0;
unsigned char num_1=0;
unsigned char INT0_Time = 0;
unsigned char INT1_Time = 0;
unsigned char LED_Time = 1;//LED_TIME和SEG_TIME初始为0 1 可以让seg和led每隔一秒交替进行
unsigned char LED_N = 0;
unsigned char LED_Speed = 50;
unsigned char SEG_Time = 0;
unsigned int Num_Move_Time = 0;
unsigned int STEP_Time = 0;
unsigned int Key_ON_Time = 0;
extern unsigned char TIME[7];
unsigned char num[26] = {0};
unsigned char wei = 0;
unsigned char num_2 = 0;
extern unsigned char ad_value;
char step = 0;
unsigned char dire = 0;
unsigned int speed_value[5] = {5,4,3,2,1};
char speed = 2;
unsigned char motor_go = 0;
unsigned char num1 = 0, num2 =0, num3 = 0, num4 = 0;
unsigned char key_num1 = 0, key_num2 =0, key_num3 = 0, key_num4 = 0;
unsigned char code smgduan[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0xff};//显示0~F的值
void DisPlay(unsigned char n1,unsigned char n2,unsigned char n3,unsigned char n4)
{
static unsigned char i = 0;
SEG=0xff;//消隐
i++;
if(i>=4) i = 0;
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=1;LSC=1;LSD=1;
if((Key_ON_Time == 0)&&(wei == 22)) SEG=smgduan[n1]&127;
else SEG=smgduan[n1];
break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=1;LSD=1;
if((Key_ON_Time == 0)&&(wei == 21)) SEG=smgduan[n2]&127;
else SEG=smgduan[n2];
break;//显示第1位
case(2):
LSA=1;LSB=1;LSC=0;LSD=1;
if((Key_ON_Time == 0)&&(wei == 20)) SEG=smgduan[n3]&127;
else SEG=smgduan[n3];
break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=1;LSD=0;
if((Key_ON_Time == 0)&&(wei == 19)) SEG=smgduan[n4]&127;
else SEG=smgduan[n4];
break;//显示第3位
}
}
void Num_move()
{
num[0] = TIME[6]/16;
num[1] = TIME[6]&0x0f;
num[2] = 16;
num[3] = TIME[5]/16;
num[4] = TIME[5]&0x0f;
num[5] = 16;
num[6] = TIME[4]/16;
num[7] = TIME[4]&0x0f;
num[8] = 16;
num[9] = TIME[3]/16;
num[10] = TIME[3]&0x0f;
num[11] = 16;
num[12] = TIME[2]/16;
num[13] = TIME[2]&0x0f;
num[14] = 16;
num[15] = TIME[1]/16;
num[16] = TIME[1]&0x0f;
num[17] = 16;
num[18] = TIME[0]/16;
num[19] = TIME[0]&0x0f;
num[20] = 17;
num[21] = 17;
num[22] = ad_value/10;
num[23] = ad_value%10;
num[24] = 17;
num[25] = 17;
num1 = num[wei];
num2 = num[wei+1];
num3 = num[wei+2];
num4 = num[wei+3];
}
void delay_ms(unsigned int t)
{
n_time = t;
while(n_time);
}
void Timer0Init()
{
TMOD|=0X01;//选择为定时器0模式,工作方式1。
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
/*任务管理*/
void Timer0() interrupt 1
{
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
if(n_time>0) n_time--;
if(Key_ON_Time>0) Key_ON_Time--;
if(INT0_flag) INT0_Time++;//如果有键按下就开始计数,起到消抖的作用
if(INT1_flag) INT1_Time++;//同上
LED_Time++;//控制led显示与关闭
SEG_Time++;//控制seg的显示与关闭
if(motor_go) STEP_Time++;//电机
Num_Move_Time++;//时间位移控制量
num_2++;
if(num_2>10)
{num_1++;
num_2=0;
}
/* 流水灯控制函数*/
if(INT0_Time>=10) //消抖 流水灯方向
{
if(k1 == 0)
{
flag=~flag;
move_clock = 0;//控制是流动还是走动
}
INT0_flag = 0;//中断清零
INT0_Time = 0;//消抖清零
}
/* 按一下走一下控制函数*/
if(INT1_Time>=10) // 按键 走动
{
if(k2 == 0)
{
move_clock = 1;//1即为走动
if(flag)
{
state>>=1;
if(state==0x00) state=0x80;
}
else
{
state<<=1;
if(state==0x00) state=0x01;
}
}
INT1_flag = 0;
INT1_Time = 0;
}
if(LED_Time>=LED_Time_Max) //LED流动
{
LED_Time = 0; //清零
LSA=1;LSB=1;LSC=1;LSD=1;//关闭数码管
LED_ON();//开启led
LED_N++;//每次流动时间
//LED_Speed = 201 - ad_value*20/5;
LED_Speed = 500;//每隔两毫秒进来加一次LED_N,2*100=200ms;
if(LED_N>=LED_Speed)
{
LED_N = 0;
if(!move_clock)//和前面相对应 0才进行移位,1就是按一下走一下
{
if(flag)
{
state>>=1;
if(state==0x00) state=0x80;
}
else
{
state<<=1;
if(state==0x00) state=0x01;
}
}
}
LED = ~state;
}
if(Num_Move_Time>=600)//时钟显示移位函数
{
Num_Move_Time = 0;
if(wei>=22) wei = 0;
else wei++;
}
if(SEG_Time>=SEG_Time_Max)//2ms 交替进来
{
if(Key_ON_Time==0)//有键按下就等key on time减到0再进行时间的显示,先显示按键
{
SEG_Time = 0;
Num_move();//移位
LED_OFF();//关闭led
DisPlay(num1,num2,num3,num4);//显示
}
else//下面为显示按键的函数
{
SEG_Time = 0;
LED_OFF();
DisPlay(key_num1,key_num2,key_num3,key_num4);
}
}
if(STEP_Time>=speed_value[speed])//电机函数
{
STEP_Time = 0;
switch(step)
{
case 0:
B1 = 1; B2 = 0; B3 = 0; B4 = 0;
break;
case 1:
B1 = 1; B2 = 1; B3 = 0; B4 = 0;
break;
case 2:
B1 = 0; B2 = 1; B3 = 0; B4 = 0;
break;
case 3:
B1 = 0; B2 = 1; B3 = 1; B4 = 0;
break;
case 4:
B1 = 0; B2 = 0; B3 = 1; B4 = 0;
break;
case 5:
B1 = 0; B2 = 0; B3 = 1; B4 = 1;
break;
case 6:
B1 = 0; B2 = 0; B3 = 0; B4 = 1;
break;
case 7:
B1 = 1; B2 = 0; B3 = 0; B4 = 1;
break;
}
if(dire == 0)
{
step++;
if(step>=8) step = 0;
}
if(dire == 1)
{
step--;
if(step<=0) step = 7;
}
}
if(Warning == 1)
{
BZ = ~BZ;//无缘蜂鸣器
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
51all1.zip_单片机_步进电机 串口
共44个文件
c:8个
lst:8个
obj:8个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 80 浏览量
2022-09-21
22:50:16
上传
评论 1
收藏 86KB ZIP 举报
温馨提示
七个功能同时实现,跑马灯、红外报警、步进电机、串口等....
资源详情
资源评论
资源推荐
收起资源包目录
51all1.zip (44个子文件)
51all
DRIVER
src
i2c.c 2KB
usart.c 2KB
Int0.c 196B
timer1.c 446B
Int1.c 187B
timer0.c 6KB
ds1302.c 2KB
lib
ds1302.h 359B
timer0.h 126B
timer1.h 126B
usart.h 91B
Int1.h 109B
Int0.h 109B
i2c.h 344B
USER
51all.h 194B
usart.obj 7KB
Int0.obj 2KB
51all.hex 12KB
51all.uvproj 15KB
timer0.lst 12KB
51all.uvopt 8KB
51all.c 2KB
ds1302.lst 5KB
51all.LST 5KB
timer1.lst 2KB
usart.lst 4KB
51all.OBJ 8KB
51all 41KB
51all.plg 159B
51all_uvopt.bak 59KB
51all.lnp 136B
51all.M51 40KB
Int1.obj 2KB
51all.build_log.htm 967B
ds1302.obj 6KB
timer1.obj 2KB
Int1.lst 1KB
Int0.lst 1KB
i2c.lst 4KB
timer0.obj 15KB
51all_uvproj.bak 14KB
timer0.__i 155B
i2c.obj 6KB
51all.uvgui.HASEE 92KB
共 44 条
- 1
JonSco
- 粉丝: 74
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0