1.用T0定時中斷控制P1口8只led燈以周期2秒回圈閃爍,fosc12MHZ.
#include<reg51.c>
sbit led=P2^0; //定義P2.0口的指示燈
void main()
{
TMOD=0x01; //設定定時器作業方式
TH0=(65536-50000)/256; //設定定時器初值
TL0=(65536-50000)%256;
EA=1; //開總中斷
ET0=1; //開定時器T0溢位中斷
TR0=1; //啟動T0
while(1); //等待中斷
}
void Timer0()interrupt 1 //T0定時中斷處理子程式
{
Int i;
for(i=0;i<40;i++)
{
TH0=(65536-50000)/256; //重賦初值
TL0=(65536-50000)%256;
}
led=~led; //控制指示燈閃爍
}
uj5u.com熱心網友回復:
給你改了一下。#include <reg51.h>
sbit led=P2^0; //定義P2.0口的指示燈
void main()
{
TMOD=0x01; //設定定時器作業方式
TH0=(65536-50000)/256; //設定定時器初值
TL0=(65536-50000)%256;
EA=1; //開總中斷
ET0=1; //開定時器T0溢位中斷
TR0=1; //啟動T0
while(1); //等待中斷
}
void Timer0()interrupt 1 //T0定時中斷處理子程式
{
int i;
for(i=0;i<40;i++)
{
TH0=(65536-50000)/256; //重賦初值
TL0=(65536-50000)%256;
}
led=~led; //控制指示燈閃爍
}
uj5u.com熱心網友回復:
改在哪里的?沒看見變化呀
uj5u.com熱心網友回復:
你為什么要在定時器中斷里加個回圈uj5u.com熱心網友回復:
<reg51.c> 改為 <reg51.h>Int 改為 int
uj5u.com熱心網友回復:
不是2秒一個周期嗎,怎么改
uj5u.com熱心網友回復:
改不在中斷里回圈:
#include <reg51.h>//<reg51.c>
sbit led=P2^0; //定義P2.0口的指示燈
unsigned char tim;
void main()
{
TMOD=0x01; //設定定時器作業方式
TH0=(65536-50000)/256; //設定定時器初值
TL0=(65536-50000)%256;
EA=1; //開總中斷
ET0=1; //開定時器T0溢位中斷
TR0=1; //啟動T0
while(1)
{
if(tim>20)
{
tim=0;
led=~led; //控制指示燈閃爍
}
}
}
void Timer0()interrupt 1 //T0定時中斷處理子程式
{
tim++;
TH0=(65536-50000)/256; //重賦初值
TL0=(65536-50000)%256;
TR0=1; //啟動T0
}
uj5u.com熱心網友回復:
你發這貼子的目的是什么?就是為了發貼而發貼嗎?uj5u.com熱心網友回復:
oid Timer0()interrupt 1 //T0定時中斷處理子程式{
Int i;
for(i=0;i<40;i++)
{
[color=#FF0000]TH0=(65536-50000)/256; //重賦初值
TL0=(65536-50000)%256;
}[/color]
led=~led; //控制指示燈閃爍
}
紅色那個代碼你想干嘛?
中斷函式里面一般是
1、關中斷
2、做一點事情(盡量避免使用回圈)
uj5u.com熱心網友回復:
你為什么要在定時器中斷里加個回圈
不是2秒一個周期嗎,怎么改
改不在中斷里回圈:
#include <reg51.h>//<reg51.c>
sbit led=P2^0; //定義P2.0口的指示燈
unsigned char tim;
void main()
{
TMOD=0x01; //設定定時器作業方式
TH0=(65536-50000)/256; //設定定時器初值
TL0=(65536-50000)%256;
EA=1; //開總中斷
ET0=1; //開定時器T0溢位中斷
TR0=1; //啟動T0
while(1)
{
if(tim>20)
{
tim=0;
led=~led; //控制指示燈閃爍
}
}
}
void Timer0()interrupt 1 //T0定時中斷處理子程式
{
tim++;
TH0=(65536-50000)/256; //重賦初值
TL0=(65536-50000)%256;
TR0=1; //啟動T0
}
這里中斷服務程式中,TR0不需要再重新賦值1了,因為前面的程式中并沒有將定時器關掉
uj5u.com熱心網友回復:
初學者很容易犯錯造成的。 指示燈2秒閃爍一下,它們就想把定時器時間配置成2秒,但是定時器根本就配不出來2秒的定時器。主要是各方面的知識缺乏造成的,主要是因為撰寫中斷服務程式的要點不清楚,撰寫中斷服務程式的要點如下:
1、中斷服務程式一定要快進快出,一定不要在中斷服務程式中撰寫耗時的代碼。
2、至于指示燈2秒閃爍一下,完全可以設計一個20毫秒的定時器(定時器配置為自動重裝,防止誤差)
3、定義1個計數器,定時器中斷一次計數器累加1次
4、主程式中檢測,當計數器>100,就表示2秒到了,翻轉一下指示燈
if 計數器>100
{
關中斷
計數器=0
開中斷
指示燈翻轉
}
uj5u.com熱心網友回復:
弄明白了,以前一直中斷,用計數判斷。好經驗
uj5u.com熱心網友回復:
學習了,都是高手轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/35576.html
標籤:單片機/工控
