⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 一个按键控制的10 级变速跑马灯.c

📁 这是本人在学习51单片机时练习的C程序 lgl_5923@163.com
💻 C
字号:
/*一个按键控制的10 级变速跑马灯试验 
我们要用一个按键来实现跑马灯的10 级调速。这又会涉及到键的去抖的问 
题。 本课的试验结果是,每按一次按键,跑马速度就降低一级,共10 级。 
这里我们又增加了一个变量speedlever,来保存当前的速度档次。 在按键
里的处理中,多了当前档次的延时值的设置。 


经验:++ 写成 + 将无法运行程序,并出现编译警告


    请看程序: */
#define uchar unsigned char//宏定义
#define uint unsigned int
#define ulong unsigned long
#include <reg51.h>//51内部说明

sbit K=P3^2;//按键位定义
bit ldelay=0;//长定时溢出标记,预置是0 即软件定时溢出标志位

uchar speed=10;//软件定时值
uchar speedlever=0;//按钮值

void main(void)//主程序
{
/*LED的8位值 无符号字符型,code表示定义为内部ROM数据*/
uchar code ledp[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar ledi;//用来选择LED值的位
uint n;
TMOD=0x01;//定时器0工作方式1
TH0=0x10;//定时器高位初值
TL0=0x00;//低位值
TR0=1;//开始计时
ET0=1;//允许T0中断
EA=1;//打开总中断

while(1)//主程序循环
  {
    if(ldelay)//如果软件定时标志位溢出,执行{}
       {
       ldelay=0;//清软件定时标志位,让它继续计时
       P1=ledp[ledi];//查表把值送到P0口
       ledi++;//自加移到下一位,
       if(ledi==8)//如果到了第8位LED则回到第一位
            {
            ledi=0;
            }
       }
if(!K)//有按键按下?有则执行{}
   {
for(n=0;n<1000;n++);//延时去抖
while(!K);//待放键
for(n=0;n<1000;n++);//延时去抖

speedlever++;//自加1,按一次键盘加一次
if(speedlever==10)//到10则清零,
speedlever=0;//在这因为只有一个语句所以省了{}

speed=speedlever*3;/*档次和延时之间的预算法则,也可以用查表方法,做出 
不规则的法则,按键值speedlever X 3=speed 作软件定时时间参数*/
    }
  }
}

timer2() interrupt 1
{
static uchar t;//静态变量,使t在中断返回后的值不变,否则t返回后会自动复位
TF0=0;//清零T0标志位
t++;

if((t==speed)||(t>30))//T到按钮设的速度值且小于30,则软件定时溢出t=0,ldelay=1
  {
  t=0;
  ldelay=1;
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -