十天學會單片機C語言-課后習題答案_第1頁
十天學會單片機C語言-課后習題答案_第2頁
十天學會單片機C語言-課后習題答案_第3頁
十天學會單片機C語言-課后習題答案_第4頁
十天學會單片機C語言-課后習題答案_第5頁
已閱讀5頁,還剩41頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

所有課作業(yè)+答案,特別整理,供單片機愛好與學習者使用

講次內容細節(jié)

第一講學單片機預備知識、

如何點亮一個發(fā)光管單片機能做什么,基本電子知識,如何用TX-1C單片機學習板學習單

片機,C51知識簡介,如何申請免費芯片樣品。點亮一個發(fā)光管,

第二講流水燈設計、蜂鳴器發(fā)聲、繼電器控制簡單延時程序、子程序調用、帶參數(shù)子程

序設計、流水燈同時蜂鳴器響、如何驅動蜂鳴器,及如何驅動繼電器,集電極開路的概念及

應用。

第三講數(shù)碼管顯示的原理、數(shù)碼管的靜態(tài)顯示共陽、共陰數(shù)碼管顯示原理、定時器工作

方式介紹、重點講述工作方式2.中斷概念及中斷函數(shù)寫法、外部中斷試驗、定時器中斷應

第四講數(shù)碼管的動態(tài)顯示原理及應用實現(xiàn)動態(tài)掃描概念、定時器、中斷加深

用單片機的定時器及中斷設計一個60秒定時器

第五講獨立鍵盤、矩陣鍵盤

的檢測原理及實現(xiàn)鍵盤用來做什么、如何鍵盤檢測、消抖、鍵盤編碼、帶返回值函數(shù)寫

法及應用

第六講AD、DA的工作原理

及實現(xiàn)、運放電路模擬電壓與數(shù)字電壓的關系、為什么要使用AD及DA、ADC0804的操

作方法、DAC0832的操作方法

第七講串口通訊原理及操作流程串口通訊工作方式、10位數(shù)據(jù)通訊、波特率概念、如

何根據(jù)波特率計算定時器初值、串口打印在調試程序中的應用。

第八講1602液晶、12864液晶顯示原理及實現(xiàn)最簡單液晶工作原理、如何開始對一個沒

有任何概念的芯片開始單片機的操作

第九講IIC總線AT24co2芯片工作原理IIC總線工作原理、

目前非常通用的一種通信機制

第十講利用51單片機的定時器設計一個時鐘綜合運用51單片機知識設計一個可以隨

意調節(jié)時間、帶整點鬧鈴的時鐘。(其中用到定時器、中斷、按鍵、蜂鳴器、數(shù)碼管或串口

通信)

第十一講用DS12c887時鐘芯片設計一個高精度時鐘DS12c887內部帶有鋰電池,系

統(tǒng)掉電情況下可自行精確走10年,并帶有鬧鐘功能、年、月、日、時、分、秒等.(本節(jié)由

學生自己設計電路)

第十二講使用Protell99繪制電路圖全過程Protel199軟件使用、元件庫、封裝庫設

計、繪制原理圖、錯誤檢查、生成PCB、手動、自動布線、送去加工

第十三講Altiumdesigner6.5繪制電路圖全過程最頂級電路板設計軟件Altium

Designer使用、元件庫、封裝庫設計、繪制原理圖、錯誤檢查、生成PCB、手動、自動布線、

送去加工

lessonl

對照TX-1C單片機學習板原理圖寫程序

用位操作和總線操作兩種方法完成以下題目

1.熟練建立KEIL工程

2.點亮第一個發(fā)光管.

3.點亮最后一個發(fā)光管

4.點亮1、3、5、7

5.點亮二、四、五、六

6.嘗試讓第一個發(fā)光管閃爍

7.嘗試設計出流水燈程序

lesson2

第一個發(fā)光管以間隔200ms閃爍

8個發(fā)光管由上至下間隔1s流動,其中每個管亮500ms,滅500ms,亮

時蜂鳴器響,滅時關閉蜂鳴器,一直重復下去。

8個發(fā)光管來回流動,每個管亮100ms,流動時讓蜂鳴器發(fā)出“滴滴”

聲。

用8個發(fā)光管演示出8位二進制數(shù)累加過程。

8個發(fā)光管間隔200ms由上至下,再由下至上,再重復一次,然后全

部熄滅再以300ms間隔全部閃爍5次。重復此過程。

間隔300ms第一次一個管亮流動一次,第二次兩個管亮流動,依次到

8個管亮,然后重復整個過程。

間隔300ms先奇數(shù)亮再偶數(shù)亮,循環(huán)三次;一個燈上下循環(huán)三次;兩

