找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6844|回復(fù): 3
收起左側(cè)

用51單片機(jī)仿真花式流水燈的設(shè)計(jì)

[復(fù)制鏈接]
ID:664251 發(fā)表于 2019-12-15 13:21 | 顯示全部樓層 |閱讀模式
一、基本要求:
  使用8051,要求系統(tǒng)電路含有16個(gè)led燈和按鍵,按鍵控制燈的不同閃爍方式(跑馬燈),按鍵使用中斷方式,使用定時(shí)器T1方式1實(shí)現(xiàn)一個(gè)心跳燈,中斷方式,在Proteus上仿真實(shí)現(xiàn)。
二 、具體功能:

     1.選擇兩個(gè)I/O端口控制16個(gè)LED流水燈。
     2.設(shè)置四個(gè)按鍵K1~K4,按下K1跑馬燈,K2鴛鴦戲水,K3雙流水燈,K4則循環(huán)三種控制方式。
     3.跑馬燈:共16個(gè)LED逐次點(diǎn)亮,每隔10ms點(diǎn)亮一個(gè)LED,點(diǎn)亮10ms后關(guān)閉,然后繼續(xù)上次操作。
     4.鴛鴦戲水燈:第一次單數(shù)燈點(diǎn)亮,延時(shí)10ms,關(guān)閉,然后雙數(shù)燈點(diǎn)亮,延時(shí)10ms,關(guān)閉,然后繼續(xù)上次操作。
     5.雙流水燈:16個(gè)LED依次向中間點(diǎn)亮,間隔10ms,再依次向兩邊擴(kuò)散點(diǎn)亮,間隔10ms,然后繼續(xù)上次操作。

三、控制電路介紹
16個(gè)發(fā)光二極管L1-L16分別接在單片機(jī)P0.0-P0.7,P2.0-P2.7。輸出“0”,發(fā)光二極管亮。

四、系統(tǒng)程序
#include "reg51.h"             //此文件中定義了單片機(jī)的一些特殊功能寄存器

typedef unsigned int u16;      //對(duì)數(shù)據(jù)類(lèi)型進(jìn)行聲明定義
typedef unsigned char u8;

sbit K1 = P1 ^0;//按鈕
sbit K2 = P1 ^1;
sbit K3 = P1 ^2;
sbit K4 = P1 ^3;
sbit XTD = P3 ^3;    //P3.3引腳作為心跳燈的控制信號(hào)
u8 mode = 0;//模式。0跑馬燈、1鴛鴦燈、2雙流水燈
u8 time = 0;//
u8 done = 0;
u8 time1 = 0;//
u8 times = 0;//計(jì)數(shù)
u8 flag = 0;//鴛鴦燈標(biāo)志
void delay(u16 i)     // delay延時(shí)函數(shù)    i=1時(shí),大約延時(shí)10us
{
    while (i--);
}

/*******************************************************************************
* 函 數(shù) 名         : Timer1Init
* 函數(shù)功能       : 定時(shí)器1初始化
* 輸    入         : 無(wú)
* 輸    出         : 無(wú)
*******************************************************************************/
void Timer1Init() {
    TMOD |= 0X10;//選擇為定時(shí)器1模式,工作方式1,僅用TR1打開(kāi)啟動(dòng)。

    TH1 = 0XD8;    //給定時(shí)器賦初值,定時(shí)10ms
    TL1 = 0XF0;
    ET1 = 1;//打開(kāi)定時(shí)器1中斷允許
    EA = 1;//打開(kāi)總中斷
    TR1 = 1;//打開(kāi)定時(shí)器
}

/*******************************************************************************
* 函 數(shù) 名       : main
* 函數(shù)功能     : 主函數(shù)
* 輸    入       : 無(wú)
* 輸    出        : 無(wú)
*******************************************************************************/
void main() {
    Timer1Init();  //定時(shí)器1初始化
    while (1) {
        if (!K1)//跑馬燈
        {
            mode = 0;
            times = 0;
            while (!K1);
        }
        if (!K2)//鴛鴦燈
        {
            mode = 1;
            times = 0;
            while (!K2);
        }
        if (!K3)//雙流水燈
        {
            mode = 2;
            times = 0;
            while (!K3);
        }
        if (!K4)//輪詢(xún)
        {

            while (!K4) {
                while (!done) mode = 0;
                done = 0;
                while (!done) mode = 1;
                done = 0;
                while (!done) mode = 2;
                done = 0;
            }
        }
    }
}

