基于51单片机点阵显示左移c程序.docx

上传人:b****6 文档编号:8038259 上传时间:2023-05-12 格式:DOCX 页数:21 大小:18.11KB
下载 相关 举报
基于51单片机点阵显示左移c程序.docx_第1页
第1页 / 共21页
基于51单片机点阵显示左移c程序.docx_第2页
第2页 / 共21页
基于51单片机点阵显示左移c程序.docx_第3页
第3页 / 共21页
基于51单片机点阵显示左移c程序.docx_第4页
第4页 / 共21页
基于51单片机点阵显示左移c程序.docx_第5页
第5页 / 共21页
基于51单片机点阵显示左移c程序.docx_第6页
第6页 / 共21页
基于51单片机点阵显示左移c程序.docx_第7页
第7页 / 共21页
基于51单片机点阵显示左移c程序.docx_第8页
第8页 / 共21页
基于51单片机点阵显示左移c程序.docx_第9页
第9页 / 共21页
基于51单片机点阵显示左移c程序.docx_第10页
第10页 / 共21页
基于51单片机点阵显示左移c程序.docx_第11页
第11页 / 共21页
基于51单片机点阵显示左移c程序.docx_第12页
第12页 / 共21页
基于51单片机点阵显示左移c程序.docx_第13页
第13页 / 共21页
基于51单片机点阵显示左移c程序.docx_第14页
第14页 / 共21页
基于51单片机点阵显示左移c程序.docx_第15页
第15页 / 共21页
基于51单片机点阵显示左移c程序.docx_第16页
第16页 / 共21页
基于51单片机点阵显示左移c程序.docx_第17页
第17页 / 共21页
基于51单片机点阵显示左移c程序.docx_第18页
第18页 / 共21页
基于51单片机点阵显示左移c程序.docx_第19页
第19页 / 共21页
基于51单片机点阵显示左移c程序.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于51单片机点阵显示左移c程序.docx

《基于51单片机点阵显示左移c程序.docx》由会员分享,可在线阅读,更多相关《基于51单片机点阵显示左移c程序.docx(21页珍藏版)》请在冰点文库上搜索。

基于51单片机点阵显示左移c程序.docx

基于51单片机点阵显示左移c程序

#include

#include

typedefunsignedintuint;

typedefunsignedcharuchar;

ucharnian,zhou,yue,ri,shi,fen,miao;

ucharn,m;

ucharflagstart;//确定标志位

ucharflagstop;//停止标志位

ucharflagdushi;//读时间标志位

ucharhaoma;

uchartemp;//温度

ucharirtime;//红外高低电平所占时间,由定时器0中断产生

ucharstartflag;//接收红外引导码的标志位

ucharbitnum;

ucharirreseok;//红外接收标志位

ucharirjieshu;

sbitDQ=P1^3;//DS18B20数据管脚

sbitrst=P1^6;//1302接口定义

sbitsck=P1^1;

sbitio=P1^0;

sbitrs=P2^0;//液晶接口定义

sbitrw=P2^1;

sbite=P2^2;

ucharinit_ds18b20(void);

ucharread_ds18b20temp(void);

voidwrite_ds18b20byte(uchardat);

ucharread_ds18b20byte(void);

voiddelay_8us(uintt);

voidset_time1(ucharm);

voidtiaoshi(void);

voidirkongzhi(void);

voidirpd(void);//红外解码判断

voidirchuli(void);//红外接收数据保存

voidwrite_com(com);//液晶的写指令

voidwrite_data(dat);//液晶的写数据

voidinit(void);//定时器,液晶,红外中断的初始化

voiddelay(uintt);

voidtimechuli(void);

voidset_time(void);//设置时间

voidread_time(void);//读书时间

voidyejinchuli(void);

ucharread_ds1302(ucharadd);//读DS1302上的某个地址上的数,如:

读时间

voidwrite_byte(uchardat);//写一个字节到DS1302

voidwrite_ds1302(ucharadd,uchardat);//在DS1302上的某个地址上写数据

//ucharread_1602(ucharadd);

ucharcodetimetable[8];

ucharirtable[33];

ucharircode[4];

uchardisp[16]="";

uchardisp1[16]="";

ucharcodetable[10]="0123456789";

ucharcodetable1[4]="zhou";//液晶数组

ucharcodetable2[5]="-CSD:

";

uchartime[7];//年周月日时分秒

ucharcodewrite_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};//写操作的时候DS1302中的对应的时间地址

ucharcoderead_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};//读操作的时候DS1302中的对应的时间地址

voidmain()

{

init();

//set_time();

while

(1)

{

read_ds18b20temp();

if(irreseok==1)

{

irreseok=0;

irchuli();

delay(5);

irpd();

delay(5);

tiaoshi();

}

if(flagstop)

{

flagdushi=1;

flagstop=0;

}

if(flagstart)

{

flagstart=0;

flagdushi=0;

}

if(!

flagdushi)

{

timechuli();

yejinchuli();

read_time();

}

}

}

voiddelay_8us(uintt)

