|
一、基本要求:
使用8051,要求系統(tǒng)電路含有16個led燈和按鍵,按鍵控制燈的不同閃爍方式(跑馬燈),按鍵使用中斷方式,使用定時器T1方式1實現(xiàn)一個心跳燈,中斷方式,在Proteus上仿真實現(xiàn)。
二 、具體功能:
1.選擇兩個I/O端口控制16個LED流水燈。
2.設(shè)置四個按鍵K1~K4,按下K1跑馬燈,K2鴛鴦戲水,K3雙流水燈,K4則循環(huán)三種控制方式。
3.跑馬燈:共16個LED逐次點亮,每隔10ms點亮一個LED,點亮10ms后關(guān)閉,然后繼續(xù)上次操作。
4.鴛鴦戲水燈:第一次單數(shù)燈點亮,延時10ms,關(guān)閉,然后雙數(shù)燈點亮,延時10ms,關(guān)閉,然后繼續(xù)上次操作。
5.雙流水燈:16個LED依次向中間點亮,間隔10ms,再依次向兩邊擴散點亮,間隔10ms,然后繼續(xù)上次操作。
三、控制電路介紹
16個發(fā)光二極管L1-L16分別接在單片機P0.0-P0.7,P2.0-P2.7。輸出“0”,發(fā)光二極管亮。
四、系統(tǒng)程序
#include "reg51.h" //此文件中定義了單片機的一些特殊功能寄存器
typedef unsigned int u16; //對數(shù)據(jù)類型進行聲明定義
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引腳作為心跳燈的控制信號
u8 mode = 0;//模式。0跑馬燈、1鴛鴦燈、2雙流水燈
u8 time = 0;//
u8 done = 0;
u8 time1 = 0;//
u8 times = 0;//計數(shù)
u8 flag = 0;//鴛鴦燈標志
void delay(u16 i) // delay延時函數(shù) i=1時,大約延時10us
{
while (i--);
}
/*******************************************************************************
* 函 數(shù) 名 : Timer1Init
* 函數(shù)功能 : 定時器1初始化
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void Timer1Init() {
TMOD |= 0X10;//選擇為定時器1模式,工作方式1,僅用TR1打開啟動。
TH1 = 0XD8; //給定時器賦初值,定時10ms
TL1 = 0XF0;
ET1 = 1;//打開定時器1中斷允許
EA = 1;//打開總中斷
TR1 = 1;//打開定時器
}
/*******************************************************************************
* 函 數(shù) 名 : main
* 函數(shù)功能 : 主函數(shù)
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void main() {
Timer1Init(); //定時器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)//輪詢
{
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ù)功能 : 定時器0中斷函數(shù)
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void Timer1() interrupt 3 {
TH1 = 0XD8; //給定時器賦初值,定時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() //定時器0初始化
//{
// TMOD|=0X10; //選擇為定時器1模式,工作方式1,僅用TR1打開啟動。
// TH0=0XFC; //系統(tǒng)為=采用33MHZ晶振,分頻系數(shù)為12,則定時脈沖周期為0.363636……us
// TL0=0X18; //1ms=2750*0.363636……us則給定時器賦初值655536-2750=62786=F542H,定時1ms
//
// EA=1; //打開總中斷
// ET0=1; //打開定時器1中斷允許
// TF0=1; //打開定時器1溢出標志位,產(chǎn)生溢出后,會向CPU申請中斷
// TR0=1; //打開定時器
//
//}
//void timer0() interrupt 0 //定時器1中斷函數(shù)
//{
// TH0=0XFC; //由于方式1不會自動重裝,因此要在溢出后重裝
// TL0=0X18;
// XTD=~XTD;
// delay(20000);
//}
|
-
圖片1.png
(53.79 KB, 下載次數(shù): 82)
下載附件
2019-12-15 13:18 上傳
proteus仿真圖
-
圖片2.png
(44.18 KB, 下載次數(shù): 86)
下載附件
2019-12-15 13:20 上傳
-
圖片3.png
(15.66 KB, 下載次數(shù): 77)
下載附件
2019-12-15 13:20 上傳
-
圖片4.png
(22.91 KB, 下載次數(shù): 92)
下載附件
2019-12-15 13:20 上傳
-
圖片5.png
(21.42 KB, 下載次數(shù): 78)
下載附件
2019-12-15 13:20 上傳
|