单片机复习code程序.docx
《单片机复习code程序.docx》由会员分享,可在线阅读,更多相关《单片机复习code程序.docx(24页珍藏版)》请在冰点文库上搜索。
单片机复习code程序
//8255数码管滚动显示20120818
//ALE的作用:
访问片外存储器时,ALE为有效高电平,
//P0口可做外部地址锁存器的锁存信号
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
#definePAXBYTE[0xfff8]//111111111111000
#definePBXBYTE[0xfff9]//111111111111001
#defineCOMXBYTE[0xfffb]//111111111111011
ucharcodeweima[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//共阳极
/*ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};//0—F*/
ucharcodeduanma[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xa4,0xc0,0xf9,0xa4,0xc0,0x80,0xf9,0x80,
0xff,0xff,0xff,0xff,0xff,0xff,0xff};
voiddelayms(uintz);
voidmain()
{
uchari,j,k;
P3=0xfe;
COM=0x80;
while
(1)
{
for(j=0;j<10;j++)//为了延长显示时间
{
for(i=0;i<8;i++)
{
PB=weima[i];
PA=duanma[i+k];
delayms
(1);
}
}
k=(k+1)%15;//8+14=22
}
}
voiddelayms(uintz)
{
uchari;
while(z--)
for(i=0;i<120;i++);
}
/*
//锯齿波
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
#defineDAC0832XBYTE[0x7fff]
voidmain()
{
uchari;
while
(1)
{
for(i=0;i<250;i++)
DAC0832=i;
}
}*/
/*
//三角波
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
#defineDAC0832XBYTE[0x7fff]
voiddelayms(uintz);
voidmain()
{
uchari;
while
(1)
{
for(i=0;i<250;i++)
{
DAC0832=i;//没有delayms()函数T=2ms
delayms
(1);//加了delayms()函数T=0.5s
}
for(i=250;i>0;i--)
{
DAC0832=i;
delayms
(1);
}
}
}
voiddelayms(uintz)
{
uintx,y;
for(x=120;x>0;x--)
for(y=z;y>0;y--);
}*/
//梯形
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
#defineDAC0832XBYTE[0x7fff]
voiddelayms(uintz);
voidmain()
{
uchari;
while
(1)
{
for(i=0;i<250;i++)
{
DAC0832=i;//没有delayms()函数T=2ms
//delayms
(1);//加了delayms()函数T=0.5s
}
DAC0832=250;//可以不用
delayms
(1);
for(i=250;i>0;i--)
{
DAC0832=i;
//delayms
(1);
}
}
}
voiddelayms(uintz)
{
uintx,y;
for(x=120;x>0;x--)
for(y=z;y>0;y--);
}
//先开输入寄存器,然后关闭输入寄存器,再开DAC寄存器
#include
#include
#defineinput1XBYTE[0x8fff]
#defineinput2XBYTE[0xa7ff]
#defineDACRXBYTE[0x2fff]
#defineuintunsignedint
#defineucharunsignedchar
voiddelayms(uintz);
voidtransmit(uchardate1,uchardate2);
voidmain()
{
uchari,j;
while
(1)
{
for(i=0,j=255;i<255;i++,j--)
{
transmit(i,j);
}
}
}
voiddelayms(uintz)
{
uintx,y;
for(x=120;x>0;x--)
for(y=z;y>0;y--);
}
//2路信号
voidtransmit(uchardate1,uchardate2)
{
input1=date1;
input2=date2;
DACR=0;
}
//先开输入寄存器,然后关闭输入寄存器,再开DAC寄存器
#include
#include
#defineinputXBYTE[0x8fff]
#defineDACRXBYTE[0x2fff]
#defineuintunsignedint
#defineucharunsignedchar
sbitkey1=P3^0;
sbitkey2=P3^1;
sbitkey3=P3^3;
sbitkey4=P3^4;zzzx
voiddelayms(uintz)
{
uintx,y;
for(x=120;x>0;x--)
for(y=z;y>0;y--);
}
voidmain()
{
uchari,j,k;
while
(1)
{
if(key1==0)
{
i++;
while(!
key1);
}
if(key2==0)
{
i--;
while(!
key3);
}
if(key3==0)
{
j=j+10;
while(!
key1);
}
if(key4==0)
{
j=j-10;
while(!
key3);
}
for(k=0;k<0x80+j;k++)
{
input=k;
DACR=0;
delayms(i);
}
}
}
AT24C02
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
#defineNOP5(){_nop_();_nop_();_nop_();_nop_();_nop_();}
sbitSDA=P2^5;
sbitSCL=P2^6;
voiddelayms(uintz);
voidstart_i2c();
voidstop_i2c();
voidack();
voidnoack();
voidwrite_byte(ucharj);
voidwrite_i2c(ucharadd,uchardate);
ucharread_byte();
ucharread_current();
ucharread_random(ucharadd);
ucharcodeweima[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
ucharcodeduanma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//显示段码值0~9
ucharcodeled[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
voidmain()
{
uchari;
SDA=1;
SCL=1;
for(i=0;i<8;i++)
{
write_i2c(i,weima[i]);
write_i2c(i+8,duanma[i]);
}
while
(1)
{
for(i=0;i<8;i++)
{
P1=read_random(i);
P0=read_random(i+8);
delayms(1000);
}
}
}
voiddelayms(uintz)
{
unsignedintx,y;
for(x=120;x>0;x--)
for(y=z;y>0;y--);
}
//主机
voidstart_i2c()
{
SDA=1;
SCL=1;
NOP5();
SDA=0;
NOP5();
SCL=0;//钳位I2C总线,准备发送数据
}
//主机
voidstop_i2c()
{
SDA=0;
SCL=1;
NOP5();
SDA=1;
NOP5();
}
//从机产生应答
voidack()
{
SDA=0;
SCL=1;
NOP5();
SCL=0;
SDA=1;
}
voidnoack()
{
SDA=1;
SCL=1;
NOP5();
SCL=0;
SDA=0;
}
//主机向24C02中写一字节数据
voidwrite_byte(ucharj)
{
uchari;
SCL=0;
for(i=0;i<8;i++)
{
if(j&0x80)
SDA=1;
else
SDA=0;
_nop_();
SCL=1;//时钟线为高
NOP5();
SCL=0;
j<<=1;
}
ack();
}
//向指定地址写数据
voidwrite_i2c(ucharadd,uchardate)
{
start_i2c();
write_byte(0xa0);//器件地址,写10100000
write_byte(add);//写字地址
write_byte(date);//写数据
stop_i2c();
delayms
(1);//为什么?
?
?
}
//从24C04中读取一字节
ucharread_byte()
{
uchari,j;
for(i=0;i<8;i++)
{
SCL=1;
j<<=1;//最低位已经为0
j=j|SDA;
SCL=0;
}
returnj;
}
//主机从24C02当前地址读数据
ucharread_current()
{
uchard;
start_i2c();
write_byte(0xa1);//器件地址,读10100001
d=read_byte();//当前地址读数据
noack();
stop_i2c();
returnd;
}
//从任意地址读数据
ucharread_random(ucharadd)
{
uchara;
start_i2c();
write_byte(0xa0);//器件地址
write_byte(add);//从所写地址读数据
a=read_current();
returna;
}
//串口
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetable[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
voiddelayms(uintz)
{
uintx,y;
for(x=120;x>0;x--)
for(y=z;y>0;y--);
}
voidmain()
{
uchari;
SCON=0x50;//串口方式1REN=1;SM0=0;SM1=1;
PCON=0;//SMOD=0
TMOD=0x20;//定时器1定时方式2
EA=1;
ES=1;
TH1=0xe6;//12MHz2400波特率
TL1=0xe6;
TR1=1;//启动定时器
while
(1)
{
for(i=0;i<8;i++)
{
SBUF=table[i];
while(TI==0);
TI=0;
delayms(100);
}
}
}
voides()interrupt4
{
while(RI==0);
RI=0;
P1=SBUF;
}
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharcodetable[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchari,temp;
voiddelay(uintz)
{
uintx,y;
for(x=120;x>0;x--)
for(y=z;y>0;y--);
}
voidmain()
{
TMOD=0x20;//定时器T1工作方式2
TH1=0xfd;
TL1=0xfd;//波特率为9600,11.0592M
TR1=1;
//SCON=0x50;
SM0=0;
SM1=1;
REN=1;
PCON=0;
while
(1)
{
for(i=0;i<8;i++)
{
SBUF=table[i];//发送数据
while(!
TI);
TI=0;
while(!
RI);
RI=0;
P1=SBUF;//接收数据
delay(100);
}
}
}
#include
#defineucharunsignedchar
#defineSLAVE0x03
#defineBN16
ucharidatatrbuf[16]={0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xa,0xb,0xc,0xd,0xe,0xf};
ucharidatarebuf[16];
bittready;
bitrready;
//
voiddelay(){
unsignedinti;
for(i=0;i<10000;i++);
}
//主程序
voidmain(void){
TMOD=0x20;
TL1=0xfd;
TH1=0xfd;
PCON=0x00;
TR1=1;
SCON=0xf0;
ES=1;EA=1;//开串行口中断
while
(1){tready=1;rready=1;}//假设准备好发送和接收
}
//中断程序
voidssio(void)interrupt4using1{
voidstr(void);
voidsre(void);
uchara;
RI=0;
ES=0;//关串行口中断
//****验证地址****
if(SBUF!
=SLAVE){ES=1;gotoreti;}//非本机地址,继续监听
SM2=0;//取消监听状态
SBUF=SLAVE;//从机地址发回
while(TI!
=1);TI=0;
while(RI!
=1);RI=0;
if(RB8==1){SM2=1;ES=1;gotoreti;}//是恢复信号,恢复监听
//****接收命令****
a=SBUF;//接收命令
if(a==0x01){//从机接收主机数据
if(rready==1)SBUF=0x01;//接收准备好接状态
elseSBUF=0x00;
while(TI!
=1);TI=0;
while(RI!
=1);RI=0;
if(RB8==1){SM2=1;ES=1;gotoreti;}
sre();//接收数据块
}
else{
if(a==0x02){//从机向主机发数据
if(tready==1)SBUF=0x02;//发送准备好发状态
elseSBUF=0x00;
while(TI!
=1);TI=0;
while(RI!
=1);RI=0;
if(RB8==1){SM2=1;ES=1;gotoreti;}
str();//发送数据块
}
else{
SBUF=0x80;//命令非法,发状态
while(TI!
=1);TI=0;
SM2=1;ES=1;//恢复监听
}
}
reti:
;//中断结束,返回断点
}
//发送数据程序
voidstr(void){
ucharp,i;
tready=0;
do{
p=0;//清校验和
for(i=1;iSBUF=trbuf[i];//发送一数据
p+=trbuf[i];
P2=trbuf[i];//从P2口显示
delay();
while(TI!
=1);
TI=0;
}
SBUF=p;//发校验和
while(TI==0);TI=0;
while(RI==0);RI=0;
}while(SBUF!
=0);//主机接收不正确,重新发送
SM2=1;
ES=1;
}
//接收数据块程序
voidsre(void){
ucharp,i;
rready=0;
while
(1){
p=0;//清校验和
for(i=0;iwhile(RI!
=1);RI=0;
rebuf[i]=SBUF;//接收一数据
p+=rebuf[i];
}
while(RI!
=1);RI=0;
if(SBUF==p){SBUF=0x00;while(TI==0);TI=0;break;}//校验和正确,发00
else{
SBUF=0xff;//校验和不同,发0ff,重新接收
while(TI==0);TI=0;
}
}
SM2=1;
ES=1;
}
lcd
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetable[]="ILIKEY!
";
ucharcodetable1[]="IAMZGX!
";
sbitRS=P2^0;//数据寄存器
sbitRW=P2^1;//读与写
sbitE=P2^2;//使能端
ucharnum;
voiddelayms(uintz)
{
uintx,y;
for(x=120;x>0;x--)
for(y=z;y>0;y--);
}
voidwrite_com(ucharj)
{
RS=0;
P0=j;
delayms(5);
E=1;
delayms(5);
E=0;
}
voidwrite_data(ucharj)
{
RS=1;
P0=j;
delayms(5);
E=1;
delayms(5);
E=0;
}
voidinit()
{
E=0;
RW=0;
write_com(0x38);//设置16*2显示,7*2点阵,8位数据接口
write_com(0x0e);
write_com(0x06);
write_com(0x01);//清屏
write_com(0x80+0x10);//第一行第一列
}
voidmain()
{
init();
for(num=0;num<12;num++)
{
write_data(table[num]);
delayms(100);
}
//write_com(0x01);//清屏
write_com(0x80+0x50);//重新设置数据指针
for(num=0;num<10;num++)
{
write_data(table1[num]);
delayms(100);//显示的时间
}
for(num=0;num<16;num++)
{
write_com(0x18);
delayms(300);//整屏移动的时间
}
while
(1);
}