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

📄 4 级变速的跑马灯.c

📁 这是本人在学习51单片机时练习的C程序 lgl_5923@163.com
💻 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 + -