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