单片机实验1
题目: 利用定时器1实现流水灯,先从左至右,再从右至左,1s从左到右,1s从右到左(不采用延时函数的方式实现)
思路
首先要求使用定时器1,且定时1s,那么先将基础的初始化函数完成,计算初值为1ms.在服务函数中定义一个计数变量count并且让count自增,当count=1000时即达到要求的1s.接着题目要求led灯
先从左至右,再从右至左移动,这一功能通过使用左移函数与右移函数来完成,具体看示例程序
#include <reg51.h>
#include <intrins.h>
#define led P2
typedef unsigned char u8;
typedef unsigned int u16;
u16 i,j; //定义两个控制左移和右移的控制变量
void Time1Init(); //声明定时器1的初始化函数
void main()
{
i = 0; //i用来控制左移 赋初值0
j = 8; //j用来控制右移 赋初值8
led = 0xfe; //先点亮最左边的led灯
Time1Init();
while(1);
}
/*定时器1的初始化,设置初值为1ms*/
void Time1Init()
{
TMOD |= 0x01;
TH1 = 0xfc;
TL1 = 0x18;
EA = 1;
ET1 = 1;
TR1 = 1;
}
/*配置定时器1的服务函数*/
void Time1Start() interrupt 3
{
u16 count = 0; //定义计数变量
TH1 = 0xfc;
TL1 = 0x18;
count++;
if(count == 1000) //达到1s
{
count = 0;
/*
判断灯是否从左边开始,如果是led灯开始右移
加上逻辑与的原因是防止漏掉灯在中间的情况
*/
if(j==8 && i<8)
{
led = _crol_(led,1);
/*
每移动一次就让控制左移的函数加1,直到第八个led灯
如果到达第八个led灯,说明已经到达最右边,重新赋值
*/
i=i+1;
if(i==8)
{
j = 0;
}
}
/*原理同上*/
if(i==8 && j<8)
{
led = _cror_(led,1);
j = j+1;
if(j==8)
{
i = 0;
}
}
}
}