本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
我用的片子是stc89c52的,做好原理图,把程序写进去光出乱码,望大侠解疑答惑
这是程序
#include <AT89X52.H>
#include<intrins.h>
sbit rst=P0^0;//设置管脚
sbit sck=P0^1;//设置管脚
sbit io=P0^2;//设置管脚
unsigned char code smg_du[]={0x03,0x9f,0x26,0x0d,0x99,0x89,0x41,0x1f,0x01,0x09};//数码管段选 低电平有效
unsigned char code smg_we[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//数码管位选 高电平有效
unsigned char time_data[7]={11,6,5,21,12,25,00};//年周月日时分秒
unsigned char write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};//写定义
unsigned char read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};//读定义
unsigned char disp[8];//处理数组
void delay_50us(unsigned int t);
void write_ds1302_byte(unsigned char dat);//写操作函数
void write_ds1302(unsigned char add,unsigned char dat);//传送数据函数
unsigned char read_ds1302(unsigned char add);//读操作函数
void set_rtc(void);//实时时钟初始设置函数
void read_rtc(void);//读取实时时钟函数
void time_pros(void);//处理函数
void display(void);//显示函数
void delay_50us(unsigned int t)//延时程序
{
unsigned char j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
/*void delay_50ms(unsigned int t)//延时程序
{
unsigned int j;
for(;t>0;t--)
for(j=6245;j>0;j--);
}
*/
void write_ds1302_byte(unsigned char dat)//写操作程序
{
unsigned char i;
for(i=0;i<8;i++)
{
sck=0;//时钟打开
io=dat&0x01;//数据传送
dat=dat>>1;//移位操作
sck=1;//时钟关闭
}
}
void write_ds1302(unsigned char add,unsigned char dat)//传送数据程序
{
rst=0;
_nop_();//空操作
sck=0;
_nop_();
rst=1;//打开写数据传送
_nop_();
write_ds1302_byte(add);//传送地址
write_ds1302_byte(dat);//传送数据
rst=0;//关闭写操作
_nop_();
io=1;
sck=1;
}
unsigned char read_ds1302(unsigned char add)
{
unsigned char i,value;
rst=0;
_nop_();
sck=0;
_nop_();
rst=1;
_nop_();
write_ds1302_byte(add);
for(i=0;i<8;i++)
{
value=value>>1;
sck=0;
if(io)
{
value=value|0x80;
sck=1;
}
}
rst=0;
_nop_();
sck=0;
_nop_();
sck=1;
io=1;
return value;
}
void set_rtc(void)//实时时钟初始化
{
unsigned char i,j;
for(i=0;i<7;i++)
{
j=time_data/10;//十进制化成十六进制
time_data=time_data%10;
time_data=time_data+j*16;
}
write_ds1302(0x8e,0x00);//去除写保护
for(i=0;i<7;i++)
{
write_ds1302(write_add,time_data);
}
write_ds1302(0x8e,0x80);//打开写保护
}
void read_rtc(void)//读函数
{
char i;
for(i=0;i<7;i++)
{
time_data=read_ds1302(read_add);
}
}
void time_pros(void)//处理函数
{
disp[0]=time_data[6]%16;
disp[1]=time_data[6]/16;
disp[2]=0xfd;
disp[3]=time_data[5]%16;
disp[4]=time_data[5]/16;
disp[5]=0xfd;
disp[6]=time_data[4]%16;
disp[7]=time_data[4]/16;
}
void display(void)
{
unsigned char i;
for(i=0;i<8;i++)
{
P1=smg_du[disp];
P3=smg_we;
delay_50us(20);
}
}
void main(void)//主程序
{
set_rtc();
while(1)
{
read_rtc();
time_pros();
display();
}
}
这是仿真图 |