LINUX下的51单片机LED 渐亮渐灭实验

//实验原理
/************************************************************
关于内部定时/计数器的编程主要是定时常数的设置和有关控制寄存器的设置。内部定
时/计数器在单片机中主要有定时器和计数器两个功能。本实验用的是定时器。内部定时/计
数器用作定时器时,是对机器周期计数。每个机器周期的长度是 12 个振荡器周期。因为实
验系统的晶振是 11.0592MHz,所以定时常数的设置可按以下方法计算:
机器周期=12÷11.0592MHz=1.08507μs
(65536-定时常数)*1.08507μs =50ms(50ms 中断一次)
定时常数=4C00H。
定时器的有关的寄存器有工作方式寄存器 TMOD 和控制寄存器 TCON。TMOD 用于设
置定时器/计数器的工作方式 0~3,并确定用于定时还是用于计数。 TCON 主要功能是为定时
器在溢出时设定标志位,并控制定时器的运行或停止等。在例程的中断服务程序中,因为中
断定时常数的设置对中断程序的运行起到关键作用,置数前先关定时器,置数完再打开的定
时器...
*************************************************************/
/*LED 渐亮渐灭实验主要是定时器、LED 和独立按键的综合使用。本实验主要是通过独
立按键来改变定时器的初值,在改变的过程中,进行反复改变 LED 状态,随着定时器初值
的改变,定时器中断时间的长短也发生改变,进而改变 LED 的亮度,初值越大,LED 的亮
度就越高。*/
/*************************************************************************
	> File Name: ledflash.c
	> Author:chensir 
	> Mail:1441353519@qq.com 
	> Created Time: 2017年02月01日 星期三 19时09分57秒
 ************************************************************************/

#include<8051.h>



//蜂鸣器
unsigned char PWM=0x7f ;
//赋初值
/*********************************************************/
// 延时子程序
/*********************************************************/

void delay(unsigned char t)
{
while(t--) ;
}
/*********************************************************/
// 延时子程序
/*********************************************************/
void delayms(unsigned char x)
{
unsigned char i ;
while(x--)
{
for(i = 0 ; i < 113 ; i++) ;
}
}
/*********************************************************/
//蜂鸣器子程序
/*********************************************************/
void Beep()
{
unsigned char i ;
for (i=0 ;i<100 ;i++)
{
delay(100) ;
P0_7=!P0_7;
//Beep 取反
}
P0_7=1;
//关闭蜂鸣器
delayms(100);
}
/*********************************************************/
void main()
{
P1=0xff;
//置高 P1 口,消除干扰
TMOD=0x21 ;
//定时器/计数器寄存器定义
TH0=0xfc ;
//1ms 延时常数(65535-917)/256 (1/11059200)*12 =1.09us 1000/1.09
TL0=0x6A ;
//频率调节 (65535-917)%256

TH1=PWM ;
TL1=0 ;
//脉宽调节
EA=1;
ET0=1;
ET1=1; //开启总中断
//开启定时器 0 中断
//开启定时器 1 中断
TR0=1 ; //开启定时器 0
while(1)
//循环检测按键
{
do{
if(PWM!=0xff)
{PWM++ ;delayms(10);}
else Beep() ;
}
while(P3_6==0);
//按键释放检测
do{
if(PWM!=0x02)
{PWM-- ;delayms(10);}
else Beep() ;
}
while(P3_7==0);
//按键释放检测
}
}
/*********************************************************/
// 定时器 0 中断服务程序 (频率)
/*********************************************************/
void timer0()__interrupt(1)
{
TR1=0 ;
//关闭定时器 1
TH0=0xfc ;
TL0=0x66 ;
TH1=PWM ;
//改变定时器 1 初值
TR1=1 ;
//开启定时器 1
P1=0x00 ;
//启动输出
}
/*********************************************************/

// 定时器 1 中断服务程序 (脉宽)
/*********************************************************/
void timer1()__interrupt(3)
{
TR1 = 0 ;
P1 = 0xff ;
//结束输出
}


实验结果

按下Key3,LED逐渐变暗,到最暗的时候,蜂鸣器响;按下Key4,LED逐渐变
亮,到最亮的时候,蜂鸣器响;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值