能不能幫我看一下,先謝謝
單片機源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define LCD1602_DB P0 //定義1602的DB口為P0口
- uchar code table[]="CurrentTime"; //當前時間
- uchar code table1[]="00:00:00";
- uchar key1Flag = 0;//定義按鍵關閉符
- uchar key2Flag = 0;
- uchar key3Flag = 0;
- uchar key4Flag = 0;
- uchar count = 0;
- uchar sec = 57;//秒
- uchar min = 59;//分
- uchar hour = 9;//小時
- uchar clockHour = 0;//鬧鐘小時
- uchar clockMin = 0;//分
- uchar clockFlag = 0;// 定義鬧鐘關閉符
- uchar beepNum = 0;//聲音
- uchar temp=0;
- uchar shijian=0;
- sbit LCD1602_RS = P2^0; //指令1/數據0選擇端
- sbit LCD1602_RW = P2^1; //讀1寫0選擇端
- sbit LCD1602_E = P2^2; //讀1寫0使能端
- sbit Key1 = P1^0;//定義鍵位符
- sbit Key2 = P1^1;
- sbit Key3 = P1^2;
- sbit Key4 = P1^3;
- sbit Speaker = P2^5;//定義蜂鳴器
- sbit LED=P2^4;
- void Delay1ms() //@12.000MHz
- {
- uchar i, j;
- i = 12;
- j = 169;
- do
- {
- while (--j);
- } while (--i);
- }
- void Delay20ms() //@12.000MHz
- {
- uchar i, j, k;
- _nop_();
- _nop_();
- i = 1;
- j = 234;
- k = 113;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- void delay()
- {
- unsigned int a;
- while(a--);
- }
- void Beep() //蜂鳴器警報
- {
- Speaker = 0;
- Delay20ms();
- Speaker = 1;
- }
- void LcdWaitReady() //檢查LCD忙函數
- {
- uchar sta;
- LCD1602_DB = 0xFF;
- LCD1602_RS = 0;
- LCD1602_RW = 1;
- do {
- LCD1602_E = 1;
- sta = LCD1602_DB;
- LCD1602_E = 0;
- }while(sta & 0x80);
- }
- void LcdWriteCmd(uchar cmd) //寫命令函數
- {
- LcdWaitReady();
- LCD1602_RS = 0;
- LCD1602_RW = 0;
- LCD1602_DB = cmd;
- LCD1602_E = 1;
- LCD1602_E = 0;
- }
- void LcdWriteDat(uchar dat) //寫數據函數
- {
- LcdWaitReady();
- LCD1602_RS = 1;
- LCD1602_RW = 0;
- LCD1602_DB = dat;
- LCD1602_E = 1;
- LCD1602_E = 0;
- }
- void LcdSetCursor(uchar x, uchar y)//時間設置
- {
- uchar addr;
- if(y == 0)
- addr = 0x00 + x;
- else
- addr = 0x40 + x;
- LcdWriteCmd(addr | 0x80);
- }
- void LcdShowStr(uchar x, uchar y, uchar *str)
- {
- LcdSetCursor(x, y);
- while(*str != '\0')
- {
- LcdWriteDat(*str++);
- }
- }
- void InitLcd1602()//初始化LCD函數
- {
- LcdWriteCmd(0x01);
- LcdWriteCmd(0x38);
- LcdWriteCmd(0x0c);
- LcdWriteCmd(0x06);
- }
- void WriteAddress(uchar x)
- {
- LcdWriteCmd(0x80 + x);
- }
- void DisplayMinTens() //顯示分十位
- {
- WriteAddress(0x49);
- LcdWriteDat((min / 10) + '0');
- Delay1ms();
- }
- void DisplayMinUnits() //顯示分個位
- {
- WriteAddress(0x4A);
- LcdWriteDat((min % 10) + '0');
- Delay1ms();
- }
- void DisplayHourTens() //顯示時十位
- {
- WriteAddress(0x46);
- LcdWriteDat((hour / 10) + '0');
- Delay1ms();
- }
- void DisplayHourUnits()//顯示時個位
- {
- WriteAddress(0x47);
- LcdWriteDat((hour % 10) + '0');
- Delay1ms();
- }
- void DisplayClkMinTens() //顯示鬧鐘分十位
- {
- WriteAddress(0x49);
- LcdWriteDat((clockMin / 10) + '0');
- Delay1ms();
- }
- void DisplayClkMinUnits() //顯示鬧鐘分個位
- {
- WriteAddress(0x4A);
- LcdWriteDat((clockMin % 10) + '0');
- Delay1ms();
- }
- void DisplayClkHourTens() //顯示鬧鐘時十位
- {
- WriteAddress(0x46);
- LcdWriteDat((clockHour / 10) + '0');
- Delay1ms();
- }
- void DisplayClkHourUnits() //顯示鬧鐘時個位
- {
- WriteAddress(0x47);
- LcdWriteDat((clockHour % 10) + '0');
- Delay1ms();
- }
- void DisplayClkSecTens() //顯示秒十位
- {
- WriteAddress(0x4C);
- LcdWriteDat((sec / 10) + '0');
- Delay1ms();
- }
- void DisplayClkSecUnits() //顯示秒個位
- {
- WriteAddress(0x4D);
- LcdWriteDat((sec % 10) + '0');
- Delay1ms();
- }
- void ScanKey4()
- {
- if((Key4 == 0)&(clockFlag ==1))
- {
- Delay20ms();
- if((Key4 == 0)&(clockFlag ==1))
- {
- clockFlag = 0;
- beepNum = 0;
- key4Flag = 0;
- }
- }
- }
- void InitTimer0()//初始化定時器0
- {
- TMOD = 0x11;
- TH0 = (65536 - 50000) / 256;
- TL0 = (65536 - 50000) % 256;
- TH1 = (65536 - 50000) / 256;
- TL1 = (65536 - 50000) % 256;
- ET1=1;
- ET0=1;
- EA = 1;
- PT0=1;
- TR0=1;
- TR1=1;
-
-
- }
- void main()//主函數
- {
- InitLcd1602();
- LcdShowStr(0,0,table);
- LcdShowStr(6,1,table1);
- InitTimer0();
- while(1)
- {
- if(sec == 60)
- {
- sec = 0;
- min++;
- }
- if(min == 60)
- {
- min = 0;
- hour++;
- }
- if(hour == 24)
- {
- hour = 0;
- }
- LcdShowStr(0,0,table);
- DisplayHourTens();
- DisplayHourUnits();
- LcdShowStr(8,1,":");
- DisplayMinTens();
- DisplayMinUnits();
- LcdShowStr(11,1,":");
- DisplayClkSecUnits();
- DisplayClkSecTens();
- //==============================================================
- if((Key1 == 0)&(key1Flag == 0)) { //設置當前時間
- Delay20ms();
- if((Key1 == 0)&(key1Flag == 0)) {
- TR0 = 0;
- InitLcd1602();
- LcdShowStr(0,0,"SetCurrentTime");
- DisplayHourTens();
- DisplayHourUnits();
- LcdShowStr(8,1,":");
- DisplayMinTens();
- DisplayMinUnits();
- key1Flag = 1;
- }
- }
- while(key1Flag == 1)
- {
- if(Key1 == 0) {
- Delay20ms();
- if(Key1 == 0)
- {
- hour++;
- if(hour == 24)
- {
- hour = 0;
- }
- DisplayHourTens();
- DisplayHourUnits();
- LcdShowStr(8,1,":");
- DisplayMinTens();
- DisplayMinUnits();
- }
- }
- if(Key2 == 0)
- {
- Delay20ms();
- if(Key2 == 0)
- {
- min++;
- if(min == 60)
- {
- min = 0;
- hour++;
- }
- DisplayHourTens();
- DisplayHourUnits();
- LcdShowStr(8,1,":");
- DisplayMinTens();
- DisplayMinUnits();
- }
- }
- if((Key3 == 0)&(key1Flag == 1)) { //退出設置當前時間
- Delay20ms();
- if((Key3 == 0)&(key1Flag == 1)) {
- InitLcd1602();
- LcdShowStr(0,0,table);
- DisplayHourTens();
- DisplayHourUnits();
- LcdShowStr(8,1,":");
- DisplayMinTens();
- DisplayMinUnits();
- LcdShowStr(11,1,":");
- DisplayClkSecUnits();
- DisplayClkSecTens();
- key1Flag = 0;
- TR0 = 1;
- }
- }
- }
- //==============================================================
- if((min==0)&(sec<5)) //時間到整點
- {
- LED=0;
- delay();
- Beep();
- Beep();
- Delay20ms();
- }
- if((min==0)&(sec>=5))
- {
- LED=1;
- }
- //==============================================================
- if((Key2 == 0)&(key2Flag == 0))
- { //顯示鬧鐘時間
- Delay20ms();
- if((Key2 == 0)&(key2Flag == 0))
- {
- key2Flag = 1;
- InitLcd1602();
- while(key2Flag == 1)
- {
- LcdShowStr(0,0,"Clock Time");
- DisplayClkHourTens();
- DisplayClkHourUnits();
- LcdShowStr(8,1,":");
- DisplayClkMinTens();
- DisplayClkMinUnits();
- if(Key2 == 0)
- {
- Delay20ms();
- if(Key2 == 0)
- {
- key2Flag = 0;
- InitLcd1602();
- DisplayHourTens();
- DisplayHourUnits();
- LcdShowStr(8,1,":");
- DisplayMinTens();
- DisplayMinUnits();
- LcdShowStr(11,1,":");
- DisplayClkSecUnits();
- DisplayClkSecTens();
- }
- }
- }
- }
- }
- //==============================================================
- if((Key3 == 0)&(key3Flag == 0)) //設置鬧鐘時間
- {
- Delay20ms();
- if((Key3 == 0)&(key3Flag == 0))
- {
- TR0 = 0;
- InitLcd1602();
- LcdShowStr(0,0,"SetClockTime");
- DisplayClkHourTens();
- DisplayClkHourUnits();
- LcdShowStr(8,1,":");
- DisplayClkMinTens();
- DisplayClkMinUnits();
- key3Flag = 1;
- }
- }
- while(key3Flag == 1)
- {
- if(Key1 == 0)
- {
- Delay20ms();
- if(Key1 == 0)
- {
- clockHour++;
- if(clockHour == 24)
- {
- clockHour = 0;
- }
- DisplayClkHourTens();
- DisplayClkHourUnits();
- LcdShowStr(8,1,":");
- DisplayClkMinTens();
- DisplayClkMinUnits();
- }
- }
- if(Key2 == 0)
- {
- Delay20ms();
- if(Key2 == 0)
- {
- clockMin++;
- if(clockMin == 60)
- {
- clockHour++;
- clockMin = 0;
- }
- DisplayClkHourTens();
- DisplayClkHourUnits();
- LcdShowStr(8,1,":");
- DisplayClkMinTens();
- DisplayClkMinUnits();
- }
- }
- if(Key3 == 0)
- { //退出設置鬧鐘時間
- Delay20ms();
- if(Key3 == 0)
- {
- key3Flag = 0;
- InitLcd1602();
- TR0 = 1;
- DisplayHourTens();
- DisplayHourUnits();
- LcdShowStr(8,1,":");
- DisplayMinTens();
- DisplayMinUnits();
- LcdShowStr(11,1,":");
- DisplayClkSecUnits();
- DisplayClkSecTens();
- }
- }
- }
- //==============================================================
- if((Key4 == 0)&(key4Flag == 0)) //鬧鐘ON/OFF位設置
- {
- Delay20ms();
- if((Key4 == 0)&(key4Flag == 0))
- {
- key4Flag = 1;
- InitLcd1602();
- LcdShowStr(0,0,"Clock ON");
- Delay20ms();
-
- Delay20ms();
-
- Delay20ms();
-
- Delay20ms();
-
- Delay20ms();
- }
- }
- if((Key4 == 0)&(key4Flag == 1)) //鬧鐘ON/OFF位設置
- {
- Delay20ms();
- if((Key4 == 0)&(key4Flag == 1))
- {
- key4Flag = 0;
- InitLcd1602();
- LcdShowStr(0,0,"Clock OFF");
- Delay20ms();
- Delay20ms();
- Delay20ms();
- Delay20ms();
- }
- }
- //==============================================================
- if((key4Flag == 1)&(hour == clockHour)&(min == clockMin))
- {
- clockFlag = 1; //鬧鐘時間到
- InitLcd1602();
- LcdShowStr(0,0,table);
- LcdShowStr(0,0,"Time's up");
- DisplayHourTens();
- DisplayHourUnits();
- LcdShowStr(8,1,":");
- DisplayMinTens();
- DisplayMinUnits();
- LcdShowStr(11,1,":");
- DisplayClkSecUnits();
- DisplayClkSecTens();
- while(clockFlag == 1)
- {
- LED=!LED;
- Beep();
- ScanKey4();
- Delay20ms();
- ScanKey4();
- Delay20ms();
- ScanKey4();
- Delay20ms();
- ScanKey4();
- Delay20ms();
- ScanKey4();
- Delay20ms();
- ScanKey4();
- Delay20ms();
- ScanKey4();
- Delay20ms();
- ScanKey4();
- Delay20ms();
- ScanKey4();
- beepNum++;
- if(beepNum == 20)
- {
- clockFlag = 0;
- beepNum = 0;
- key4Flag = 0;
- LED=1;
- }
- }
- }
- }
- }
- void Timer0() interrupt 1
- {
- temp++;
- if(temp == 20)
- {
- sec++;
- temp = 0;
- }
- TH0 = (65536 - 50000) / 256;
- TL0 = (65536 - 50000) % 256;
- }
- void Timer1() interrupt 3
- {
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- }
復制代碼 |