ds1302用1602并行显示,lcd1602与单片机连接接了p1 p2 p3个口都有,要怎么写程序

单片机与DS18B20并用LCD1602显示 c程序_百度知道
单片机与DS18B20并用LCD1602显示 c程序
这是电路的连接sbit DQ=P1^4;//ds18b20与单片机连接口sbit RS=P1^3;sbit RW=P1^2;sbit EN=P1^1;还有我的LCD的16引脚接到了单片机上的P1.0上,就是要用软件使LCD亮,硬件已经做出来了,所以改不了.(最好附上详细的解释,谢谢了)
我有更好的答案
#include&reg51.h&#define uchar unsigned char#define uint unsigned intsbit BLK=P1^0;sbit DQ=P1^4;sbit RS=P1^3;sbit RW=P1^2;sbit EN=P1^1;unsigned char code str1[]={&temperature: &};unsigned char code str2[]={&
&};uchar data disdata[5];//温度值//温度正负标志/*************************lcd1602程序**************************/void delay1ms(unsigned int ms)//延时1毫秒(不够精确的){
unsigned int i,j; for(i=0;i&i++) for(j=0;j&100;j++);}void wr_com(unsigned char com)//写指令//{
delay1ms(1); RS=0; RW=0; EN=0; P0= delay1ms(1); EN=1; delay1ms(1); EN=0;}void wr_dat(unsigned char dat)//写数据//{
delay1ms(1);; RS=1; RW=0;
P0= delay1ms(1);
delay1ms(1);
EN=0;}void lcd_init()//初始化设置//{
BLK=0; delay1ms(15); wr_com(0x38); delay1ms(5);
wr_com(0x08);delay1ms(5);
wr_com(0x01);delay1ms(5);
wr_com(0x06);delay1ms(5);
wr_com(0x0c);delay1ms(5);}void display(unsigned char *p)//显示//{ while(*p!='\0') {
wr_dat(*p);
delay1ms(1); }}init_play()//初始化显示{
lcd_init();
wr_com(0x80); display(str1); wr_com(0xc0); display(str2);}/******************************ds1820程序***************************************/void delay_18B20(unsigned int i)//延时1微秒{
while(i--); }
void ds1820rst()/*ds1820复位*/ {
unsigned char x=0; DQ = 1;
//DQ复位 delay_18B20(4); //延时 DQ = 0;
//DQ拉低 delay_18B20(100); //精确延时大于480us DQ = 1;
//拉高 delay_18B20(40); } uchar ds1820rd()/*读数据*/{
unsigned char i=0; unsigned char dat = 0; for (i=8;i&0;i--) {
DQ = 0; //给脉冲信号
DQ = 1; //给脉冲信号
dat|=0x80;
delay_18B20(10); } return(dat);}void ds1820wr(uchar wdata)/*写数据*/{ unsigned char i=0; for (i=8; i&0; i--)
DQ = wdata&0x01;
delay_18B20(10);
wdata&&=1;
}}read_temp()/*读取温度值并转换*/{ uchar a,b; ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/ ds1820wr(0x44);//*启动温度转换*/ ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd(); b=ds1820rd(); tvalue=b; tvalue&&=8; tvalue=tvalue|a;
if(tvalue&0x0fff)
tvalue=~tvalue+1;
} tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小? return(tvalue);}/*******************************************************************/void ds1820disp()//温度值显示{
disdata[0]=tvalue/;//百位数
disdata[1]=tvalue%x30;//十位数
disdata[2]=tvalue%100/10+0x30;//个位数
disdata[3]=tvalue%10+0x30;//小数位
if(tflag==0)
flagdat=0x20;//正温度不显示符号
flagdat=0x2d;//负温度显示负号:-
if(disdata[0]==0x30)
disdata[0]=0x20;//如果百位为0,不显示
if(disdata[1]==0x30)
disdata[1]=0x20;//如果百位为0,十位为0也不显示
wr_com(0xc0);
wr_dat(flagdat);//显示符号?
wr_com(0xc1);
wr_dat(disdata[0]);//显示百位
wr_com(0xc2);
wr_dat(disdata[1]);//显示十位
wr_com(0xc3);
wr_dat(disdata[2]);//显示个位
wr_com(0xc4);
wr_dat(0x2e);//显示小数点
wr_com(0xc5);
wr_dat(disdata[3]);//显示小数位}/********************主程序***********************************/void main(){
init_play();//初始化显示
while(1) {
read_temp();//读取温度
ds1820disp();//显示 }}
采纳率:12%
/*main.c&&&自己参考一下&改改吧#include&reg51.h&#include&DS18B20_3.H&#define&uint&unsigned&int#define&uchar&unsigned&charuchar&a,miao,shi,fen,ri,yue,nian,week,flag,key1n,//flag用于读取头文件中的温度值,和显示温度值#define&yh&0x80&//LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1()#define&er&0x80+0x40&//LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)//液晶屏的与C51之间的引脚连接定义(显示数据线接C51的P0口)sbit&rs=P2^0;sbit&en=P2^2;sbit&rw=P2^1;&//如果硬件上rw接地,就不用写这句和后面的rw=0了sbit&led=P2^6;&//LCD背光开关//DS1302时钟芯片与C51之间的引脚连接定义sbit&IO=P1^1;sbit&SCLK=P1^0;sbit&RST=P1^2;sbit&ACC0=ACC^0;sbit&ACC7=ACC^7;/************************************************************ACC累加器=AACC.0=E0H&ACC.0就是ACC的第0位。Acc可以位寻址。累加器ACC是一个8位的存储单元,是用来放数据的。但是,这个存储单元有其特殊的地位,是单片机中一个非常关键的单元,很多运算都要通过ACC来进行。以后在学习指令时,常用A来表示累加器。但有一些地方例外,比如在PUSH指令中,就必须用ACC这样的名字。一般的说法,A代表了累加器中的内容、而ACC代表的是累加器的地址。&***************************************************************///校时按键与C51的引脚连接定义sbit&key1=P1^5;&&//设置键sbit&key2=P1^6;&&//加键sbit&key3=P1^7;&&//减键sbit&buzzer=P1^3;//蜂鸣器,通过三极管9012驱动,端口低电平响/**************************************************************/uchar&code&tab1[]={&20&&-&&-&&&&};&//年显示的固定字符uchar&code&tab2[]={&&&:&&:&&&};//时间显示的固定字符//延时函数,后面经常调用void&delay(uint&xms)//延时函数,有参函数{&uint&x,y;&for(x=x&0;x--)&&for(y=110;y&0;y--);}/********液晶写入指令函数与写入数据函数,以后可调用**************//*在这个程序中,液晶写入有关函数会在DS1302的函数中调用,所以液晶程序要放在前面*/write_1602com(uchar&com)//****液晶写入指令函数****{&rs=0;//数据/指令选择置为指令&rw=0;&//读写选择置为写&P0=//送入数据&delay(1);&en=1;//拉高使能端,为制造有效的下降沿做准备&delay(1);&en=0;//en由高变低,产生下降沿,液晶执行命令}write_1602dat(uchar&dat)//***液晶写入数据函数****{&rs=1;//数据/指令选择置为数据&rw=0;&//读写选择置为写&P0=//送入数据&delay(1);&en=1;&//en置高电平,为制造下降沿做准备&delay(1);&en=0;&//en由高变低,产生下降沿,液晶执行命令}lcd_init()//***液晶初始化函数****{&write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据&write_1602com(0x0c);//开显示不显示光标&write_1602com(0x06);//整屏不移动,光标自动右移&write_1602com(0x01);//清显示&write_1602com(yh+1);//日历显示固定符号从第一行第1个位置之后开始显示&for(a=0;a&14;a++)&{&write_1602dat(tab1[a]);//向液晶屏写日历显示的固定符号部分&//delay(3);&}&write_1602com(er+2);//时间显示固定符号写入位置,从第2个位置后开始显示&for(a=0;a&8;a++)&{&write_1602dat(tab2[a]);//写显示时间固定符号,两个冒号&//delay(3);&}}/*********************over***********************//***************DS1302有关子函数********************/void&write_byte(uchar&dat)//写一个字节{&ACC=&RST=1;&for(a=8;a&0;a--)&{&&IO=ACC0;&&SCLK=0;&&SCLK=1;&&ACC=ACC&&1;&}}uchar&read_byte()//读一个字节{&RST=1;&for(a=8;a&0;a--)&{&&ACC7=IO;&&SCLK=1;&&SCLK=0;&&ACC=ACC&&1;&}&return&(ACC);}//----------------------------------------void&write_1302(uchar&add,uchar&dat)//向1302芯片写函数,指定写入地址,数据{&RST=0;&SCLK=0;&RST=1;&write_byte(add);&write_byte(dat);&SCLK=1;&RST=0;}uchar&read_1302(uchar&add)//从1302读数据函数,指定读取数据来源地址{&uchar&&RST=0;&SCLK=0;&RST=1;&write_byte(add);&temp=read_byte();&SCLK=1;&RST=0;&return(temp);}uchar&BCD_Decimal(uchar&bcd)//BCD码转十进制函数,输入BCD,返回十进制{&uchar&D&Decimal=bcd&&4;&return(Decimal=Decimal*10+(bcd&=0x0F));}//--------------------------------------void&ds1302_init()&//1302芯片初始化子函数(,12:00:00,week4){RST=0;SCLK=0;write_e,0x00);&//允许写,禁止写保护&//write_,0x00);&//向DS1302内写秒寄存器80H写入初始秒数据00//write_,0x00);//向DS1302内写分寄存器82H写入初始分数据00//write_,0x12);//向DS1302内写小时寄存器84H写入初始小时数据12//write_a,0x04);//向DS1302内写周寄存器8aH写入初始周数据4//write_,0x07);//向DS1302内写日期寄存器86H写入初始日期数据07//write_,0x01);//向DS1302内写月份寄存器88H写入初始月份数据01//write_c,0x10);//向DS1302内写年份寄存器8cH写入初始年份数据10write_e,0x80);&//打开写保护}//------------------------------------//温度显示子函数void&write_temp(uchar&add,uchar&dat)//向LCD写温度数据,并指定显示位置{&uchar&gw,&gw=dat%10;//取得个位数字&sw=dat/10;//取得十位数字&write_1602com(er+add);//er是头文件规定的值0x80+0x40&write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码&write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码&&&write_1602dat(0xdf);//显示温度的小圆圈符号,0xdf是液晶屏字符库的该符号地址码&&&write_1602dat(0x43);&//显示&C&符号,0x43是液晶屏字符库里大写C的地址码&&}//------------------------------------//时分秒显示子函数void&write_sfm(uchar&add,uchar&dat)//向LCD写时分秒,有显示位置加、现示数据,两个参数{&uchar&gw,&gw=dat%10;//取得个位数字&sw=dat/10;//取得十位数字&write_1602com(er+add);//er是头文件规定的值0x80+0x40&write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码&write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码&&&&}//-------------------------------------//年月日显示子函数void&write_nyr(uchar&add,uchar&dat)//向LCD写年月日,有显示位置加数、显示数据,两个参数{&uchar&gw,&gw=dat%10;//取得个位数字&sw=dat/10;//取得十位数字&write_1602com(yh+add);//设定显示位置为第一个位置+add&write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码&write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码&}//-------------------------------------------void&write_week(uchar&week)//写星期函数{&write_1602com(yh+0x0c);//星期字符的显示位置&switch(week)&{&&case&1:write_1602dat('M');//星期数为1时,显示&&&&&&write_1602dat('O');&&&&&&write_1602dat('N');&&&&&&&&&&&&case&2:write_1602dat('T');//星期数据为2时显示&&&&&&write_1602dat('U');&&&&&&write_1602dat('E');&&&&&&&&&&case&3:write_1602dat('W');//星期数据为3时显示&&&&&&write_1602dat('E');&&&&&&write_1602dat('D');&&&&&&&&&&case&4:write_1602dat('T');//星期数据为4是显示&&&&&&write_1602dat('H');&&&&&&write_1602dat('U');&&&&&&&&&&case&5:write_1602dat('F');//星期数据为5时显示&&&&&&write_1602dat('R');&&&&&&write_1602dat('I');&&&&&&&&&&case&6:write_1602dat('S');//星期数据为6时显示&&&&&&write_1602dat('T');&&&&&&write_1602dat('A');&&&&&&&&&&case&7:write_1602dat('S');//星期数据为7时显示&&&&&&write_1602dat('U');&&&&&&write_1602dat('N');&&&&&&}}//****************键盘扫描有关函数**********************void&keyscan(){&if(key1==0)//---------------key1为功能键(设置键)--------------------&{&delay(9);//延时,用于消抖动&if(key1==0)//延时后再次确认按键按下&{&&&&buzzer=0;//蜂鸣器短响一次&&&&delay(20);&&&&buzzer=1;&while(!key1);&key1n++;&if(key1n==9)&&key1n=1;//设置按键共有秒、分、时、星期、日、月、年、返回,8个功能循环&switch(key1n)&{&&case&1:&TR0=0;//关闭定时器&&&//TR1=0;&&&write_1602com(er+0x09);//设置按键按动一次,秒位置显示光标&&&&&&write_1602com(0x0f);//设置光标为闪烁&&&&&&temp=(miao)/10*16+(miao)%10;//秒数据写入DS1302&&&&&&write_e,0x00);&&&&&&write_,0x80|temp);//miao&&&&&&&&write_e,0x80);&&&&&&&case&2:&&write_1602com(er+6);//按2次fen位置显示光标&&&&&&&&&&//write_1602com(0x0f);&&&&case&3:&write_1602com(er+3);//按动3次,shi&&&&&&&//write_1602com(0x0f);&&&&case&4:&write_1602com(yh+0x0e);//按动4次,week&&&&&&&//write_1602com(0x0f);&&&&case&5:&write_1602com(yh+0x0a);//按动5次,ri&&&&&&&//write_1602com(0x0f);&&&&case&6:&write_1602com(yh+0x07);//按动6次,yue&&&&&&&//write_1602com(0x0f);&&&&case&7:&write_1602com(yh+0x04);//按动7次,nian&&&&&&&//write_1602com(0x0f);&&&&case&8:&&&write_1602com(0x0c);//按动到第8次,设置光标不闪烁&&&TR0=1;//打开定时器&&&&&&&&&temp=(miao)/10*16+(miao)%10;&&&&&write_e,0x00);&&&&&write_,0x00|temp);//miao数据写入DS1302&&&&&write_e,0x80);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&}&}//------------------------------加键key2----------------------------&&&if(key1n!=0)//当key1按下以下。再按以下键才有效(按键次数不等于零)&{&if(key2==0)&&//上调键&{&delay(10);&if(key2==0)&{&&&&buzzer=0;//蜂鸣器短响一次&&&&delay(20);&&&&buzzer=1;&while(!key2);&switch(key1n)&{&case&1:miao++;//设置键按动1次,调秒&&&if(miao==60)&&&&miao=0;//秒超过59,再加1,就归零&&&write_sfm(0x08,miao);//令LCD在正确位置显示&加&设定好的秒数&&&temp=(miao)/10*16+(miao)%10;//十进制转换成DS1302要求的DCB码&&&&&&write_e,0x00);&//允许写,禁止写保护&&&&&&&write_,temp);&//向DS1302内写秒寄存器80H写入调整后的秒数据BCD码&&&&&&write_e,0x80);&//打开写保护&&&write_1602com(er+0x09);//因为设置液晶的模式是写入数据后,光标自动右移,所以要指定返回&&&//write_1602com(0x0b);&&&&case&2:fen++;&&&if(fen==60)&&&&fen=0;&&&write_sfm(0x05,fen);//令LCD在正确位置显示&加&设定好的分数据&&&temp=(fen)/10*16+(fen)%10;//十进制转换成DS1302要求的DCB码&&&&&&write_e,0x00);//允许写,禁止写保护&&&&&&&write_,temp);//向DS1302内写分寄存器82H写入调整后的分数据BCD码&&&&&&write_e,0x80);//打开写保护&&&write_1602com(er+6);//因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置&&&&case&3:shi++;&&&if(shi==24)&&&&shi=0;&&&write_sfm(2,shi);//令LCD在正确的位置显示&加&设定好的小时数据&&&temp=(shi)/10*16+(shi)%10;//十进制转换成DS1302要求的DCB码&&&&&&write_e,0x00);//允许写,禁止写保护&&&&&&&write_,temp);//向DS1302内写小时寄存器84H写入调整后的小时数据BCD码&&&&&&write_e,0x80);//打开写保护&&&write_1602com(er+3);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位&&&&case&4:week++;&&&if(week==8)&&&&week=1;&&&&&&&&&&&&write_1602com(yh+0x0C);//指定'加'后的周数据显示位置&&&&write_week(week);//指定周数据显示内容&&&&&&&&&&&&temp=(week)/10*16+(week)%10;//十进制转换成DS1302要求的DCB码&&&&&&write_e,0x00);//允许写,禁止写保护&&&&&&&write_a,temp);//向DS1302内写周寄存器8aH写入调整后的周数据BCD码&&&&&&write_e,0x80);//打开写保护&&&&&&write_1602com(yh+0x0e);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位&&&&case&5:ri++;&&&if(ri==32)&&&&ri=1;&&&write_nyr(9,ri);//令LCD在正确的位置显示&加&设定好的日期数据&&&temp=(ri)/10*16+(ri)%10;//十进制转换成DS1302要求的DCB码&&&&&&write_e,0x00);//允许写,禁止写保护&&&&&&write_,temp);//向DS1302内写日期寄存器86H写入调整后的日期数据BCD码&&&&&&write_e,0x80);//打开写保护&&&write_1602com(yh+10);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位&&&&case&6:yue++;&&&if(yue==13)&&&&yue=1;&&&write_nyr(6,yue);//令LCD在正确的位置显示&加&设定好的月份数据&&&temp=(yue)/10*16+(yue)%10;//十进制转换成DS1302要求的DCB码&&&&&&write_e,0x00);//允许写,禁止写保护&&&&&&write_,temp);//向DS1302内写月份寄存器88H写入调整后的月份数据BCD码&&&&&&write_e,0x80);//打开写保护&&&write_1602com(yh+7);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位&&&&case&7:nian++;&&&if(nian==100)&&&nian=0;&&&write_nyr(3,nian);//令LCD在正确的位置显示&加&设定好的年份数据&&&&&&&&&&&&temp=(nian)/10*16+(nian)%10;//十进制转换成DS1302要求的DCB码&&&&&&write_e,0x00);//允许写,禁止写保护&&&&&&write_c,temp);//向DS1302内写年份寄存器8cH写入调整后的年份数据BCD码&&&&&&write_e,0x80);//打开写保护&&&write_1602com(yh+4);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位&&&&&&&}&}&}&//------------------减键key3,各句功能参照'加键'注释---------------&if(key3==0)&{&delay(10);//调延时,消抖动&if(key3==0)&{&&&&buzzer=0;//蜂鸣器短响一次&&&&delay(20);&&&&buzzer=1;&while(!key3);&switch(key1n)&{&&case&1:miao--;&&&&if(miao==-1)&&&&&miao=59;//秒数据减到-1时自动变成59&&&write_sfm(0x08,miao);//在LCD的正确位置显示改变后新的秒数&&&&&&&&&&&&temp=(miao)/10*16+(miao)%10;//十进制转换成DS1302要求的DCB码&&&&&&write_e,0x00);&//允许写,禁止写保护&&&&&&&write_,temp);&//向DS1302内写秒寄存器80H写入调整后的秒数据BCD码&&&&&&write_e,0x80);&//打开写保护&&&write_1602com(er+0x09);//因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置&&&//write_1602com(0x0b);&&&&&case&2:fen--;&&&&if(fen==-1)&&&&&fen=59;&&&write_sfm(5,fen);&&&temp=(fen)/10*16+(fen)%10;//十进制转换成DS1302要求的DCB码&&&&&&write_e,0x00);//允许写,禁止写保护&&&&&&&write_,temp);//向DS1302内写分寄存器82H写入调整后的分数据BCD码&&&&&&write_e,0x80);//打开写保护&&&write_1602com(er+6);//因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置&&&&&case&3:shi--;&&&&&&if(shi==-1)&&&&&shi=23;&&&write_sfm(2,shi);&&&temp=(shi)/10*16+(shi)%10;//十进制转换成DS1302要求的DCB码&&&&&&write_e,0x00);//允许写,禁止写保护&&&&&&&write_,temp);//向DS1302内写小时寄存器84H写入调整后的小时数据BCD码&&&&&&write_e,0x80);//打开写保护&&&write_1602com(er+3);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位&&&&&case&4:week--;&&&&if(week==0)&&&&&week=7;&&&&&&&&&&&&&&&&write_1602com(yh+0x0C);//指定'加'后的周数据显示位置&&&&write_week(week);//指定周数据显示内容&&&&&&temp=(week)/10*16+(week)%10;//十进制转换成DS1302要求的DCB码&&&&&&write_e,0x00);//允许写,禁止写保护&&&&&&&write_a,temp);//向DS1302内写周寄存器8aH写入调整后的周数据BCD码&&&&&&write_e,0x80);//打开写保护&&&&&&write_1602com(yh+0x0e);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位&&&&&case&5:ri--;&&&&if(ri==0)&&&&&ri=31;&&&write_nyr(9,ri);&&&temp=(ri)/10*16+(ri)%10;//十进制转换成DS1302要求的DCB码&&&&&&write_e,0x00);//允许写,禁止写保护&&&&&&write_,temp);//向DS1302内写日期寄存器86H写入调整后的日期数据BCD码&&&&&&write_e,0x80);//打开写保护&&&write_1602com(yh+10);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位&&&&&case&6:yue--;&&&&if(yue==0)&&&&&yue=12;&&&write_nyr(6,yue);&&&temp=(yue)/10*16+(yue)%10;//十进制转换成DS1302要求的DCB码&&&&&&write_e,0x00);//允许写,禁止写保护&&&&&&write_,temp);//向DS1302内写月份寄存器88H写入调整后的月份数据BCD码&&&&&&write_e,0x80);//打开写保护&&&write_1602com(yh+7);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位&&&&&&case&7:nian--;&&&if(nian==-1)&&&nian=99;&&&write_nyr(3,nian);&&&&&&&&&temp=(nian)/10*16+(nian)%10;//十进制转换成DS1302要求的DCB码&&&&&&write_e,0x00);//允许写,禁止写保护&&&&&&write_c,temp);//向DS1302内写年份寄存器8cH写入调整后的年份数据BCD码&&&&&&write_e,0x80);//打开写保护&&&write_1602com(yh+4);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位&&&&&&&&&&&}&}&}&}}//-------------------------------void&init()&//定时器、计数器设置函数{&TMOD=0x11;&//指定定时/计数器的工作方式为3&TH0=0;&&//定时器T0的高四位=0&TL0=0;&&//定时器T0的低四位=0&EA=1;&&//系统允许有开放的中断&ET0=1;&//允许T0中断&TR0=1;&//开启中断,启动定时器}//*******************主函数**************************//***************************************************void&main(){&lcd_init();&&&&&&//调用液晶屏初始化子函数&ds1302_init();&&&//调用DS1302时钟的初始化子函数&init();&&&&&&&&&&//调用定时计数器的设置子函数&led=0;&&&&&&&&&&&//打开LCD的背光电源&&&&buzzer=0;//蜂鸣器长响一次&&&&delay(80);&&&&buzzer=1;&while(1)&&//无限循环下面的语句:&{&&&&&&&keyscan();&&&&&&//调用键盘扫描子函数&&&&&}}void&timer0()&interrupt&1&&//取得并显示日历和时间{&&&&//Init_DS18B20();//温度传感器DS18b2初始化子函数,在头文件中&&&flag=ReadTemperature();//将18b2头文件运行返回的函数结果送到变量FLAG中,用于显示&&//读取秒时分周日月年七个数据(DS1302的读寄存器与写寄存器不一样):&&&miao&=&BCD_Decimal(read_));&fen&=&BCD_Decimal(read_));&shi&&=&BCD_Decimal(read_));&ri&&=&BCD_Decimal(read_));&yue&=&BCD_Decimal(read_));&nian=BCD_Decimal(read_d));&week=BCD_Decimal(read_b));&//显示温度、秒、时、分数据:&&&&&&write_temp(12,flag);//显示温度,从第二行第12个字符后开始显示&&&write_sfm(8,miao);//秒,从第二行第8个字后开始显示(调用时分秒显示子函数)&write_sfm(5,fen);//分,从第二行第5个字符后开始显示&write_sfm(2,shi);//小时,从第二行第2个字符后开始显示&&//显示日、月、年数据:&write_nyr(9,ri);//日期,从第二行第9个字符后开始显示&&&write_nyr(6,yue);//月份,从第二行第6个字符后开始显示&write_nyr(3,nian);//年,从第二行第3个字符后开始显示&write_week(week);}
为您推荐:
其他类似问题
您可能关注的内容
lcd1602的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。当前位置: &
> 基于 AT89S52、DS1302、LCD1602 的 时钟 日历 闹钟(含C源文件、详细程序摘要)
查看: 8214|回复: 22
积分6914帖子
在网上下的程序,针对自己的学习板修改了引脚的定义,并实现/增加了以下功能:1、设置参数其间光标闪烁等待的功能。& &网上下的原程序无此功能,设置日期、时间时不知道光标移到哪?当前选中哪个参数,很不方便。& &于是我修改了一下设置参数其间光标显示特性为“显示+闪烁”,并增加了等待按键的语句就实现了。 2、增加了一个按键——确认键 S4。& &原程序只有3个按键,每次一进入设置参数模式后,都要进入到设置闹钟模式选中字符“@”再按一下加数键或减数键才能返回到正常显示模式,这样至少要按9次S1键(未进入设置闹钟模式、并且无调整过参数大小的情况),或者11次S1键+1次S2/S3键(有进入过设置闹钟的情况、并且无调整过参数大小的情况)。可见会按到你烦。& &于是我增加了一个按键——确认键 S4,这样每次进入设置参数模式后,一按S4键就可返回到正常显示模式。 3、增加了闹钟记忆功能。& &原程序虽然可以设置闹钟,但每当复位、关断电源后又重新接上电源时原来设置好的闹钟时间就掉失了,要重新设置。& &于是我增加了闹钟记忆功能,把设置好的闹钟时间及闹钟开/关状态保存下来,重新接电后就是断电前设置的状态。 注:使用本程序要注意的地方:<font color="#、引脚定义时,DS1302、1602 接到 AT89S52 的哪个引脚。 <font color="#、引脚定义部分并未指明 LCD1602 的8位数据线接到的哪个 I/O 口,使用前记得要改为你自己的接法。& &我的学习板接的是P2口,变量P2涉及到以下函数:& &void write_com(uchar com)& & //写入lcd显示方式& &void write_data(uchar date)&&//向lcd1602写入数据
主要芯片:AT89S52、DS1302、LCD1602 一、系统功能:1、&&用液晶屏 LCD1602 分两行显示“ 年、月、日、周日、时、分、秒 ”,格式如下:& && && & Fri&&15:18:36& & 2、&&还可以设置1个闹钟。3、&&日期、时间、闹钟均可通过按键来调整。4、&&闹钟时间及开关状态可保存,即关机后再开机会显示上次关机前闹钟的设置5、&&共4个独立按键:S1:功能键。用来选择要更改的项目(年、月、日、周日、时、分、秒、闹钟)。S2:加数键。按1下则数值加1。S3:减数键。按1下则数值减1。S4:确认键。在设置参数模式下,一按此键程序即返回到正常显示模式的状态。 在设置闹钟模式下,屏幕第二行显示的格式:@ NO 00:00:00
20:39:37 上传
正常显示模式
20:39:42 上传
设置闹钟模式
20:45:05 上传
下载次数: 346
下载积分: 积分 -1
494.96 KB, 下载次数: 346, 下载积分: 积分 -1
售价: 3 积分 &[]
C源程序、及摘要
500 字节以内
不支持自定义 Discuz! 代码
积分6914帖子
以前未试过利用时钟芯片DS1302来编时钟程序,通过这次修改程序、增加功能,编写程序摘要文档使我更加理解程序的功能及执行过程,同时也加深了对 DS1302、LCD1602&&的了解。
看来编写文档,很好!很好!
积分6914帖子
附件中C源文件生成的HEX文件显示达到9KB之大(我是用 Keil uVision3&&来编的),但程序中并未增加以下功能:
1、显示“AM”、“PM” 的功能。
2、12小时制与24小时制之间切换的功能,现在只能以24小时制来显示。
3、在调整参数大小的过程中,不能通过长按加减键来实现自动快速加减数。
4、只能设置1个闹钟,不能设置多个。
5、没有秒表功能。
6、闹钟铃声只有“嘀嘀”声,没有乐曲。
7、也不能通过与PC机连接,进行由PC机来在线实时修改时钟日历的参数。
积分6914帖子
还可以再加上懒人闹钟的功能。
地主, 积分 1051, 距离下一级还需 1949 积分
积分1051帖子
学习O(∩_∩)O谢谢
佃户, 积分 32, 距离下一级还需 68 积分
积分32帖子
谢谢& && && && && && && && && &&&
佃户, 积分 7, 距离下一级还需 93 积分
富农, 积分 808, 距离下一级还需 192 积分
积分808帖子
楼主真热心,分享这么好的嵌入式系统资料,多谢!
佃户, 积分 39, 距离下一级还需 61 积分
积分39帖子
谢谢你提供好的资料,学习学习~
佃户, 积分 56, 距离下一级还需 44 积分
积分56帖子
佃户, 积分 32, 距离下一级还需 68 积分
积分32帖子
看看,,,,
地主, 积分 1628, 距离下一级还需 1372 积分
积分1628帖子
,,,,,,,,,,www.pcbkey.com
佃户, 积分 32, 距离下一级还需 68 积分
积分32帖子
卡卡看看。。。。
贫农, 积分 126, 距离下一级还需 74 积分
积分126帖子
这个帖子怎么收藏???
贫农, 积分 117, 距离下一级还需 83 积分
积分117帖子
楼上看什么?
佃户, 积分 49, 距离下一级还需 51 积分
积分49帖子
學習了,謝謝版主分享!!
佃户, 积分 40, 距离下一级还需 60 积分
积分40帖子
佃户, 积分 38, 距离下一级还需 62 积分
积分38帖子
佃户, 积分 32, 距离下一级还需 68 积分
积分32帖子
楼主为什么按照你的仿真LCD不显示
佃户, 积分 32, 距离下一级还需 68 积分
积分32帖子
你好 谢谢分享}

我要回帖

更多关于 c51 ds1302 lcd1602 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信