标题:
长时间计时(含1302,1602,DAC0832)
[打印本页]
作者:
51hei社区
时间:
2016-1-16 02:31
标题:
长时间计时(含1302,1602,DAC0832)
上周做了板子终于成功了,把程序发过来,是关于1302时钟芯片,1602液晶使用,和DAC0832的使用的,具体功能就不说了,看看程序吧!其中P0接1602数据端,1602的E接p20,rs接p21,r/w接p22。1302时钟芯片rst接p30,sclk接p31,i/o接p32,P1口是DAC0832的数据端口,其cs接p34,wr接p36,p24-p27接按键。下面是具体程序
程序编写比较乱,凑合看吧!编写程序好的习惯是很重要的。
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define ledlen 8
unsigned char pos; //wei xuan duan bian
unsigned char ledbuf[8];
unsigned char ledbuf1[2];
uint num;
char zhankong;
sbit p10=P3^3;
bit sign;
sbit sclk_1302=P3^1; //1302端口设置
sbit io_1302 =P3^2;
sbit rst_1302 =P3^0;
sbit lcden=P2^0;
sbit lcdrs=P2^1;
sbit dula=P2^2;
sbit wela=P2^3;
sbit p24=P2^4;
sbit p25=P2^5;
sbit p11=P2^6; //pwm +
sbit p12=P2^7; //pwm -
sbit p34=P3^4;
sbit p36=P3^6;
unsigned char huanying[]="welcome!";
unsigned char huanying1[]="yu xin";
unsigned char time[]="time:";
unsigned char percent[]="percent:";
float temp;
uchar second ,minute, day, month, year, week,hour;
unsigned long int hour5=0;
uchar second_set=0x00 ,minute_set=0x00, day_set=0x28, month_set=0x01, year_set=0x10, week_set=0x04,hour_set=0x00;
uchar second1=34 ,minute1=67, day1, month1, year1, week1,hour1;
code unsigned char ledmap[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e }; //0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
void delay(unsigned int cnt)
{ unsigned char i;
while(cnt--!=0)
for(i=100;i!=0;i--);
}
void write_command_1302(uchar date,uchar date1)
{
uchar i;
rst_1302=0;
for(i=0;i<8;i++)
{
sclk_1302=0;
delay(1);
rst_1302=1;
if(date&0x01==0x01)
{
io_1302=1;
}
else
{
io_1302=0;
}
sclk_1302=1;
date=date>>1;
}
for(i=0;i<8;i++)
{
sclk_1302=0;
delay(1);
if(date1&0x01==0x01)
{
io_1302=1;
}
else
{
io_1302=0;
}
sclk_1302=1;
date1=date1>>1;
}
rst_1302=0;
}
uchar read_date_1302(uchar date)
{
uchar i;
uchar date1=0x00;
rst_1302=0;
for(i=0;i<8;i++)
{
sclk_1302=0;
delay(5);
rst_1302=1;
if(date&0x01==0x01)
{
io_1302=1;
}
else
{
io_1302=0;
}
date=date>>1;
sclk_1302=0;
sclk_1302=1;
}
for(i=0;i<7;i++)
{
sclk_1302=0;
if(io_1302==1)
{
date1=(date1|0x80);
}
else
{
date1=(date1|0x00);
}
sclk_1302=1;
date1=date1>>1;
}
return date1;
rst_1302=0;
}
void write_RAM_DS1302()
{
write_command_1302(0xc0,0x22);
}
uchar read_RAM_DS1302()
{
uchar temp;
temp=read_date_1302(0xc1);
return temp;
}
void DS1302_init()
{
write_command_1302(0x80,second_set);// 秒钟设定
write_command_1302(0x82,minute_set);// 分钟设定
write_command_1302(0x84,hour_set);// 小时设定
write_command_1302(0x86,day_set);// 日期设定
write_command_1302(0x88,month_set);// 月份设定
write_command_1302(0x8a,week_set);// 星期设定
write_command_1302(0x8c,year_set);// 年份设定
}
void DS1302_read()
{
second= read_date_1302(0x81); // 秒钟设定
minute= read_date_1302(0x83); // 分钟设定
hour = read_date_1302(0x85);
day = read_date_1302(0x87);
month = read_date_1302(0x89); // 月份设定
week = read_date_1302(0x8b);
year = read_date_1302(0x8d);
}
void BCD_change()
{
second1=((second&0x70)>>4)*10+(second&0x0f);
minute1=((minute&0x70)>>4)*10+(minute&0x0f);
hour1=((hour&0x70)>>4)*10+(hour&0x0f);
day1=((day&0x70)>>4)*10+(day&0x0f);
month1=((month&0x70)>>4)*10+(month&0x0f);
year1=((year&0x70)>>4)*10+(year&0x0f);
week1=((week&0x70)>>4)*10+(week&0x0f);
if(week1>7)
{
week1=7;
}
}
void scankey() //扫描按键
{
if(p10==1&sign==1)
{
sign=0;
DS1302_init();
}
if(p10==0)
{
sign=1;
second_set=second;
minute_set=minute;
hour_set=0x00;
hour5=hour5+hour1;
}
if(p11==0) //p11口按键及处理程序
{
delay(100);
if(p11==0)
{
do delay(10);
while(p11==0);
zhankong++;
if(zhankong>99)
{
zhankong=99;
}
}
}
if(p12==0) //p11口按键及处理程序
{
delay(100);
if(p12==0)
{
do delay(10);
while(p12==0);
zhankong--;
if(zhankong<0)
{
zhankong=0;
}
}
}
if(p24==0) //p11口按键及处理程序
{
delay(100);
if(p24==0)
{
do delay(10);
while(p24==0);
zhankong=zhankong-10;
if(zhankong<0)
{
zhankong=0;
}
}
}
if(p25==0) //p11口按键及处理程序
{
delay(100);
if(p25==0)
{
do delay(10);
while(p25==0);
zhankong=zhankong+10;
if(zhankong>99)
{
zhankong=99;
}
}
}
p34=0;
p36=0;
temp=zhankong*2.55;
P1=(int)temp;
p34=1;
p36=1;
}
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
dula=0;
wela=0;
lcden=0;
write_com(0x38);
write_com(0x0e);
write_com(0x06);
write_com(0x01);
write_com(0x80+0x10);
}
void main()
{
p10=0;
init(); //开机显示欢迎词
write_com(0x80+0x03);
for(num=0;num<8;num++)
{
write_data(huanying[num]);
delay(20);
}
write_com(0x80+0x44);
for(num=0;num<6;num++)
{
write_data(huanying1[num]);
delay(20);
}
delay(5000);
init();
DS1302_init();
DS1302_read();
BCD_change();
while(1)
{
if(sign==0) //试验停止则显示时间不变化了
{
DS1302_read();
BCD_change();
ledbuf[0]=minute1/10; //处理数据转化段码
ledbuf[1]=minute1;
ledbuf[2]=second1/10;
ledbuf[3]=second1;
ledbuf[4]=hour5/1000;
ledbuf[5]=hour500/100;
ledbuf[6]=hour50/10;
ledbuf[7]=hour5;
}
ledbuf1[0]=zhankong/10;
ledbuf1[1]=zhankong;
scankey();
write_com(0x80);
for(num=0;num<5;num++)
{
write_data(time[num]);
delay(20);
}
write_data(ledbuf[4]+0x30);
delay(20);
write_data(ledbuf[5]+0x30);
delay(20);
write_data(ledbuf[6]+0x30);
delay(20);
write_data(ledbuf[7]+0x30);
delay(20);
write_data(time[4]);
delay(20);
write_data(ledbuf[0]+0x30);
delay(20);
write_data(ledbuf[1]+0x30);
write_data(time[4]);
write_data(ledbuf[2]+0x30);
delay(20);
write_data(ledbuf[3]+0x30);
delay(20);
write_com(0x80+0x40);
for(num=0;num<8;num++)
{
write_dat
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1