在此附程序源碼,希望幫助到由需要的小伙伴!
單片機源程序如下:
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit sclk = P1^2; //ds1302時鐘脈沖引腳
- sbit dio = P1^1; //ds1302輸入引腳
- sbit ce = P1^0; //ds1302片選引腳
- sbit beep = P1^7; //蜂鳴器引腳
- // 顯示部分引腳定義
- sbit din = P2^6; // 串行數據輸出,接CH451的數據輸入
- sbit load=P3^3; //串行命令加載,上升延激活
- sbit dout=P2^7; //INT1,鍵盤中斷和鍵值數據輸入,接CH451的數據輸出
- sbit dclk = P2^5; //串行數據時鐘上升延激活
- //ch452命令定義
- #define CH452_RESET 0x0201 // 復位
- #define CH452_SYSOFF 0x0400 // 關閉顯示、關閉鍵盤
- #define CH452_SYSON1 0x0401 // 開啟顯示
- #define CH452_SYSON2 0x0403 // 開啟顯示、鍵盤
- #define CH452_DIG4 0x0c00 // 數碼管位4顯示,需另加8位數據
- #define CH452_DIG5 0x0d00 // 數碼管位5顯示,需另加8位數據
- #define CH452_DIG6 0x0e00 // 數碼管位6顯示,需另加8位數據
- #define CH452_DIG7 0x0f00 // 數碼管位7顯示,需另加8位數據
- #define h 12
- #define m 0
- #define s 0
- unsigned char code number[]={0xbd,0x18,0xd5,0xd9,0x78,0xe9,0xed,0x98,0xfd,0xf9};
- //鍵盤部分
- uchar keycode,b,d,z,zz;
- //按鍵延時部分
- void Delay200ms() //@11.0592MHz
- {
- unsigned char i, j, k;
- _nop_();
- _nop_();
- i = 7;
- j = 78;
- k = 167;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=120;y>0;y--);
- }
- void CH452_Read(void)
- { uchar cmd1;
- uint i,j;
- cmd1=0x07; //讀按鍵的命令字
- load=0;
- for(i=0;i!=4;i++) // 只需要發出高4位,多發也可以,但應該確保最后留下的4位是該命令碼
- {
- din=cmd1&1;
- dclk=0;
- cmd1>>=1; //往右移一位
- dclk=1; //產生時鐘上升沿鎖通知CH451輸入位數據
- }
- load=1; //產生加載上升沿通知CH451處理命令數據
- for(j=0;j<100;j++){ }
- keycode=0; //清除keycode
- for(i=0;i!=7;i++)
- {
- keycode<<=1; //數據移入keycode,高位在前,低位在后
- if (dout)
- { keycode++;} //從高到低讀入451的數據
- // keycode|=CH452_DOUT;
- dclk=0; //產生時鐘下升沿通知CH451輸出下一位
- dclk=1;
- }
- }
- // ch452寫程序
- void ch451_write(uint command)
- {
- char i;
- load=0;
- for(i=0;i<12;i++){ //送入12位數據,低位在前
- din = command&1;
- dclk =0;
- command>>=1;
- dclk=1; //上升沿有效
- }
- load=1;
- }
- //顯示程序
- void display1(uchar minute10,minute,second10,second)
- {
- ch451_write(CH452_DIG4 | number[minute10]);
- ch451_write(CH452_DIG5 | number[minute]|0x02);
- ch451_write(CH452_DIG6 | number[second10]);
- ch451_write(CH452_DIG7 | number[second]);
- }
- //顯示程序
- void display2(uchar z,zz,nian10,nian)
- {
- ch451_write(CH452_DIG4 | 0);
- ch451_write(CH452_DIG5 | 0);
- ch451_write(CH452_DIG6 | number[nian10]);
- ch451_write(CH452_DIG7 | number[nian]);
- }
- //顯示程序
- void display3(uchar yue10,yue,ri10,ri)
- {
- ch451_write(CH452_DIG4 | number[yue10]);
- ch451_write(CH452_DIG5 | number[yue]);
- ch451_write(CH452_DIG6 | number[ri10]);
- ch451_write(CH452_DIG7 | number[ri]);
- }
- //ds1302時序部分程序
- void write_1302(uchar add,dat)//寫數據 add 是addres 地址 dat 是數據
- {
- uchar i,temp;
- temp=add; // 把add地址給 temp
- ce=0;
- _nop_();
- sclk=0;
- _nop_();
- ce=1;
- _nop_();
- for(i=0;i<8;i++)
- {
- sclk=0;
- _nop_();
- if((temp&0x01)==0x01)// 剛才把地址給了temp 現在和1與然后一位一位的給dio 前面定義了dio是引腳
- dio=1;
- else
- dio=0;
- temp>>=1;
- sclk=1;
- _nop_();
- }
- temp=dat;
- for(i=0;i<8;i++)
- {
- sclk=0;
- _nop_();
- if((temp&0x01)==0x01)
- dio=1;
- else
- dio=0;
- temp>>=1;
- sclk=1;
- _nop_();
- }
- ce=0;
- sclk=0;
- }
- uchar read_1302(uchar add)// 讀數據
- {
- uchar dat,dat1,i,temp;
- temp=add;
- ce=0;
- _nop_();
- sclk=0;
- _nop_();
- ce=1;
- for(i=0;i<8;i++)
- {
- sclk=0;
- _nop_();
- if((temp&0x01)==0x01)
- dio=1;
- else
- dio=0;
- temp>>=1;
- sclk=1;
- _nop_();
- }
- for(i=0;i<8;i++)
- {
- sclk=0;
- _nop_();
- if(dio)
- dat|=0x80;
- if(i<7)
- dat>>=1;
- sclk=1;
- }
- dat1=dat/16;
- dat=dat%16;
- dat=dat1*10+dat;
- ce=0;
- sclk=0;
- return dat;
- }
- //數字調整
- uint tiaozheng ( uint Q){
- uint a;
- a = Q;
- if(Q>15) {
- a=a+6;
- }
- if(Q>25) {
- a=a+6;
- }
- if(Q>35) {
- a=a+6;
- }
- if(Q>45) {
- a=a+6;
- }
- if(Q>55) {
- a=a+6;
- }
- return a;
- }
- //主函數部分
- void main()
- {
- unsigned int minute;
- unsigned int second;
- unsigned int shi;
- unsigned int ri;
- unsigned int yue;
- unsigned int nian;
- b=0;
- d=0;
- ch451_write(CH452_RESET); // 開啟顯示
- ch451_write(CH452_SYSON2); // 開啟顯示
- write_1302(0x8e,0x00); //開寫保護
- write_1302(0xc0,0xfe);
- write_1302(0xc2,0xff);
- write_1302(0x80,0x30); //秒寫入 (地址+數據)
- write_1302(0x82,0x59); //分寫入
- write_1302(0x84,0x11); //時寫入
- write_1302(0x86,0x11); //日寫入
- write_1302(0x88,0x01); //月寫入
- write_1302(0x8c,0x18); //年寫入
- write_1302(0x8e,0x80); //關寫保護
- display3(1,5,0,3);
- while(1){
- write_1302(0x8e,0x00); //開寫保護
- second=read_1302(0x81); //讀秒
- minute=read_1302(0x83); //讀分鐘
- shi=read_1302(0x85); //讀小時
- ri=read_1302(0x87); //讀日
- yue=read_1302(0x89); //讀月
- nian=read_1302(0x8d); //讀年
- write_1302(0x8e,0x80); //關寫保護
- CH452_Read();
- //功能鍵作用
- if(keycode==0x4c){
- Delay200ms();
- CH452_Read();
- if(keycode==0x4c){
- b++;
- if (b==7){
- b=0;
- }
- }
- }
- if(keycode==0x4f){
- Delay200ms();
- CH452_Read();
- if(keycode==0x4f){
- d++;
- if (d==7){
- d=0;
- }
- }
- }
- if (keycode==0x44){
- Delay200ms();
- CH452_Read();
- if (keycode==0x44){
- display2(0,0,nian/10,nian%10);
- b=0;
- }
- }
- if (keycode==0x45){
- Delay200ms();
- CH452_Read();
- if (keycode==0x45){
- display1(yue/10,yue%10,ri/10,ri%10);
- b=0;
- }
- }
- if (keycode==0x46){
- Delay200ms();
- CH452_Read();
- if (keycode==0x46){
- display1(shi/10,shi%10,minute/10,minute%10);
- b=0;
- }
- }
- if (keycode==0x47){
- Delay200ms();
- CH452_Read();
- if (keycode==0x47){
- display1(0,0,second/10,second%10);
- b=6;
- }
- }
- if(b==1){
- display2(0,0,nian/10,nian%10);
- }
- if(b==2){
- display2(0,0,yue/10,yue%10);
- }
- if(b==3){
- display2(0,0,ri/10,ri%10);
- }
- if(b==4){
- display2(0,0,shi/10,shi%10);
- }
- if(b==5){
- display2(0,0,minute/10,minute%10);
- }
- if(b==6){
- display2(0,0,second/10,second%10);
- }
- //選擇加減鍵
- //加減年
- if(d==1){
- CH452_Read();
- if (keycode==0x4d){
- Delay200ms();
- CH452_Read();
- if (keycode==0x4d){
- nian++;
- nian = tiaozheng(nian);
- write_1302(0x8e,0x00);//開寫保護
- write_1302(0x8c,nian); //年寫入
- write_1302(0x8e,0x80);//關寫保護
- write_1302(0x8e,0x00);//開寫保護
- nian=read_1302(0x8d); //讀年
- write_1302(0x8e,0x80);//關寫保護
- display2(0,0,nian/10,nian%10);
- b=1;
- }
-
- }
- if(d==1){
- CH452_Read();
- if (keycode==0x4e){
- Delay200ms();
- CH452_Read();
- if (keycode==0x4e){
- nian--;
- nian = tiaozheng(nian);
- write_1302(0x8e,0x00);//開寫保護
- write_1302(0x8c,nian); //年寫入
- write_1302(0x8e,0x80);//關寫保護
- write_1302(0x8e,0x00);//開寫保護
- nian=read_1302(0x8d); //讀年
- write_1302(0x8e,0x80);//關寫保護
- display2(0,0,nian/10,nian%10);
- b=1;
- }
-
- }
- }
-
- }
- //加減月
- if(d==2){
- CH452_Read();
- if (keycode==0x4d){
- Delay200ms();
- CH452_Read();
- if (keycode==0x4d){
- yue++;
- write_1302(0x8e,0x00);//開寫保護
- write_1302(0x88,yue); //月寫入
- write_1302(0x8e,0x80);//關寫保護
- write_1302(0x8e,0x00);//開寫保護
- yue=read_1302(0x89); //讀月
- write_1302(0x8e,0x80);//關寫保護
- display2(0,0,yue/10,yue%10);
- b=2;
- }
-
- }
- if(d==2){
- CH452_Read();
- if (keycode==0x4e){
- Delay200ms();
- CH452_Read();
- if (keycode==0x4e){
- yue--;
- yue = tiaozheng(yue);
- write_1302(0x8e,0x00);//開寫保護
- write_1302(0x88,yue); //月寫入
- write_1302(0x8e,0x80);//關寫保護
- write_1302(0x8e,0x00);//開寫保護
- yue=read_1302(0x89); //讀月
- write_1302(0x8e,0x80);//關寫保護
- display2(0,0,yue/10,yue%10);
- b=2;
- }
-
- }
- }
-
- }
- //加減日
- if(d==3){
- CH452_Read();
- if (keycode==0x4d){
- Delay200ms();
- CH452_Read();
- if (keycode==0x4d){
- ri++;
- ri = tiaozheng(ri);
- write_1302(0x8e,0x00);//開寫保護
- write_1302(0x86,ri); //日寫入
- write_1302(0x8e,0x80);//關寫保護
- write_1302(0x8e,0x00);//開寫保護
- ri=read_1302(0x87); //讀日
- write_1302(0x8e,0x80);//關寫保護
- display2(0,0,ri/10,ri%10);
- b=3;
- }
-
- }
- if(d==3){
- CH452_Read();
- if (keycode==0x4e){
- Delay200ms();
- CH452_Read();
- if (keycode==0x4e){
- ri--;
- ri = tiaozheng(ri);
- write_1302(0x8e,0x00);//開寫保護
- write_1302(0x86,ri); //日寫入
- write_1302(0x8e,0x80);//關寫保護
- write_1302(0x8e,0x00);//開寫保護
- ri=read_1302(0x87); //讀日
- write_1302(0x8e,0x80);//關寫保護
- display2(0,0,ri/10,ri%10);
- b=3;
- }
-
- }
- }
-
- }
- //加減小時
- if(d==4){
- CH452_Read();
- if (keycode==0x4d){
- Delay200ms();
- CH452_Read();
- if (keycode==0x4d){
- shi++;
- shi = tiaozheng(shi);
- write_1302(0x8e,0x00);//開寫保護
- write_1302(0x84,shi); //小時寫入
- write_1302(0x8e,0x80);//關寫保護
- write_1302(0x8e,0x00);//開寫保護
- shi=read_1302(0x85); //讀小時
- write_1302(0x8e,0x80);//關寫保護
- display2(0,0,shi/10,shi%10);
- b=4;
- }
-
- }
- if(d==4){
- CH452_Read();
- if (keycode==0x4e){
- Delay200ms();
- CH452_Read();
- if (keycode==0x4e){
- shi--;
- shi = tiaozheng(shi);
- write_1302(0x8e,0x00);//開寫保護
- write_1302(0x84,shi); //小時寫入
- write_1302(0x8e,0x80);//關寫保護
- write_1302(0x8e,0x00);//開寫保護
- shi=read_1302(0x85); //讀小時
- write_1302(0x8e,0x80);//關寫保護
- display2(0,0,shi/10,shi%10);
- b=4;
- }
-
- }
- }
-
- }
- //加減分鐘
- if(d==5){
- CH452_Read();
- if (keycode==0x4d){
- Delay200ms();
- CH452_Read();
- if (keycode==0x4d){
- minute++;
- minute = tiaozheng(minute);
- write_1302(0x8e,0x00);//開寫保護
- write_1302(0x82,minute); //分寫入
- write_1302(0x8e,0x80);//關寫保護
- write_1302(0x8e,0x00);//開寫保護
- minute=read_1302(0x83); //讀分
- write_1302(0x8e,0x80);//關寫保護
- display2(0,0,minute/10,minute%10);
- b=5;
- }
-
- }
- if(d==5){
- CH452_Read();
- if (keycode==0x4e){
- Delay200ms();
- CH452_Read();
- if (keycode==0x4e){
- minute--;
- minute = tiaozheng(minute);
- write_1302(0x8e,0x00);//開寫保護
- write_1302(0x82,minute); //分寫入
- write_1302(0x8e,0x80);//關寫保護
- write_1302(0x8e,0x00);//開寫保護
- minute=read_1302(0x83); //讀分
- write_1302(0x8e,0x80);//關寫保護
- display2(0,0,minute/10,minute%10);
- b=5;
- }
- }
- }
- }
- //加減秒
- if(d==5){
- CH452_Read();
- if (keycode==0x4d){
- Delay200ms();
- CH452_Read();
- if (keycode==0x4d){
- second++;
- second = tiaozheng(second);
- write_1302(0x8e,0x00);//開寫保護
- write_1302(0x80,second); //秒寫入
- write_1302(0x8e,0x80);//關寫保護
- write_1302(0x8e,0x00);//開寫保護
- second=read_1302(0x81); //讀秒
- write_1302(0x8e,0x80);//關寫保護
- display2(0,0,second/10,second%10);
- b=6;
- }
-
- }
- if(d==5){
- CH452_Read();
- if (keycode==0x4e){
- Delay200ms();
- CH452_Read();
- if (keycode==0x4e){
- second--;
- second = tiaozheng(second);
- write_1302(0x8e,0x00);//開寫保護
- write_1302(0x80,second); //秒寫入
- write_1302(0x8e,0x80);//關寫保護
- write_1302(0x8e,0x00);//開寫保護
- second=read_1302(0x81); //讀秒
- write_1302(0x8e,0x80);//關寫保護
- display2(0,0,second/10,second%10);
- b=6;
- }
- }
- }
- }
- //蜂鳴器部分
- if(h==shi){
- if (m==minute){
- if (second==s){
- beep = 0;
- Delay200ms();
- beep = 1;
- }
- }
- }
-
- }//while結束
- }//main結束
-
復制代碼
所有資料51hei提供下載:
A最終程序.rar
(41.94 KB, 下載次數: 23)
2018-12-25 15:44 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|