日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

实验四51单片机并口实验

發(fā)布時間:2024/7/23 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实验四51单片机并口实验 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一.實驗?zāi)康?#xff1a;

1.?了解51單片機(jī)I/O口的電氣特性和驅(qū)動能力。

2.?了解LED電路中加入限流電阻的原因。

3.?掌握定時器原理及編程。

4.?掌握并口程序的編輯、編譯、調(diào)試和運行。

二.實驗設(shè)備和器件

1.?PC機(jī)

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 ?????// 允許單片機(jī)總中斷,SETB bit:位置1

SETB ET0 ????//允許T0溢出中斷

SETB TR0 ????//開啟定時器0

SJMP $ ??????//必須要有死循環(huán),表示等待定時過程,否者只有一個燈亮

INTT0: ??????//定時到進(jìn)入中斷

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,機(jī)器周期為2,當(dāng)采用工作方式1時,最大的定時時間為:,則每隔1s一個定時器不能直接實現(xiàn),即用定時器T0產(chǎn)生周期為100ms=0.1s的定時,用一個寄存器R2對100ms計數(shù)10次,則可以產(chǎn)生1s的定時。

T0的定時為100ms時,初值:


十六進(jìn)制數(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) ?//當(dāng)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) ?//當(dāng)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的初值計算:

?

十六進(jìn)制數(shù)為3CB0H ??計數(shù)10次

T0的初值計算:

?

十六進(jìn)制數(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ù)名(voidinterrupt ?寄存器組(1、2、3、4)

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

總結(jié)

以上是生活随笔為你收集整理的实验四51单片机并口实验的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。