注:仅用于学习分享,分享自己在使用C8051F020单片机中的所做的一个小方案【DIY】。
最后附有下载链接
方案一 用到的主要工具材料:
方案简易示意图:
电路硬件:
[MCU] C8051F020
[稳压电源]【LM2596-5.0V】12.0V稳压5.0V 【TPS7333】5.0V稳压3.3V
[外围电路] 1.7寸12864液晶屏、串口屏、功能按键、PCF8563实时时钟电路
TOP层
BOTTOM层
#include "c8051f020.h"
#include "delay.h"
#include "lcd.h"
#include "I2C.h"
#include "keydown.h"typedef unsigned int u16;
typedef unsigned char u8;
int Clock[16]; //读寄存器pecf8563 buffersbit LED = P1^6;//下载程序指示灯extern u8 KeyValue;
extern u8 code num[],kong[],kong1[],rain[];
extern int flag_move,flag_set,Time_Count_flag;struct Time //结构体全局变量
{unsigned char second;unsigned char minite;unsigned char hour;unsigned char day;unsigned char week;unsigned char month;unsigned char year;
};
struct Reg
{unsigned char reg1;unsigned char reg2;unsigned char clk;unsigned char count1;unsigned char count2;
};
struct Alarm
{unsigned char minite;unsigned char hour;unsigned char day;unsigned char week;
};
/*----------------函数定义声明-------------------------*/
void PORT_Init();//交叉开关使能
void SYSCLK_Init();
void Disable_Wdog(); //禁止看门狗定时器
void Clock_Setting();
void Init(); //初始化void PORT_Init()//交叉开关使能
{XBR0 = 0x07; // Enable UART0(TXD0-P0.0 RXD-P0.1) SPI_SCK-P0.2 SPI_MISO-P0.3// SPI_MOSI-P0.4 SPI_NSS-P0.5 (SDA-P0.6 SCL-P0.7)XBR1 = 0x10; // INT1使能P1.2XBR2 = 0x44; // TXD1-P1.0 RXD1-P1.1P3MDOUT = 0xff; P1MDOUT = 0xff; P2MDOUT = 0xff;
}
/*void Timer0_Init() { TMOD = 0x02; //方式2 定时,自动重装载 TL0 = 0x06; TH0 = 0x06; }*/
void SYSCLK_Init()
{ unsigned int i;OSCXCN=0X67; //0X67=0110,0111for(i=0;i<256;i++); //等待>1mswhile(!(OSCXCN&0X80)); //等待XTLVLD变为1OSCICN=0X88; //时钟失效监测器,选择外部时钟源作为系统时钟
}void Disable_Wdog() //禁止看门狗定时器
{ WDTCN=0xDE; WDTCN=0xAD;
}void Clock_Setting()
{struct Time TIME={0x10,0x49,0x09,0x15,0x00,0x03,0x18};//设置时间: 秒/分/时/日/星期/月/年struct Reg REG={0x00,0x00,0x83,0x82,0x00};//设置寄存器struct Alarm ALARM={0x00,0x00,0x00,0x00};//设置报时控制寄存器unsigned char Set[16];//写寄存器bufferSet[0]=1; Set[1]=2;Set[2]=TIME.second;Set[3]=TIME.minite;Set[4]=TIME.hour;Set[5]=TIME.day;Set[6]=TIME.week;Set[7]=h;Set[8]=ar;Set[9]=ALARM.minite;Set[10]=ALARM.hour;Set[11]=ALARM.day;Set[12]=ALARM.week;Set[13]=REG.clk; //CLKOUT输出寄存器 0DHSet[14]=unt1; //定时器控制寄存器 0EHSet[15]=unt2; //定时器倒计数寄存器 0FH//WritePcf(Set,0,16);//设置时钟
}void Init()
{Disable_Wdog();PORT_Init();SYSCLK_Init();Initial_Lcd();//LCD初始化clear_screen();//清屏SMBusInit();//SMBus初始化 设置I2C
}
void main()
{ u8 i=0;LED=0;//下载程序成功指示灯Init();EA=1;//打开中断Clock_Setting();//Timer0_Init();//定时器0中断//IE = 0x82;//中断初始化//TR0=1;Delay_ms(200);while(1){//Clock_Setting();//需设置时间时使用ReadPcf(Clock,0,16);//实时时钟显读取//display_graphic_8x16(1,(0+8*0),&num[KeyValue*16]);//按键值标志Key_setting();Time_Watch();}
}
unsigned char Command;//命令缓存
int *I2CDataBuff;//待法发数据、接收数据指针
unsigned char ByteNumber; //发送字节数
unsigned char ByteReadBytes;//读字节数
int *ByteReadAddress;//读缓冲区指针
unsigned char ChipChoice;//芯片选择,0选择RTC、1选择24C256 bit BusBusy;//总线忙
bit NoStop;//发送完一组数据后不发送停止位/***********************************************************************************
* 函数名称:ReadPcf;
*
* 函数功能描述:读PCF8563;
*
* 输入参数:unsigned char类型指针BytesAddress,读出数据存储的头地址;
* unsigned char 类型RomAddress,片内地址;
* unsigned char 类型Count,读数据个数;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/void ReadPcf( int *BytesAddress,int RomAddress,unsigned char Count)//读PCF8563
{ChipChoice=0;ByteReadAddress=BytesAddress;ByteReadBytes=Count; while (BusBusy);I2CDataBuff=&RomAddress;//存储空间地址BusBusy=1;AA=1;NoStop=0;ByteNumber=1;Command=I2CPcfAddressW;//设备写地址STA=1;while (BusBusy);
}
/***********************************************************************************
* 函数名称:WritePcf;
*
* 函数功能描述:写PCF8563;
*
* 输入参数:unsigned char类型指针BytesAddress,写入数据的头地址;
* unsigned char 类型RomAddress,片内地址;
* unsigned char 类型Count,写数据个数;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/void WritePcf(unsigned char *BytesAddress,unsigned char RomAddress,unsigned char Count)//写PCF8563
{int xdata TempBuff[17],n;ChipChoice=0;TempBuff[0]=RomAddress;for(n=1;n<(Count+1);n++){TempBuff[n]=*BytesAddress++;}while (BusBusy);NoStop=1;I2CDataBuff=&TempBuff[0];BusBusy=1;AA=1;ByteNumber=Count+1;Command=I2CPcfAddressW;STA=1;while (BusBusy);
}
#include "c8051f020.h"
#include "keydown.h"
#include "delay.h"
#include "lcd.h"typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;sbit up = P2^0;
sbit down = P2^1;
sbit left = P2^2;
sbit right = P2^3;
sbit centre = P2^4;
u8 KeyValue=0;
int Set_Begin[16]={0,0,0,0,8},Set_End[16]={0,0,0,0,9};
int flag_page=0,flag_move=0;
extern int Clock[];
extern char code begin_time[],end_time[];//汉字
extern char code num[],heng[],maohao[],kong[];//字符
extern int bcd_dec(uchar bat); //BCD码转十进制void Key_Move(int page[16])//初始or结束 页面设定
{int i,j;if(right == 0)//右移 修改时间{Dela
本文发布于:2024-01-31 02:38:48,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170663993124744.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |