導航:首頁 > 操作系統 > 51單片機程序100例

51單片機程序100例

發布時間:2024-08-11 03:03:35

『壹』 C51單片機的萬年歷程序設計

我這有個數碼管顯示的程序
以前做的,。。
你可以在我這個程序上修改修改
包括鍵盤掃描,還有動態顯示



【。。。】
#include
//常量參數
#define TMODW 0x01;
#define SCONW 0x00;
#define xplay 0x04;//顯示分頻系數
//顯示位選
unsigned char data stb;
//鍵值緩存,0xFF無鍵命令
unsigned char data keynum;
//顯示字型變數
unsigned char data play[8];
//工作參數
unsigned char data l,m;
//字型碼
unsigned char code BCDPC[10]=
{0x3F,0x06,0x5B,0x4F,0x66,
0x6D,0x7D,0x07,0x7F,0x6F};
//字位碼
unsigned char code STBCODE[8]=
{0x01,0x02,0x04,0x08,
0x10,0x20,0x40,0x80 };
//400Hz xplay分頻計數
unsigned char data cttime;
//時鍾參數
unsigned char data hr,min,sec,sec100;
//調整時鍾參數(時鍾「走」)
void ct1()
{sec100++;
if (sec100==100)
{sec100=0;sec++;
if (sec==60)
{sec=0;min++;
if (min==60)
{min=0;hr++;
if (hr==24) hr=0;
}
}
}
}
//時鍾參數→LED 顯示緩存7段參數轉換函數;
void xcplay()
{play[0]=BCDPC[hr/10];
play[1]=BCDPC[hr%10];
play[2]=BCDPC[min/10];
play[3]=BCDPC[min%10];
play[4]=BCDPC[sec/10];
play[5]=BCDPC[sec%10];
play[6]=BCDPC[sec100/10];
play[7]=BCDPC[sec100%10];
}
//顯示掃描
void cplay()
{T0=1;//T0-高電平消隱
T1=0;//T1-低電平準備發脈沖前沿
TI=0;//?
P1=0;//?
SBUF=STBCODE[stb];
while (TI==0)
{
};
TI=0;
SBUF=play[stb];
while (TI==0)
{
};
T1=1;
T0=0;
stb=++stb&0x07;
}

extern void cthl0();
//定時器0中斷處理程序
void ct0(void) interrupt 1 using 1
{cthl0();
cttime--;
if (cttime==0)
{cttime=xplay;
ct1();//調用時鍾「走」函數
xcplay();//調用時鍾參數→Led顯示緩存轉換函數
};
cplay();
}
void w20ms()
{for (l=0;l<41;l++)
{for (m=0;m<81;m++)
{
}
}
}
void tkey()
{P1=0xF0;
keynum=0xFF;
if (P1!=0xF0)
{w20ms();
P1=0xF0;
if (P1!=0xF0)
{P1=0xFE;
switch (P1)
{case 0xEE:keynum=0;break;
case 0xDE:keynum=1;break;
case 0xBE:keynum=2;break;
case 0x7E:keynum=3;break;
}
P1=0xFD;
switch (P1)
{case 0xED:keynum=4;break;
case 0xDD:keynum=5;break;
case 0xBD:keynum=6;break;
case 0x7B:keynum=7;break;
}
P1=0xFB;
switch (P1)
{
case 0xEB:keynum=8;break;
}
};
};
P1=0x00;
}
void command()
{switch (keynum)
{
case 0:{hr=hr+1;
if (hr==24)
hr=0;
}
break;

case 1:{min=min+1;
if (min==60)
min=0;
}
break;

case 2:{sec=sec+1;
if (sec==60)
sec=0;
}
break;

case 3:{sec100=0;
}
break;

case 4:{
while(!(P1=0xED))
{
hr=0;
min=0;
sec=0;
}
}
break;

case 5:{hr=hr-1;
if (hr==00)
hr=24;
}
break;
case 6:{min=min-1;
if (min==00)
min=59;
}
break;

case 7:{sec=sec-1;
if (sec==00)
sec=0;
}
break;

case 0xFF:break;
}
keynum=0xFF;
}
main ()
{ hr=8;
min=5;
sec=8;
sec100=0;
TMOD=TMODW;
SCON=SCONW;
ET0=1;
TR0=1;
EA=1;
cttime=xplay;
while (1)
{w20ms();
tkey();
command();

};
}

