標(biāo)題:
單片機(jī)定時(shí)器LCD顯示加音樂(lè)加流水燈程序
[打印本頁(yè)]
作者:
5868
時(shí)間:
2017-9-5 17:57
標(biāo)題:
單片機(jī)定時(shí)器LCD顯示加音樂(lè)加流水燈程序
單片機(jī)定時(shí)器LCD顯示加音樂(lè)加流水燈
單片機(jī)源程序如下:
#include<reg51.h> //調(diào)用51單片機(jī)的頭文件
#define uchar unsigned char
#define uint unsigned int
//---------------------------------------
//1602液晶相關(guān)I/O設(shè)置
//sbit E=P2^3; //1602液晶的E腳接在P2.3口上
//sbit RW=P2^4; //1602液晶的RW腳接在P2.4口上
//sbit RS=P2^5; //1602液晶的RS腳接在P2.5口上
sbit E=P2^7; //1602液晶的E腳接在P2.3口上
sbit RW=P2^5; //1602液晶的RW腳接在P2.4口上
sbit RS=P2^6; //1602液晶的RS腳接在P2.5口上
sbit Busy=P0^7;
//按鍵相關(guān)I/O設(shè)置
sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^2;
//sbit beep = P1^3;
sbit beep = P1^5;
uchar code word1[]={" TIME STOP "};
uchar code word2[]={" TIME SET! "};
uchar code word3[]={" TIME START "};
//---------------------------------------
unsigned char i;
unsigned char menu;
signed int Time_bai,Time_ge;
bit Adjust;
//---------------------------------------
//1602液晶寄存器設(shè)置
unsigned int DISbuf_ge,DISbuf_bai; //設(shè)置16位的unsigend int型寄存器用來(lái)暫存1602要顯示的內(nèi)容
//---------------------------------------
uchar code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,
212,212,106,126,159,169,190,119,119,126,159,142,159,0};
uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,
9,3,12,12,12,12,12,9,3,12,12,12,24,0};
void Display();
void DelayMS(uint ms)
{
uchar t;
while(ms--)
{
for(t=0;t<120;t++);
}
}
void PlayMusic()
{
uint i=0,j,k;
while(SONG_LONG[i]!=0||SONG_TONE[i]!=0)
{ //播放各個(gè)音符,SONG_LONG 為拍子長(zhǎng)度
for(j=0;j<SONG_LONG[i]*20;j++)
{
beep=~beep;
if(Adjust==1)
break;
//SONG_TONE 延時(shí)表決定了每個(gè)音符的頻率
for(k=0;k<SONG_TONE[i]/3;k++);
}
DelayMS(70);
i++;
}
}
void led()
{
P2 = P2 << 1; //第一次循環(huán),led1亮,其他都不亮
if(P2 == 0x00) //全部移出
P2 = 0x01;
}
//---------------------------------------
//名稱:1602液晶用延時(shí)函數(shù)
//---------------------------------------
void Delay1602(unsigned int t)
{
unsigned int k; //定義一個(gè)16位寄存器用來(lái)做延時(shí)用
for(k=0;k<t;k++); //延時(shí)
}
//---------------------------------------
//名稱:1602液晶忙檢測(cè)函數(shù)
//---------------------------------------
void LCD1602_busy(void)
{
Busy=1; //將P0.7置1,為讀狀態(tài)做準(zhǔn)備
RS=0; //RS=0、RW=1、E=1時(shí),忙信號(hào)輸出到DB7,由P0.7讀入
RW=1; //RS=0、RW=1、E=1時(shí),忙信號(hào)輸出到DB7,由P0.7讀入
E=1; //RS=0、RW=1、E=1時(shí),忙信號(hào)輸出到DB7,由P0.7讀入
while(Busy==1); //由P0.7讀入1,表示1602液晶忙,需要等待
E=0; //讀完以后,恢復(fù)E的電平
}
//---------------------------------------
//名稱:1600寫命令函數(shù)
//適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
//公司:寧波芯動(dòng)電子有限公司
//網(wǎng)址:www.MovingChip.com
//日期:20120914
//---------------------------------------
void LCD1602_Write_com(unsigned char combuf)
{
RS=0; //選擇指令寄存器
RW=0; //選擇寫狀態(tài)
P0=combuf; //將命令字通過(guò)P0口送至DB
E=1; //E高電平將命令字寫入1602液晶
E=0; //寫完以后,恢復(fù)E的電平
}
//---------------------------------------
//名稱:1602寫命令函數(shù)(帶忙檢測(cè))
//---------------------------------------
void LCD1602_Write_com_busy(unsigned char combuf)
{
LCD1602_busy(); //調(diào)用忙檢測(cè)函數(shù)
LCD1602_Write_com(combuf); //調(diào)用忙檢測(cè)函數(shù)
}
//---------------------------------------
//名稱:1602寫數(shù)據(jù)函數(shù)(帶忙檢測(cè))
//---------------------------------------
void LCD1602_Write_data_busy(unsigned char databuf)
{
LCD1602_busy(); //調(diào)用忙檢測(cè)函數(shù)
RS=1; //選擇數(shù)據(jù)寄存器
RW=0; //選擇寫狀態(tài)
P0=databuf; //將命令字通過(guò)P0口送至DB
E=1; //E高電平將命令字寫入1602液晶
E=0; //寫完以后,恢復(fù)E的電平
}
//---------------------------------------
//名稱:1602液晶顯示地址寫函數(shù)
//適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
//公司:寧波芯動(dòng)電子有限公司
//網(wǎng)址:www.MovingChip.com
//日期:20120914
//---------------------------------------
void LCD1602_Write_address(unsigned char x,unsigned char y)
{
x&=0x0f; //列地址限制在0-15間
y&=0x01; //行地址限制在0-1間
if(y==0) //如果是第一行
LCD1602_Write_com_busy(x|0x80); //將列地址寫入
else //如果是第二行
LCD1602_Write_com_busy((x+0x40)|0x80); //將列地址寫入
}
//---------------------------------------
//名稱:1602液晶初始化函數(shù)
//---------------------------------------
void LCD1602_init(void)
{
Delay1602(1500); //調(diào)用延時(shí)函數(shù)
LCD1602_Write_com(0x38); //8位數(shù)據(jù)總線,兩行顯示模式,5*7點(diǎn)陣顯示
Delay1602(500); //調(diào)用延時(shí)函數(shù)
LCD1602_Write_com(0x38); //8位數(shù)據(jù)總線,兩行顯示模式,5*7點(diǎn)陣顯示
Delay1602(500); //調(diào)用延時(shí)函數(shù)
LCD1602_Write_com(0x38); //8位數(shù)據(jù)總線,兩行顯示模式,5*7點(diǎn)陣顯示
LCD1602_Write_com_busy(0x38); //8位數(shù)據(jù)總線,兩行顯示模式,5*7點(diǎn)陣顯示
LCD1602_Write_com_busy(0x08); //顯示功能關(guān),無(wú)光標(biāo)
LCD1602_Write_com_busy(0x01); //清屏
//LCD1602_Write_com_busy(0x06); //寫入新的數(shù)據(jù)后,光標(biāo)右移,顯示屏不移動(dòng)
LCD1602_Write_com_busy(0x0C); //顯示功能開(kāi),無(wú)光標(biāo)
}
//---------------------------------------
//名稱:1602液晶指定地址顯示函數(shù)
//---------------------------------------
void LCD1602_Disp(unsigned char x,unsigned char y,unsigned char buf)
{
LCD1602_Write_address(x,y); //先將地址信息寫入
LCD1602_Write_data_busy(buf); //再寫入要顯示的數(shù)據(jù)
}
//---------------------------------------
//名稱:1602液晶將字符輸出到液晶顯示
//---------------------------------------
void Print(unsigned char x,unsigned char y,unsigned char *str)
{
LCD1602_Write_address(x,y);
while(*str!='\0')
{
LCD1602_Write_data_busy(*str);
str++;
}
}
//---------------------------------------
//名稱:Delay10ms延時(shí)10毫秒函數(shù)
//---------------------------------------
void Delay10ms(void) //誤差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
void keyscan()
{
if(key1==0) //檢測(cè)按鍵K1是否按下
{
Delay10ms(); //消除抖動(dòng)
while(key1==0);
menu++;
if(menu==3)
menu=1;
Adjust=1;
}
if(menu==1)
{
Print(0,0,word2);
DISbuf_bai=0;
DISbuf_ge=0;
LCD1602_Disp(2,1,DISbuf_bai/1000+'0'); //在第1行的第1列顯示千位
LCD1602_Disp(3,1,(DISbuf_bai%1000)/100+'0'); //在第1行的第2列顯示百位
LCD1602_Disp(4,1,':');
LCD1602_Disp(5,1,(DISbuf_ge%100)/10+'0'); //在第1行的第3列顯示十位
LCD1602_Disp(6,1,DISbuf_ge%10+'0'); //在第1行的第4列顯示個(gè)位
if(key2==0) //檢測(cè)按鍵K1是否按下
{
Delay10ms(); //消除抖動(dòng)
while(key2==0);
Time_ge++;
if(Time_ge>59)
{
Time_ge=0;
Time_bai++;
}
}
if(key3==0) //檢測(cè)按鍵K1是否按下
{
Delay10ms(); //消除抖動(dòng)
while(key3==0);
Time_ge--;
if(Time_ge<0)
{
Time_ge=59;
Time_bai--;
}
}
}
if(menu==2)
{
if(key2==0) //檢測(cè)按鍵K1是否按下
{
Delay10ms(); //消除抖動(dòng)
while(key2==0);
Print(0,0,word3);
Adjust=0;
}
if(key3==0) //檢測(cè)按鍵K1是否按下
{
Delay10ms(); //消除抖動(dòng)
while(key3==0);
Print(0,0,word1);
Adjust=1;
}
if(Adjust==0)
{
Print(0,0,word3);
}
else
{
Print(0,0,word1);
}
}
LCD1602_Disp(9,1,Time_bai/10+'0'); //在第1行的第1列顯示千位
LCD1602_Disp(10,1,Time_bai%10+'0'); //在第1行的第2列顯示百位
LCD1602_Disp(11,1,':');
LCD1602_Disp(12,1,Time_ge/10+'0'); //在第1行的第3列顯示十位
LCD1602_Disp(13,1,Time_ge%10+'0'); //在第1行的第4列顯示個(gè)位
LCD1602_Disp(14,1,' ');
LCD1602_Disp(15,1,' ');
}
void Display()
{
LCD1602_Disp(2,1,DISbuf_bai/10+'0'); //在第1行的第1列顯示千位
LCD1602_Disp(3,1,DISbuf_bai%10+'0'); //在第1行的第2列顯示百位
LCD1602_Disp(4,1,':');
LCD1602_Disp(5,1,DISbuf_ge/10+'0'); //在第1行的第3列顯示十位
LCD1602_Disp(6,1,DISbuf_ge%10+'0'); //在第1行的第4列顯示個(gè)位
LCD1602_Disp(7,1,' ');
LCD1602_Disp(8,1,' ');
if(DISbuf_ge==Time_ge && DISbuf_bai==Time_bai)
{
Adjust=1;
}
}
//---------------------------------------
//名稱: 主函數(shù)
//---------------------------------------
void main(void) //主函數(shù),單片機(jī)開(kāi)機(jī)后就是從這個(gè)函數(shù)開(kāi)始運(yùn)行
{
LCD1602_init(); //調(diào)用1602液晶初始化函數(shù)
//***定時(shí)器Timer0初始化***
TMOD&=0xF0; //將TMOD的低4位定時(shí)器0控制部分清零
TMOD|=0x01; //設(shè)置定時(shí)器0為方式1
TL0=0xFF; //設(shè)置定時(shí)器0初值低8位
TH0=0x4B; //設(shè)置定時(shí)器0初值高8位
TR0=1; //啟動(dòng)定時(shí)器0
ET0=1; //Timer0中斷允許
//**********************
//***開(kāi)全局中斷設(shè)置****
//定時(shí)器Timer0設(shè)置了中斷允許,此處要開(kāi)全局中斷
EA=1; //開(kāi)全局中斷
//*********************
menu=2;
Adjust=1;
Time_bai=0;
Time_ge=10;
DISbuf_bai=0;
DISbuf_ge=0;
Print(0,0,word1);
LCD1602_Disp(2,1,DISbuf_bai/10+'0'); //在第1行的第1列顯示千位
LCD1602_Disp(3,1,DISbuf_bai%10+'0'); //在第1行的第2列顯示百位
LCD1602_Disp(4,1,':');
LCD1602_Disp(5,1,DISbuf_ge/10+'0'); //在第1行的第3列顯示十位
LCD1602_Disp(6,1,DISbuf_ge%10+'0'); //在第1行的第4列顯示個(gè)位
beep=1;
P0 = 0x01;
while(1) //死循環(huán),單片機(jī)初始化后,將一直運(yùn)行這個(gè)死循環(huán)
{
if(DISbuf_ge==Time_ge && DISbuf_bai==Time_bai && Adjust==1)
……………………
…………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
Project.zip
(52 KB, 下載次數(shù): 14)
2017-9-5 17:57 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
xymiss
時(shí)間:
2017-9-30 23:14
謝謝分享。下載看看
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1