{

while(t--);

}

ucharinit_ds18b20(void)

{

ucharn;

DQ=1;

delay_8us(8);

DQ=0;

delay_8us(80);

DQ=1;//释放总线

delay_8us(8);

n=DQ;

delay_8us(4);

returnn;

}

voidwrite_ds18b20byte(uchardat)

{

ucharj;

for(j=0;j<8;j++)

{

DQ=0;

DQ=dat&0x01;

delay_8us(4);

DQ=1;

dat>>=1;

}

delay_8us(4);

}

ucharread_ds18b20byte(void)

{

uchari,dat;

for(i=0;i<8;i++)

{

DQ=0;

dat>>=1;

DQ=1;

if(DQ)

dat|=0x80;

delay_8us(4);

}

returndat;

}

ucharread_ds18b20temp(void)

{

uchara,b;

init_ds18b20();

write_ds18b20byte(0xcc);//跳过ROM

write_ds18b20byte(0x44);//启动温度测量

delay_8us(300);

init_ds18b20();

write_ds18b20byte(0xcc);//跳过ROM

write_ds18b20byte(0xbe);//开始读取温度

a=read_ds18b20byte();

b=read_ds18b20byte();

temp=(b*256+a)*0.0625;

returntemp;

}

voidtime0()interrupt1

{

irtime++;

}

voidint0()interrupt0

{

if(startflag)

{

if(irtime>32)//收到引导码

{

bitnum=0;

}

irtable[bitnum]=irtime;

irtime=0;

bitnum++;

if(bitnum==33)

{

bitnum=0;

irreseok=1;

}

}

else

{

startflag=1;

irtime=0;

}

}

voidinit(void)

{

//液晶初始化

P0=0x00;

e=0;

write_com(0x38);

write_com(0x0f);

write_com(0x06);

delay(15);

write_com(0x38);

delay(5);

write_com(0x38);

delay(5);

write_com(0x38);

write_com(0x38);

write_com(0x08);

write_com(0x01);

write_com(0x06);

write_com(0x0f);

//定时器0初始化

TH0=0X00;

TL0=0X00;

ET0=1;

TMOD=0X02;

TR0=1;

EA=1;

//外部中断0初始化

IT0=1;

EX0=1;

EA=1;

}

/*ucharread_1602(ucharadd)

{

uchardat;

write_com(add);

rs=0;

rw=0;

rw=1;

delay

(1);

e=0;

e=1;

dat=P0;

delay

(1);

e=0;

rw=0;

return(dat);

}*/

voidtiaoshi(void)

{

if(ircode[1]==0xbf)

{

if(haoma<10)

{

delay

(2);

n++;

if((n>0x0f)&&(n<0x40))

n=0x40;

switch(n)

{

case0x01:

time[0]=time[0]%16+(haoma*16);

set_time1(0);

break;

case0x02:

time[0]=time[0]/16*16+haoma;

set_time1(0);

break;

case0x04:

time[2]=time[2]%16+(haoma*16);

set_time1

(2);

break;

case0x05:

time[2]=time[2]/16*16+haoma;

set_time1

(2);

break;

case0x07:

time[3]=time[3]%16+(haoma*16);

set_time1(3);

break;

case0x08:

time[3]=time[3]/16*16+haoma;

set_time1(3);

break;

case0x40:

time[1]=time[1]/16*16+haoma;

set_time1

(1);

break;

case0x41:

time[4]=time[4]%16+(haoma*16);

set_time1(4);

break;

case0x42:

time[4]=time[4]/16*16+haoma;

set_time1(4);

break;

case0x44:

time[5]=time[5]%16+(haoma*16);

set_time1(5);

break;

case0x45:

time[5]=time[5]/16*16+haoma;

set_time1(5);

break;

case0x47:

time[6]=time[6]%16+(haoma*16);

set_time1(6);

break;

case0x48:

time[6]=time[6]/16*16+haoma;

set_time1(6);

break;

default:

;

}

delay(10);

write_data(table[haoma]);

}

if(haoma==10)

{

if((n>=0x40)&&(n<=0x4f))

n-=0x40;

}

if(haoma==11)

{

if((n>=0x00)&&(n<=0x0f))

n+=0x40;

}

if(haoma==12)

{

n--;

if(n==255)

n=0x47;

if(n==0x3f)

n=0x0f;

if(n==0x0e)

n=7;

if(n==5)

n=4;

if(n==2)

n=1;

if(n==0x45)

n=0x44;

if(n==0x42)

n=0x41;

if(n==0x10)

n=0x40;

}

if(haoma==13)

{

n++;

}

if(haoma==14)

{

flagstart=1;

}

if(haoma==15)

{

flagstop=1;

};

if(n==2)

n=3;

if(n==5)

n=6;

if((n>=8)&&(n<=14))

n=15;

if(n==0x10)

n=0x40;

if(n==0x42)

n=0x43;

if(n==0x45)

n=0x46;

if(n==0x48)

n=0;

write_com(0x80+n);

}

}