『貳』 大家幫忙找一些51單片機的基本C語言程序例子,最好帶說明,謝啦

中斷控製程序:

#include <AT89X52.H>

#define uchar unsigned char
#define uint unsigned int
#define port_count P2 //P2接8LED介面
//將計數器的二進制值用8個LED顯示出來
uchar count;//計數器(存儲中斷次數)

void main(void)
{
count=0; //清零計數器
port_count=~count;//清零P2口
IT0=1; //INT0設為邊沿觸發方式�IT0=0則為電平觸發方式
EX0=1; //開INT0中斷
EA=1; //開系統中斷
while(1); //等待中斷處理

}

//INT0中斷處理函數
void int0_interrupt() interrupt 0 //INT0中斷號0
{
count++;
port_count=~count; //當達到255時,溢出,又從0開始

}

I/O控製程序:
#include <AT89X52.H>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int
#define flowlight P2
void delay10ms()
{uchar a,b;
for(a=200;a>0;a--)
for(b=225;b>0;b--);
}
void main()
{
uchar flag=0;//判斷移動方向 flag==0 左移 flag==1 右移
uchar port_state=0x01;
flowlight=~port_state;
while(1)
{
delay10ms();
if(port_state==0X80&&flag==0)
{
flag=1; //流水燈左移到第八位又移回來 ~1000 0000
}
else
if(port_state==0X01&&flag==1)
{
flag=0; //流水燈右移到第1位又移回來 ~0000 0001
}
if(flag==0)
{
port_state=port_state<<1;
flowlight=~port_state;
}
else
{
port_state=port_state>>1;
flowlight=~port_state;
}
}

串口通信程序:
主機程序:
#include <AT89X52.H>
#define NODE_ADDR 3 //目的節點地址
#define COUNT 10 //發送緩沖區buffer大小
typedef unsigned char uchar;
uchar buffer[COUNT]; //定義buffer
int pt; //設置指針
main()//////////////////////////////////////////發送程序
{

//buffer初始化
pt=0;
while(pt<COUNT)
{
buffer[pt]='1'+pt; //[buffer]=0X31,[buffer+1]= 0X32,[buffer+2] 0X33........
pt++;
}
////初始化串口和T1(波特率發生器)/////////PCON預設為0
PCON=0X00;
SCON=0Xc0; //SCON=1100 0000B,置串口為方式3, SM2=0,REN=0,主機不接收地址幀
TMOD=0X20; //20H=0010 0000B,置T1為方式2,TR1控制T1的開關,定時器方式
TH1=253;TL1=253; //方式2為自動重裝///f(bps)=9600bps (f(osc)=11.0592MHZ)
TR1=1; //啟動T1
ET1=0; //關T1中斷 由於自動重裝
ES=1; //開串口中斷
EA=1; //開系統中斷
pt=0;

///////////////發送地址幀
TB8=1; //地址幀標志
SBUF=NODE_ADDR; //發送目的節點地址
while(pt<COUNT); //等待發送完全部數據
while(1);//不執行任何操作
} //end main

/////發送完中斷函數
void send()interrupt 4
{
TI=0; //清發送中斷標志
if(pt<COUNT)
{
//發送一幀數據
TB8=0;//數據幀標志
SBUF=buffer[pt]; //啟動發送
pt++;//指針指向下一單元
}

else
{
ES=0; //關串口中斷
EA=0; //關系統中斷
return; //若發送完則停止發送並返回
}

}
接收程序:
#include<reg52.h>
#define uchar unsigned char

#define NODE_ADDR 3 //本機節點地址
#define COUNT 10 //定義接收緩沖區buffer大小
uchar buffer[COUNT]; //定義buffer
int pt; //當前位置指針

void send_char_com(unsigned char ch); //向串口發送一個字元的函數聲明
void delay(void);

main() ////////////////串列非同步從機接收程序
{
PCON=0X00; //初始化串口和T1(波特率發生器)/////////PCON預設為0
SCON=0XF0; //SCON=1111 0000B,方式3,SM2=1,REN=1,允許接收地址幀
TMOD=0X20; //20H=0010 0000B,置T1為方式2,TR1控制T1的開關,定時器方式
TH1=253;TL1=253; //方式2為自動重裝///f(bps)=9600bps (f(osc)=11.0592MHZ)
TR1=1; //啟動T1
ET1=0; //關T1中斷 由於自動重裝
ES=1; //開串口中斷
EA=1; //開系統中斷
pt=0;
while(pt<COUNT); //等待接收地址幀和全部數據幀
delay() ;
//接收完後返回數據
SCON=0XC0; //SCON=1100 0000B,置串口為方式3, SM2=0,REN=0,主機不接收地址幀
EA=0;
for(pt=0;pt<COUNT;pt++)
{
send_char_com(buffer[pt]);

}
while(1);
} //end main

///////////串口接收中斷函數
void receive()interrupt 4 using 3
{
RI=0; //清除接收中斷標志
if(RB8==1) //地址幀
{//若為本機地址,則置SM2=0,以便接收數據
if(SBUF==NODE_ADDR)
{
SM2=0;
}

}
/////RB8=0,數據幀
else if(RB8==0)
{buffer[pt]=SBUF; //數據幀送buffer
pt++;
if(pt>=COUNT)
SM2=1; //若接收完全部數據幀,則通信結束;置SM2=1,准備下一次通信
}

}

//向串口發送一個字元
void send_char_com(unsigned char ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}

///////////////////////////////////////////////////////////////////////////////////

void delay(void)
{uchar i=100;
while(i--);
}

『叄』 《單片機C語言程序設計實訓100例——基於8051+Proteus模擬》 第03篇源代碼

單片機c語言編程100個實例目錄1
函數的使用和熟悉
實例3:用單片機控制第一個燈亮
實例4:用單片機控制一個燈閃爍:認識單片機的工作頻率
實例5:將 P1口狀態分別送入P0、P2、P3口:認識I/O口的引腳功能
實例6:使用P3口流水點亮8位LED
實例7:通過對P3口地址的操作流水點亮8位LED
實例8:用不同數據類型控制燈閃爍時間
實例9:用P0口、P1 口分別顯示加法和減法運算結果
實例10:用P0、P1口顯示乘法運算結果
實例11:用P1、P0口顯示除法運算結果
實例12:用自增運算控制P0口8位LED流水花樣
實例13:用P0口顯示邏輯"與"運算結果
實例14:用P0口顯示條件運算結果
實例15:用P0口顯示按位"異或"運算結果
實例16:用P0顯示左移運算結果
實例17:"萬能邏輯電路"實驗
實例18:用右移運算流水點亮P1口8位LED
實例19:用if語句控制P0口8位LED的流水方向
實例20:用swtich語句的控制P0口8位LED的點亮狀態
實例21:用for語句控制蜂鳴器鳴笛次數
實例22:用while語句控制LED
實例23:用do-while語句控制P0口8位LED流水點亮
實例24:用字元型數組控制P0口8位LED流水點亮
實例25: 用P0口顯示字元串常量
實例26:用P0 口顯示指針運算結果
實例27:用指針數組控制P0口8位LED流水點亮
實例28:用數組的指針控制P0 口8 位LED流水點亮
實例29:用P0 、P1口顯示整型函數返回值
實例30:用有參函數控制P0口8位LED流水速度
實例31:用數組作函數參數控制流水花樣
實例32:用指針作函數參數控制P0口8位LED流水點亮
實例33:用函數型指針控制P1口燈花樣
實例34:用指針數組作為函數的參數顯示多個字元串
單片機c語言編程100個實例目錄2
實例35:字元函數ctype.h應用舉例
實例36:內部函數intrins.h應用舉例
實例37:標准函數stdlib.h應用舉例
實例38:字元串函數string.h應用舉例
實例39:宏定義應用舉例2
實例40:宏定義應用舉例2
實例41:宏定義應用舉例3
* 中斷、定時器中斷、定時器 *中斷、定時器*中斷、定時器 /
實例42:用定時器T0查詢方式P2口8位控制LED閃爍
實例43:用定時器T1查詢方式控制單片機發出1KHz音頻
實例44:將計數器T0計數的結果送P1口8位LED顯示
實例45:用定時器T0的中斷控制1位LED閃爍
實例46:用定時器T0的中斷實現長時間定時
實例47:用定時器T1中斷控制兩個LED以不同周期閃爍
實例48:用計數器T1的中斷控制蜂鳴器發出1KHz音頻
實例49:用定時器T0的中斷實現"渴望"主題曲的播放
實例50-1:輸出50個矩形脈沖
實例50-2:計數器T0統計外部脈沖數
實例51-2:定時器T0的模式2測量正脈沖寬度
實例52:用定時器T0控制輸出高低寬度不同的矩形波
實例53:用外中斷0的中斷方式進行數據採集
實例54-1:輸出負脈寬為200微秒的方波
實例54-2:測量負脈沖寬度
實例55:方式0控制流水燈循環點亮
實例56-1:數據發送程序
實例56-2:數據接收程序
實例57-1:數據發送程序
實例57-2:數據接收程序
實例58:單片機向PC發送數據
實例59:單片機接收PC發出的數據
*數碼管顯示*數碼管顯示 數碼管顯示數碼管顯示*/
實例60:用LED數碼顯示數字5
實例61:用LED數碼顯示器循環顯示數字0~9
實例62:用數碼管慢速動態掃描顯示數字"1234"
實例63:用LED數碼顯示器偽靜態顯示數字1234
實例64:用數碼管顯示動態檢測結果
實例65:數碼秒錶設計
實例66:數碼時鍾設計
實例67:用LED數碼管顯示計數器T0的計數值
實例68:靜態顯示數字「59」
單片機c語言編程100個實例目錄3
鍵盤控制*鍵盤控制* *鍵盤控制 *鍵盤控制 */
實例69:無軟體消抖的獨立式鍵盤輸入實驗
實例70:軟體消抖的獨立式鍵盤輸入實驗
實例71:CPU控制的獨立式鍵盤掃描實驗
實例72:定時器中斷控制的獨立式鍵盤掃描實驗
實例73:獨立式鍵盤控制的4級變速流水燈
實例74:獨立式鍵盤的按鍵功能擴展:"以一當四"
實例75:獨立式鍵盤調時的數碼時鍾實驗
實例76:獨立式鍵盤控制步進電機實驗
實例77:矩陣式鍵盤按鍵值的數碼管顯示實驗
//實例78:矩陣式鍵盤按鍵音
實例79:簡易電子琴
實例80:矩陣式鍵盤實現的電子密碼鎖
液晶顯示LCD*液晶顯示LCD *液晶顯示LCD * *液晶顯示LCD*液晶顯示LCD *液晶顯示LCD */
實例81:用LCD顯示字元'A'
實例82:用LCD循環右移顯示"Welcome to China"
實例83:用LCD顯示適時檢測結果
實例84:液晶時鍾設計
*一些晶元的使用*24c02 DS18B20 X5045 ADC0832 DAC0832 DS1302 紅外遙控/
實例85:將數據"0x0f"寫入AT24C02再讀出送P1口顯示
實例86:將按鍵次數寫入AT24C02,再讀出並用1602LCD顯示
實例87:對I2C匯流排上掛接多個AT24C02的讀寫操作
實例88:基於AT24C02的多機通信 讀取程序
實例89:基於AT24C02的多機通信 寫入程序
實例90:DS18B20溫度檢測及其液晶顯示
實例91:將數據"0xaa"寫入X5045再讀出送P1口顯示
實例92:將流水燈控制碼寫入X5045並讀出送P1口顯示
實例93:對SPI匯流排上掛接多個X5045的讀寫操作
實例94:基於ADC0832的數字電壓表
實例95:用DAC0832產生鋸齒波電壓
實例96:用P1口顯示紅外遙控器的按鍵值
實例97:用紅外遙控器控制繼電器
實例98:基於DS1302的日歷時鍾
實例99:單片機數據發送程序
實例100:電機轉速表設計
模擬霍爾脈沖

http://www.dzkfw.com.cn/myxin/51c_language.chm 單片機c語言一百例子

『肆』 c51單片機程序實例

#include<reg51.h>
#defineucharunsignedchar
uchartab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//0到9
ucharnum,cnt,disn;
ucharkeyval,disk;
ucharled[]={1,2,3,4};
voiddealdat(uchara)
{
led[0]=0;
led[1]=0;
led[2]=0;
led[3]=0;
led[a]=disk;
}
voiddelay(unsignedinta)
{
unsignedinti,j;
for(i=0;i<a;i++)
for(j=0;j<1000;j++);
}
voidt0isr()interrupt1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
switch(num)
{
case0:P2=0x01;break;
case1:P2=0x02;break;
case2:P2=0x04;break;
case3:P2=0x08;break;
default:break;
}
P0=~tab[led[num]];
num++;
num&=0x03;
cnt++;
if(cnt>100)
{
cnt=0;
disn++;
disn%=4;
dealdat(disn);
}
}

