|
SM8952A c51仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (16.41 KB, 下載次數(shù): 53)
下載附件
2018-8-8 02:26 上傳
單片機源程序如下:
- /*calendar.c文件的功能是通過定時器實現(xiàn)日歷功能,具體描述如下:
- 1:實現(xiàn)通過按鍵調(diào)整時間;
- 2:可以實現(xiàn)24小時制和12小時制切換
- 程序創(chuàng)建人 黨羽
- 創(chuàng)建時間 2017-3-17
- */
- #include <reg51.h>
- #include <intrins.h>
- #include <string.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define DelayNOP() {_nop_();_nop_();_nop_();_nop_();}
- sbit K1 = P1^0; //設(shè)置年月日星期
- sbit K2 = P1^1; //設(shè)置時分秒
- sbit K3 = P1^2; //增加
- sbit K4 = P1^3; //減少
- sbit K5 = P1^4; //12小時制和24小時制
- sbit K6 = P1^5; //確定
- sbit SPK = P3^0; //蜂鳴器
- sbit LCD_RS = P2^0;
- sbit LCD_RW = P2^1;
- sbit LCD_EN = P2^2;
- bit LCD_Busy_Check(); //LCD忙檢測
- void LCD_Initialize(); //初始化
- void LCD_Set_POS(uchar); //設(shè)置位置
- void LCD_Write_Command(uchar); //寫命令
- void LCD_Write_Data(uchar); //寫數(shù)據(jù)函數(shù)
- uchar *WEEK[] = {"SUN", "***", "MON", "TUS", "WEN", "THU", "FRI", "SAT"};
- uchar YMD_String[] = {" 00-00-00 "}; //待顯示的年月日字符串
- uchar HMSam_String[] = "am 00:00:00"; //待顯示的12小時制am時間字符串
- uchar HMSpm_String[] = "pm 00:00:00"; //待顯示的12小時制pm時間字符串
- uchar HMS24_String[] = " 00:00:00 "; //待顯示的24小時制時間字符串
- /*0表示不修改1表示修改*/
- bit Settime = 0; //是否修改時間
- /*待顯示的年月日時分秒的默認(rèn)值*/
- uchar MilliSecond =0;
- uchar idata FlashLcd = 0;
- uchar Hour = 0;
- uchar Minute = 0;
- uchar Second = 0;
- uchar Year = 17;
- uchar Month = 1;
- uchar Day = 1;
- uint i =0;
- /*按鍵計數(shù)
- K1按下1次即Change_Y_OR_MO_OR_D_OR_W =1 表示修改年
- K1按下2次即Change_Y_OR_MO_OR_D_OR_W =2 表示修改月
- K1按下3次即Change_Y_OR_MO_OR_D_OR_W =3 表示修改日
- K1按下4次即Change_Y_OR_MO_OR_D_OR_W =4 表示修改星期
- K2按下1次即Change_H_OR_M =1 表示修改時
- K2按下2次即Change_H_OR_M =2 表示修改分
- */
- uint Change_Y_OR_MO_OR_D_OR_W =0,Change_H_OR_M = 0;
- //延時函數(shù)
- void DelayMS(uint x)
- {
- uchar i;
- while(x--)
- {
- for(i = 0; i < 120; i++);
- }
- }
- //LCD忙檢測函數(shù)
- bit LCD_Busy_Check()
- {
- bit LCD_Status;
- LCD_RS = 0;
- LCD_RW = 1;
- LCD_EN = 1;
- DelayMS(1);
- LCD_Status = P0 ;
- LCD_EN = 0;
- DelayMS(1);
- return LCD_Status;
- }
- //LCD忙等待函數(shù)
- void LCD_Busy_Wait()
- {
- while((LCD_Busy_Check() & 0x80) == 0x80);
- DelayMS(5);
- }
- //LCD寫命令函數(shù)
- void LCD_Write_Command(uchar cmd)
- {
- LCD_Busy_Wait();
- LCD_RS = 0;
- LCD_RW = 0;
- LCD_EN = 0;
- P0 = cmd;
- LCD_EN = 1;
- DelayMS(1);
- LCD_EN = 0;
- }
- //LCD寫數(shù)據(jù)函數(shù)
- void LCD_Write_Data(uchar str)
- {
- LCD_Busy_Wait();
- LCD_RS = 1;
- LCD_RW = 0;
- LCD_EN = 0;
- P0 = str;
- LCD_EN = 1;
- DelayMS(1);
- LCD_EN = 0;
- }
- //LCD初始化配置函數(shù)
- void LCD_Initialize()
- {
- LCD_Write_Command(0x38);
- DelayMS(1);
- LCD_Write_Command(0x0c);
- DelayMS(1);
- LCD_Write_Command(0x06);
- DelayMS(1);
- LCD_Write_Command(0x01);
- DelayMS(1);
- }
- //LCD坐標(biāo)設(shè)置函數(shù)
- void LCD_Set_POS(uchar Position)
- {
- LCD_Write_Command(Position | 0x80);
- }
- //LCD顯示數(shù)據(jù)函數(shù)
- void Display_String(uchar * str, uchar LineNo)
- {
- uchar k;
- LCD_Set_POS(LineNo);
- for(k = 0; k < 16; k++)
- {
- LCD_Write_Data(str[k]);
- DelayMS(1);
- }
- }
- //蜂鳴器控制函數(shù)
- void Beep()
- {
- uchar i,j = 70;
- for(i = 0; i < 200; i++)
- {
- while(--j);
- SPK = ~SPK;
- }
- DelayMS(300);
-
- SPK = 0;
- }
- void Format_DateTime(uchar d,uchar *a)
- {
- a[0] = d/10 +'0';
- a[1] = d%10 + '0';
- }
- //顯示時分秒函數(shù)
- void Display_HMS(uchar h, m, s)
- {
- if( K5 == 1 )
- {
- if(Settime) HMS24_String[3] = '>';
- else HMS24_String[3] = ' ';
- HMS24_String[4] = h/10 + '0';
- HMS24_String[5] = h%10 + '0';
- HMS24_String[7] = m/10 + '0';
- HMS24_String[8] = m%10 + '0';
- HMS24_String[10] = s/10 + '0';
- HMS24_String[11] = s%10 + '0';
- Display_String(HMS24_String,0x40);
- }
- else
- {
- if( h < 12 )
- {
- if(Settime) HMSam_String[3] = '>';
- else HMSam_String[3] = ' ';
- HMSam_String[4] = h/10 + '0';
- HMSam_String[5] = h%10 + '0';
- HMSam_String[7] = m/10 + '0';
- HMSam_String[8] = m%10 + '0';
- HMSam_String[10] = s/10 + '0';
- HMSam_String[11] = s%10 + '0';
- Display_String(HMSam_String,0x40);
- }
- else
- {
- h = h - 12 ;
- if(Settime) HMSpm_String[3] = '>';
- else HMSpm_String[3] = ' ';
- HMSpm_String[4] = h/10 + '0';
- HMSpm_String[5] = h%10 + '0';
- HMSpm_String[7] = m/10 + '0';
- HMSpm_String[8] = m%10 + '0';
- HMSpm_String[10] = s/10 + '0';
- HMSpm_String[11] = s%10 + '0';
- Display_String(HMSpm_String,0x40);
-
- }
- }
- }
- //顯示年月日星期函數(shù)
- void Display_YMDW(uchar y,m,d,i)
- {
- if(Settime) YMD_String[0] = '>';
- else YMD_String[0] = ' ';
- Format_DateTime(y,YMD_String+2);
- Format_DateTime(m,YMD_String+5);
- Format_DateTime(d,YMD_String+8);
- strcpy(YMD_String + 11,WEEK[i]);
- Display_String(YMD_String,0x00);
- }
- //調(diào)整時間函數(shù)
- void Change_Time()
- {
- Settime = 0;
- if( K1 == 0 || K2 == 0 )
- {
- TR0 = 0;
- Settime = 1;
- }
- while(Settime)
- {
- while(K1 == 0)
- {
- Beep();
- while(K1 == 0);
- Change_Y_OR_MO_OR_D_OR_W++;
- K1 = 1;
- }
- while(K2 == 0)
- {
- Beep();
- while(K2 == 0);
- Change_H_OR_M++;
- K2 = 1;
- }
-
- if(K3 == 0 )
- {
- Beep();
- while( K3 == 0);
- switch(Change_Y_OR_MO_OR_D_OR_W)
- {
- case 1:
- ++Year;
- break;
- case 2:
- {if (++Month >= 13) Month = 1;}
- break;
- case 3:
- {if (++Day >= 31) Day = 1;}
- break;
- case 4:
- {if (++i >= 8) i = 0;}
- break;
- }
- switch(Change_H_OR_M)
- {
- case 1:
- {if (++Hour >= 24) Hour = 0;}
- break;
- case 2:
- {if (++Minute >= 59) Minute = 0;}
- break;
- }
- }
- else if(K4 == 0)
- {
- Beep();
- while(K4 == 0);
- switch(Change_Y_OR_MO_OR_D_OR_W)
- {
- case 1:
- --Year;
- break;
- case 2:
- {if (--Month == 0x00) Month = 12;}
- break;
- case 3:
- {if (--Day == 0x00) Day = 31;}
- break;
- case 4:
- {if (--i == 0xff) i = 0;}
- break;
- }
- switch(Change_H_OR_M)
- {
- case 1:
- {if (--Hour == 0xff) Hour = 23;}
- break;
- case 2:
- {if (--Minute == 0xff) Minute = 59;}
- break;
- }
- }
- else if(K6 == 0)
- {
- Beep();
- while( K6 == 0);
- Settime = 0;
- TR0 = 1;
- }
- Display_HMS(Hour,Minute,Second);
- Display_YMDW(Year,Month,Day,i);
- }
- }
- //定時器0中斷
- void Time0() interrupt 1
- {
- TH0 = (65536 - 50000) / 256;
- TL0 = (65536 - 50000) % 256;
- if( ++MilliSecond == 20)
- {
- MilliSecond = 0;
- if( ++Second == 60)
- {
- Second = 0;
- if( ++Minute == 60)
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
0.png (8.44 KB, 下載次數(shù): 63)
下載附件
2018-8-8 02:27 上傳
所有資料51hei提供下載:
case 1.rar
(55.49 KB, 下載次數(shù): 50)
2018-8-7 13:27 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|