久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4498|回復(fù): 1
收起左側(cè)

msp430g2331 ds1302時(shí)鐘模塊

[復(fù)制鏈接]
ID:110653 發(fā)表于 2016-3-30 17:21 | 顯示全部樓層 |閱讀模式
     手上有塊ds1302時(shí)鐘模塊,也有些數(shù)碼管,于是試著做了個(gè)時(shí)鐘,當(dāng)然因?yàn)槭鞘止ぃ詻]有淘寶上買的好看,當(dāng)然自己做的成本也高,所以無法相比,只是作為一種學(xué)習(xí)方式。做著送人了,所以照片只有一張,也沒有顯示。
20150913134609_62391.jpg         這是我用手機(jī)拍的,只有一張,沒有多拍幾張,樣子太丑了,沒有淘寶上做的美觀,被同學(xué)批了一頓。
  程序很簡(jiǎn)單,不是很占用空間,io資源,所以只用了msp430g2231,我后來想用xin,xout做io口時(shí),發(fā)現(xiàn)不行,所以就只用了8個(gè)io口。
數(shù)碼管直接顯示年月日小時(shí),分鐘,秒,星期,每30秒刷新一次。用hc164做片選數(shù)碼管斷碼顯示芯片。

部分程序預(yù)覽:
  1. #include"io430.h"
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define ulong unsigned long
  5. #define CLK0  P1OUT&=~BIT6
  6. #define CLK1   P1OUT|=BIT6
  7. #define CPU_F ((double)1000000)   //外部高頻晶振16MHZ
  8. //#define CPU_F ((double)32768)   //外部低頻晶振32.768KHZ
  9. #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
  10. #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))


  11. unsigned char const code_hex[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x39,0x79,0x0e,0x3e,0x00};//0,1,2,3,4,5,6,7,8,9,c,e,j,u, ,
  12. uchar t,t1,t2,t3;
  13. uchar dis_play[4];


  14. //數(shù)碼管顯示函數(shù)

  15. void extern_16m()
  16. {
  17.   WDTCTL = WDTPW + WDTHOLD;
  18.     if (CALBC1_1MHZ == 0xFF || CALDCO_1MHZ == 0xFF)
  19.         {
  20.                 while(1);                // If calibration constants erased, trap CPU!!
  21.         }
  22. DCOCTL |= DCO0 + DCO1+DCO2;                                                                   //SMCLK選擇LFXT1CLK
  23. // BCSCTL2 |= SELM_0;//MCLK采用1M的內(nèi)部DCO   
  24. // BCSCTL2 |= DIVS_0;//SMCLK采用內(nèi)部的時(shí)鐘


  25. }

  26. void hc164_init()
  27. {
  28.   P1DIR |=BIT6+BIT7+BIT0+BIT1+BIT2+BIT3;                            // P1.0 output
  29.   
  30. }

  31. void sendbyte(uchar byte)
  32. {            
  33. uchar c,num;   
  34. num=byte;
  35. for(c=0;c<8;c++)        
  36. {     
  37. P1OUT&=~0x80;
  38. CLK0;   
  39. P1OUT|=num&0x80; //(0x80即十進(jìn)制的128, 二進(jìn)制的10000000 按位發(fā)送
  40. CLK1;         
  41. num<<=1;   
  42. }
  43. }


  44. void send_char(uchar weizhi,uchar byte)
  45. {
  46.   
  47.   P1OUT |= 0x0f;   
  48.   uchar c,send_byte;
  49.   send_byte=code_hex[byte];
  50. //  if((weizhi==0)&&(xianshi_flag==0))
  51. //   send_byte|=0x80;
  52.   sendbyte(send_byte);
  53.   c=weizhi&0x03;
  54.   P1OUT&=~(1<<c);
  55. }



  56. void init_TA()
  57. {

  58.   TACCR0 = 1000;                            //8ms中斷一次
  59.   TACTL = TASSEL_2 + MC_1+ID_3;              // SMCLK, upmode,8分頻,
  60.   TACCTL0 = CCIE;                           // TACCR0 interrupt enabled
  61. }


  62. void shumaguan()
  63. {
  64.    ++t;
  65. if(t>=4)
  66.    t=0;
  67.   send_char(t,dis_play[t]);
  68. }




  69. ////時(shí)鐘模塊
  70. #define DS1302_DIR  P1DIR
  71. #define DS1302_IN    P1IN
  72. #define DS1302_OUT  P1OUT

  73. #define DS1302_RST  BIT7
  74. #define DS1302_SCLK  BIT4
  75. #define DS1302_SDI  BIT5  //定義MSP320的端口

  76. #define DS1302_RST_LO  DS1302_OUT &= ~DS1302_RST
  77. #define DS1302_RST_HI  DS1302_OUT |= DS1302_RST
  78. #define DS1302_SCLK_LO  DS1302_OUT &= ~DS1302_SCLK
  79. #define DS1302_SCLK_HI  DS1302_OUT |= DS1302_SCLK
  80. #define DS1302_SDI_LO  DS1302_OUT &= ~DS1302_SDI
  81. #define DS1302_SDI_HI  DS1302_OUT |= DS1302_SDI


  82. void DS1302_Reset(void);
  83. void DS1302_WriteOneByte(unsigned char w_dat);
  84. void DS1302_WriteData(unsigned char addr,unsigned char w_dat);
  85. void DS1302_SettingData(void);
  86. void DS1302_GetData(unsigned char *str);
  87. unsigned char DS1302_ReadOneByte(void);
  88. unsigned char DS1302_ReadData(unsigned char addr);

  89. unsigned char Setting_Time[7]={ //bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
  90. 0x15,    //--------十位-------|-------個(gè)位--------|年份(當(dāng)前07年)
  91. 0x04,    //                        |-----個(gè)位-----|星期(當(dāng)前周日)
  92. 0x09,    //              |十位|-------個(gè)位--------|月份(當(dāng)前07月)
  93. 0x10,    //         |--十位---|-------個(gè)位--------|日期(當(dāng)前01號(hào))
  94. 0x13,    //-12H|    |--十位---|-------個(gè)位--------|小時(shí)(當(dāng)前18點(diǎn))
  95. 0x00,    //    |-----十位-----|-------個(gè)位--------|分鐘(當(dāng)前20分)
  96. 0x21    //    |-----十位-----|-------個(gè)位--------|秒鐘(當(dāng)前30秒)
  97. };
  98. unsigned char ReadingData[7];  //讀出來的數(shù)據(jù),同SettingData定義與格式

  99. /****************************
  100. void main(void) {
  101. WDTCTL = WDTPW + WDTHOLD;
  102. DS1302_Reset();
  103. //DS1302_SettingData();
  104. while(1){
  105.   DS1302_GetData(ReadingData);
  106.   _NOP();
  107. };
  108. }
  109. ****************************/


  110. //DS1302復(fù)位
  111. void DS1302_Reset(void) {
  112. DS1302_DIR |=  DS1302_SCLK;

  113. DS1302_SCLK_LO;
  114. DS1302_RST_LO;
  115. // delay_us(10);
  116. DS1302_SCLK_HI;
  117. }

  118. //向DS1302寫入一個(gè)字節(jié)
  119. void DS1302_WriteOneByte(unsigned char w_dat) {
  120. unsigned char temp;

  121. DS1302_RST_HI;
  122. DS1302_DIR |= DS1302_SDI;

  123. for(temp=8;temp>0;temp--) {
  124.   DS1302_SDI_LO;
  125.   if(w_dat&BIT0) DS1302_SDI_HI;
  126.   DS1302_SCLK_LO;
  127. //  delay_us(10);
  128.   DS1302_SCLK_HI;
  129. //  delay_us(10);
  130.   w_dat >>=1;
  131. }
  132. }

  133. //從DS1302中讀取一個(gè)字節(jié)
  134. unsigned char DS1302_ReadOneByte(void) {
  135. unsigned char temp,rdata;
  136. rdata = 0x00;

  137. DS1302_RST_HI;
  138. DS1302_DIR &= ~DS1302_SDI;

  139. for(temp=0;temp<8;temp++){rdata >>= 1;//將移位放到前面,否則讀不到最高一位
  140.   DS1302_SCLK_HI;
  141. // delay_us(10);
  142.   DS1302_SCLK_LO;
  143. //  delay_us(10);
  144.   if((DS1302_IN&DS1302_SDI)==DS1302_SDI)
  145.    rdata |= BIT7;
  146.   //rdata >>= 1;
  147. }

  148. return(rdata);
  149. }

  150. //向DS1302中寫入地址后寫入數(shù)據(jù)
  151. void DS1302_WriteData(unsigned char addr,unsigned char w_dat) {
  152. DS1302_RST_LO;
  153. DS1302_SCLK_LO;
  154. DS1302_RST_HI;

  155. DS1302_WriteOneByte(addr);  //寫入地址
  156. DS1302_WriteOneByte(w_dat);  //寫入數(shù)據(jù)

  157. DS1302_SCLK_HI;
  158. DS1302_RST_LO;
  159. }

  160. //向DS1302寫入地址后,從DS1302中讀取數(shù)據(jù)
  161. unsigned char DS1302_ReadData(unsigned char addr) {
  162. unsigned char r_dat;
  163. DS1302_RST_LO;
  164. DS1302_SCLK_LO;
  165. DS1302_RST_HI;

  166. DS1302_WriteOneByte(addr);  //寫入地址
  167. r_dat = DS1302_ReadOneByte();  //讀出數(shù)據(jù)

  168. DS1302_SCLK_LO;
  169. DS1302_RST_LO;

  170. return(r_dat);
  171. }

  172. //按照SettingData的設(shè)置設(shè)置DS1302的時(shí)間
  173. void DS1302_SettingData(void) {
  174. unsigned char temp;
  175. unsigned char addr = 0x8C;

  176. DS1302_WriteData(0x8E,0x00);  //寫入控制命令,禁用寫保護(hù)

  177. for(temp=0;temp<7;temp++) {
  178.   DS1302_WriteData(addr,Setting_Time[temp]);
  179.   addr -= 2;
  180. }

  181. DS1302_WriteData(0x8E,0x80);  //寫入控制命令,啟用寫保護(hù)
  182. }

  183. //讀取DS1302時(shí)間到ReadingData中
  184. void DS1302_GetData(unsigned char *str) {
  185. unsigned char temp;
  186. unsigned char addr = 0x8D;

  187. for(temp=0;temp<7;temp++) {
  188.   str[temp] = DS1302_ReadData(addr);//年
  189.   addr -= 2;
  190. }
  191. }

  192. void shumaguan_buff(void)
  193. {
  194.   if(++t3==30)
  195.   t3=0;
  196.   if(t3<5)t2=1;
  197.   else if(t3<10)t2=2;
  198.   else if(t3<20)t2=3;
  199.   else t2=4;
  200.   switch(t2)
  201.   {
  202.   case 1:dis_play[0]=2;dis_play[1]=0;dis_play[2]=ReadingData[0]/16;dis_play[3]=ReadingData[0]%16;break;                                       //顯示年份
  203.   case 2:dis_play[0]=ReadingData[2]/16;dis_play[1]=ReadingData[2]%16;dis_play[2]=ReadingData[3]/16;dis_play[3]=ReadingData[3]%16;break;       //顯示月份日期
  204.   case 3:dis_play[0]=ReadingData[4]/16;dis_play[1]=ReadingData[4]%16;dis_play[2]=ReadingData[5]/16;dis_play[3]=ReadingData[5]%16;break;       //顯示時(shí)分
  205.   case 4:dis_play[0]=ReadingData[1]%16;dis_play[1]=14;dis_play[2]=ReadingData[6]/16;dis_play[3]=ReadingData[6]%16;break;                      //顯示星期秒
  206.   default:break;
  207.   }
  208.   
  209. }


  210. #pragma vector=TIMER0_A0_VECTOR  
  211. __interrupt void TIMERA0_ISR() // the interrupt source is CC0
  212. {
  213.   ++t1;
  214.   if(t1>=125)
  215.     t1=0;
  216.   if(t1==0)
  217.   {
  218.     DS1302_GetData(ReadingData);
  219.     shumaguan_buff();
  220.   }  
  221. else
  222. shumaguan();
  223. }

