找回密碼
         注冊會員
        搜索附件  
        MCU資訊論壇 附件中心 單片機論壇 51單片機論壇 5_50410_bdbeb49e3a25f16.jpg

        5_50410_bdbeb49e3a25f16.jpg

         

        “從單片機初學者邁向單片機工程師”之LED主題討論周第三章----:
        本部分內容設定了隱藏,需要回復后才能看到






















































































































        OK ,到此一個簡單的工程模板就建立起來了,以后我們再新建源文件和頭文件的時候,就可以直接保存到src文件目錄下面了。
        下面我們開始編寫各個模塊文件。
        首先編寫Timer.c 這個文件主要內容就是定時器初始化,以及定時器中斷服務函數。其內容如下。
        #include <reg52.h>

        bit g_bSystemTime1Ms = 0 ; // 1MS系統時標


        void Timer0Init(void)
        {
        TMOD &= 0xf0 ;
        TMOD |= 0x01 ; //定時器0工作方式1
        TH0 = 0xfc ; //定時器初始值
        TL0 = 0x66 ;
        TR0 = 1 ;
        ET0 = 1 ;
        }

        void Time0Isr(void) interrupt 1
        {
        TH0 = 0xfc ; //定時器重新賦初值
        TL0 = 0x66 ;
        g_bSystemTime1Ms = 1 ; //1MS時標標志位置位
        }

        由于在Led.c文件中需要調用我們的g_bSystemTime1Ms變量。同時主函數需要調用Timer0Init()初始化函數,所以應該對這個變量和函數在頭文件里作外部聲明。以方便其它函數調用。

        Timer.h 內容如下。
        #ifndef _TIMER_H_
        #define _TIMER_H_

        extern void Timer0Init(void) ;
        extern bit g_bSystemTime1Ms ;

        #endif

        完成了定時器模塊后,我們開始編寫LED驅動模塊。
        Led.c 內容如下:

        #include <reg52.h>
        #include "MacroAndConst.h"
        #include "Led.h"
        #include "Timer.h"

        static uint16 g_u16LedTimeCount = 0 ; //LED計數器
        static uint8 g_u8LedState = 0 ; //LED狀態標志, 0表示亮,1表示熄滅

        #define LED P0 //定義LED接口
        #define LED_ON() LED = 0x00 ; //所有LED亮
        #define LED_OFF() LED = 0xff ; //所有LED熄滅

        void LedProcess(void)
        {
        if(0 == g_u8LedState) //如果LED的狀態為亮,則點亮LED
        {
        LED_ON() ;
        }
        else //否則熄滅LED
        {
        LED_OFF() ;
        }
        }


        void LedStateChange(void)
        {
        if(g_bSystemTime1Ms) //系統1MS時標到
        {
        g_bSystemTime1Ms = 0 ;
        g_u16LedTimeCount++ ; //LED計數器加一
        if(g_u16LedTimeCount >= 500) //計數達到500,即500MS到了,改變LED的狀態。
        {
        g_u16LedTimeCount = 0 ;
        g_u8LedState = ! g_u8LedState ;
        }
        }
        }


        這個模塊對外的借口只有兩個函數,因此在相應的Led.h 中需要作相應的聲明。
        Led.h 內容:
        #ifndef _LED_H_
        #define _LED_H_

        extern void LedProcess(void) ;
        extern void LedStateChange(void) ;

        #endif

        這兩個模塊完成后,我們將其C文件添加到工程中。然后開始編寫主函數里的代碼。
        如下所示:

        #include <reg52.h>
        #include "MacroAndConst.h"
        #include "Timer.h"
        #include "Led.h"

        sbit LED_SEG = P1^4; //數碼管段選
        sbit LED_DIG = P1^5; //數碼管位選
        sbit LED_CS11 = P1^6; //led控制位

        void main(void)
        {
        LED_CS11 = 1 ; //74HC595輸出允許
        LED_SEG = 0 ; //數碼管段選和位選禁止(因為它們和LED共用P0口)
        LED_DIG = 0 ;
        Timer0Init() ;
        EA = 1 ;
        while(1)
        {
        LedProcess() ;
        LedStateChange() ;
        }
        }

        整個工程截圖如下:




        至此,第三章到此結束。
        一起來總結一下我們需要注意的地方吧

        [color=#FF0000]1. C語言源文件(*.c)的作用是什么
        2. C語言頭文件(*.h)的作用是什么
        3. typedef 的作用
        4. 工程模板如何組織
        5. 如何創建一個多模塊(多文件)的工程



        [ 此貼被紅金龍吸味在2009-12-28 21:04重新編輯 ]


        5_50410_bdbeb49e3a25f16.jpg

        QQ|手機版|MCU資訊論壇 ( 京ICP備18035221號-2 )|網站地圖

        GMT+8, 2025-5-7 16:54 , Processed in 0.053721 second(s), 8 queries , Redis On.

        Powered by Discuz! X3.5

        © 2001-2025 Discuz! Team.

        返回頂部
        精品91自产拍在线观看二区| 久久精品无码专区免费东京热| 国产精品久久成人影院| 国产成人亚洲合集青青草原精品 | 亚洲AV午夜福利精品一区二区| 精品人妻系列无码天堂| 欧美精品国产精品| 久久国产乱子伦精品免费午夜| 三级在线免费观看| 国产在线拍揄自揄视精品不卡| 精品无人区无码乱码毛片国产| 亚洲精品乱码久久久久久蜜桃图片| 成人国产精品999视频| 精品国产一区二区三区在线观看| 2022国产男人亚洲欧美天堂| 欧美一区二区精品系列在线观看| 一级做a爰黑人又硬又粗免费看51社区国产精品视| 亚洲Av无码精品色午夜| 成人精品一区二区三区| 国产精品极品美女自在线| 亚洲精品欧美综合在线| freefron性中国国产高清| 亚洲欧美精品伊人久久| 极品身材小美女啪啪自拍| 1区1区3区4区产品芒果精品| 99国产牛牛视频在线网站| 9999国产精品欧美久久久久久| 日本一区二区不卡在线视频| 久久夜色精品国产亚洲| 四虎精品免费永久免费视频| 99国产欧美精品久久久蜜芽| 久久无码精品一区二区三区| 国产精品乱码高清在线观看| 日韩精品一区二区三区影院| 国产精品大白天新婚身材| 最近的中文字幕大全免费版| 四虎精品8848ys一区二区| 91大神在线电影| 国产精品无码专区在线观看| 精品亚洲成AV人在线观看| 欧美日韩精品久久久久|