用51单片机P1口驱动8个LED做循环点亮控制,每个LED占空比50%,周期两秒

用51单片机P1口驱动8个LED做循环点亮控制,每个LED占空比50%,周期两秒,第1张

#include <reg51.h>

#include <intrins.h>

#define uchar unsigned char

#define uint unsigned int

uchar Counter = 0

uchar P1LEDBUF = 0x01//P1口的灯如果亮了7个,就改成0xFE

main()

{

P1=0x00//如果灯全亮了,则全部改为0xFF

TMOD = 0x01 //T0工作在定时方式1

TH0 = 0x3C //T0初值50ms

TL0 = 0xB0

ET0 = 1//开启定时器0中断

EA = 1 //开总中断

TR0 = 1//启动定时器0

while(1)

}

/********************************************/

/* 定时器0中断服务程序 */

/********************************************/

void T0_Serve() interrupt 1

{

TH0 = 0x3c //每次定时50ms

TL0 = 0xb0

Counter++

if(Counter == 20) //中断20次后进入函数,时间刚好1秒(误差可以忽略)

{

Counter = 0 //计数清0

P1 = P1LEDBUF

P1LEDBUF =_crol_(P1LEDBUF,1) //位移P1口LED,准备下一轮

//如果灯亮和灭的刚好反了(熄了一个灯,亮了7个)就把初值改了

}

if(Counter == 40)

{

Counter = 0//计数清0,周期2秒

P1 = 0x00 //如果灯全亮了,则改为P1=0xFF

}

}

/**52系列单片机,晶振12MHz,P1.0输出100Hz方波(即周期10ms),方波由T0定时器产生

P1.3接按键

K1,每按一次按键,方波占空比改变一次,依次为:1/10→2/10→……→9/10→1/10,如此循环**/

#include"reg52.h"

//包含52系列头文件

#define

uchar

unsigned

char

//定义

无符号字符型

#define

uint

unsigned

int

//定义

无符号整型

#define

TRUE

1

//定义

逻辑真

#define

FALSE

0

//定义

逻辑假

#define

th0

0xfc

//100Hz(10ms),占空比分母10,则其最小时间单位应该为10ms/10=1ms,故定时器T0定时时间为

1ms

#define

tl0

0x18

//1ms

at

12HMz

Fosc

#define

DutyDeno

10

//定义

占空比分母

为:10

sbit

WaveOut=P1^0

//定义

方波输出

接口

sbit

Key1=P1^3

//定义

按键Key1

接口

uchar

DutyNume=1

//定义

占空比分子

变量,并初始化为

1(即

占空比

为:1/10)

void

Timer0()

interrupt

1

//定时器T0

中断

函数

{

static

uchar

duty_time=0

//定义静态变量,作为

占空比

输出时间的参考值(1ms)

TL0=tl0

TH0=th0

//重赋定时器初值,1ms

duty_time=++duty_time%DutyDeno

//该句等效于:duty_time++duty_time%=DutyDeno

if(duty_time

评论

0

0

0

加载更多


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7902680.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存