個分別從兩邊往中間流動三次;再從中間往兩邊流動三次;8個全部

閃爍3次;關閉發(fā)光管,程序停止。

lesson3

1、利用定時/計數(shù)器TO從Pl.0輸出周期為1s的方波,讓發(fā)光二極

管以1HZ閃爍,設晶振頻率為12MHz-

2、利用定時/計數(shù)器T1產生定時時鐘,由P1口控制8個發(fā)光二極管,

使8個指示燈依次一個一個閃動,閃動頻率為10次/秒(8個燈依次

亮一遍為一個周期),循環(huán)。

3、同時用兩個定時器控制蜂鳴器發(fā)聲,定時器0控制頻率,定時器

1控制同個頻率持續(xù)的時間,間隔300nls依次輸出1,10,50,100,

200,400,800,

lk(hz)的方波。

4、用定時器以間隔500Ms在6位數(shù)碼管上依次顯示0、1、2、3....C、

D、E、F,重復。

lesson4

1.利用動態(tài)掃描方法在六位數(shù)碼管上顯示出穩(wěn)定的654321.

2.用動態(tài)掃描方法和定時器1在數(shù)碼管的前三位顯示出秒表,精確到

1%秒,即后兩位顯示1%秒,一直循環(huán)下去。

3.利用動態(tài)掃描和定時器1在數(shù)碼管上顯示出從765432開始以1/10

秒的速度往下遞減直至765398并保持顯示此數(shù),與此同時利用定時

器0以500MS速度進行流水燈從上至下移動,當數(shù)碼管上數(shù)減到停止

時,實驗板上流水燈也停止然后全部開始閃爍,3秒后(用T0定時)

流水燈全部關閉、數(shù)碼管上顯示出“HELLO"。到此保持住。

lesson5

數(shù)碼管前三位顯示一個跑表,從000到999之間以1%秒速度運行,

當按下一個獨立鍵盤時跑表停止,松開手后跑表繼續(xù)運行。(用定時

器設計表)。

在上題的基礎上,用另外三個獨立鍵盤實現(xiàn)按下第一個時計時停止,

按下第二個時計時開始,按下第三個是計數(shù)值清零從頭開始。

按下16個矩陣鍵盤依次在數(shù)碼管上顯示1-16的平方。如按下第一個

顯示1,第二個顯示4...

lesson7

1.由上位機發(fā)送1給單片機時,蜂鳴器以400ms頻率發(fā)聲,發(fā)2時以

200ms頻率發(fā)聲,發(fā)3時以100ms頻率發(fā)聲,發(fā)4時關閑蜂鳴器。

1.以2400bps從計算機發(fā)送任一字節(jié)數(shù)據(jù),當單片機收到該數(shù)據(jù)后,

在此數(shù)據(jù)前加上一序號然后連同此數(shù)據(jù)一起發(fā)送至計算機,當序號超

過255時歸零.

2.以16進制發(fā)送一個0-65536之間的任一數(shù),當單片機收到后在數(shù)

碼管上動態(tài)顯示出來,波特率自定。

3.用AD以1HZ的頻率采集模擬信號,然后轉換成數(shù)字量,再將其以

1200bps發(fā)送到計算機,在計算機上顯示。

4.按下矩陣鍵盤第一行時以1200bps發(fā)送,1,2,3,4,第二行時以

2400bps發(fā)送5,6,7,8,第三行以4800bps發(fā)送,9,10,11,12,

第四行以9600pbs發(fā)送,13,14,15,16.

Lessonl作業(yè)

1用位操作點亮第一個發(fā)光管.

//適用TX-1C單片機實驗板

//晶振為11.0592M

I*********************************************************I

#include<reg52.h>//52單片機頭文件

sbitledl=PlA0;〃單片機管腳位聲明

voidmain0〃主函數(shù)

ledl=O;〃將單片機PL0口清零

while(l);〃程序停止在這里,在后面會講到為什么這樣寫。

)

2/用總線操作點亮第一個發(fā)光管.

//適用TX-1C單片機實驗板

//晶振為11.0592M

I*********************************************************I

#include<reg52.h>〃52單片機頭文件

voidmain()〃主函數(shù)

