📄 4 级变速的跑马灯.c
字号:
#include <reg51.h>//对51内部使用进行说明
#include <1.h>
#define uchar unsigned char//宏定义,用uchar代表unsigned char
#define uint unsigned int //宏定义
#define ulong unsigned long//宏定义
sbit P10=P1^0; //特殊寄存器位定义P10-P13四位个跑马灯
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit K1=P3^0;//4个调速按键
sbit K2=P3^1;
sbit K3=P3^2;
sbit K4=P3^3;
bit ldelay=0;//普通位定义,长定时溢出标记,预置是0
uchar speed=10;//设置一个变量保存默认的跑马灯的移动速度
//char code dx516[3]_at_ 0x003b;
void main(void)
{
uchar code ledp[4]={0xfe,0xfd,0xfb,0xf7};/*4个灯各自的值,uchar为无符号字符型,在
//在程序的开头已定义,code为存储模式为将
数组ledp[4]存在内部ROM中,如汇编中的数据表 */
uchar ledi;//定义,
TMOD=0x01;//定时器0工作方式1,即TMOD=00000001B
TH0=0xff;//定时器初值
TL0=0xfd;
TR0=1;//T0开始工作
ET0=1;//允许T0中断输入
EA=1;//打开总中断
while(1)//主程序循环
{
if(ldelay)//如果ldelay标志位为1则执行它后面的{},否则跳到45行
{
ldelay=0;//清标软件定时志位
P1=ledp[ledi];//将数组中的第1个数据给P1口,即第一个LED亮
ledi++;//自加1
if(ledi==4)//加后判断是否到第个LED了
{
ledi=0;//到了则回0
}
}
if(!K1) speed=30;//判断是否有调速按钮按下,并设置对应的速度值
if(!K2) speed=15;
if(!K3) speed=6;
if(!K4) speed=3;
}
}
/*中断服务程序*/
timer0() interrupt 2
{
static uchar t;//定义一个表态变量
TF0=0;//定时器标志位清零,让它从新工作
t++;//自加,每中断一次加1以达到要求的时间表值,t值受speed控制,
if((t==speed)||(t>30))/*当(t==speed) (t>30) 这两为会真时执行{}
比较一个变化的数值,以实现变化的时间溢出,
同时限制了最慢速度 */
{
t=0;
ldelay=1;//每次长时间的溢出,就置一个标记,以便主程序处理
//定时器溢出时间 X t值=ldelay溢出的时间(软件定时)
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -