}
//实例50-1:输出50个矩形脉冲
#include
/ 函数功能:延时约30ms (3 100 100=30 000μs =30m
/ void delay30ms(void) {
unsigned char m,n; for(m=0;m<100;m++) for(n=0;n<100;n++) ; }
/ 函数功能:主函数
/ void main(void) {
unsigned char i;
u=1; //初始化输出高电平
for(i=0;i<50;i++) //输出50个矩形脉冲 { u=1; delay30ms(); u=0; delay30ms(); } while(1) ; //无限循环,防止程序“跑飞” }
//实例50-2:计数器T0统计外部脉冲数
#include
/ 函数功能:主函数
/ void main(void) {
TMOD=0x06; // TMOD=0000 0110B,使用计数器T0的模式2 EA=1; //开总中断 ET0=0; //不使用定时器T0的中断 TR0=1; //启动T0 TH0=0; //计数器T0高8位赋初值 TL0=0; //计数器T0低8位赋初值 while(1) //无限循环,不停地将TL0计数结果送P1口 P1=TL0; }
//实例51-2:定时器T0的模式2测量正脉冲宽度
#include
sbit ui=P3^2; //将ui位定义为P3.0(INT0)引脚,表示输入电压 / 函数功能:主函数
/ void main(void) {
TMOD=0x0a; // TMOD=0000 1010B,使用定时器T0的模式2,GATE置1 EA=1; //开总中断 ET0=0; //不使用定时器T0的中断 TR0=1; //启动T0 TH0=0; //计数器T0高8位赋初值 TL0=0; //计数器T0低8位赋初值 while(1) //无限循环,不停地将TL0计数结果送P1口 { while(ui==0) //INT0为低电平,T0不能启动 ; TL0=0; //INT0为高电平,启动T0计时,所以将TL0清0 while(ui==1) //在INT0高电平期间,等待,计时 ; P1=TL0; //将计时结果送P1口显示 } }
//实例52:用定时器T0控制输出高低宽度不同的矩形波
#include
sbit u=P3^0; //将u位定义为P3.0,从该引脚输出矩形脉冲 unsigned char Countor; //设置全局变量,储存负跳变累计数 / 函数功能:延时约30ms (3 100 100=30 000μs =30ms)
/ void delay30ms(void) {
unsigned char m,n; for(m=0;m<100;m++) for(n=0;n<100;n++) ; }
/ 函数功能:主函数
/ void main(void) {
unsigned char i;
EA=1; //开放总中断 EX0=1; //允许使用外中断
IT0=1; //选择负跳变来触发外中断 Countor=0;
for(i=0;i<100;i++) //输出100个负跳变 { u=1; delay30ms(); u=0; delay30ms(); } while(1)
; //无限循环, 防止程序跑飞 }
/ 函数功能:外中断T0的中断服务程序
void int0(void) interrupt 0 using 0 //外中断0的中断编号为0 {
/
Countor++; P1=Countor; }
//实例53:用外中断0的中断方式进行数据采集
#include
/ 函数功能:主函数
/ void main(void) {
EA=1; //开放总中断 EX0=1; //允许使用外中断
IT0=1; //选择负跳变来触发外中断 P1=0xff; while(1)
; //无限循环, 防止程序跑飞 }
/ 函数功能:外中断T0的中断服务程序
/ void int0(void) interrupt 0 using 0 //外中断0的中断编号为0 {
P1=~P1; //每产生一次中断请求,P1取反一次。 }
//实例54-1:输出负脉宽为200微秒的方波
#include
/ 函数功能:主函数
/ void main(void)
{
TMOD=0x02; //TMOD=0000 0010B,使用定时器T0的模式2 EA=1; //开总中断 ET0=1; //定时器T0中断允许 TH0=256-200; //定时器T0的高8位赋初值 TL0=256-200; //定时器T0的高8位赋初值 TR0=1; //启动定时器T0 while(1) //无限循环,等待中断 ; }
/ 函数功能:定时器T0的中断服务程序
/ void Time0(void) interrupt 1 using 0 //\声明函数为中断服务函数 {
u=~u; //将P1.4引脚输出电平取反,产生方波 }
//实例54-2:测量负脉冲宽度
#include
/ 函数功能:主函数
/ void main(void) {
TMOD=0x02; //TMOD=0000 0010B,使用定时器T0的模式2 EA=1; //开放总中断 EX0=1; //允许使用外中断
IT0=1; //选择负跳变来触发外中断 ET0=1; //允许定时器T0中断 TH0=0; //定时器T0赋初值0 TL0=0; //定时器T0赋初值0 TR0=0; //先关闭T0 while(1)
; //无限循环, 不停检测输入负脉冲宽度 }
/