(

Pl=0xfe;〃將單片機Pl口的8個口由高到低分別賦值為11111110

while(l);〃程序停止在這里,在后面會講到為什么這樣寫。

3//用位操作點亮最后一個發(fā)光管.

//適用TX-1C單片機實驗板

//晶振為11.0592M

/*********************************************************/

#include<reg52.h>//52單片機頭文件

sbitled8=PlA7;〃單片機管腳位聲明

voidmain()//主函數(shù)

(

led8=0;〃將單片機Pl.7口清零

while(l);〃程序停止在這里,在后面會講到為什么這樣寫。

)

4//用總線操作點亮最后一個發(fā)光管.

//適用TX-1C單片機實驗板

//晶振為11.0592M

/*********************************************************/

#include<reg52.h>〃52單片機頭文件

voidmain()//主函數(shù)

(

Pl=0x7f;〃將單片機Pl口的8個口由高到低分別賦值為01111111

while(l);〃程序停止在這里,在后面會講到為什么這樣寫.

)

5//用位操作點亮1,3,5,7發(fā)光管.

//適用TX-1C單片機實驗板

//晶振為11.0592M

/*********************************************************/

#include<reg52.h>〃52單片機頭文件

sbitledl=PlAO;〃單片機管腳位聲明

sbitled3=PlA2;〃單片機管腳位聲明

sbitled5=PlA4;〃單片機管腳位聲明

sbitled7=PlA6;〃單片機管腳位聲明

voidmain0//主函數(shù)

(

ledl=0;〃將單片機PL0口清零

led3=0;〃將單片機Pl.2口清零

led5=0;〃將單片機PL4口清零

led7=0;//將單片機Pl.6口清零

whiled);〃程序停止在這里,在后面會講到為什么這樣寫.

)

6//用總線操作點亮1,3,5,7發(fā)光管.

//適用TX-1C單片機實驗板

//晶振為11.0592M

/*********************************************************/

#include<reg52.h>〃52單片機頭文件

voidmain0//主函數(shù)

Pl=0xaa;〃將單片機Pl口的8個口由高到低分別賦值為10101010

while(l);〃程序停止在這里,在后面會講到為什么這樣寫。

//用位操作點亮2,4,5,6發(fā)光管.

//適用TX-1C單片機實驗板

//晶振為11.0592M

!*********************************************************I

#include<reg52.h>//52單片機頭文件

sbitled2=PlAl;//單片機管腳位聲明

sbitled4=PlA3;//單片機管腳位聲明

sbitled5=PlA4;//單片機管腳位聲明

sbitled6=PlA5;//單片機管腳位聲明

voidmain0//主函數(shù)

(

led2=0;〃將單片機Pl.1口清零

led4=0;"將單片機PL3口清零

led5=0;//將單片機Pl.4口清零

led6=0;//將單片機Pl.5口清零

while(l);〃程序停止在這里,在后面會講到為什么這樣寫。

)

8//用總線操作點亮2,4,5,6發(fā)光管.

〃適用TX-1C單片機實驗板

//晶振為11.0592M

/*********************************************************/

#include<reg52.h>〃52單片機頭文件

voidmain0//主函數(shù)

(

Pl=0xc5;〃將單片機Pl口的8個口由高到低分別賦值為11000101

while(l);〃程序停止在這里,在后面會講到為什么這樣寫。

)

9〃嘗試讓第一個發(fā)光管閃爍.(程序看不懂沒關系,后面章節(jié)會有詳細講解)

//適用TX-1C單片機實驗板

//晶振為11.0592M

/*********************************************************/

#include<reg52.h>〃52單片機頭文件

sbitledl=PlA0;〃單片機管腳位聲明

voidmain()//主函數(shù)

unsignedinti;〃定義一個int型變量

while(1)

i=50000;〃變量賦初值為50000

ledl=0;//點亮燈

while(i一);//延時

i=50000;

ledl=l;〃熄滅燈

whiled—);

9//嘗試寫出流水燈程序(程序看不懂沒關系,后面章節(jié)會有詳細講解)

//適用TXTC單片機實驗板

//晶振為11.0592M

/*********************************************************/

#include<reg52.h>//52單片機頭文件

voidmain0〃主函數(shù)

(

unsignedinti;〃定義一個int型變量

while(1)

i=50000;//變量賦初值為50000

Pl=0xfe;〃點亮第一個燈

whi1e(i-);〃延時

i=50000;〃變量賦初值為50000

Pl=0xfd;〃點亮第二個燈

whi1e(i-);//延時

i=50000;//變量賦初值為50000

Pl=0xfb;〃點亮第三個燈

whiled—);//延時

i=50000;//變量賦初值為50000

Pl=0xf7;〃點亮第四個燈

whi1e(i-);//延時

i=50000;//變量賦初值為50000

Pl=0xef;//點亮第五個燈

while(i一);〃延時

i=50000;〃變量賦初值為50000

Pl=0xdf;〃點亮第六個燈

whi1e(i-);//延時

i=50000;//變量賦初值為50000

Pl=0xbf;//點亮第七個燈

