|
- #include<reg52.h>
- #include<intrins.h>
- #define MAIN_Fosc 11059200UL
- /*自定義類型明*/
- typedef unsigned char INT8U;
- typedef unsigned char uchar;
- typedef unsigned int INT16U;
- typedef unsigned int uint;
- /*聲明硬件的接口*/
- sbit TSCLK = P1^0;//時(shí)鐘線
- sbit TIO = P1^1; //數(shù)據(jù)線
- sbit TRST = P1^2; //使能端
- sbit DU = P2^6;//段選
- sbit WE = P2^7;//位選
- /*共陽極數(shù)碼管段選碼*/
- uchar code table[]={
- // 0 1 2 3 4 5
- 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92,
- // 6 7 8 9 . 關(guān)顯示
- 0x82, 0xf8, 0x80, 0x90, 0x7f, 0xff
- };
- /*位選碼*/
- uchar code T_COM[] = {
- //1 2 3 4 5 6
- 0x01, 0x02, 0x04, 0x08, 0x10, 0x20
- };
- /*延時(shí)函數(shù)*/
- void Delay_Ms(INT16U ms)
- {
- INT16U i;
- do{
- i = MAIN_Fosc/96000;
- while(--i);
- }while(--ms);
- }
- /*顯示函數(shù)*/
- void Display(uchar Hour,Min,Sec)
- {
- //第一位數(shù)碼管 小時(shí)十位
- DU = 0;
- P0 = table[Hour/10];
- DU = 1;
- DU = 0;
- WE = 0;
- P0 = T_COM[0];
- WE = 1;
- WE = 0;
- Delay_Ms(3);
- //第二位數(shù)碼管 小時(shí)個(gè)位
- DU = 0;
- P0 = table[Hour%10] | 0x7f;// 0111 1111 顯示小數(shù)點(diǎn)
- DU = 1;
- DU = 0;
- WE = 0;
- P0 = T_COM[1];
- WE = 1;
- WE = 0;
- Delay_Ms(3);
- //第三位數(shù)碼管
- DU = 0;
- P0 = table[Min/10];
- DU = 1;
- DU = 0;
- WE = 0;
- P0 = T_COM[2];
- WE = 1;
- WE = 0;
- Delay_Ms(3);
- //第四位數(shù)碼管
- DU = 0;
- P0 = table[Min%10] | 0x7f;
- DU = 1;
- DU = 0;
- WE = 0;
- P0 = T_COM[3];
- WE = 1;
- WE = 0;
- Delay_Ms(3);
- //第五位數(shù)碼管
- DU = 0;
- P0 = table[Sec/10];
- DU = 1;
- DU = 0;
-
- WE = 0;
- P0 = T_COM[4];
- WE = 1;
- WE = 0;
- Delay_Ms(3);
- //第六位數(shù)碼管
- DU = 0;
- P0 = table[Sec%10];
- DU = 1;
- DU = 0;
- WE = 0;
- P0 = T_COM[5];
- WE = 1;
- WE = 0;
- Delay_Ms(3);
- }
- //寫DS1302
- void Writer_DS1302_DAT(uchar cmd,uchar dat) //命令和數(shù)據(jù)需要給出
- {
- uchar i;
- TRST = 0;
- TSCLK = 0;
- TRST = 1;
- for(i = 0; i < 8; i++)
- {
- TSCLK = 0;
- TIO = cmd & 0x01;
- TSCLK = 1;//拉高時(shí)鐘總線接收數(shù)據(jù)
- dat >>= 1;//右移一位 往最低位移 左移往最高位移 從低位開始發(fā)送 需右移 把八位數(shù)據(jù)出 從高位發(fā)送需左移
- }
- for(i = 0; i < 8; i++)
- {
- TSCLK = 0;
- TIO = dat & 0x01;
- TSCLK = 1;
- dat >>= 1;
- }
- }
- //讀DS1302數(shù)據(jù)
- uchar Read_DS1302_DAT(uchar cmd)
- {
- uchar i, dat;
- TRST = 0;
- TSCLK = 0;
- TRST = 1;
- for(i = 0;i < 8; i++)// 寫入命令
- {
- TSCLK = 0;
- TIO = cmd & 0x01;
- TSCLK = 1;
- dat >>= 1; //
- }
- for(i = 0; i < 8 ; i++)// 讀八次
- {
- TSCLK = 0;
- dat >>= 1;
- if(TIO) dat |= 0x80;
- TSCLK = 1;
- }
- return dat;
- }
- //數(shù)據(jù)轉(zhuǎn)BCD
- uchar Dat_Chg_BCD(uchar dat)
- {
- uchar dat1,dat2;
- dat1 = dat / 10;
- dat2 = dat % 10;
- dat2 = dat2 + dat1 * 16;
- return dat2;
- }
- //BCD轉(zhuǎn)數(shù)據(jù)
- uchar BCD_Chg_Dat(uchar dat)
- {
- uchar dat1,dat2;
- dat1 = dat / 16;
- dat2 = dat % 16;
- dat2 = dat2 + dat1 * 10;
- return dat2;
- }
- void main()
- {
- uchar i;
- uchar Sec,Min,Hour;
- Writer_DS1302_DAT(0x8e, 0);
- Writer_DS1302_DAT(0x80,Dat_Chg_BCD(30));
- Writer_DS1302_DAT(0x82,Dat_Chg_BCD(15));
- Writer_DS1302_DAT(0x84,Dat_Chg_BCD(19));
- Writer_DS1302_DAT(0x8e,0x80);
- while(1)
- {
- Writer_DS1302_DAT(0x8e,0);
- Sec = BCD_Chg_Dat(Read_DS1302_DAT(0x81));
- Min = BCD_Chg_Dat(Read_DS1302_DAT(0x83));
- Hour = BCD_Chg_Dat(Read_DS1302_DAT(0x85));
- Writer_DS1302_DAT(0x8e,0x80);
- for(i = 0;i < 50; i++)
- {
- Display(Hour,Min,Sec);
- }
- }
- }
復(fù)制代碼
為什么仿真的時(shí)候 數(shù)碼管顯示數(shù)字很亂 |
-
捕獲3.PNG
(59.75 KB, 下載次數(shù): 46)
下載附件
2018-7-24 14:25 上傳
|