① 單片機實驗「定時/計數器及中斷」的一些問題
1.1)主程序各行作用如下:
第一行:設置定時器模式
第二行:設置定時器高位寄存器初值
第三行:設置定時器低位寄存器初值
第四行:T0定時器中斷使能
第五行:總中斷使能
第六行:打開T0定時器
第七行:死循環(主程序停留在此行)
主程序整體實現的功能:初始化定時器T0
1.2)void Timer0_Int(void)是定時器0中斷函數,每行作用如下:
第一行:重新設定定時器高位寄存器初值
第二行:重新設置定時器低位寄存器初值
第三行:如果P1_0 IO口是高電平則改為低電平,如是低電平改為高電平
整體實現的功能:P1_0 IO口高低電平1秒切換一次
媽呀,這么多問題,網上找找,應該有的
② 單片機中斷定時實驗
涉及到的單片機知識如下:數碼管編碼(視具體電路連接而定,看是共陰還是共陽)、定時(可以採用定時器或者軟體延時)、流水燈直接在pin口上輸出高或低就行了。編碼自己去寫,不然怎麼會有進步呢。看你們的要求,就知道你應該是重點高校學生,一定要對自己負責才行。
③ 單片機程序——定時器中斷實驗;實現LED一滅一閃
首先寫法就不對!匯編應該是大寫的
④ 單片機實驗利用定時器控制八個LED燈每隔1S每四個為一組輪流點亮
03 8隻LED左右來回點亮
/* 名稱:8隻LED左右來回點亮
說明:程序利用循環移位函數_crol_和_cror_形成來回滾動的效果
*/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//延時
void DelayMS(uint x)
{
uchari;
while(x--)
{
for(i=0;i<120;i++);
}
}
//主程序
void main()
{
uchari;
P2=0x01;
while(1)
{
for(i=0;i<7;i++)
{
P2=_crol_(P2,1);//P2的值向左循環移動
DelayMS(150);
}
for(i=0;i<7;i++)
{
P2=_cror_(P2,1);//P2的值向右循環移動
DelayMS(150);
}
}
}
04 花樣流水燈
/* 名稱:花樣流水燈
說明:16隻LED分兩組按預設的多種花樣變換顯示
*/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code Pattern_P0[]=
{
0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff,
0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,
0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff,
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,
0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,
0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff
};
uchar code Pattern_P2[]=
{
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0xff,
0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff,
0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,
0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,
0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,
0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff
};
//延時
void DelayMS(uint x)
{
uchari;
while(x--)
{
for(i=0;i<120;i++);
}
}
//主程序
void main()
{
uchari;
while(1)
{ //從數組中讀取數據送至P0和P2口顯示
for(i=0;i<136;i++)
{
P0=Pattern_P0[i];
P2=Pattern_P2[i];
DelayMS(100);
}
}
}
05 LED模擬交通燈
/* 名稱:LED模擬交通燈
說明:東西向綠燈亮若干秒,黃燈閃爍5次後紅燈亮, 紅燈亮後,南北向由紅燈變為綠燈,若干秒後南北向黃燈閃爍5此後變紅燈,東西向變綠燈,如此重復。
*/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit RED_A=P0^0; //東西向燈
sbit YELLOW_A=P0^1;
sbit GREEN_A=P0^2;
sbit RED_B=P0^3; //南北向燈
sbit YELLOW_B=P0^4;
sbit GREEN_B=P0^5;
uchar Flash_Count=0,Operation_Type=1; //閃爍次數,操作類型變數
//延時
void DelayMS(uint x)
{
uchari;
while(x--)for(i=0;i<120;i++);
}
//交通燈切換
void Traffic_Light()
{
switch(Operation_Type)
{
case1: //東西向綠燈與南北向紅燈亮
RED_A=1;YELLOW_A=1;GREEN_A=0;
RED_B=0;YELLOW_B=1;GREEN_B=1;
DelayMS(2000);
Operation_Type=2;
break;
case2: //東西向黃燈閃爍,綠燈關閉
DelayMS(300);
YELLOW_A=~YELLOW_A;GREEN_A=1;
if(++Flash_Count!=10)return; //閃爍5次
Flash_Count=0;
Operation_Type=3;
break;
case3: //東西向紅燈,南北向綠燈亮
RED_A=0;YELLOW_A=1;GREEN_A=1;
RED_B=1;YELLOW_B=1;GREEN_B=0;
DelayMS(2000);
Operation_Type=4;
break;
case4: //南北向黃燈閃爍5次
DelayMS(300);
YELLOW_B=~YELLOW_B;GREEN_B=1;
if(++Flash_Count!=10)return;
Flash_Count=0;
Operation_Type=1;
}
}
//主程序
void main()
{
while(1)Traffic_Light();
}
06 單只數碼管循環顯示0~9
/* 名稱:單只數碼管循環顯示0~9
說明:主程序中的循環語句反復將0~9的段碼送至P0口,使數字0~9循環顯示
*/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar codeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
//延時
void DelayMS(uint x)
{
uchart;
while(x--)for(t=0;t<120;t++);
}
//主程序
void main()
{
uchari=0;
P0=0x00;
while(1)
{/* for(;i<11;i++){ P0=~DSY_CODE[i]; DelayMS(300);} //注:另一方案 */
P0=~DSY_CODE[i];
i=(i+1)%10;
DelayMS(300);
}
}
⑤ PIC單片機定時器初值計算方法及幾種周期小結
正確為你解答:
1 可以按定時時間的計算公式, 計算出定時器的時間常數X:
定時時間T=(2的N次方-X)12/單片機晶振頻率
2 N為定時器的工作方式:
方式0時,N=13
方式1時,N=16
方式2時,N=8
3 根據定時時間和工作方式,計算出時間常數X
把X轉換成二進制數,高8位送給TH1,低8位送給TL1,就可以啟動定時器開始定時了。
例如: 工作在方式1,定時時間為1000微秒 晶振頻率=12MHZ
則 定時時間T=(2的16次方-X)12/12MHZ=1000 解出 X=64536=FC18H
⑥ 關於MCS-51系列單片機定時器/計數器實驗的幾個問題
(1)計數和定時有什麼區別?怎樣選擇和設定?
(2)計數或定時初始值怎樣計算與裝入?
(3)定時器T0和T1各有哪幾種工作方式?工作原理如何?
(4)怎樣啟動定時器?
這些,夠寫十多頁了。
⑦ 單片機的定時器
從來也沒有人說過:在串口通信時,89C51依靠檢查TF1的置位清零的次數來計算溢出率。
樓主的疑問,在硬體設計的時候,Intel已經解決了,內部肯定有檢查的方法。
⑧ 單片機定時器實驗.
你的注釋有的有錯誤,現重新更正如下
ORG 0000H
AJMP START
ORG 001BH ;外中斷1入口地址
AJMP INT_T1
ORG 0100H
START:
MOV SP,#60H;設置堆棧深度
MOV TMOD,#10H ;置T1為方式1
MOV TL1,#00H ;延時50mS的時間常數
MOV TH1,#4BH
MOV R0,#00H;表格計數器
MOV R1,#20;1s計數器即20*50ms=1000ms=1s,得到所需要定時時間1s
SETB TR1;打開定時器1
SETB ET1:允許定時器1中斷
SETB EA ;開總中斷
SJMP $:等待
INT_T1: ;T1中斷服務子程序
PUSH ACC ;保護現場
PUSH PSW
PUSH DPL
PUSH DPH
CLR TR1 ;關定時器
MOV TL1,#00H ;重新載入計數初值
MOV TH1,#4BH
SETB TR1 ;再次打開定時器
DJNZ R1,EXIT;判斷是否到達20個50ms,如果沒有則繼續循環
MOV R1,#20 ;重新載入1s計數值
MOV DPTR,#DATA ;置常數表首地址 MOV A,R0 ;置常數表偏移量
MOVC A,@A+DPTR ;讀常數表
MOV P1,A ;這里中的A決定是什麼花色,也就是顯示什麼
INC R0;指向下一個數
ANL 00,#07H;
EXIT:
POP DPH ;恢復現場
POP DPL
POP PSW
POP ACC
RETI
LED顯示常數表
DATA: DB 0FAH,0F5H,0AFH,05FH,0AAH,55H,00H,0FFH
END
總的來說顯示什麼樣的花色是由你提前計算好,然後將對應的值放入表格中。比方說,你的led是共陰極接法,那麼你要L1和L3亮就要給p1口送00000110B,這個值放到表格中等你用的時候從表格中取出來就行了
⑨ 51單片機實驗(關於定時器計數器)
6mz的晶振 可算出一個時鍾周期為2微秒,200毫秒去除一下2微秒就是10000,然後吧10000取16進制為 27A0 ,用 FFFF減27A0再加1 得 C860,用定時方式一,TL0 ,#60H
TH0, #C8H
⑩ 單片機定時計數器實驗
1. 你搞錯了吧,周期2秒? 重復周期? 時間長了點吧。
2. 單片機也分種類,型號,還有1T單片機,12T單片機等等等等。
3. 搞不懂,不然有空給你寫個代碼了