whiled―);//延時

i=50000;〃變量賦初值為50000

Pl=0x7f;//點亮第八個燈

whi1e(i-);//延時

)

Lesson2

1//第一個發(fā)光管以間隔200ms閃爍

//適用TX-1C單片機實驗板

//晶振為11.0592M

/*********************************************************/

#include<reg52.h>//52單片機頭文件

#defineuintunsignedint〃宏定義

#defineucharunsignedchar〃宏定義

sbitledl=PlA0;〃單片機管腳位聲明

voiddelay(uintz)〃延時函數(shù),z的取值為這個函數(shù)的延時ms數(shù),如delay(200);大約

延時200ms.

{//delay(500);大約延時500ms.

uintx,y;

for(x=z;x>0;x-)

for(y=110;y>0;y-);

voidmain()//主函數(shù)

while(l)//大循環(huán)

(

ledl=0;〃點亮小燈

delay(200);〃延時200毫秒

ledl=l;//熄滅小燈

delay(200);〃延時200毫秒

)

)

2//8個發(fā)光管由上至下間隔1s流動

//,其中每個管亮500ms,滅500ms,亮時蜂鳴器響

〃,滅時關閉蜂鳴器,一直重復下去。

//適用TX-1C單片機實驗板

//晶振為11.0592M

/*********************************************************/

#include<reg52.h>//52單片機頭文件

#include<intrins.h>//包含有左右循環(huán)移位子函數(shù)的庫

#defineuintunsignedint//宏定義

#defineucharunsignedchar〃宏定義

sbitbeep=P2A3;

voiddelay(uintz)〃延時函數(shù),z的取值為這個函數(shù)的延時ms數(shù),如delay(200);大約

延時200ms.

{//delay(500);大約延時500ms.

uintx,y;

for(x=z;x>0;x-)

for(y=110;y>0;y-);

)

voidmain0〃主函數(shù)

(

uchara;

a=0xfe;

while(1)〃大循環(huán)

(

Pl=a;〃點亮小燈

beep=0;〃開啟蜂鳴器

delay(500);〃延時500毫秒

Pl=0xff;〃熄滅小燈

beep=l;〃關閉蜂鳴器

delay(500);〃延時500毫秒

a=_crol.(a,1);//將a變量循環(huán)左移一位

)

3/*

8個發(fā)光管來回流動,

每個管亮100ms,流動時讓蜂鳴器發(fā)出"滴滴"聲.

I*********************************************************/

#include<reg52.h>//52單片機頭文件

#include<intrins.h>〃包含有左右循環(huán)移位子函數(shù)的庫

#defineuintunsignedint〃宏定義

#defineucharunsignedchar〃宏定義

sbitbeep=P2A3;

voiddelay(uintz)〃延時函數(shù),z的取值為這個函數(shù)的延時ms數(shù),如delay(200);大約

延時200ms.

{“delay(500);大約延時500ms.

uintx,y;

for(x=z;x>0;x-)

for(y=110;y>0;y-);

)

voidmain0〃主函數(shù)

(

uchara,i;

while(l)〃大循環(huán)

(

a=0xfe;〃賦初值

for(i=0;i<8;i++)〃左移

Pl=a;〃點亮小燈

beep=0;〃開啟蜂鳴器

delay(50);〃延時50毫秒

beep=l;〃關閉蜂鳴器

delay(50);//再延時50毫秒

a=_crol_(a,1);//將a變量循環(huán)左移一位

a=0x7f;

for(i=0;i<8;i++)〃右移

Pl=a;〃點亮小燈

beep=0;〃開啟蜂鳴器

delay(50);〃延時50毫秒

beep=l;〃關閉蜂鳴器

delay(50);//再延時50毫秒

a=_cror_(a,1);〃將a變量循環(huán)右移一位

)

)

4/*

用8個發(fā)光管演示出8位二進制數(shù)累加過程。

*/

/*********************************************************/

#include<reg52.h>//52單片機頭文件

#include<intrins.h>〃包含有左右循環(huán)移位子函數(shù)的庫

#defineuintunsignedint〃宏定義

#defineucharunsignedchar〃宏定義

voiddelay(uintz)〃延時函數(shù),z的取值為這個函數(shù)的延時ms數(shù),如delay(200);大約

延時200ms.

{//delay(500);大約延時500ms.

uintx,y;

for(x=z;x>0;x-)

for(y=110;y>0;y-);

)

voidmain0〃主函數(shù)

(

uchara;

while(l)〃大循環(huán)

(

a++;

Pl=a;

delay(200);

)

)

5/*

8個發(fā)光管間隔200ms由上至下,

再由下至上,再重復一次,

然后全部熄滅再以300ms間隔

全部閃爍5次。重復此過程

*/

/*********************************************************/

#include<reg52.h>//52單片機頭文件

#include<intrins.h>〃包含有左右循環(huán)移位子函數(shù)的庫

#defineuintunsignedint〃宏定義

#defineucharunsignedchar〃宏定義

voiddelay(uintz)〃延時函數(shù),z的取值為這個函數(shù)的延時ms數(shù),如delay(200);大約

延時200ms.

{//delay(500);大約延時500ms.

uintx,y;

for(x=z;x>0;x-)

for(y=110;y>0;y-);

voidmain0//主函數(shù)

uchara,i,j;

while(l)//大循環(huán)

(

for(j=0;j<2;j++)

(

a=0xfe;〃賦初值

for(i=0;i<8;i++)〃左移

(

Pl=a;〃點亮小燈

delay(200);〃延時200毫秒

a=-crol-(a,1);〃將a變量循環(huán)左移一位

)

a=0x7f;

for(i=0;i<8;i++)//右移

(

Pl=a;〃點亮小燈

delay(200);〃延時200毫秒

a=.cror.(a,1);〃將a變量循環(huán)右移一位

)

)

Pl=0xff;〃全部熄滅

for(j=0;j<10;j++)

(

delay(300);〃延時

P1="P1;//全部取反10次,既閃爍5次

)

)

)

6/*

間隔300ms第一次一個管亮流動一次,

第二次兩個管亮流動,依次到8個管亮,

然后重復整個過程。

*/

/*********************************************************/

#include<reg52.h>//52單片機頭文件

#include<intrins.h>〃包含有左右循環(huán)移位子函數(shù)的庫

#defineuintunsignedint〃宏定義

#defineucharunsignedchar〃宏定義

voiddelay(uintz)〃延時函數(shù),z的取值為這個函數(shù)的延時ms數(shù),如delay(200);大約

延時200ms.

//delay(500);大約延時500ms.

uintx,y;

for(x=z;x>0;x-)

for(y=110;y>0;y-);

)

