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

发布者:廿由人最新更新时间:2015-10-27 来源: eefocus关键字:51单片机  C语言程序  定时  计数器  中断 手机看文章 扫描二维码
随时随地手机看文章
程序一

利用定时/计数器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);//等待中断产生
 
}[page]

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++;
}

关键字:51单片机  C语言程序  定时  计数器  中断 引用地址:51单片机C语言程序(二)定时/计数器 中断

上一篇:51单片机C语言程序(三)数码管
下一篇:51单片机最小系统制作笔记

推荐阅读最新更新时间:2024-03-16 14:37

关于51单片机串口的使用
51单片机串口的使用有两种方法,一个是查询法,还有就是中断法,查询法相对简单就是不断查询是否有数据,而中断就是利用串口中断interrupt 4,这里给出中断法,大家参考! #include unsigned char a,flag; void main() { TMOD=0X20;//设置定时器1为方式2 TH1=0XFD;// 装入初值(由软件计算一下) TL1=0XFD; TR1=1;//启动定时器1 SM0=0;//设置为方式1 SM1=1; REN=1;//允许接受 EA=1;//打开总中断开关 ES=1;//打开串口中断开关 while(1) { if(flag==1) {
[单片机]
基于51单片机家具门屉耐用性自动检测装置程序设计
#include reg52.h #define uint unsigned int #define uchar unsigned char #define ZKB 6 //占空比初始值设定 #define max_time 100 //设置超出时间 sbit gd1=P1^0; //光电开关被挡住是高电平,没有被挡住是低电平 sbit gd2=P1^1; //光电开关被挡住是高电平,没有被挡住是低电平 sbit en=P1^2; //步进电机使能端,高电平工作,低电平不工作 sbit zx=P1^3; //高电平步进电机正
[单片机]
MCS-51单片机指令详解
MCS-51系列单片机指令以A开头的指令有18条,分别为: ACALL addr11 ADD A,Rn ADD A,direct ADD A,@Ri ADD A,#data ADDC A,RnADDC A,direct ADDC A,@Ri ADDC A,#data AJMP addr11 ANL A,Rn ANL A,direct ANL A,@Ri ANL A,#data ANL direct,A ANL direct,#data ANL C,bit ANL C,/bit 1、ACALL addr11 指令名称:绝对调用指令 指令代码:A10 A9 A8 10001 A7 A6 A5 A4 A3 A2 A1 A0 指令
[单片机]
【ARM裸板】软件中断分析及示例
1.APP如何切换模式 APP一般运行于User Mode下,受到限制(例如不可访问硬件) 如果APP想要访问硬件,必须切换模式 如何切换?发生异常即可: 软中断,swi #val 中断 未定义指令异常 2.SWI中软处理过程 执行异常处理函数之前,硬件会处理的事情: 1.lr_svc保存有被中断模式中的下一条即将执行的指令的地址 2.SPSR_svc保存被中断模式CPSR 3.CPSR的 = ,进入到svc模式 4.跳到0x08的模式执行程序,即跳到b do_svc这一指令 /*====================================异常向量表===============================
[单片机]
【ARM裸板】软件<font color='red'>中断</font>分析及示例
MSP430F149单片机实现uart数据接收中断
/***************************************************** 程序功能:MCU不停向PC机发送数据,在屏幕上显示0~127对应 的ASCII字符 ------------------------------------------------------ 通信格式:N.8.1, 9600 ------------------------------------------------------ 测试说明:打开串口调试精灵,正确设置通信格式,观察屏幕 ******************************************************/ #in
[单片机]
MSP430F149单片机实现uart数据接收<font color='red'>中断</font>
中断法键盘扫描c程序
/* 程序效果:按下按键,蜂鸣器响,数码管有相应的键值 显示,按下E键继电器关,按下C键继电器开。 这与上一程序的功能相同,比上一程序简洁 但理解相对困难些。 运行平台:51hei单片机学习板 */ #include reg52.h //头文件 #include intrins.h #define uchar unsigned char //宏定义 #define uint unsigned int sbit jdq=P3^5; //位声明,驱动继电器管脚 sbit fmq=P3^4; //位声明,驱动蜂鸣器管脚 code uchar table ={0x3f,0x06,0x5b,//数码管显示的数值 0x4f,0x66,0x6
[单片机]
51单片机-STC89C52系列学习第一篇之IO口学习
STC89C52系列单片机IO口有三种工作模式: 1、准双向口/弱上拉(标准8051输出模式) 2、开漏输出模式 3、输入模式 其中P1/P2/P3/P4上电复位后为传统的8051的IO口模式,而P0口上电后是开漏输出。 P0口作为IO口使用时需要加4.7K-10K的上拉电阻。 新增特殊功能寄存器的声明示例: sfr P4 = 0xe8; sbit P40 = 0xe8; sbit P41 = 0xe9; sbit P42 = 0xea; sbit P43 = 0xeb; sbit P44 = 0xec; sbit P45 = 0xed; sbit P46 = 0xee; 将寄存器P4的位全部置为1: P4 = 0xff; 单
[单片机]
PIC中档单片机的中断总结
与51或者其他系列的单片机相比,PIC 单片机的中断机制有其特殊之处,针对我们一些初学者存在的一些问题和疑惑,我在此做一个个人总结,不当的地方,请站友们指正。 先摘引三个对PIC中断理解的回帖,然后我再对中断活动的过程、应该注意的事项、及一个疑惑进行较详细的总结和解释。 --------------- john frank :关于pic中断有些不明白的地方 借用大虾的程序; ;******************** 中断服务代码 btfss INTCON,T0IE ; 判断是否为T0中断 goto other_int btfss INTCON,T0IF ; it ’s the t
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved