实验四51单片机并口实验
一.實驗?zāi)康?#xff1a;
1.?了解51單片機I/O口的電氣特性和驅(qū)動能力。
2.?了解LED電路中加入限流電阻的原因。
3.?掌握定時器原理及編程。
4.?掌握并口程序的編輯、編譯、調(diào)試和運行。
二.實驗設(shè)備和器件
1.?PC機
2.?PROTEUS仿真軟件 ??
3.?實驗箱
4.?ISP下載器
5.?51仿真器 ???????????
三.實驗內(nèi)容
(1)編程實現(xiàn):采用定時器0,每隔1s點亮1只發(fā)光二極管
① 電路圖:
?
② 代碼:
??中斷處理方式:
ORG 0000H
LJMP MAIN ?
ORG 000BH
LJMP INTT0
ORG 0100H
MAIN:
MOV TMOD,#01H ??//TMOD為方式寄存器,該題是定時器0,且為方式1,則TMOD=0000_0001
MOV TH0,#3CH ??
MOV TL0,#0B0H ?//初值的計算
MOV R2,#00H ???//計數(shù)寄存器
MOV A,#0FEH ???
MOV P0, A ?????//設(shè)置燈的初狀態(tài),第D0個燈亮
SETB EA ?????// 允許單片機總中斷,SETB bit:位置1
SETB ET0 ????//允許T0溢出中斷
SETB TR0 ????//開啟定時器0
SJMP $ ??????//必須要有死循環(huán),表示等待定時過程,否者只有一個燈亮
INTT0: ??????//定時到進入中斷
MOV TH0,#3CH
MOV TL0,#0B0H ??//每次定時都需要重新賦初值
INC R2 ?????????//計數(shù)次數(shù)加1
CJNE R2,#0AH,NEXT ??//判斷計數(shù)次數(shù)是否等于10,不等跳轉(zhuǎn)到NEXT
RL ???A ???????????//計數(shù)次數(shù)到10次之后,A左移
MOV ??P0, A ???????//下一個燈亮
MOV R2,#00H ???????//計數(shù)清0
NEXT:
RETI
END
??查詢處理方式:
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H
MOV R2,#00H
MOV A,#0FEH
MOV P0,A
SETB TR0
LOOP:
JBC TF0,NEXT1 //判斷TF0是否溢出,及TF0是否為1,有則跳轉(zhuǎn)到NEXT1,并把TF0清0
SJMP LOOP ???//無溢出,一直查詢
NEXT1: ?
MOV TH0,#3CH
MOV TL0,#0B0H ?//每次定時都需要重新賦初值
INC R2
CJNE R2,#0AH,NEXT
RL ??A
MOV ?P0, A
MOV ?R2,#00H
SJMP LOOP
NEXT:
SJMP LOOP
SJMP $
END
③ 分析:
初值的計算:系統(tǒng)時鐘為6MHz,機器周期為2,當采用工作方式1時,最大的定時時間為:,則每隔1s一個定時器不能直接實現(xiàn),即用定時器T0產(chǎn)生周期為100ms=0.1s的定時,用一個寄存器R2對100ms計數(shù)10次,則可以產(chǎn)生1s的定時。
T0的定時為100ms時,初值:
十六進制數(shù)為3CB0H
(2)編程實現(xiàn):上電時, 8個發(fā)光二極管全亮;按下K1時,發(fā)光二極管向左(向下)移一位;按下K2時,發(fā)光二極管向右(向上)移一位。
① 電路圖:
?
② 代碼:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uint i;
sbit P1_0=P1^0; ??sbit P1_1=P1^1; ??//定義并口P1的第0、1位
void Time_Init() //定時器裝入初值 T0定時時間為100ms,T1定時時間為50ms
{
TMOD=0x11; ?
TH0=0x3c; TL0=0xb0;
TR0=0;//初始化后并不啟動定時器T0,待命
TH1=0x9e; ?TL1=0x58;
TR1=0;//初始化后并不啟動定時器T1,待命
}
void main()
{
Time_Init(); //初始化定時器 ?
i=0;
P0=0x0; ?//上電時, 8個發(fā)光二極管全亮
while(1)
{
if(P1_0==0) ?//當P1.0有效時,及開關(guān)K1按下
{ ?EA=1; ???TR1=0;//關(guān)閉定時器1
TR0=1; ??ET0=1;//允許中斷0,打開定時器0
P0=0x7f; ??// 給燈賦初值,第8個燈亮
}
if(P1_1==0) ?//當P1.1有效時,及開關(guān)K2按下
{ ?
EA=1; ??
TR0=0; ?//關(guān)閉定時器0
TR1=1; ?ET1=1; ?//允許中斷1,打開定時器1
P0=0xfe; ????// 給燈賦初值,第1個燈亮
}}}
?
void time0_int(void) interrupt 1 ??//中斷服務(wù)程序1
{
TH0=0x3c; ??TL0=0xb0; ??//每次定時都需要重新賦初值
i++; ??????//計數(shù)加1
if(i==10)
{
i=0;
P0= _cror_(P0,1); //循環(huán)右移(向上)1位,點亮下一個燈
}}
?
void time1_int(void) interrupt 3
{
TH1=0x9e;TL1=0x58; //每次定時都需要重新賦初值
i++;
if(i==20)
{
i=0;
P0= _crol_(P0,1); //循環(huán)左移(向下)1位,點亮下一個燈
}}
③ 分析:
??該題中最上面的燈為第一個燈,
K1---P0=0x7f---向上移
K2---P0=0xfe---向下移
????該題才用的兩個定時器T0、T1
T0的初值計算:
?
十六進制數(shù)為3CB0H ??計數(shù)10次
T0的初值計算:
?
十六進制數(shù)為9E58H ??計數(shù)10次
?
四.部分知識點及遇到的問題:
(1)?定時/計數(shù)器T0工作方式:
??方式0 ?M1 M0=00 ?13 位定時/計數(shù)器
??方式1 ?M1 M0=01 ?16 位定時/計數(shù)器(每次定時均需重新賦值,TF0=0)
??方式2 ?M1 M0=10 ??8位自動充值定時/計數(shù)器
??方式3 ?M1 M0=11 ??兩個9位定時/計數(shù)器
(2)?用了T1之后,T0不可以執(zhí)行:定時器T1比定時器T0優(yōu)先級高
(3)?開關(guān)與燈在該仿真電路中均是低電平有效
(4)?中斷服務(wù)程序的格式:void 函數(shù)名(void) interrupt ?寄存器組(1、2、3、4)
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的实验四51单片机并口实验的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3.认识和操作一下mysql的基本命令
- 下一篇: 【每日SQL打卡】