#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
加载更多
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)