ucharkbscan(void)
{
unsignedcharsccode,recode;
P3=0x0f;//發0掃描,列線輸入
if((P3&0x0f)!=0x0f)//有鍵按下
{
// delay(20);//延時去抖動
if((P3&0x0f)!=0x0f)
{
sccode=0xef;//逐行掃描初值
while((sccode&0x01)!=0)
{
P3=sccode;
if((P3&0x0f)!=0x0f)
{
recode=(P3&0x0f)|0xf0;
return((~sccode)+(~recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
}
return0;//無鍵按下,返回0
}

voidgetkey(void)
{
unsignedcharkey;
key=kbscan();
if(key==0){keyval=0xff;return;}
switch(key)
{
case0x11:keyval=7;break;
case0x12:keyval=4;break;
case0x14:keyval=1;break;
case0x18:keyval=10;break;
case0x21:keyval=8;break;
case0x22:keyval=5;break;
case0x24:keyval=2;break;
case0x28:keyval=0;break;
case0x41:keyval=9;break;
case0x42:keyval=6;break;
case0x44:keyval=3;break;
case0x48:keyval=11;break;
case0x81:keyval=12;break;
case0x82:keyval=13;break;
case0x84:keyval=14;break;
case0x88:keyval=15;break;
default:keyval=0xff;break;
}
}

main()
{
TMOD=0x11;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
getkey();
if(keyval!=0xff)disk=keyval;
delay(10);
}

}

『伍』 51單片機流水燈用C語言編寫的設計程序

其實很簡單
就是用_cror_()函數或者 _crol_()函數,第一個是右移第二個是左移

『陸』 c51單片機c語言交通燈的程序

Proteus模擬原理圖:

程序如下:

#include <reg51.h>

#define uchar unsigned char

#define uint unsigned int

uchar data buf[4];

uchar data sec_dx=20;//東西數默認

uchar data sec_nb=30;//南北默認值

uchar data set_timedx=20;

uchar data set_timenb=30;

int n;

uchar data b;//定時器中斷次數

sbit k1=P1^6;//定義5組開關

sbit k2=P1^7;

sbit k3=P2^7;

sbit k4=P3^0;

sbit k5=P3^1;

sbit Yellow_nb=P2^5; //南北黃燈標志

sbit Yellow_dx=P2^2; //東西黃燈標志

sbit Green_nb=P2^4;

sbit Green_dx=P2^1;

sbit Buzz=P3^7;

bit Buzzer_Indicate;

bit time=0;//燈狀態循環標志

bit set=1;//調時方向切換鍵標志

uchar code table[11]={ //共陰極字型碼

0x3f, //--0

0x06, //--1

0x5b, //--2

0x4f, //--3

0x66, //--4

0x6d, //--5

0x7d, //--6

0x07, //--7

0x7f, //--8

0x6f, //--9

0x00 //--NULL

};

//函數的聲明部分

void delay(int ms);//延時子程序

void key();//按鍵掃描子程序

void key_to1();//鍵處理子程序

void key_to2();

void key_to3();

void display();//顯示子程序

void logo(); //開機LOGO

void Buzzer();

//主程序

void main()

{

TMOD=0X01;

TH0=0XD8;

TL0=0XF0;

EA=1;

ET0=1;

TR0=1;

EX0=1;

EX1=1;

logo();

P2=0Xc3;// 開始默認狀態,東西綠燈,南北黃燈

sec_nb=sec_dx+5;

while(1)

{

key(); //調用按鍵掃描程序

display(); //調用顯示程序

Buzzer();

}

}

//函數的定義部分

void key() //按鍵掃描子程序

{

if(k1!=1)

{

delay(10);

if(k1!=1)

{

while(k1!=1)

{

key_to1();

for(n=0;n<40;n++)

{ display();}

}

}

}

if(k2!=1)

{

delay(10);

if(k2!=1)

{

while(k2!=1)

{

key_to2();

for(n=0;n<40;n++)

{ display();}

}

}

}

if(k3!=1)

{

TR0=1; //啟動定時器

Buzzer_Indicate=0;

sec_nb=set_timenb; //從中斷回復,仍顯示設置過的數值

sec_dx=set_timedx;

if(time==0)

{ P2=0X99;sec_nb=sec_dx+5; }

else { P2=0xC3;sec_dx=sec_nb+5; }

}

if(k4!=1)

{

delay(5);

if(k4!=1)

{

while(k4!=1);

set=!set;

}

}

if(k5!=1)

{

delay(5);

if(k5!=1)

{

while(k5!=1)

key_to3();

}

}

}

void display() //顯示子程序

{

buf[1]=sec_dx/10; //第1位 東西秒十位

buf[2]=sec_dx%10; //第2位 東西秒個位

buf[3]=sec_nb/10; //第3位 南北秒十位

buf[0]=sec_nb%10; //第4位 南北秒個位

P1=0xff; // 初始燈為滅的

P0=0x00;

P1=0xfe; //片選LCD1

P0=table[buf[1]];

delay(1);

P1=0xff;

P0=0x00;

P1=0xfd; //片選LCD2

P0=table[buf[2]];

delay(1);

P1=0xff;

P0=0x00;

P1=0Xfb; //片選LCD3

P0=table[buf[3]];

delay(1);

P1=0xff;

P0=0x00;

P1=0Xf7;

P0=table[buf[0]]; //片選LCD4

delay(1);

}

void time0(void) interrupt 1 using 1 //定時中斷子程序

{

b++;

if(b==19) // 定時器中斷次數

{ b=0;

sec_dx--;

sec_nb--;

if(sec_nb<=5&&time==0) //東西黃燈閃

{ Green_dx=0;Yellow_dx=!Yellow_dx;}

if(sec_dx<=5&&time==1) //南北黃燈閃

{ Green_nb=0;Yellow_nb=!Yellow_nb;}

if(sec_dx==0&&sec_nb==5)

sec_dx=5;

if(sec_nb==0&&sec_dx==5)

sec_nb=5;

if(time==0&&sec_nb==0)

{ P2=0x99;time=!time;sec_nb=set_timenb;sec_dx=set_timenb+5;}

if(time==1&&sec_dx==0)

{P2=0Xc3;time=!time;sec_dx=set_timedx;sec_nb=set_timedx+5;}

}

}

void key_to1() //鍵盤處理子程序之+

{

TR0=0; //關定時器

if(set==0)

set_timenb++; //南北加1S

else

set_timedx++; //東西加1S

if(set_timenb==100)

set_timenb=1;

if( set_timedx==100)

set_timedx=1; //加到100置1

sec_nb=set_timenb ; //設置的數值賦給東西南北

sec_dx=set_timedx;

}

void key_to2() //鍵盤處理子程序之-

{

TR0=0; //關定時器

if(set==0)

set_timenb--; //南北減1S

else

set_timedx--; //東西減1S

if(set_timenb==0)

set_timenb=99;

if( set_timedx==0 )

set_timedx=99; //減到1重置99

sec_nb=set_timenb ; //設置的數值賦給東西南北

sec_dx=set_timedx;

}

void key_to3() //鍵盤處理之緊急車通行

{

TR0=0;

P2=0Xc9;

sec_dx=00;

sec_nb=00;

Buzzer_Indicate=1;

}

void int0(void) interrupt 0 using 1 //只允許東西通行

{

TR0=0;

P2=0Xc3;

Buzzer_Indicate=0;

sec_dx=00;

sec_nb=00;

}

void int1(void) interrupt 2 using 1 //只允許南北通行

{

TR0=0;

P2=0X99;

Buzzer_Indicate=0;

sec_nb=00;

sec_dx=00;

}

void logo()//開機的Logo "- - - -"

{ for(n=0;n<50;n++)

{

P0=0x40;

P1=0xfe;

delay(1);

P1=0xfd;

delay(1);

P1=0Xfb;

delay(1);

P1=0Xf7;

delay(1);

P1 = 0xff;

}

}

void Buzzer()

{

if(Buzzer_Indicate==1)

Buzz=!Buzz;

else Buzz=0;

}

void delay(int ms) //延時子程序

{

uint j,k;

for(j=0;j<ms;j++)

for(k=0;k<124;k++);

}


『柒』 求大神編一道51單片機實現多種倒計時功能

這個不算太難,只要利用標識符進行判斷即可


標識符就是一個變數,常使用字元型變數作為標識符,佔用空間小


每一種狀態都用標識符表示出來,例如狀態0,狀態1,狀態2 ..................狀態254


字元型變數的值范圍是 0 ~ 254 共255個值,夠你用的了


給你一個類似的程序,我自己寫的,你作為參考吧


程序的組成是:兩個按鍵,一組四位數碼管,兩個LED發光二極體


程序的功能是:按下按鍵A,兩個LED同時點亮,並延時10秒(時間隨意修改)

按下按鍵B,兩個LED同時熄滅,並延時10秒(時間隨意修改)

無按鍵按下時,兩個LED交替點亮,達到閃爍的效果


程序如下,並加了注釋,若滿意請採納!


#include <reg51.h> //51單片機通用頭文件

unsigned int i,t,h; char fe;

sbit a=P3^7; sbit b=P3^6; sbit led=P2^7; sbit lad=P2^6;//按鍵及LED埠定義

char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//數碼管顯示編碼

/***************************************************************************/

void YS(char hs){char hk;for(;hs>0;hs--){for(hk=200;hk>0;hk--);}}//延時函數

/***************************************************************************/

void XS(int xs) //數碼管顯示

{

char d1,d2,d3,d4;

d1=(xs/1)%10; d2=(xs/10)%10; d3=(xs/100)%10; d4=(xs/1000)%10;

P0=table[d1]; P1=0xf7; YS(10); P1=0xff;//個位顯示

P0=table[d2]; P1=0xfb; YS(10); P1=0xff;//十位顯示

P0=table[d3]; P1=0xfd; YS(10); P1=0xff;//百位顯示

P0=table[d4]; P1=0xfe; YS(10); P1=0xff;//千位顯示

}

/***************************************************************************/

void main()

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TMOD=0x01; TR0=1; ET0=1; EA=1;

led=0;lad=1;

while(1)

{

XS(h);//調用數碼管顯示函數

if(a==0){h=10;fe=0;}//按鍵 A, LED 亮10秒

if(b==0){h=10;fe=1;}//按鍵 B, LED 滅10秒

}

}

/***************************************************************************/

void t0()interrupt 1//定時器 0 中斷

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

i++; t++;

if(h>0){t=0;}//如果按鍵按下,屏蔽 t 計數,

if(t>=5){t=0;led=~led; lad=~lad;}//t計數,用於兩個LED閃爍

if(i>=20)//還是原來的時間判斷

{

i=0;

if(h>0&&fe==0){h--;led=0;lad=0;}//如果是狀態 0 同時點亮兩個LED

if(h>0&&fe==1){h--;led=1;lad=1;}//如果是狀態 1 同時關閉兩個LED

}

if(h==0&&led==0&&lad==0){led=1;lad=0;}//此句防止數碼管倒計時後兩個LED繼續同時點亮

}

/***************************************************************************/

閱讀全文

與51單片機程序100例相關的資料

熱點內容
gcc編譯選項給gdb調試 瀏覽:586
ios和android前景好 瀏覽:60
蘋果如何藍牙傳送安卓app 瀏覽:550
方舟編譯器mod怎麼用 瀏覽:754
伺服器地址欄在哪裡 瀏覽:393
做安檢還是程序員好 瀏覽:524
程序員最火的bug 瀏覽:936
騰訊文件夾英文怎麼寫 瀏覽:125
pdf內碼 瀏覽:432
微信小程序文件夾怎麼發給好友 瀏覽:969
java不能被繼承的類 瀏覽:161
蘋果app網址怎麼添加 瀏覽:910
php明年的今天 瀏覽:115
麒麟970也能用方舟編譯器么 瀏覽:476
金融實驗大作業python 瀏覽:795
雲伺服器搭建聊天室 瀏覽:603
怎麼在手機上下載荔枝app 瀏覽:18
湖南戴爾伺服器雲空間 瀏覽:363
聯想驅動怎麼解壓 瀏覽:268
程序員進化論解說 瀏覽:871