voidmain()//主函數(shù)

(

uchara,i,j;

while⑴〃大循環(huán)

(

a=0xfe;〃賦初值

for(j=0;j<8;j++)

(

for(i=0;i<8-j;i++)〃左移

(

Pl=a;〃點亮小燈

delay(200);〃延時200毫秒

a=-crol-(a,1);〃將a變量循環(huán)左移一位

)

a=-crol-(a,j);〃補齊,方便下面的左移一位

Pl=0xff;〃全部關閉

a=a?l;//左移一位讓多一個燈點亮

)

7/*

間隔300ms先奇數(shù)亮再偶數(shù)亮,

循環(huán)三次;一個燈上下循環(huán)三次;

兩個分別從兩邊往中間流動三次;

再從中間往兩邊流動三次;8個全部閃爍3次;

關閉發(fā)光管,程序停止.

*/

I*********************************************************/

#include<reg52.h>//52單片機頭文件

#include<intrins.h>//包含有左右循環(huán)移位子函數(shù)的庫

#defineuintunsignedint〃宏定義

#defineucharunsignedchar〃宏定義

voiddelay(uintz)//延時函數(shù),z的取值為這個函數(shù)的延時ms數(shù),如delay(200);大約

延時200ms.

{“delay(500);大約延時500ms.

uintx,y;

for(x=z;x>0;x-)

for(y=110;y>0;y-);

)

voidmainO〃主函數(shù)

uchara,i,j;

for(j=0;j<3;j++)//寄偶交替

(

Pl=0x55;"點亮小燈

delay(300);〃延時300毫秒

Pl=0xaa;

delay(300);〃延時300毫秒

}

for(j=0;j<3;j++)〃流水燈

a=0xfe;

for(i=0;i<8;i++)

(

Pl=a;〃點亮小燈

delay(300);〃延時300毫秒

a=_crol_(a,1);

)

Pl=0xff;

for(j=0;j<3;j++)〃從兩邊往中間流

(

Pl=0x7e;//點亮小燈

delay(300);//延時300毫秒

Pl=0xbd;

delay(300);〃延時300毫秒

Pl=0xdb;〃點亮小燈

delay(300);〃延時300毫秒

Pl=0xe7;

delay(300);〃延時300毫秒

)

Pl=0xff;

for(j=0;j<3;j++)//從中間往兩邊流

(

Pl=0xe7;//點亮小燈

delay(300);〃延時300毫秒

Pl=0xdb;

delay(300);〃延時300毫秒

Pl=0xbd;//點亮小燈

delay(300);//延時300毫秒

Pl=0x7e;

delay(300);〃延時300毫秒

)

Pl=0xff;

for(j=0;j<6;j++)〃全部閃爍

P1="P1;//點亮小燈

delay(300);〃延時300毫秒

)

Pl=0xff;

while(l);

)

