您的位置:首页 > 编程语言 > C语言/C++

51单片机C语言程序(二)定…

2014-04-26 23:34 99 查看
原文地址:中断">51单片机C语言程序(二)定时/计数器 中断作者:飞扬程序一

利用定时/计数器T0从P1.0输出周期为1s的方波,

让发光二极管以1HZ闪烁,
#include<reg52.h>
//52单片机头文件

#include <intrins.h>
//包含有左右循环移位子函数的库

#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<reg52.h>
//52单片机头文件

#include <intrins.h>
//包含有左右循环移位子函数的库

#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<reg52.h>
//52单片机头文件

#include <intrins.h>
//包含有左右循环移位子函数的库

#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<reg52.h>
//52单片机头文件

#include <intrins.h>
//包含有左右循环移位子函数的库

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: