使用C8051F驱动PCF8563时钟芯片

来自丢石头百科
Admin讨论 | 贡献2021年6月18日 (五) 18:03的版本 (文本替换 - 替换“http://{{”为“https://{{”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
<tbody></tbody>
<tbody></tbody>
系统功能

   利用C8051F驱动PCF8563时钟芯片,显示时钟。


<tbody></tbody>
硬件设计

C8051F 3 8.jpg LCD12864液晶电路原理图 C8051F 3 7.jpg 使用C8051F驱动PCF8563时钟芯片电路原理图


<tbody></tbody>
软件设计

下面部分从TXT拷出,拷到网页,代码部分缺省了很多空格,比较凌乱,请谅解! I2C(SMBus)详细程序请查看<a class="Blue_2_12px_" href="https://wiki.diustou.com/article/C8051F-4-3-4.htm" style="color: rgb(7, 66, 184);" target="_blank">C8051F I2C(SMBus)程序 。  LCD12864液晶详细程序请查看<a class="Blue_2_12px_" href="https://wiki.diustou.com/article/C8051F-4-3-10.htm" style="color: rgb(7, 66, 184);" target="_blank">C8051F LCD12864程序 。 

//目标系统: 基于C8051F单片机 //应用软件: Silicon IDE / Keil

/*01010101010101010101010101010101010101010101010101010101010101010101


实验内容: 使用C8051F驱动PCF8563时钟芯片,把读取到的时间在LCD12864上显示


硬件连接: DVK501(PCF8563PrlPort)    F320 EX                            VCC    ---------   VCC                            GND   ---------   GND                            SDA    ---------   P1.0                              SCL    ---------   P1.1 DVK501(LCD12864PrlPort)  F320 EX                            VCC    ---------   VCC                            GND   ---------   GND                            CS      ---------    P0.7                              SID     ---------    P0.6                              SCK   ---------    P0.0


注意事项: (1)若有加载库程序,请将光盘根目录下的“library”下的“C8051F”文件夹拷到D盘 (2)请详细阅读:光盘根目录下的“说明书首页.htm”里的相应产品说明


10101010101010101010101010101010101010101010101010101010101010101010*/

  1. define _DVK501_F320_EX_
  2. include <c8051f320.h>
  3. include <../../../../library/C8051F/ws_clock.h>
  4. include <../../../../library/C8051F/ws_delay.h>
  5. include <../../../../library/C8051F/ws_iic_port.h>
  6. include <../../../../library/C8051F/ws_pcf8563_port.h>
  7. include <../../../../library/C8051F/ws_lcd_st7920_port.h>

void main(void) {  uchar time[3],tmp=0; PCA0MD &= ~0x40; // Clear watchdog timer enable clock_external(); // Set oscillator in external,the clock is 12M delay_ms(100); Check_SDA();  XBR1 = 0x40; // Enable crossbar and weak pull-ups SPI_Init(); st7920LcdInit(); showLine(0,0,lcd_buffer,"PCF8563 Example"); showLine(0,1,lcd_buffer,"Set Time: OK"); showLine(0,2,lcd_buffer,"Read Time:"); refreshLCD(lcd_buffer); SMBus_Init(); Enb_Interrupt();  PCF8563_init();  PCF8563_setTime(12,0,0);  delay_ms(10); while(1) {  PCF8563_getTime(time); if(time[0]!=tmp) { showLine(8,3,lcd_buffer,"%d2:%d2:%d2",time[2],time[1],time[0]); refreshLCD(lcd_buffer); } tmp=time[0]; } } /*-------------------------------------------------------------------- 函数全称:十进制强制转换为十六进制 函数功能: 注意事项: 提示说明:调用changeIntToHex(33),return 0x33 输 入: 返 回:


*/
  1. define changeIntToHex(dec) ( (((dec)/10) <<4) + ((dec)%10) )

/*-------------------------------------------------------------------- 函数全称:十进制化为十六进制,并以十进制格式返回 函数功能: 注意事项:传参必须为 unsigned 类型,否则移位结果可能吓你一跳 提示说明:调用converseIntToHex(33),return 21 输 入: 返 回:


*/
  1. define converseIntToHex(dec) ( (((dec)>>4) *10) + ((dec)%16) )

/*-------------------------------------------------------------------- 函数全称:十六进制强制转换为十进制 函数功能: 注意事项:传参必须为 unsigned 类型,否则移位结果可能吓你一跳 提示说明:调用changeHexToInt(0x33),return 33 输 入: 返 回:


*/
  1. define changeHexToInt(hex) ( (((hex)>>4) *10 ) + ((hex)%16) )

/*-------------------------------------------------------------------- 函数全称:十六进制化为十进制,,并以十六进制格式返回 函数功能: 注意事项: 提示说明:调用converseHexToInt(0x33),return 0x51 输 入: 返 回:


*/
  1. define converseHexToInt(hex) ( (((hex)/10) <<4 ) + ((hex)%10) )

void WriteAByte(uchar wordAdr,uchar dat); void ReadNByte(uchar wordAdr,uchar *pRdDat); void PCF8563_getTime(uchar *buf); void PCF8563_setTime(uchar hour,uchar minute,uchar second); void PCF8563_init(void);

  1. define CTRL_BUF1 0x00
  2. define CTRL_BUF2 0x01
  3. define SECOND_DATA_BUF 0x02
  4. define MINUTE_DATA_BUF 0x03
  5. define HOUR_DATA_BUF 0x04
  6. define DAY_DATA_BUF 0x05
  7. define WEEK_DATA_BUF 0x06
  8. define MONTH_DATA_BUF 0x07
  9. define YEAR_DATA_BUF 0x08
  10. define MINUTE_AE_BUF 0x09
  11. define HOUR_AE_BUF 0x0A
  12. define DAY_AE_BUF 0x0B
  13. define WEEK_AE_BUF 0x0C
  14. define CLK_FRQ_BUF 0x0D
  15. define TIMER_CTRL_BUF 0x0E
  16. define COUNT_VAL_BUF 0x0F

void WriteAByte(uchar wordAdr,uchar dat) { SMBus_Write(0xA2,wordAdr,dat,2); } void ReadNByte(uchar wordAdr,uchar *pRdDat) {  SMBus_Write(0xA2,wordAdr,0,1); SMBus_Read(0xA3,pRdDat,3); } void PCF8563_getTime(uchar *buf) { ReadNByte(SECOND_DATA_BUF,buf); buf[0] = buf[0] & 0x7f; //get second data buf[1] = buf[1] & 0x7f; //get minute data buf[2] = buf[2] & 0x3f; //get hour data buf[0] = changeHexToInt(buf[0]); buf[1] = changeHexToInt(buf[1]); buf[2] = changeHexToInt(buf[2]); } void PCF8563_setTime(uchar hour,uchar minute,uchar second) { hour = changeIntToHex(hour); //将数据的Dex格式转换为Hex格式 minute = changeIntToHex(minute); second = changeIntToHex(second); WriteAByte(HOUR_DATA_BUF,hour); WriteAByte(MINUTE_DATA_BUF,minute); WriteAByte(SECOND_DATA_BUF,second); } void PCF8563_init(void) { WriteAByte(CTRL_BUF1,0x00); //basic setting WriteAByte(CTRL_BUF2,0x12); //alarm enable

}
<tbody></tbody>
系统调试

改变初始化时间,将语句“PCF8563_setTime(12,0,0);”改成 “PCF8563_setTime(1,2,3);”,断电重启后查看现象。