1、初学单片机万能模板51单片机C语言程序#include #include#define uint unsigned int#define uchar unsigned charsbit DQ = P1A7;sbit EN = P2A7;sbit RS = P2A5;sbit RW = P2A6;sbit key1 = P1A0;sbit key2 = P1A1;sbit key3 = P1A2;sbit key4 = P1A3;sbit SDA = P2A4;sbit SCLK = P2A3;sbit CE = P2A2;sbit buzzer = P2A1;uchar code a=MON
2、TUE WED THU FRI SAT SUN;char nian=13,yue=3,ri=20,shi=20,fen,miao,t1,num2,num3,date=3,A1;bit flag;int temp;float f_temp;void week(date);void Write_1302(uchar address,uchar dat) ;bit RST_DS18B20();void WBIT_DS18B20(bit data_bit);bit RBIT_DS18B20(void);voidWBYTE_DS18B20(uchar data_byte);uchar RBYTE_DS1
3、8B20(void);void START_DS18B20(void);uint READ_TEM(void);void Delay_15us(uint temp)/ 延时函数。公式:( 15*temp+15 ) usfor(temp;temp0;temp-)_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();void delay(uchar x)uchar y,z;for (y=x;y0;y-) for(z=110;z0;z-);void write_com(uchar com) /1602 写指令RS=0;RW=0; delay(1);P3=co
4、m;EN=0;delay(1);EN=1;void write_date(uchar date) /1602 写数据 RS=1;RW=0;delay(1);P3=date;EN=0; delay(1);EN=1;void init()write_com(0x38);位数据接口delay(5); write_com(0x38);delay(5);write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80); delay(5);/ 初始化/ 显示模式设置 16*2 显示, 5*7 点阵, 8/ 显示开
5、显示 .显示光标,不闪烁 00001110/ 写一个字符后地址指针 +1/ 清零miao=miao/10*16+miao%10;fen=fen/10*16+fen%10; shi=shi/10*16+shi%10; ri=ri/10*16+ri%10;yue=yue/10*16+yue%10;nian=nian/10*16+nian%10;void write_sfm(uchar add,char date)/时分秒显示char shi,ge; shi=date/16; ge=date%16; write_com(0xc0+add); write_date(0x30+shi); write_d
6、ate(0x30+ge);void write_nyr(uchar add,char date) / 年月日显示char shi,ge;shi=date/16;ge=date%16;write_com(0x80+add);write_date(0x30+shi);write_date(0x30+ge);void Write_1302(uchar address,uchar dat) /1302 写数据uchar i;CE=0;SCLK=0;CE=1;for (i=0;i8;i+) / 循环 8 次 写入地址数据SCLK=0;_nop_();SDA=address&0x01; / 每次传输低字节
7、/ 每次传输低字节/ 右移一位 DSCLK=1/1302 读数据_nop_();for (i=0;i=1;SCLK=1;_nop_();CE=0;_nop_();uchar Read_1302(uchar address)uchar i,temp=0x00;CE=0;SDA=1;SCLK=0;CE=1;for (i=0;i=1;for (i=0;i=1;/ 每次传输低字节/循环 8 次 读取数据/ 每次传输低字节/ 右移一位SCLK=1;CE=0;SDA=0;return temp;void DS1302_initW()Write_1302(0x8e,0x00);Write_1302(0x80
8、,miao);Write_1302(0x82,fen);Write_1302(0x84,shi);/ 返回/ 初始化时间设置(写)/ 写保护关/秒/ 分/时Write_1302(0x88,yue);Write_1302(0x8a,date);Write_1302(0x8c,nian);Write_1302(0x8e,0x80);void DS1302_initR()miao=Read_1302(0x81);fen=Read_1302(0x83);shi=Read_1302(0x85);date=Read_1302(0x8b);ri=Read_1302(0x87);yue=Read_1302(0
9、x89);nian=Read_1302(0x8d);void display()write_com(0x80+0x07);write_date(-);write_com(0x80+0x04);write_date(-);write_com(0xc0+0x02);write_date(:);write_com(0xc0+0x05);write_date(:);/月/周/年/ 写保护开/ 初始化时间设置(读)/ 读秒数据/ 读分钟数据/ 读小时数据/ 读星期数据/ 读日数据/ 读月数据/ 读年数据/ 显示函数write_com(0x80+0x00);write_date(0x30+2);write
10、_date(0x30);DS1302_initR();write_nyr(2,nian); / 送液晶显示write_nyr(5,yue);write_nyr(8,ri);write_sfm(0,shi);write_sfm(3,fen);write_sfm(6,miao);week(date);/ 星期函数void week(date)write_com(0x80+12);if(date=1)for(num3=0;num33;num3+)write_date(anum3);delay(2);if(date=2)for(num3=4;num37;num3+)write_date(anum3);
11、delay(2);if(date=3)for(num3=8;num311;num3+)write_date(anum3); delay(2);if(date=4)for(num3=12;num315;num3+)write_date(anum3); delay(2);if(date=5)for(num3=16;num319;num3+)write_date(anum3); delay(2);if(date=6)for(num3=20;num323;num3+)write_date(anum3);复位/ 写位delay(2);if(date=7)for(num3=24;num327;num3+)
12、write_date(anum3);delay(2);bit RST_DS18B20() /DS18B20bit ret=1;DQ=0;Delay_15us(39);DQ=1;Delay_15us(4);ret=DQ;Delay_15us(27);DQ=1;return(ret);void WBIT_DS18B20(bit data_bit)DQ=0;Delay_15us(0);DQ=data_bit;/ 读位/ 写字节Delay_15us(2);DQ=1;bit RBIT_DS18B20(void)bit data_bit;DQ=0;_nop_();_nop_();_nop_();DQ=1;
13、_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();data_bit=DQ;Delay_15us(3);DQ=1;return(data_bit);void WBYTE_DS18B20(uchar data_byte)uchar i;for(i=0;i=1;uchar RBYTE_DS18B20(void) / 读字节uchar data_byte=0;uchar i,j;for(i=0;i8;i+)j=RBIT_DS18B20();j=ji;data_byte=data_byte|j;return data_byte
14、;void START_DS18B20(void)DQ=1;_nop_();_nop_();RST_DS18B20();WBYTE_DS18B20(0xcc);WBYTE_DS18B20(0x44);uint READ_TEM(void)uchar a,b,c,d;_nop_();_nop_();TR0=0;RST_DS18B20();WBYTE_DS18B20(0xcc);WBYTE_DS18B20(0xbe);temp=RBYTE_DS18B20();temp=(RBYTE_DS18B20()=2048)的检测temp=temp+1;f_temp=temp*0.0625;temp=f_te
15、mp*10+0.5; a=temp/100;b=temp%100/10; c=temp%10; write_com(0xc0+13); write_date(.);write_com(0xc0+11);write_date(0x30+a);write_com(0xc0+12);write_date(0x30+b);write_com(0xc0+14);write_date(0x30+c);write_com(0xc0+10); write_date(-);/ 温度的小数点/ 温度负值时的显示函数/ 温度的负值else正数时f_temp=temp*0.0625;temp=f_temp*10+0.
16、5; a=temp/1000; b=temp%1000/100; c=temp%100/10;d=temp%10;write_com(0xc0+13);write_date(.);write_com(0xc0+10);write_date(0x30+a);write_com(0xc0+11);write_date(0x30+b);write_com(0xc0+12);write_date(0x30+c);write_com(0xc0+14); write_date(0x30+d);return temp;void key()/ 温度的小数点/ 温度正值时的显示函数/ 键盘uchar fen1,
17、fen2,shi1,shi2,ri1,ri2,yue1,yue2,nian1,nian2,miao1,miao2;if(!key1) / 暂停选位/if(!key1) while(!key1);num2+;switch(num2)case 1: flag=flag;Write_1302(0x8e,0x00);write_com(0xc7);write_com(0x0f);break;case 2:write_com(0xc4)break;case 3:write_com(0xc1)break;case 4:write_com(0x80+0x09);break;case 5:write_com(
18、0x80+0x0c);break;case 6:write_com(0x80+0x06);break;case 7:write_com(0x80+0x03);break;write_com(0x0c);num2=0;flag=flag;write_nyr(2,nian);write_nyr(5,yue);write_nyr(8,ri);write_sfm(0,shi);write_sfm(3,fen);write_sfm(6,miao);week(date);DS1302_initW();/将设置的时间日期等写入 DS1302 中Write_1302(0x8e,0x80); /写保护开brea
19、k;if(flag=1)if(!key2) / 数字加减delay(10);if(!key2)while(!key2);switch(num2)case 1: DS1302_initW();miao1=miao/16;miao2=miao%16;miao2+;if(miao2=10)miao2=0;miao1+;if(miao1=6)miao1=0;miao2=0;miao=miao1*16+miao2;write_sfm(6,miao);write_com(0xc7);break;case 2: fen1=fen/16;fen2=fen%16;fen2+;if(fen2=10)fen2=0;
20、fen1+;if(fen1=6)fen1=0;fen2=0;write_sfm(3,fen);write_com(0xc4);break;case 3: shi1=shi/16;shi2=shi%16;shi2+;if(shi2=10)shi2=0;shi1+;if(shi1=2)&(shi2=4)shi1=0;shi2=0;shi=shi1*16+shi2;write_sfm(0,shi);write_com(0xc1)break;case 4: ri1=ri/16;ri2=ri%16;ri2+;if(ri2=10)ri2=0;ri1+;ri1=0;ri2=1;ri=ri1*16+ri2;w
21、rite_nyr(8,ri);write_com(0x80+0x09);break;case 5: date+;if(date=8)date=1;week(date);write_com(0x80+0x0c);break;case 6: yue1=yue/16;yue2=yue%16;yue2+;if(yue2=10)yue2=0;yue1+;if(yue1=1)&(yue2=3)yue1=0;yue2=1; yue=yue1*16+yue2;write_nyr(5,yue); write_com(0x80+0x06);break;case 7: nian1=nian/16; nian2=ni
22、an%16;nian2+; if(nian2=10)nian2=0;nian1+;if(nian1=8)&(nian2=0)nian1=0;nian2=0; nian=nian1*16+nian2; write_nyr(2,nian); write_com(0x80+0x03);break;case 8:Write_1302(0x8e,0x80);/ 写保护开break;if(!key3)delay(10);if(!key3)switch(num2) case 1: miao1=miao/16;miao2=miao%16;miao2-;if(miao2=-1)miao2=9;miao1-;if
23、(miao1=-1)miao1=5;miao=miao1*16+miao2;write_sfm(6,miao);write_com(0xc7) break;case 2: fen1=fen/16;fen2=fen%16;fen2-;if(fen2=-1)fen2=9;fen1-;if(fen1=-1)fen1=5;fen=fen1*16+fen2;write_sfm(3,fen);write_com(0xc4)break;case 3: shi1=shi/16;shi2=shi%16;shi2-;if(shi2=-1)shi2=9; shi1-; if(shi1=-1)shi1=2;shi2=
24、3;shi=shi1*16+shi2;write_sfm(0,shi);write_com(0xc1) break;case 4: ri1=ri/16;ri2=ri%16;ri2-;if(ri2=-1)ri2=9; ri1-;if(ri1=-1)ri1=3;ri=ri1*16+ri2;write_nyr(8,ri);write_com(0x80+0x09);break;case 5: date-;if(date=-1|date=0)date=7;week(date);write_com(0x80+0x0c);break;case 6: yue1=yue/16;yue2=yue%16;yue2-
25、;if(yue2=-1)yue2=9;yue1-;if(yue1=-1)yue1=1;yue2=2;yue=yue1*16+yue2;write_nyr(5,yue);write_com(0x80+0x06);break;case 7: nian1=nian/16;nian2=nian%16; nian2-;if(nian2=-1)nian2=9;nian1-;if(nian1=-1)nian1=7;nian2=9;nian=nian1*16+nian2; write_nyr(2,nian);write_com(0x80+0x03); break;/ 写保护开case 8: Write_1302(0x8e,0x80);break;void main()uint temp=0;init();DS1302_initW();/ 初始化时间日期DS1302_initR();while(1)display();key();START_DS18B20(); temp=READ_TEM(); delay(5);while(flag=1) key();
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1