自动化专业单片机课程设计.docx
《自动化专业单片机课程设计.docx》由会员分享,可在线阅读,更多相关《自动化专业单片机课程设计.docx(17页珍藏版)》请在冰豆网上搜索。
![自动化专业单片机课程设计.docx](https://file1.bdocx.com/fileroot1/2023-1/25/53daae13-a782-462f-8705-ba0fcf20ccae/53daae13-a782-462f-8705-ba0fcf20ccae1.gif)
自动化专业单片机课程设计
/***********************************************************************/
****电子信息与自动化学院自动化专业单片机课程设计****
/***彩灯移动实验****/
/***********************************************************************/
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#definetime500//点亮时间间隔
uintcont=1,n=7;
voidDelay(uintdel);//基本延时程序
voidAll_flash(uintk);//全部灯闪烁k次
voidfunction1();//基本功能
voidfunction2();//拓展功能
/********************************主函数*********************************/
voidmain()
{
EX0=1;//开外部中断0
IT0=1;//负边沿触发
EA=1;//开总中断
All_flash(3);
while
(1)
{
function1();
}
}
/********************************子函数*********************************/
voidDelay(uintdel)//延时del(ms)子函数
{
uinti,j;
for(i=0;ifor(j=0;j<1940;j++);
}
voidAll_flash(uintk)//所有灯闪烁5次
{
uinti;
for(i=0;i{
P0=0x00;
Delay(500);
P0=0xff;
Delay(500);
}
}
voidfunction1()
{
uinti;
P0=0xff;
Delay(time);
while
(1)
{
P0=0xfe;//功能18个灯依次点亮
Delay(time);
for(i=0;i<7;i++)
{
P0=_irol_(P0,1);
Delay(time);
}
P0=0x80;//功能28个灯依次熄灭
Delay(time);
P0=0xc0;
Delay(time);
P0=0xe0;
Delay(time);
P0=0xf0;
Delay(time);
P0=0xf8;
Delay(time);
P0=0xfc;
Delay(time);
P0=0xfe;
Delay(time);
P0=0xff;
Delay(time);
All_flash
(2);//功能3全亮全灭循环2次
P0=0x01;//功能4
Delay(time);
for(i=0;i<7;i++)
{
P0=_crol_(P0,1);
Delay(time);
}
P0=0x00;//功能5
Delay(time);
P0=0x80;
Delay(time);
for(i=0;i<7;i++)
{
P0=_cror_(P0,1);
Delay(time);
}
All_flash(3);
}
}
voidfunction2()
{
uinti;
n=7;
P0=0x7f;
Delay(time);
while
(1)
{
for(i=n;i>0;i--)
{
P0=_cror_(P0,1);
Delay(time);
}
for(i=0;i{
P0=_crol_(P0,1);
Delay(time);
}
}
}
/********************************中断服务程序*********************************/
voidInterrupt0(void)interrupt0
{
EX0=0;
Delay(3);
cont++;
if(cont>=7)cont=1;
switch(cont)
{
case1:
{P0=0x7f;n=7;break;}
case2:
{P0=0x3f;n=6;break;}
case3:
{P0=0x1f;n=5;break;}
case4:
{P0=0x0f;n=4;break;}
case5:
{P0=0x07;n=3;break;}
case6:
{P0=0x03;n=2;break;}
case7:
{P0=0x01;n=1;break;}
default:
{P0=0xfe;n=7;}
}
EX0=1;
}
/***********************************************************************/
/***************************交通灯实验****************************/
/***********************************************************************/
#include
#defineucharunsignedchar
#defineuintunsignedint
#definecont5//黄灯闪烁次数
#definetime5000//黄灯闪烁时间10s
#definetime25000//救护车通过时间10s
sbitKEY=P3^2;//救护车按键外中断0
sbitEWR=P0^0;//东西红灯EastWestRed缩写
sbitEWY=P0^2;//东西黄灯
sbitEWG=P0^4;//东西绿灯
sbitSNR=P0^1;//南北红灯SouthNorthRed缩写
sbitSNY=P0^3;//南北黄灯
sbitSNG=P0^5;//南北绿灯
voidflash();//南北黄灯闪烁cont次
voidEWY_flash();//东西黄灯闪烁cont次
voidDelay(uintdel);//延时del(ms)子函数
/********************************主函数*********************************/
voidmain()
{
EWR=0;//初始状态俩红灯亮
EWY=1;
EWG=1;
SNR=0;
SNY=1;
SNG=1;
Delay(1000);
EX0=1;//开外部中断0
IT0=1;//负边沿触发
EA=1;//开总中断
while
(1)
{
EWR=1;//东西绿灯亮南北红灯亮
EWY=1;
EWG=0;
SNR=0;
SNY=1;
SNG=1;
Delay(time);//延时10s
EWG=1;//东西绿灯灭
flash();//东西黄灯闪烁
EWR=0;//东西红灯亮南北绿灯亮
EWY=1;
EWG=1;
SNR=1;
SNY=1;
SNG=0;
Delay(time);//延时10s
SNG=1;//东西绿灯灭
flash();//东西黄灯闪烁
}
}
/********************************子函数*********************************/
voidDelay(uintdel)//延时del(ms)子函数
{
uinti,j;
for(i=0;ifor(j=0;j<1940;j++);
}
voidflash()//黄灯闪烁cont次
{
uinti;
EWR=1;
EWY=1;
EWG=1;
SNR=1;
SNY=1;
SNG=1;
for(i=0;i{
EWY=0;
SNY=0;
Delay(1000);
EWY=1;
SNY=1;
Delay(1000);
}
}
/********************************中断服务程序*********************************/
voidInterrupt0(void)interrupt0
{
uchartemp;
EX0=0;
temp=P0;
Delay(3);
EWR=0;//救护车到俩红灯亮
EWY=1;
EWG=1;
SNR=0;
SNY=1;
SNG=1;
Delay(time2);//救护车通过时间
P0=temp;
EX0=1;
}
/***********************************************************************/
/************************数码管显示实验**************************/
/***********************************************************************/
/***********************************************************************/
#include
#defineucharunsignedchar
#defineuintunsignedint
codeucharduan[16]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0x11,0xc1,0x63,0x85,0x61,0x71};//显示段码数码管字跟
ucharwei[4]={0x7f,0xbf,0xdf,0xef};//位的控制端
uintcont=1;
uintq=0;
uintb=0;
uints=0;
uintg=0;
voiddelay(uchart);
voiddisplay();
/************************************主函数***********************************/
voidmain()
{
IT0=1;
IT1=1;
EX0=1;
EX1=1;
EA=1;
P0=0xfe;
while
(1)
{
display();
}
}
/**********************************子函数***********************************/
voiddelay(uchart)
{
uchari,j;
for(i=0;ifor(j=2122;j>0;j--);
}
voiddisplay()//显示函数
{
if(q>16)q=0;
if(b>16)b=0;
if(s>16)s=0;
if(g>16)g=0;
P2=duan[q];
P1=wei[0];
delay(100);
P2=duan[b];
P1=wei[1];
delay(100);
P2=duan[s];
P1=wei[2];
delay(100);
P2=duan[g];
P1=wei[3];
delay(100);
}
/********************************中断服务程序*********************************/
voidInterrupt0(void)interrupt0
{
EX0=0;
switch(cont)
{
case1:
{g++;if(g>16)g=0;break;}
case2:
{s++;if(s>16)s=0;break;}
case3:
{b++;if(b>16)b=0;break;}
case4:
{q++;if(q>16)q=0;break;}
default:
g++;
}
EX0=1;
}
voidInterrupt1(void)interrupt2
{
EX1=0;
cont++;
if(cont>4)cont=1;
switch(cont)
{
case1:
{P0=0xfe;break;}
case2:
{P0=0xfd;break;}
case3:
{P0=0xfb;break;}
case4:
{P0=0xf7;break;}
default:
P0=0xfe;;
}
EX1=1;
}
/******************************************************************************
***********************************DS18B20************************************
******************************************************************************/
#include
#defineucharunsignedchar
#defineuintunsignedint
#definejump_ROM0xCC
#definestart0x44
#defineread_EEROM0xBE
#defineT4
unsignedcharcodeduan[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};
ucharwei[4]={0x7f,0xbf,0xdf,0xef};
sbitDQ=P3^7;//DS18B20数据口
unsignedcharTMPH,TMPL;
voiddelay(uintN)
{
inti;
for(i=0;i}
voiddelay_1()
{
inti,j;
for(i=0;i<=10;i++)
for(j=0;j<=2;j++);
}
voiddelay_2(uchart)//数码管显示
{
uchari,j;
for(i=0;ifor(j=80;j>0;j--);
}
ucharReset(void)//复位DS18B20
{
uchardeceive_ready;
DQ=0;
delay(29);
DQ=1;
delay(3);
deceive_ready=DQ;
delay(25);
return(deceive_ready);
}
ucharread_bit(void)//从DS18B20读一个位值
{
uchari;
DQ=0;
DQ=1;
for(i=0;i<3;i++);
return(DQ);
}
voidwrite_bit(ucharbitval)//向DS18B20写一位
{
DQ=0;
if(bitval==1)
DQ=1;
delay(5);
DQ=1;
}
ucharread_byte(void)//从DS18B20读一个字节
{
uchari,m,receive_data;
m=1;
receive_data=0;
for(i=0;i<8;i++)
{
if(read_bit())
{
receive_data=receive_data+(m<
}
delay(6);
}
return(receive_data);
}
voidwrite_byte(ucharval)//向DS18B20写一个字节
{
uchari,temp;
for(i=0;i<8;i++)
{
temp=val>>i;
temp=temp&0x01;
write_bit(temp);
delay(5);
}
}
voiddisplayz(unsignedintv)
{
unsignedchars,g;
s=v%100/10;
g=v%10;
P2=duan[s];
P1=wei[0];
delay_2(100);
P2=duan[g];
P1=wei[1];
delay_2(100);
}
voiddisplayx(unsignedintv)
{
unsignedchars,g;
s=v%100/10;
g=v%10;
P2=duan[s];
P1=wei[2];
delay_2(100);
P2=duan[g];
P1=wei[3];
delay_2(100);
}
voiddisplay(unsignedintv)
{
unsignedcharc,b,s,g;
c=v/1000;
b=v%1000/100;
s=v%100/10;
g=v%10;
P1=0xff;
P2=duan[c];
P1=wei[0];
delay_2(100);
P1=0xff;
P2=0xfe&duan[b];
P1=wei[1];
delay_2(100);
P1=0xff;
P2=duan[s];
P1=wei[2];
delay_2(100);
P1=0xff;
P2=duan[g];
P1=wei[3];
delay_2(100);
}
voidmain()//主函数
{
floatt;
uinttemp;
while
(1)
{
Reset();
write_byte(jump_ROM);
write_byte(start);
Reset();
write_byte(jump_ROM);
write_byte(read_EEROM);
TMPL=read_byte();
TMPH=read_byte();
temp=TMPH;
temp<<=8;
temp=temp|TMPL;
t=temp*0.0625;
temp=t*100;
display(temp);
}
}