1. 51單片機代碼(定時器/計數器實驗)求詳細注釋,非常謝謝
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0_INT
ORG 0100
MAIN:
MOV TMOD,#01H ;定時器0設為模式1
MOV TH0,#0D8H ;賦初值(65536-10000)
MOV TL0,#0F0H
MOV A,#00H ;A=0
MOV P1,A ;P1=A
MOV R0,#20 ;R2=20
SETB EA ;開中斷
SETB ET0 ;開定時器0中斷
SETB TR0 ;啟動定時器0
LOOP: NOP ;空操作
LJMP LOOP ;轉LOOP
T0_INT:
MOV TH0,#0D8H ;重賦初值
MOV TL0,#0F0H
DJNZ R0,OUT ;R0減1不為0轉OUT
MOV R0,#20H ;R0重賦初值
CPL A ;A取反
MOV P1,A ;P1=A
OUT: RETI
END
;該程序結果在P1上產生周期為400毫秒的脈沖輸出,控制LED燈的話,以400毫秒周期閃爍
2. 51單片機定時計數器
TMOD = 0X01; //設置t0為16位(01)計時模式,以TR0來啟動計時器
//計算初值
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
EA = 1; //開總中斷
ET0 = 1;//開定時器0中斷
TR0 = 1; //啟動T0
while (1);
定時器中斷服務函數;
void timer0_service(void) interrupt 1 (T1 時這里應為3)
{
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256; //打算繼續定時下去時,進入中斷服務函數後,重新設定一下初值。
times++; //這可以產生更大的定時
if (times == 20) {
times = 0;
led = !led;
}
}
3. C51單片機程序
TH0=0xf6;
TL0=0xff;
上兩行是定時器/計數器T0的初值,因為T0是16位的,所以用TH0表示高八位,TL0表示低八位
TH1=0xfd;
TL1=0xfd;
T1初值
TMOD=0x21;
定時器/計數器模式控制寄存器如圖
GATE=1時,由外部中斷引腳INT0、INT1來啟動定時器T0、T1
GATE=0時,僅由TR0,TR1置位分別啟動定時器T0、T1。
C/T=0時為定時功能,C/T=1時為計數功能
M0、M1——方式選擇功能
M1M0工作方式計數器模式TMOD(設置定時器模式)
00方式013位計數器TMOD=0x00
01方式116位計數器TMOD=0x01
10方式2自動重裝8位計數器TMOD=0x02
11方式3T0分為2個8位獨立計數器,T1為無中斷重裝8位計數器TMOD=0x03
PCON=0x00;
PCON主要是為CHMOS型單片機的電源控制而設置的專用寄存器
WDCON=0x00;清狗
SCON=0x50;
SCON1=0x40;
串口控制寄存器
4. 求一個51單片機用T0做計數器的C語言代碼。
//timer0設定為計數器模式1
TMOD &= 0xf0; //清除原來的設定
TMOD |= 0x05; //T0為計數器模式1
TH0 = 0;
TL0 = 0; //從0開始計數
TR0 = 1; //使能T/C0
// IE |= 0x82; //Timer0中斷使能,不需要就注釋掉該行
另外執行不了有可能是你的實驗板沒有連接T0引腳
5. 用51單片機測頻率,T0定時,T1計數,具體程序應該怎麼寫呀,跪求完整點的
數碼管還是液晶屏顯示?晶振頻率多少?
用定時器時,先設置工作方式再裝入初值開啟中斷再開啟定時器/計數器
void init()//初始化設置
{
TMOD=0x51;//定時器1作為計數器,定時器0作為定時器用
TH1=0;//計數器清0
TL1=0;
EA=1;//開總中斷
ET0=1;//允許定時器0中斷
TH0=(65535-50000)/256;// 晶振12M時 定時50ms需裝入的初值
TL0==(65535-50000)%256;
TR0=1;//啟動計數器
TR1=1;//啟動定時器
}
定時器中斷程序
void timer0()interrupt 1//注意:定時器0的中斷序號為1
{
TH0=(65535-50000)/256;
TL0==(65535-50000)%256;
TR1=0;//暫停計數
bb=TH1;//讀出計數器數據
cc=TL1;
TL1=0;//計數器清0
TH1=0;
TR1=1;//重新啟動
}
頻率f=(bb*256+cc)*20
然後分離出個十百千萬,送液晶屏或數碼管去顯示
主程序先初始化,然後就是不停地顯示
6. MCS_51鍗曠墖鏈虹殑瀹氭椂鍣═O鍋滄㈣℃暟鐨勮鍙ユ槸浠涔
TR0=0錛涘仠姝㈣℃暟
TR0=1錛涘紑濮嬭℃暟
7. 51單片機定時/計數器的問題 (代碼)
TH0 = THC0; // 向TH0寄存器寫入THC0常數,也就是0xEE
TL0 = TLC0; // 向TL0寄存器寫入TLC0常數,也就是0x00
// 以上完成定時器0在16位模式下的初值載入,也就是0xEE00
TR0 = 1; // 開啟定時器0的運行。此語句之後Timer0計數器才開始累加
ET0 = 1; // 開啟定時器0的中斷。此語句之後,Timer0計數器溢出才會產生中斷標志
EA = 1; // 開啟總中斷開關。此語句之後,中斷標志置位才會觸發PC跳轉到對應的中斷向量
好好學習天天向上
8. 求個 51單片機 計數器 程序 註解
#include "reg52.h"
#define u8 unsigned char
#define u16 unsigned int
sbit sw1=P3^4;
sbit sw2=P3^5;
sbit sw3=P3^6;
sbit e0=P2^0;
sbit e1=P2^1;
sbit e2=P2^2;
sbit e3=P2^3;
u8 ds[4]={0,0,0,0};
u16 num=0;
u8 code table[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0x00};//共陰數碼管
u8 ajsm() //SW3按鍵檢測和處理
{
static u16 ms;
if(sw3==0)
{
if(++ms==2)
{
return 1;
}
}
else
{
ms=0;
}
return 0;
}
void xs() //顯示
{
static u8 a;
a++;
if(a>3)a=0; //a最大為3,大於3則為0
e0=1;
e1=1;
e2=1;
e3=1;//以上4條語句關閉顯示(沒有位選)
P0=table[ds[a]];//段選碼送P0
switch(a)
{
case 0: //a=0,顯示第一位(位選e0=0其餘為1)
{
e0=0;
e1=1;
e2=1;
e3=1;
}break;
case 1: //a=1,顯示第二位(位選e1=0其餘為1)
{
e0=1;
e1=0;
e2=1;
e3=1;
}break;
case 2: //a=2,顯示第三位(位選e2=0其餘為1)
{
e0=1;
e1=1;
e2=0;
e3=1;
}break;
case 3: //a=3,顯示第四位(位選e3=0其餘為1)
{
e0=1;
e1=1;
e2=1;
e3=0;
}break;
}
}
void main()
{
TMOD=0x66;//定時器0和1均設置為自動重裝載計數器模式
TH0=0xff;//定時器0來一個脈沖中斷一次
TL0=0xff;
TH1=0xff;//定時器1來一個脈沖中斷一次
TL1=0xff;
TR1=1;//啟動計數器1
TR0=1;//啟動計數器0
ET0=1;//允許定時器0中斷
ET1=1;//允許定時器1中斷
EA=1;//開總中斷
while(1)
{
ds[0]=num/1000%10;
ds[1]=num/100%10;
ds[2]=num/10%10;
ds[3]=num%10; //以上四句將num轉換為數碼管顯示的值
xs(); //調用顯示
if(ajsm()) //檢測按鍵
{
num=0; //清零
}
}
}
void time0()interrupt 1 //SW1按鍵處理
{
if(num<9999)num++;
}
void time1()interrupt 3 //SW2按鍵處理
{
if(num>0)num--;
}