C51使用的晶振頻率是11.0592MHz一顆LED燈接在C51的P0.0,現(xiàn)在要求設(shè)計(jì)程序,讓這顆LED燈以1s為間隔閃爍。
我們不只是設(shè)計(jì)程序,更要對(duì)這個(gè)單片機(jī)項(xiàng)目分析一下
順便看看這道題的難度~~~~~~~~~~~
順帶一提,本節(jié)課要用到單片機(jī)定時(shí)器》》看我上一篇文章,詳細(xì)介紹定時(shí)器
設(shè)計(jì)一個(gè)電路圖,單片機(jī)用80C52RC,晶振11.0592MHz,一顆LED接在P0.0
這里說(shuō)明一下,C51的IO只支持弱上拉,這就意味著單片機(jī)的IO上拉的時(shí)候只能提供很弱小的電流,這個(gè)電流可能不足以點(diǎn)亮一顆LED燈(或者這顆LED燈的亮度很低),為了讓LED正常發(fā)光,我們使用上拉的方法。這里簡(jiǎn)單介紹一下使用方法哈
當(dāng)P0.0低電平的時(shí)候LED燈導(dǎo)通,正常點(diǎn)亮,P0.0給高電平的時(shí)候LED不導(dǎo)通,熄滅
考慮到手頭的資源問(wèn)題,我使用現(xiàn)成的開(kāi)發(fā)板來(lái)完成這個(gè)程序設(shè)計(jì),這個(gè)開(kāi)發(fā)板使用的是上拉LED,LED1接在P1.0,實(shí)際電路圖修改后如下:
現(xiàn)在對(duì)程序分析一下
程序框圖
首先我們要明白,我們使用的LED是上拉模式的,P1.0 = 1的時(shí)候關(guān)閉LED,P1.0 = 0的時(shí)候點(diǎn)亮LED
既然要控制LED,這里就講一下方法
三條特殊的指令
sfr P0 = 0x80;
這條指令存放在reg52.h里面,已經(jīng)對(duì)IO組的寄存器的地址進(jìn)行定義,像P0,P1,P2這些關(guān)鍵字我們可以直接用。方便我們對(duì)IO的寄存器進(jìn)行操作,值得一提的是,IO寄存器是可以位尋址
sbit LED = P1^0
sbit指令給IO上的一個(gè)端口定義名字,比如說(shuō)給P1.0(寫(xiě)作P1^0)定義一個(gè)叫LED的名字,下次對(duì)這個(gè)IO進(jìn)行操作的時(shí)候用以下方法
sbit LED = P1^0;//這是前面的定義
LED= 1;//給P1.0IO寫(xiě)高電平
LED= 0;//給P1.0IO寫(xiě)低電平電平
此外,還可以直接對(duì)整個(gè)IO組進(jìn)行操作,方法
那么,接下來(lái)就是程序了
【1】軟件延遲實(shí)現(xiàn)
所謂的軟件延遲,就是通過(guò)執(zhí)行空代碼,實(shí)現(xiàn)延遲的效果,這種延遲實(shí)現(xiàn)的延遲有一個(gè)特點(diǎn),時(shí)間不準(zhǔn),因?yàn)閱纹瑱C(jī)里面每次執(zhí)行C語(yǔ)言下的一條操作的時(shí)間是不固定的
程序如下
#include< reg52.h >
sbit LED = P1^0;
void delay(unsigned int xms) //調(diào)用時(shí)需提供參數(shù)xms的實(shí)際值。
{
unsigned int i,j; //定義無(wú)符號(hào)整型變量i、j
for(i=0; i< xms; i++) //后面沒(méi)帶";",下一條語(yǔ)句是循環(huán)體。參數(shù)xms延時(shí)x毫秒。
for(j=0; j< 110; j++); //后面帶";",表示這個(gè)for語(yǔ)句的循環(huán)體是空語(yǔ)句。
}//這個(gè)值得學(xué)習(xí),這里的代碼是延遲代碼
void main ()
{
LED = 1;//先關(guān)閉LED燈
while(1)
{
LED = !LED;//LED狀態(tài)取反
/*
這里說(shuō)明一下取反
取反用“!”
取反前,LED = 1,取反后,LED = 0
*/
delay(1000);//軟件延遲1000ms = 1s
}
}
這就是效果了,怎么樣,還可以吧,但是……
題目要求我們延遲1s,如此精確的提到1s,肯定是希望我們用定時(shí)器來(lái)完成這個(gè)項(xiàng)目
我想,用軟件延遲,老師應(yīng)該會(huì)給特別低的分?jǐn)?shù),而且也體現(xiàn)不出我們的能力
下面我們用定時(shí)器完成這一道題
關(guān)于定時(shí)器的用法
#include< reg52.h >
void main()
{//注意設(shè)置定時(shí)器初始值要在main函數(shù)里面設(shè)置
TMOD = 0x01;
/*設(shè)置定時(shí)器模式寄存器TMOD為 0000 0001
GATE = 0
C/T = 0
M1 =0
M0 = 1
標(biāo)準(zhǔn)16位定時(shí)器
*/
//先設(shè)置定時(shí)器初始值
TL0 = 0x3A;//設(shè)置定時(shí)器初始值低位
TH0 = 0x8E;//設(shè)置定時(shí)器初始值高位
TR0 = 0;//記得一定要設(shè)置定時(shí)器開(kāi)啟
while(1)
{
if (TF0 == 1)
{//這里可以先放下你的定時(shí)器計(jì)時(shí)滿了以后要執(zhí)行的代碼
//溢出后你需要先給你的定時(shí)器再次設(shè)置初始值
TL0 = 0x3A;//設(shè)置定時(shí)器初始值低位
TH0 = 0x8E;//設(shè)置定時(shí)器初始值高位
TF0 = 0;//設(shè)置好初始值后再?gòu)?fù)位定時(shí)器
}
}
}
我們要設(shè)置一個(gè)標(biāo)準(zhǔn)的16位定時(shí)器,設(shè)置方法和流程參考我寫(xiě)過(guò)的文章,上面是16位定時(shí)器的設(shè)置流程
以下是程序框圖
下面是代碼
#include< reg52.h >
sbit LED = P1^0;
unsigned char counter = 0;
void main()
{//注意設(shè)置定時(shí)器初始值要在main函數(shù)里面設(shè)置
TMOD = 0x01;
/*設(shè)置定時(shí)器模式寄存器TMOD為 0000 0001
GATE = 0
C/T = 0
M1 =0
M0 = 1
標(biāo)準(zhǔn)16位定時(shí)器
*/
//先設(shè)置定時(shí)器初始值
TL0 = 0x4B;//設(shè)置定時(shí)器初始值低位
TH0 = 0xF5;//設(shè)置定時(shí)器初始值高位
TR0 = 1;//記得一定要設(shè)置定時(shí)器開(kāi)啟
while(1)
{
if (TF0 == 1)
{
counter++;
if(counter >200)
{
counter = 0;
LED = !LED;
}
TL0 = 0x4B;//設(shè)置定時(shí)器初始值低位
TH0 = 0xF5;//設(shè)置定時(shí)器初始值高位
TF0 = 0;//設(shè)置好初始值后再?gòu)?fù)位定時(shí)器
}
}
}
-
單片機(jī)
+關(guān)注
關(guān)注
6058文章
44822瀏覽量
644853 -
led燈
+關(guān)注
關(guān)注
22文章
1593瀏覽量
109190 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3272瀏覽量
116747 -
C51單片機(jī)
+關(guān)注
關(guān)注
12文章
164瀏覽量
35204
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
C51單片機(jī)實(shí)現(xiàn)獨(dú)立按鍵點(diǎn)亮LED燈
使用51單片機(jī)定時(shí)器中斷控制LED燈亮1S的程序免費(fèi)下載

使用51單片機(jī)閃爍LED燈的代碼免費(fèi)下載

使用單片機(jī)實(shí)現(xiàn)不同頻率閃爍1個(gè)LED燈的C語(yǔ)言程序?qū)嵗赓M(fèi)下載

C語(yǔ)言||利用C51單片機(jī)編程實(shí)現(xiàn)轉(zhuǎn)向燈實(shí)驗(yàn)

51單片機(jī)如何延時(shí)1s,讓LED燈閃爍

STM32和C51單片機(jī)實(shí)現(xiàn)程序設(shè)計(jì)與仿真測(cè)試(LED閃爍)

c51單片機(jī)——led燈的初步學(xué)習(xí)

51單片機(jī)如何跳出wile循環(huán)_51單片機(jī)閃爍LED燈

單片機(jī)led燈閃爍實(shí)驗(yàn)總結(jié)_Linux下單片機(jī)開(kāi)發(fā)2(C51):LED閃爍

51單片機(jī)使用C語(yǔ)言點(diǎn)亮閃爍LED燈
使用51單片機(jī)實(shí)現(xiàn)延時(shí)控制LED燈閃爍

評(píng)論