Lesson3

i/*

利用定時/計數(shù)器TO從Pl.0輸出周期為1s的方波,

讓發(fā)光二極管以1HZ閃爍,

設晶振頻率為12MHz。?

*/

/*********************************************************

#include<reg52.h>//52單片機頭文件

#include<intrins.h>〃包含有左右循環(huán)移位子函數(shù)的庫

#defineuintunsignedint〃宏定義

#defineucharunsignedchar//宏定義

sbitP1_O=P1AO;

uchar11;

voidmain0〃主函數(shù)

(

TMOD=0x01;〃設置定時器0為工作方式1

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;//開總中斷

ETO=1;〃開定時器0中斷

TRO=1;〃啟動定時器0

while(l);〃等待中斷產生

voidtimerO0interrupt1

(

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

tt++;

if(tt==20)

(

11=0;

P1-O=_P1_O;

2/*

利用定時/計數(shù)器T1產生定時時鐘,

由P1口控制8個發(fā)光二極管,

使8個指示燈依次一個一個閃動,

閃動頻率為10次/秒(8個燈依次亮一遍為一個周期),循環(huán)。

設晶振頻率為12MHz.

*/

y*********************************************************

#include<reg52.h>//52單片機頭文件

#include<intrins.h>//包含有左右循環(huán)移位子函數(shù)的庫

#defineuintunsignedint〃宏定義

#defineucharunsignedchar〃宏定義

sbitPl_0=PlA0;

uchar11,a;

voidmain()〃主函數(shù)

(

TMOD=0x01;//設置定時器0為工作方式1

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;〃開總中斷

ET0=l;//開定時器0中斷

TR0=l;//啟動定時器0

a=0xfe;

while(l);〃等待中斷產生

voidtimerO0interrupt1

I

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

tt++;

if(tt==2)

(

11=0;

Pl=a;

a=_crol_(a,1);

)

)

3/*

同時用兩個定時器控制蜂鳴器發(fā)聲,

定時器0控制頻率,定時器1控制同個

頻率持續(xù)的時間,間隔2s依次輸出

1,10,50,100,200,400,800,

Ik(hz)的方波?

設晶振頻率為12MHz.

*/

/*********************************************************/

#include<reg52.h>//52單片機頭文件

#include<intrins.h>〃包含有左右循環(huán)移位子函數(shù)的庫

#defineuintunsignedint〃宏定義

#defineucharunsignedchar〃宏定義

sbitbeep=P2A3;

uchar11;

uintfre,flag;

voidmain0〃主函數(shù)

(

fre=50000;

beep=0;

TMOD=Oxll;〃設置定時器0,定時器1為工作方式1

TH0=(65536-fre)/256;

TL0=(65536-fre)%256;

THl=(65536-50000)/256;

TLl=(65536-50000)%256;

EA=1;〃開總中斷

ET0=l;//開定時器。中斷

ET1=1;

TR1=1;

TR0=l;//啟動定時器0

while⑴;〃等待中斷產生

voidtimerO()interrupt1〃定時器0中斷

(

TR0=0;〃進中斷后先把定時器0中斷關閉,防止內部程序過多而造成中斷丟失

TH0=(65536-fre)/256;

TL0=(65536-fre)%256;

tt++;

if(flag<40)//以下幾個if分別用來選取不同的頻率

if(tt==10)

(

11=0;

fre=50000;

beep=beep;

)

if(flag>=40&&flag<80)

tt=O;

fre=50000;

beep=beep;

)

if(flag>=80&&flag<120)

(

tt=O;

fre=10000;

beep=beep;

)

if(flag>=120&&flag<160)

(

11=0;

fre=5000;

beep=beep;

)

if(flag>=160&&flag<200)

(

11=0;

fre=2500;

beep=beep;

)

if(flag>=200&&flag<240)

(

11=0;

fre=1250;

beep=beep;

)

if(flag>=240&&flag<280)

(

tt=O;

fre=625;

beep=beep;

)

if(flag>=2804&flag<320)

(

tt=O;

fre=312;

beep=beep;

)

if(flag>=320&&flag<360)

tt=O;

fre=156;

beep=beep;

)

TRO=1;

)

voidtimerl0interrupt3//定時器1中斷用來產生2秒時間定時

(

THl=(65536-50000)/256;

TLl=(65536-50000)%256;

flag++;

if(flag==360)

(

flag=0;

fre=50000;

)

)

