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

来源:互联网 发布:斑马梦龙网络计划心得 编辑:程序博客网 时间:2024/06/05 15:03
//实验原理/************************************************************关于内部定时/计数器的编程主要是定时常数的设置和有关控制寄存器的设置。内部定时/计数器在单片机中主要有定时器和计数器两个功能。本实验用的是定时器。内部定时/计数器用作定时器时,是对机器周期计数。每个机器周期的长度是 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.09TL0=0x6A ;//频率调节 (65535-917)%256TH1=PWM ;TL1=0 ;//脉宽调节EA=1;ET0=1;ET1=1; //开启总中断//开启定时器 0 中断//开启定时器 1 中断TR0=1 ; //开启定时器 0while(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 ;//关闭定时器 1TH0=0xfc ;TL0=0x66 ;TH1=PWM ;//改变定时器 1 初值TR1=1 ;//开启定时器 1P1=0x00 ;//启动输出}/*********************************************************/// 定时器 1 中断服务程序 (脉宽)/*********************************************************/void timer1()__interrupt(3){TR1 = 0 ;P1 = 0xff ;//结束输出}


实验结果

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

0 0
原创粉丝点击