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++;
}
利用定时/计数器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++;
}
相关文章推荐
- 51单片机C语言程序(三)数…
- 基于51单片机的计算器 C语言程序
- 基于51单片机SJA1000 CAN通讯实现(C语言程序)
- 基于proteus的51单片机仿真实例十二、51单片机的C语言程序结构
- 51单片机的MODBUS C语言程序…
- 经典C语言程序100例(41-50)------------------转自C语言经典论坛
- 某女生编的c语言程序
- vs2005下编译c语言程序
- 基于51单片机的数控电源设计
- 51单片机RTL8019AS网卡驱动程序
- 【转】51单片机控制四相步进电机
- 51单片机特殊功能寄存器(供初学者用)
- C语言程序编译的内存分配,堆与栈的区别
- 51单片机总线时序
- 从51单片机白痴到51单片机高手的快速成长
- 51单片机--数码管
- 《划时代-51单片机C语言全新教程》-第十章 数码管 概览
- 51单片机定时器计数器中断总结
- 51单片机矩阵扫描键盘程序(源代码)
- socket c语言程序 c/s tcp模式 (程序部分2)