/*******************************************************************************
* 函 數(shù) 名         : void Timer1() interrupt 3
* 函數(shù)功能       : 定時(shí)器0中斷函數(shù)
* 輸    入         : 無(wú)
* 輸    出         : 無(wú)
*******************************************************************************/
void Timer1() interrupt 3 {
    TH1 = 0XD8;    //給定時(shí)器賦初值,定時(shí)10ms
    TL1 = 0XF0;
    if (time1 < 60) {
        time1++;
    } else {
        time1 = 0;
        XTD = ~XTD;
    }
    if (time < 30)//300ms
    {
        time++;
    } else {
        time = 0;

        if (times < 17)
            times++;
        else{
            times = 0;
            done = 1;
        }
        switch (mode) {
            case 0: //跑馬燈
                if ((times > 0) && (times < 9)) {
                    P0 = ~(1 << (times - 1));
                    P2 = 0xff;
                }
                if ((times > 8) && (times < 17)) {
                    P2 = ~(1 << (times - 9));
                    P0 = 0xff;
                }
                if ((times == 0) || (times == 17)) {
                    P0 = 0xff;
                    P2 = 0xff;
                }
                break;
            case 1://鴛鴦燈
                if ((times > 0) && (times < 5)) {
                    P0 = ~(1 << (2 * times - 2));
                    P2 = 0xff;
                }
                if ((times > 4) && (times < 9)) {
                    P2 = ~(1 << (2 * (times - 4) - 2));
                    P0 = 0xff;
                }
                if ((times > 9) && (times < 14)) {
                    P0 = ~(1 << (2 * (times - 9) - 1));
                    P2 = 0xff;
                }
                if ((times > 13) && (times < 18)) {
                    P2 = ~(1 << (2 * (times - 13) - 1));
                    P0 = 0xff;
                }
                if ((times == 0) || (times == 9)) {
                    P0 = 0xff;
                    P2 = 0xff;
                }
                break;
            case 2://雙流水燈
                if ((times > 0) && (times < 9)) {
                    P0 = ~(1 << (times - 1));
                    P2 = ~(0x80 >> (times - 1));
                }
                if ((times > 9) && (times < 18)) {
                    P2 = ~(1 << (times - 9));
                    P0 = ~(0x80 >> (times - 9));
                }
                if (times == 0) {
                    P0 = 0xff;
                    P2 = 0xff;
                }
        }
    }
}
//void Timer0Init()   //定時(shí)器0初始化
//{
// TMOD|=0X10;       //選擇為定時(shí)器1模式,工作方式1,僅用TR1打開(kāi)啟動(dòng)。
// TH0=0XFC;      //系統(tǒng)為=采用33MHZ晶振,分頻系數(shù)為12,則定時(shí)脈沖周期為0.363636……us
// TL0=0X18;       //1ms=2750*0.363636……us則給定時(shí)器賦初值655536-2750=62786=F542H,定時(shí)1ms
//
// EA=1;              //打開(kāi)總中斷   
// ET0=1;         //打開(kāi)定時(shí)器1中斷允許
// TF0=1;        //打開(kāi)定時(shí)器1溢出標(biāo)志位,產(chǎn)生溢出后,會(huì)向CPU申請(qǐng)中斷
// TR0=1;          //打開(kāi)定時(shí)器
//         
//}

//void timer0() interrupt 0        //定時(shí)器1中斷函數(shù)
//{   
// TH0=0XFC;               //由于方式1不會(huì)自動(dòng)重裝,因此要在溢出后重裝
// TL0=0X18;
// XTD=~XTD;
// delay(20000);
//}

proteus仿真圖

proteus仿真圖
圖片2.png
圖片3.png
圖片4.png
圖片5.png
回復(fù)

使用道具 舉報(bào)

ID:760624 發(fā)表于 2020-5-26 13:38 | 顯示全部樓層
我按照你這圖還有程序打的為什么燈不會(huì)亮呢
回復(fù)

使用道具 舉報(bào)

ID:766655 發(fā)表于 2020-6-1 17:24 | 顯示全部樓層
味子橙的歡喜 發(fā)表于 2020-5-26 13:38
我按照你這圖還有程序打的為什么燈不會(huì)亮呢

你把總線(xiàn)換一下就可以 了
回復(fù)

使用道具 舉報(bào)

ID:995527 發(fā)表于 2021-12-22 10:15 來(lái)自觸屏版 | 顯示全部樓層
樓主 可以私發(fā)程序嗎 我打出來(lái)很多錯(cuò)誤
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表