天狼星51AVR课上程序代码.docx
《天狼星51AVR课上程序代码.docx》由会员分享,可在线阅读,更多相关《天狼星51AVR课上程序代码.docx(49页珍藏版)》请在冰豆网上搜索。
天狼星51AVR课上程序代码
51篇
51单片机第二十课PS2键盘键值解码
所属类别:
课程代码发布日期:
2011-03-05点击量:
383
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitpsdata=P3^0;
sbitpsclk=P3^2;
ucharnumbit;
ucharkeyv;
ucharkey[3];
ucharkeynum;
ucharm,n;
unsignedcharcodesmg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
unsignedcharcodesmg_we[]={0x08,0x18,0x28,0x38,0x48,0x58,0x68,0x78};
//************************************************
//延时函数,在12MHz的晶振频率下
//大约50us的延时
//************************************************
voiddelay_50us(uintt)
{
ucharj;
for(;t>0;t--)
for(j=19;j>0;j--);
}
//************************************************
//延时函数,在12MHz的晶振频率下
//大约50ms的延时
//************************************************
voiddelay_50ms(uintt)
{
uintj;
for(;t>0;t--)
for(j=6245;j>0;j--);
}
voidmain()
{
IT0=1;//外部中断下降沿触发
EX0=1;//打开外部中断0
EA=1;//打开总中断
while
(1)
{
if(keynum==3)
{
keynum=0;//0x1c
n=key[0]/16;
m=key[0]%16;
}
P1=smg_du[m];
P2=smg_we[0];
delay_50us(20);
P1=smg_du[n];
P2=smg_we[1];
delay_50us(20);
}
}
voidint0()interrupt0
{
if((numbit>0)&&(numbit<9))//>>
{
keyv=keyv>>1;//001000000
if(psdata)
keyv=keyv|0x80;//10000000
}//01
numbit++;//0
if(numbit>10)
{
numbit=0;
key[keynum]=keyv;
keynum++;
}
}
51单片机第二十三课实时时钟芯片DS1302的读写
所属类别:
课程代码发布日期:
2011-03-05点击量:
531
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitsck=P1^0;
sbitio=P1^1;
sbitrst=P3^6;
sbitsmgen=P2^3;
unsignedcharcodesmg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x10};
unsignedcharcodesmg_we[]={0x08,0x18,0x28,0x38,0x48,0x58,0x68,0x78};
uchartime_data[7]={10,6,4,17,11,58,30};//年周月日时分秒
ucharwrite_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};
ucharread_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
uchardisp[8];
voidwrite_ds1302_byte(uchardat);
voidwrite_ds1302(ucharadd,uchardat);
ucharread_ds1302(ucharadd);
voidset_rtc(void);
voidread_rtc(void);
voidtime_pros(void);
voiddisplay(void);
//************************************************
//延时函数,在12MHz的晶振频率下
//大约50us的延时
//************************************************
voiddelay_50us(uintt)
{
ucharj;
for(;t>0;t--)
for(j=19;j>0;j--);
}
//************************************************
//延时函数,在12MHz的晶振频率下
//大约50ms的延时
//************************************************
voiddelay_50ms(uintt)
{
uintj;
for(;t>0;t--)
for(j=6245;j>0;j--);
}
voidwrite_ds1302_byte(uchardat)
{
uchari;
for(i=0;i<8;i++)
{
sck=0;
io=dat&0x01;
dat=dat>>1;
sck=1;
}
}
voidwrite_ds1302(ucharadd,uchardat)
{
rst=0;
_nop_();
sck=0;_nop_();
rst=1;
_nop_();
write_ds1302_byte(add);
write_ds1302_byte(dat);
rst=0;
_nop_();
io=1;
sck=1;
}
ucharread_ds1302(ucharadd)
{
uchari,value;
rst=0;
_nop_();
sck=0;
_nop_();
rst=1;
_nop_();
write_ds1302_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_rtc(void)
{
uchari,j;
for(i=0;i<7;i++)
{
j=time_data[i]/10;
time_data[i]=time_data[i]%10;
time_data[i]=time_data[i]+j*16;
}
write_ds1302(0x8e,0x00);//去除写保护
for(i=0;i<7;i++)
{
write_ds1302(write_add[i],time_data[i]);
}
write_ds1302(0x8e,0x80);//加写保护
}
voidread_rtc(void)
{
uchari;
for(i=0;i<7;i++)
{
time_data[i]=read_ds1302(read_add[i]);
}
}
voidtime_pros(void)
{
disp[0]=time_data[6]%16;
disp[1]=time_data[6]/16;
disp[2]=16;
disp[3]=time_data[5]%16;
disp[4]=time_data[5]/16;
disp[5]=16;
disp[6]=time_data[4]%16;
disp[7]=time_data[4]/16;
}
voiddisplay(void)
{
uchari;
for(i=0;i<8;i++)
{
P1=smg_du[disp[i]];
P2=smg_we[i];
delay_50us(20);
}
}
voidmain(void)
{
set_rtc();
delay_50us(20);
while
(1)
{
smgen=0;
rst=1;
read_rtc();
rst=0;
time_pros();
smgen=1;
display();
smgen=0;
}
}
51单片机第二十四课数字温度传感器DS18B20测温
所属类别:
课程代码发布日期:
2011-03-05点击量:
506
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P2^2;
sbitsmg1=P2^4;
sbitsmg2=P2^5;
sbitsmg3=P2^6;
uchartemp;
unsignedcharcodesmg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
unsignedcharcodesmg_we[]={0x08,0x18,0x28,0x38,0x48,0x58,0x68,0x78};
voidinit_ds18b20(void);
voiddelay(uintt);
voidwrite_byte(uchardat);
ucharread_byte(void);
ucharreadtemperature(void);
voiddisplay(void);
//************************************************
//延时函数,在12MHz的晶振频率下
//大约50us的延时
//************************************************
voiddelay_50us(uintt)
{
ucharj;
for(;t>0;t--)
for(j=19;j>0;j--);
}
voidmain(void)
{
while
(1)
{
temp=readtemperature();
display();
}
}
voiddelay(uintt)
{
while(t--);
}
voidinit_ds18b20(void)
{
ucharn;
DQ=1;
delay(8);
DQ=0;
delay(80);
DQ=1;
delay(8);
n=DQ;
delay(4);
}
voidwrite_byte(uchardat)
{
uchari;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;
delay(4);
DQ=1;
dat>>=1;
}
delay(4);
}
ucharread_byte(void)
{
uchari,value;
for(i=0;i<8;i++)
{
DQ=0;
value>>=1;
DQ=1;
if(DQ)
value|=0x80;
delay(4);
}
returnvalue;
}
ucharreadtemperature(void)
{
uchara,b;
init_ds18b20();
write_byte(0xcc);//跳过ROM
write_byte(0x44);//启动温度测量
delay(300);
init_ds18b20();
write_byte(0xcc);
write_byte(0xbe);
a=read_byte();
b=read_byte();
b<<=4;
b+=(a&0xf0)>>4;
returnb;
}
voiddisplay(void)
{
smg3=0;
smg2=0;
smg1=0;
P1=smg_du[temp%10];
delay_50us(20);
smg2=0;
smg1=1;
P1=smg_du[temp/10];
delay_50us(20);
}
51单片机第二十一课红外遥控解码程序设计
所属类别:
课程代码发布日期:
2011-03-05点击量:
504
#include
#defineucharunsignedchar
#defineuintunsignedint
unsignedcharcodesmg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
unsignedcharcodesmg_we[]={0x08,0x18,0x28,0x38,0x48,0x58,0x68,0x78};
ucharirtime;
ucharstartflag;
ucharirdata[33];
ucharbitnum;
ucharirreceok;
ucharircode[4];
ucharirprosok;
uchardisp[8];
//************************************************
//延时函数,在12MHz的晶振频率下
//大约50us的延时
//************************************************
voiddelay_50us(uintt)
{
ucharj;
for(;t>0;t--)
for(j=19;j>0;j--);
}
//************************************************
//延时函数,在12MHz的晶振频率下
//大约50ms的延时
//************************************************
voiddelay_50ms(uintt)
{
uintj;
for(;t>0;t--)
for(j=6245;j>0;j--);
}
voidtimer0init(void)
{
TMOD=0x02;
TH0=0x00;
TL0=0x00;
ET0=1;
EA=1;
TR0=1;
}
voidint0init(void)
{
IT0=1;
EX0=1;
EA=1;
}
voidirwork(void)
{
disp[0]=ircode[0]/16;
disp[1]=ircode[0]%16;
disp[2]=ircode[1]/16;
disp[3]=ircode[1]%16;
disp[4]=ircode[2]/16;
disp[5]=ircode[2]%16;
disp[6]=ircode[3]/16;
disp[7]=ircode[3]%16;
}
voiddisplay(void)
{
uchari;
for(i=0;i<8;i++)
{
P1=smg_du[disp[i]];
P2=smg_we[i];
delay_50us(20);
}
}
voidirpros(void)//0x1c
{
uchark,i,j;
ucharvalue;
k=1;
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{
value=value>>1;//7
if(irdata[k]>6)//8
{
value=value|0x80;
}
k++;
}
ircode[j]=value;
}
irprosok=1;
}
voidmain()
{
timer0init();
int0init();
while
(1)
{
if(irreceok)
{
irpros();
irreceok=0;
}
if(irprosok)
{
irwork();
irprosok=0;
}
display();
}
}
voidtimer0()interrupt1
{
irtime++;//255
}
voidint0()interrupt0
{
if(startflag)
{
if(irtime>32)//检测引导码
{
bitnum=0;
}
irdata[bitnum]=irtime;
irtime=0;
bitnum++;
if(bitnum==33)
{
bitnum=0;
irreceok=1;
}
}
else
{
startflag=1;
irtime=0;
}
}
51单片机第十六课串口数据收发实验
所属类别:
课程代码发布日期:
2011-03-05点击量:
358
#include
unsignedchara;
unsignedcharflag;
voidmain()
{
TMOD=0x20;//设置定时器1为方式2
TH1=0xfd;//装入初值
TL1=0xfd;
TR1=1;//启动定时器1
SM0=0;
SM1=1;//设置串口为方式1
REN=1;//接受使能
EA=1;//打开总中断开关
ES=1;//打开串口中断开关
while
(1)
{
if(flag==1)
{
ES=0;
flag=0;
SBUF=a;
while(!
TI);//等待数据发送结束
TI=0;
ES=1;
}
}
}
voidserial()interrupt4
{
a=SBUF;
P1=a;
RI=0;
flag=1;//标志位
}
51单片机第十七课字符液晶LCD1602显示
所属类别:
课程代码发布日期:
2011-03-05点击量:
436
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitrs=P2^4;
sbitrw=P2^5;
sbite=P2^6;
uchartable1[]="";
uchartable2[]="LCD1602testok!
";
//************************************************
//延时函数,在12MHz的晶振频率下
//大约50us的延时
//************************************************
voiddelay_50us(uintt)
{
ucharj;
for(;t>0;t--)
for(j=19;j>0;j--);
}
//************************************************
//延时函数,在12MHz的晶振频率下
//大约50ms的延时
//************************************************
voiddelay_50ms(uintt)
{
uintj;
for(;t>0;t--)
for(j=6245;j>0;j--);
}
voidwrite_com(ucharcom)
{
e=0;
rs=0;
rw=0;
P0=com;
delay_50us(10);
e=1;
delay_50us(20);
e=0;
}
voidwrite_data(uchardat)
{
e=0;
rs=1;
rw=0;
P0=dat;
delay_50us(10);
e=1;
delay_50us(20);
e=0;
}
voidinit(void)
{
delay_50us(300);
write_com(0x38);
delay_50us(100);
write_com(0x38);
delay_50us(100);
write_com(0x38);
write_com(0x38);
write_com(0x08);
write_com(0x01);
write_com(0x06);
write_com(0x0c);
}
voidmain()
{
ucharj;
init();
write_com(0x80);
for(j=0;j<16;j++)
{
write_data(table1[j]);
delay_50us(10);
}
write_com(0x80+0x40);
for(j=0;j<16;j++)
{
write_data(table2[j]);
delay_50us(10);
}
while
(1);
}
51单片机第十三课矩阵键盘扫描实验
所属类别:
课程代码发布日期:
2011-03-05点击量:
343
#include
#de