迪文智能屏与一般的串口屏有较大的不同,它采用的是单芯片双核ASIC IC,其中一个核是GUI CPU,用于运行DGUS II系统;一个核是OS CPU,用于运行用户8051代码或迪文OS系统,使用户在应用中可用省掉CPU。 在完成了GUI的制作后,可用利用OS CPU通过编程来驱动外部的RTC模块来进行计时处理,且可借助RTC模块上的后备电池来维持掉电后的运行。 3. RTC计时 RTC模块的外观如图1所示,该模块所使用的芯片为DS1302,并向外提供了5个连接引脚,除2个电源引脚外,其它3个引脚的作用如下: CLK---时钟引脚 DAT---数据引脚 RST---复位引脚
图1 RTC模块
迪文屏的转接板如图2所示,使用时可按以下关系来连接: CLK---P1.1 DAT--- P1.2 RST--- P1.3
图2 转接板
由于在设置RTC是执行写操作,而在读取时间值时是读操作,故在使用时应注意DAT引脚的输入输出模式的转换。 DS1302的应用程序比较容易获得,在用于迪文智能屏时,需注意运行几个问题。 1)对RTC引脚的定义 ***it RST=P1^3; ***it IO=P1^2; ***it SCK=P1^1; 2)对RTC的初始化 RTC的初始化函数为:
- void ds1302_init(void)
- {
- SetPinOut(1,1);
- SetPinOut(1,2);
- SetPinOut(1,3);
- delay_us(2);
- RST=0;
- SCK=0;
- }
复制代码
3)对RTC的读写 要对RTC进行读写,依赖的函数有2个,即字节写入函数和字节读取函数,其内容如下:
- void ds1302_write_byte(uchar addr, uchar d)
- {
- uchar i;
- RST=1;
- SetPinOut(1,2);
- addr = addr & 0xFE;
- for(i = 0; i < 8; i ++) {
- if(addr & 0x01) {
- IO=1;
- }
- else {
- IO=0;
- }
- SCK=1;
- delay_us(1);
- SCK=0;
- delay_us(1);
- addr = addr >> 1;
- }
- for(i = 0; i < 8; i ++) {
- if (d & 0x01) {
- IO=1;
- }
- else {
- IO=0;
- }
- SCK=1;
- delay_us(1);
- SCK=0;
- delay_us(1);
- d = d >> 1;
- }
- RST=0;
- }
- uchar ds1302_read_byte(uchar addr) {
- uchar i,temp;
- RST=1;
- addr = addr | 0x01;
- SetPinOut(1,2);
- for(i = 0; i < 8; i ++) {
- if (addr & 0x01) {
- IO=1;
- }
- else {
- IO=0;
- }
- SCK=1;
- delay_us(1);
- SCK=0;
- delay_us(1);
- addr = addr >> 1;
- }
- }
复制代码
4)时间的读写 读取时间的函数为:
- void ds1302_read_time(void)
- {
- time_buf[1]=ds1302_read_byte(ds1302_year_add);
- time_buf[2]=ds1302_read_byte(ds1302_month_add);
- time_buf[3]=ds1302_read_byte(ds1302_date_add);
- time_buf[4]=ds1302_read_byte(ds1302_hr_add);
- time_buf[5]=ds1302_read_byte(ds1302_min_add);
- time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7f;
- time_buf[7]=ds1302_read_byte(ds1302_day_add);
- }
复制代码
这里,为便于测试是将时间值存放到数组中。 5)测试主程序 在主程序的控制下,可通过串口对时间值进行输出显示,其程序如下:
- void main(void)
- {
- InitCPU();
- StartTimer(1,500);
- ds1302_init();
- delay_ms(10);
- ds1302_write_time();
- printf("Entry Main!rn");
- while(1)
- {
- ds1302_read_time();
- readtime[8]=(time_buf[4]>>4);
- readtime[9]=(time_buf[4]&0x0F);
- readtime[10]=(time_buf[5]>>4);
- readtime[11]=(time_buf[5]&0x0F);
- readtime[12]=(time_buf[6]>>4);
- readtime[13]=(time_buf[6]&0x0F);
- if(readtime[13]!=sec_buf)
- {
- sec_buf=readtime[13];
- UART2_Sendbyte(readtime[8]+'0');
- delay_us(2);
- UART2_Sendbyte(readtime[9]+'0');
- delay_us(2);
- UART2_Sendbyte(':');
- delay_us(2);
- UART2_Sendbyte(readtime[10]+'0');
- delay_us(2);
- UART2_Sendbyte(readtime[11]+'0');
- delay_us(2);
- UART2_Sendbyte(':');
- delay_us(2);
- UART2_Sendbyte(readtime[12]+'0');
- delay_us(2);
- UART2_Sendbyte(readtime[13]+'0');
- delay_us(2);
- printf("rn");
- delay_ms(500);
- }
- }
- }
复制代码
C51的程序编辑界面如图3所示,通过编译其结果如图4所示。
图3 编辑界面
图4 完成编译
经程序下载,其测试效果如图5所示。 后面可以把时间值发送到智能屏的指定变量地址,以实现界面上时间值的实时更新。 |