上周做了板子终于成功了,把程序发过来,是关于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
复制代码
|