单片机
返回首页

51单片机C语言程序(二)定时/计数器 中断

2015-10-27 来源:eefocus

程序一

利用定时/计数器T0从P1.0输出周期为1s的方波,
让发光二极管以1HZ闪烁,
#include  //52单片机头文件
#include //包含有左右循环移位子函数的库
#define uint unsigned int    //宏定义
#define uchar unsigned char  //宏定义
sbit P1_0=P1^0;
uchar tt;
void main()      //主函数
{
 TMOD=0x01;//设置定时器0为工作方式1
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 EA=1;//开总中断
 ET0=1;//开定时器0中断
 TR0=1;//启动定时器0
 while(1);//等待中断产生
 
}

void timer0() interrupt 1
{
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 tt++;
 if(tt==20)
 {
  tt=0;
  P1_0=~P1_0;
 }
}

 

程序二

利用定时/计数器T1产生定时时钟,
由P1口控制8个发光二极管,
使8个指示灯依次一个一个闪动,
闪动频率为10次/秒(8个灯依次亮一遍为一个周期),循环。
#include  //52单片机头文件
#include //包含有左右循环移位子函数的库
#define uint unsigned int    //宏定义
#define uchar unsigned char  //宏定义
sbit P1_0=P1^0;
uchar tt,a;
void main()      //主函数
{
 TMOD=0x01;//设置定时器0为工作方式1
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 EA=1;//开总中断
 ET0=1;//开定时器0中断
 TR0=1;//启动定时器0
 a=0xfe;
 while(1);//等待中断产生
 
}

void timer0() interrupt 1
{
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 tt++;
 if(tt==2)
 {
  tt=0;
  P1=a;
  a=_crol_(a,1);
 }
}

 

程序三

 同时用两个定时器控制蜂鸣器发声,
定时器0控制频率,定时器1控制同个
频率持续的时间,间隔2s依次输出
1,10,50,100,200,400,800,
1k(hz)的方波

#include  //52单片机头文件
#include //包含有左右循环移位子函数的库
#define uint unsigned int    //宏定义
#define uchar unsigned char  //宏定义
sbit beep=P2^3;
uchar tt;
uint fre,flag;

void main()      //主函数
{
 fre=50000;
 beep=0;
 TMOD=0x11;//设置定时器0,定时器1为工作方式1
 TH0=(65536-fre)/256;
 TL0=(65536-fre)%256;
 TH1=(65536-50000)/256;
 TL1=(65536-50000)%256;
 EA=1;//开总中断
 ET0=1;//开定时器0中断
 ET1=1;
 TR1=1;
 TR0=1;//启动定时器0
 while(1);//等待中断产生
 
}

void timer0() interrupt 1   //定时器0中断
{
 TR0=0;    //进中断后先把定时器0中断关闭,防止内部程序过多而造成中断丢失
 TH0=(65536-fre)/256;
 TL0=(65536-fre)%256;
 tt++;
 if(flag<40)    //以下几个if分别用来选取不同的频率
  if(tt==10)
   {
    tt=0;
    fre=50000;
    beep=~beep;
   }
 if(flag>=40&&flag<80)
  {
   tt=0;
   fre=50000;
   beep=~beep; 
  }
 if(flag>=80&&flag<120)
  {
   tt=0;
   fre=10000;
   beep=~beep; 
  }
 if(flag>=120&&flag<160)
  {
   tt=0;
   fre=5000;
   beep=~beep; 
  }
 if(flag>=160&&flag<200)
  {
   tt=0;
   fre=2500;
   beep=~beep; 
  }
 if(flag>=200&&flag<240)
  {
   tt=0;
   fre=1250;
   beep=~beep; 
  }
 if(flag>=240&&flag<280)
  {
   tt=0;
   fre=625;
   beep=~beep; 
  }
 if(flag>=280&&flag<320)
  {
   tt=0;
   fre=312;
   beep=~beep; 
  }
 if(flag>=320&&flag<360)
  {
   tt=0;
   fre=156;
   beep=~beep; 
  }
 TR0=1;
}
void timer1() interrupt 3  //定时器1中断用来产生2秒时间定时
{
 TH1=(65536-50000)/256;
 TL1=(65536-50000)%256;
 flag++;
 if(flag==360)
   {
     flag=0;
     fre=50000;
   }
}

 

程序四

用定时器以间隔500MS在6位数码管上依次显示
0、1、2、3....C、D、E、F,重复。

#include  //52单片机头文件
#include //包含有左右循环移位子函数的库
#define uint unsigned int    //宏定义
#define uchar unsigned char  //宏定义
sbit dula=P2^6;       //数码管段选锁存端
sbit wela=P2^7;       ////数码管位选锁存端
uchar num,tt;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void main()
{
 num=0;
 tt=0;
 TMOD=0x01;//设置定时器0为工作方式1
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 EA=1;//开总中断
 ET0=1;//开定时器0中断
 TR0=1;//启动定时器0
 dula=1;
 P0=0x3f;  //给段开始送显示0。
 dula=0;//关闭段选锁存端,防止开始时出现乱码。
 wela=1;//11101010
 P0=0xc0; // 打开六个数码管位选
 wela=0;
 while(1)
 {
  if(tt==10)   //每进入10次中断即为500ms,执行一次显示变化。
     {
    tt=0;
    num++;
    if(num==16)
    num=0;
    dula=1;
    P0=table[num];
    dula=0; 
   }
 }
}


void exter0() interrupt 1    // 定时器0中断
{
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 tt++;
}

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 单稳态控制电路设计与分析

  • CCFL的工作原理及电子驱动电路解析

  • 开关电源的基本组成及工作原理

  • 运算放大器IC741的基本工作原理及在电路中的实现方式

  • 基于M66T旋律发​​生器的电路图解析

  • 基于CA3193的热电偶放大器电路

    相关电子头条文章