4/*

用定時器以間隔500Ms在6位數(shù)碼管上依次顯示

0、1、2、3…,C、D、E、F,重復。

設時鐘頻率為12M

*/

I*********************************************************/

#include<reg52.h>//52單片機頭文件

#include<intrins.h>//包含有左右循環(huán)移位子函數(shù)的庫

#defineuintunsignedint〃宏定義

#defineucharunsignedchar〃宏定義

sbitdula=P2A6;//數(shù)碼管段選鎖存端

sbitwela=P2A7;/〃/數(shù)碼管位選鎖存端

ucharnum,tt;

ucharcodetable[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71);

voidmain0

(

num=0;

tt=O;

TMOD=Ox()l;〃設置定時器0為工作方式1

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;〃開總中斷

ET0=l;//開定時器0中斷

TR0=l;//啟動定時器0

dula=l;

P0=0x3f;〃給段開始送顯示0。

dula=0;〃關閉段選鎖存端,防止開始時出現(xiàn)亂碼。

wela=l;//11101010

P0=0xc0;//打開六個數(shù)碼管位選

wela=0;

while(1)

(

if(tt==10)//每進入10次中斷即為500ms,執(zhí)行一次顯示變化。

11=0;

num++;

if(num==16)

num=0;

dula=l;

P0=table[num];

dula=0;

voidexterO()interrupt1//定時器0中斷

(

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

tt++;

)

Lesson4

利用動態(tài)掃描方法在六位數(shù)碼管上顯示出穩(wěn)定的654321.

時鐘頻率為11.0592M

/*********************************************************/

#include<reg52.h>//52單片機頭文件

#include<intrins.h>//包含有左右循環(huán)移位子函數(shù)的庫

#defineuintunsignedint〃宏定義

#defineucharunsignedchar〃宏定義

sbitdula=P2A6;//數(shù)碼管段選鎖存端

sbitwela=P2A7;〃//數(shù)碼管位選鎖存端

ucharcodetable[]={〃數(shù)碼管顯示編碼

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

voiddisplay(uchar,uchar,uchar,uchar,uchar,uchar);〃函數(shù)聲明

voiddelay(uint);

voidmain0

(

while(1)

(

display(6,5,4,3,2,1);〃始終顯示

)

)

voiddisplay(ucharone,uchartwo,ucharthree,ucharfour,ucharfive,ucharsix)

(

dula=l;

P0=table[one];〃送段數(shù)據(jù)

dula=0;

P0=0xff;//送位數(shù)據(jù)前關閉所有顯示,防止打開位選鎖存后段選數(shù)據(jù)通過

位選鎖存器

wela=l;

P0=0xfe;

wela=0;

delay(1);

dula=l;

P0=table[two];

dula=0;

P0=0xff;

wela=l;

P0=0xfd;

wela=0;

delay(1);

dula=l;

P0=table[three];

dula=0;

P0=0xff;

wela=l;

P0=0xfb;

wela=0;

delay(1);

dula=l;

P0=table[four];

dula=O;

PO=Oxff;

wela=l;

P0=0xf7;

wela=O;

delay(1);

dula=l;

PO=table[five];

dula=O;

PO=Oxff;

wela=l;

PO=Oxef;

wela=O;

delay(1);

dula=l;

PO=table[six];

dula=O;

PO=Oxff;

wela=l;

PO=Oxdf;

wela=O;

delay(1);

)

voiddelay(uintz)//延時子函數(shù)

(

uintx,y;

for(x=z;x>0;x-)

for(y=110;y>0;y--);

)

2/*

用動態(tài)掃描方法和定時器1在數(shù)碼管的前三位顯示出秒表,

精確到1%秒,即最后一位顯示1%秒,一直循環(huán)下去

設時鐘頻率為12M

*/

^*********************************************************

#include<reg52.h>//52單片機頭文件

#include<intrins.h>〃包含有左右循環(huán)移位子函數(shù)的庫

#defineuintunsignedint〃宏定義

#defineucharunsignedchar//宏定義

sbitdula=P2A6;//數(shù)碼管段選鎖存端

sbitwela=P2A7;//〃數(shù)碼管位選鎖存端

ucharge,shi,bai;

uinttt;

ucharcodetable[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

voiddisplay(uchar,uchar,uchar);〃函數(shù)聲明

voiddelay(uint);

voidmain0

(

TMOD=OxlO;〃設置定時器1為工作方式1

THl=(65536-10000)/256;

TLl=(65536-10000)%256;

EA=1;//開總中斷

ET1=1;//開定時器1中斷

TR1=1;//啟動定時器1

while(l)

(

display(bai,shi,ge);

)

voidexterO()interrupt3//定時器1中斷

(

THl=(65536-10000)/256;

TLl=(65536-10000)%256;

tt++;

if(tt==1000)

11=0;

bai=tt/100;

shi=tt%100/10;

ge=tt%10;

)

voiddisplay(ucharone,uchartwo,ucharthree)

(

dula=l;

P0=table[one];//送段數(shù)據(jù)

dula=0;

P0=0xff;〃送位數(shù)據(jù)前關閉所有顯示,防止打開位選鎖存后段選數(shù)據(jù)通過

位選鎖存器

wela=l;

PO=Oxfe;

wela=O;

delay(1);

dula=l;

PO=table[two];

dula=0;

P0=0xff;

wela=l;

P0=0xfd;

wela=0;

delay(1);

dula=l;

PO=table[three];

dula=0;

P0=0xff;

wela=l;

P0=0xfb;

wela=0;

delay(1);

)

voiddelay(uintz)〃延時子函數(shù)

(

uintx,y;

for(x=z;x>0;x-)

for(y=110;y>0;y-);

)

3/*

利用動態(tài)掃描和定時器1在數(shù)碼管上顯示

出從765432開始以1/10秒的速度往下遞減

直至765398并保持顯示此數(shù),與此同時利

用定時器0以500MS速度進行流水燈從上至

下移動,當數(shù)碼管上數(shù)減到停止時,實驗

板上流水燈也停止然后全部開始閃爍,3秒

后(用T0定時)流水燈全部關閉、數(shù)碼管上

顯示出"HELLO"。到此保持住。

設晶振頻率為12MHz.

*/

/*********************************************************

#include<reg52.h>//52單片機頭文件

#include<intrins.h>//包含有左右循環(huán)移位子函數(shù)的庫

#defineuintunsignedint〃宏定義

#defineucharunsignedchar〃宏定義

sbitdula=P2A6;

sbitwela=P2A7;

ucharcodetable[]={//顯示數(shù)據(jù)編碼

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71,

0x76,0x79,0x38,0x3f,0);

uchartemp,10,tl,bai,shi,ge,flag,flagl;

uintshu;

voidinit0;〃函數(shù)聲明

voiddisplay(ucharaa,ucharbb,ucharcc,ucharbai,ucharshi,ucharge);

voiddelay(uintz)〃延時子函數(shù)

(

uintx,y;

for(x=z;x>0;x-)

for(y=110;y>0;y-);

}

voidmain()〃主函數(shù)

(

init();

while(1)

(

if(flagl!=l)//如果flagi不再等于1則顯示數(shù)據(jù)

display(7,6,5,bai,shi,ge);

else

display(16,17,18,18,19,20);〃否則顯示hello

)

)

voidinit0〃初始化函數(shù)

(

shu=432;

temp=0xfe;

Pl=temp;

TMOD=0xll;

TH0=(65536-50000)/256;〃定時器初始化

TL0=(65536-50000)%256;

TH1=(65536-50000)/256;

TLl=(65536-50000)%256;

EA=1;

ET0=l;

ET1=1;

TRO=1;

TR1=1;

voidtimerO()interrupt1〃定時器0中斷

(

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

t0++;

if(flag!=l)//flag不等于1時進行流水燈

(

if(t0==10)

(

tO=l;

temp=_crol.(temp,1);

Pl=temp;

)

)

else〃否則進行燈閃爍

(

if(t0%4==0)//小燈每200毫秒變化一次

P1=-P1;

if(t0==60)

(

TRO=O;〃3秒后關閉定時器0,關閉燈,并置flag=l

Pl=Oxff;

flagl=l;

)

)

voidtimerl()interrupt3〃定時器1中斷函數(shù)

(

THl=(65536-50000)/256;

TLl=(65536-50000)%256;

tl++;

if(tl==2)

(

tl=0;

shu—;

bai=shu/100;

shi=shu%l00/10;

ge=shu%10;

if(shu==398)〃當?shù)?98時把原來TO中的數(shù)清除,重新加裁初值讓小燈

閃爍

TRO=O;

THO=(65536-50000)/256;

TL0=(65536-50000)%256;

TR0=l;

flag=l;

t0=0;

Pl=0xff;

TR1=O;

)

)

voiddisplay(ucharaa,ucharbb,ucharcc,ucharbai,ucharshi,ucharge)〃顯示子函

數(shù)

(

dula=l;

P0=table[aa];

dula=0;

P0=0xff;

wela=l;

P0=0xfe;

wela=0;

delay(1);

dula=l;

P0=table[bb];

dula=0;

P0=0xff;

wela=l;

P0=0xfd;

wela=0

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論