voidirkongzhi(void)//红外控制液晶

{

if(ircode[1]==0xbf)

{

}

}

voidirpd(void)//红外解码判断

{

if(ircode[1]==0xbf)

{

switch(ircode[2])

{

case0x0c:

haoma=0;

break;

case0x10:

haoma=1;

break;

case0x11:

haoma=2;

break;

case0x12:

haoma=3;

break;

case0x14:

haoma=4;

break;

case0x15:

haoma=5;

break;

case0x16:

haoma=6;

break;

case0x18:

haoma=7;

break;

case0x19:

haoma=8;

break;

case0x1a:

haoma=9;

break;

case0x05:

haoma=10;

break;

case0x0d:

haoma=11;

break;

case0x08:

haoma=12;

break;

case0x0a:

haoma=13;

break;

case0x09:

haoma=14;

break;

case0x06:

haoma=15;

break;

default:

;

}

}

}

voiddelay(uintt)//长延时

{

uchara,b;

for(a=t;a>0;a--)

for(b=120;b>0;b--);

}

voidwrite_com(ucharcom)//1602液晶写指令

{

e=0;

rs=0;

rw=0;

P0=com;

delay

(1);

e=1;

delay(5);

e=0;

}

voidwrite_data(uchardat)//1602液晶写数据

{

e=0;

rs=1;

rw=0;

P0=dat;

delay

(1);

e=1;

delay(5);

e=0;

}

voidwrite_byte(uchardatt)//向ds1302时钟芯片中写一个字节

{

uchari;

for(i=0;i<8;i++)

{

sck=0;

io=datt&0x01;

datt=datt>>1;

sck=1;

}

}

voidwrite_ds1302(ucharadd,uchardat)//给ds1302中某个地址上写数据

{

rst=0;

_nop_();

sck=0;

_nop_();

rst=1;

_nop_();

write_byte(add);

write_byte(dat);

rst=0;

_nop_();

io=1;

sck=1;

}

ucharread_ds1302(ucharadd)//读DS1302中某个地址上的数据并返回

{

uchari,value;

rst=0;

_nop_();

sck=0;

_nop_();

rst=1;

_nop_();

write_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;

returnvalue;

}

voidset_time(void)//设置DS1302的时间

{

uchari,j;

for(i=0;i<7;i++)

{

j=time[i]/10;

time[i]=time[i]%10;

time[i]=time[i]+j*16;//把十进制数转为BCD码,如:

15转换成BCD码位00011001

}

write_ds1302(0x8e,0x00);//去除写保护

for(i=0;i<7;i++)

{

write_ds1302(write_add[i],time[i]);

}

write_ds1302(0x8e,0x80);//加写保护

}

voidset_time1(ucharm)//设置DS1302的时间

{

write_ds1302(0x8e,0x00);//去除写保护

write_ds1302(write_add[m],time[m]);

write_ds1302(0x8e,0x80);//加写保护

}

voidread_time(void)//读DS1302中的年,周,月,日,时,分,秒。

{

uchari;

for(i=7;i>0;i--)

{

time[i]=read_ds1302(read_add[i]);

}

}

voidtimechuli(void)//把从DS1302中读出的年,周,月,日,时,分,秒,进行分离成十进制。

{

//第一行显示

disp[0]=table[time[0]/16];

disp[1]=table[time[0]%16];

disp[2]=table2[0];

disp[3]=table[time[2]/16];

disp[4]=table[time[2]%16];

disp[5]=table2[0];

disp[6]=table[time[3]/16];

disp[7]=table[time[3]%16];

disp[8]=table2[0];

disp[9]=table2[0];

disp[10]=table1[0];

disp[11]=table1[1];

disp[12]=table1[2];

disp[13]=table1[3];

disp[14]=table2[0];

disp[15]=table[time[1]%16];

//第二行显示

disp1[0]=table[time[4]/16];

disp1[1]=table[time[4]%16];

disp1[2]=table2[4];

disp1[3]=table[time[5]/16];

disp1[4]=table[time[5]%16];

disp1[5]=table2[4];

disp1[6]=table[time[6]/16];

disp1[7]=table[time[6]%16];

disp1[8]=table2[0];

disp1[9]=table2[0];

disp1[10]=table[temp/100];

disp1[11]=table[temp%100/10];

disp1[12]=table[temp%10];

disp1[13]=table2[1];

disp1[14]=table2[2];

disp1[15]=table2[3];

}

voidyejinchuli(void)

{

uchari;

write_com(0x80);

delay

(1);

for(i=0;i<16;i++)

{

write_data(disp[i]);

}

write_com(0xc0);

for(i=0;i<16;i++)

{

write_data(disp1[i]);

}

}

voidirchuli(void)

{

uchari,j,k,vaule;

k=1;

for(i=0;i<4;i++)

{

for(j=0;j<8;j++)

{

vaule=vaule>>1;

if(irtable[k]>6)

{

vaule=vaule|0x80;

}

k++;

}

ircode[i]=vaule;

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 公共行政管理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2