在此附程序源码,希望帮助到由需要的小伙伴!
单片机源程序如下:
- #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)
|