復(fù)制代碼



</c);

數(shù)碼管-時(shí)鐘.zip

177.62 KB, 下載次數(shù): 20, 下載積分: 黑幣 -5

回復(fù)

使用道具 舉報(bào)

ID:117823 發(fā)表于 2016-6-4 02:13 來自觸屏版 | 顯示全部樓層
ds1302電源問題
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日本精品一区二区在线观看 | 久久久久久黄 | 91精品国产色综合久久不卡98口 | 最近最新中文字幕 | 精品少妇一区二区三区日产乱码 | 亚洲一区日韩 | 亚洲精品电影网在线观看 | 欧洲妇女成人淫片aaa视频 | 秋霞在线一区二区 | 国产不卡视频 | 91私密视频 | av网站在线看 | 日韩在线精品视频 | 国产成人精品免费视频大全最热 | 日韩精品久久久久久 | 国产精品久久久久久久久污网站 | 奇色影视 | 亚洲久久久 | 国内毛片毛片毛片毛片 | 人人干天天干 | 午夜成人免费视频 | 欧美在线观看一区 | 国产伦精品一区二区三区精品视频 | 精品视频一区二区在线观看 | 久久国品片 | 成人三级在线观看 | 欧美一区二区在线观看 | 澳门永久av免费网站 | 视频国产一区 | 国产综合av | 懂色一区二区三区免费观看 | 国产一在线观看 | 日韩精品一区二区三区在线观看 | 天堂在线1 | 青青草精品 | 视频在线亚洲 | 欧美激情精品久久久久久 | 亚洲成人黄色 | 国产精品久久久久久中文字 | 在线播放国产视频 | 婷婷久久综合 |