幫一個朋友做程序,也是學習吧。哈哈,直接上代碼,驅動部分也是在51HEI學習的。
制作出來的實物圖如下:
單片機源程序如下:
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sfr P4 = 0xc0; //I/O端口4 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
- //位描述 P4.7 P4.6 P4.5 P4.4 P4.3 P4.2 P4.1 P4.0
- //初始值=1111,1111 1 1 1 1 1 1 1 1
- sbit P47 = P4^7; //I/O口P4.7
- sbit P46 = P4^6; //I/O口P4.6
- sbit P45 = P4^5; //I/O口P4.5
- sbit P44 = P4^4; //I/O口P4.4
- sbit P43 = P4^3; //I/O口P4.3
- sbit P42 = P4^2; //I/O口P4.2
- sbit P41 = P4^1; //I/O口P4.1
- sbit P40 = P4^0; //I/O口P4.0
- sbit RST = P4^7; //復位腳,可通過編程器設置
- sbit EX_LVD = P4^6; //外部低壓檢測引腳
- sbit P4SPISCLK = P4^3; //SPI總線的時鐘腳
- sbit P4SPIMISO = P4^2; //SPI總線的主出從入腳
- sbit P4SPIMOSI = P4^1; //SPI總線的主入從出腳
- sbit P4SPISS = P4^0; //SPI總線的從機選擇腳
- sbit P4CEX1 = P4^3; //比較/捕獲/PWM1外部引腳
- sbit P4CEX0 = P4^2; //比較/捕獲/PWM0外部引腳
- sbit P4ECI = P4^1; //比較/捕獲/PWM模塊的外部時鐘輸入腳(最大值為Fosc/2)
- sbit P4TXD2 = P4^3; //串口2數據輸出腳
- sbit P4RXD2 = P4^2; //串口2數據輸入腳
- sfr P4SW = 0xbb; //P4口的功能開關 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
- //位描述 - LVD_P4.6 ALE_P4.5 NA_P4.4 - - - -
- //初始值=x000,xxxx x 0 0 0 x x x x
- #define P46EN 0x40 //傳統的EA腳 0:為LVD的信號引入腳 1:為P4.6
- #define P45EN 0x20 //傳統的ALE腳 0:仍為ALE 1:為P4.5
- #define P44EN 0x10 //傳統的PSEN腳 0:無任何功能 1:為P4.4
- sbit P2_0 = P2^0;
- sbit P2_1 = P2^1;
- sbit P2_2 = P2^2;
- sbit P2_3 = P2^3;
- #define Ds_Bus P0
- #define smgp1 P1
- sbit DS_CS = P2^6;
- sbit DS_AS = P4^5;
- sbit DS_RW = P3^6;
- sbit DS_DS = P3^7;
- uchar count,shi,fen,miao,s1num,week=0,i,day=1,yue=1,year1=0,year2,year3,year4;
- uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
- 0xf8,0x80,0x90};
- void delay(uchar i)
- {
- uchar j,k;
- for(j=i;j>0;j--)
- for(k=125;k>0;k--);
- }
-
- //往DS12CR887寫數據函數,add=地址,date=數據。
- void ds_write(uchar add,uchar date)
- {
- DS_CS=0; DS_DS=1; DS_RW=1; DS_AS=1;
- Ds_Bus=add;
- DS_AS=0; DS_RW=0;
- Ds_Bus=date;
- DS_RW=1; DS_AS=1; DS_CS=1;
- }
- //讀取DS12CR887的數據函數
- uchar ds_read(uchar add)
- {
- uchar z;
- DS_AS=1; DS_DS=1;DS_RW=1;DS_CS=0;
- Ds_Bus=add;
- DS_AS=0; DS_DS=0;
- Ds_Bus=0xff;
- z=Ds_Bus;
- DS_DS=1; DS_AS=1; DS_CS=1;
- return z;
- }
- //DS12CR887初始化函數
- void ds_int()
- {
- DS_AS=0; DS_DS=0; DS_RW=0;
- ds_write(0x0a,0x20);//DS12CR887寄存器A功能設置,開啟時鐘振蕩器
- ds_write(0x0b,0x06);//寄存器B功能設置,不開啟鬧鐘中斷使能,數據模式為二進制,24小時模式。
- }
- void display()
- {
- // P1=(table[minute%10]& 0x7f); //加0X7F,是一個小數點
- miao=ds_read(0); //讀取DS12CR887的秒
- //write1632GDRAM(7,2,num1632[sec/10]);
- // write1632GDRAM(8,2,num1632[sec%10]);
- // miao=ds_read(0);
- smgp1=(table[miao/10]);
- P2_0 = 0;
- delay(5);
- P2_0 = 1;
- smgp1=(table[miao%10]& 0x7f);
- P2_1 = 0;
- delay(5);
- P2_1 = 1;
- fen=ds_read(2);
- smgp1=table[fen/10];
- P2_2 = 0;
- delay(5);
- P2_2 = 1;
- smgp1=table[fen%10];
- P2_3 = 0;
- delay(5);
- P2_3 = 1;
-
- }
- /*演示主程序*/
- void main(void)
- {
- unsigned int a;
-
- ds_int(); //時鐘芯片初始化
- while(1)
- {
-
- for(a=100;a>0;a--)
- {
- display();
- }
-
- }
- }
復制代碼 |