河南理工大学单片机课设.docx
- 文档编号:2851131
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:38
- 大小:265.15KB
河南理工大学单片机课设.docx
《河南理工大学单片机课设.docx》由会员分享,可在线阅读,更多相关《河南理工大学单片机课设.docx(38页珍藏版)》请在冰点文库上搜索。
河南理工大学单片机课设
单
片
机
实
验
报
告
实验一流水灯实验
一、实验目的
1)掌握软件延时编程方法
2)简单按键输入捕获判断
二、实验实现的功能
单片机上电后,所有发光二极管点亮并闪烁三下,然后顺时针依次亮灭,形成顺时针流水灯。
如果按下按键1,形成逆时针流水灯。
当再次按下按键1时,又恢复顺时针流水灯。
三、系统硬件设计
四、系统软件设计
试验程序如下:
#include
#defineucharunsignedchar
ucharkey=0;
unsignedcharcodedatanum[13]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f,
0x3b,0x37,0x2f,0x1f,0x3F};
bitflag;
sbitH1=P3^6;
sbitH2=P3^7;
sbitL1=P0^5;
sbitL2=P0^6;
sbitL3=P0^7;
sbitD1=P2^0;
sbitD2=P2^1;
sbitD3=P2^2;
sbitD4=P2^3;
sbitD5=P2^4;
sbitD6=P2^5;
sbitD7=P2^6;
sbitD8=P2^7;
sbitD9=P3^2;
sbitD10=P3^3;
sbitD11=P3^4;
sbitD12=P3^5;
//函数声明------------------------------------------------*/
voiddelayus(unsignedintt)
{
while(--t);
}
voiddelayms(unsignedintt)
{
while(t--)
{//大致延时1mS
delayus(245);
delayus(245);
}
}
/*------------------------------------------------
主函数
------------------------------------------------*/
main()
{uchari;//定义一个无符号字符型
for(i=0;i<3;i++)//12灯闪三次
{
P2=0xFC;
delayms(1000);
P2=0xFF;
delayms(1000);
}
P0=0xFF;
P3=0x3f;
flag=1;
while
(1)
{
H1=0;
H2=1;
L1=1;
L2=1;
L3=1;
if(L1==0)
flag=~flag;
if(flag==1)
{
for(i=0;i<8;i++)
{
P2=datanum[i];
delayms(300);
if(L1==0)
flag=~flag;
}
P2=0xff;//关p0控制的数码管
for(i=8;i<13;i++)
{
P3=datanum[i];
delayms(300);
if(L1==0)
flag=~flag;
}
}
if(flag==0)
{
for(i=11;i>7;i--)
{
P3=datanum[i];
delayms(300);
if(L1==0)
flag=~flag;
}
P3=0x3F;//关p3口控制的数码管
i=7;
do
{
P2=datanum[i];
delayms(300);
if(L1==0)
flag=~flag;
}while(i--);
P2=0xff;//关p0控制的数码管
}
}
}
五、实验过程中遇到的问题及解决方法
1)由于没有中断,使用按键是怎么做到及时性?
解决方法:
通过在流水灯循环点亮时,在程序中多次插入按键扫描函数,在使用中效果还是较好的。
能保证没有按键,都能使流水灯实习反转。
指导老师签字:
日期:
实验二定时器实验
一、实验目的
1)数码管动态显示技术
2)定时器的应用
3)按键功能定义
二、实验实现的功能
按键5切换时钟和定时显示,分别进入相应模式下设置。
在定时功能显示下,按键4实现分加,按键5实现分减。
在时钟下,按键4实现秒加,按键5实现秒减。
定时功能:
定时分钟和时钟正常显示分钟一样时,D5,D6数码管闪烁一分钟。
三、系统硬件设计
四、系统软件设计
试验程序如下:
#include
defineucharunsignedchar
sbitH1=P3^6;
sbitH2=P3^7;
sbitW1=P0^0;
sbitW2=P0^1;
sbitW3=P0^2;
sbitW4=P0^3;
sbitL1=P0^5;
sbitL2=P0^6;
sbitL3=P0^7;
sbitD1=P2^0;
sbitD2=P2^1;
sbitD3=P2^2;
sbitD4=P2^3;
sbitD5=P2^4;
sbitD6=P2^5;
sbitD7=P2^6;
sbitD8=P2^7;
sbitD9=P3^2;
sbitD10=P3^3;
sbitD11=P3^4;
sbitD12=P3^5;
bitflag,daring;
ucharfen=0,miu=0,fen_shi=0,fen_ge=0,miu_shi,miu_ge;
uchard_fen=2,d_miu,d_fen_shi,d_fen_ge,d_miu_shi,d_miu_ge;
unsignedchartemp[5];//显示时间存储
unsignedchardtemp[5];//定时时间存储
unsignedcharcodeduanma[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f};//共阴极数码管
//函数声明------------------------------------------------*/()
unsignedcharkeyscan(void);//按键扫描
voiddisplay();//显示程序
/****定时器0初始化**/
voidInit_time0()
{
TMOD=TMOD|0x01;
TH0=0X00;
TL0=0X00;
EA=1;
ET0=1;
TR0=1;
}
/****微秒**/
voiddelayus(unsignedchart)
{
while(--t);
}
/****毫秒**/
voiddelayms(unsignedchart)
{
while(t--)
{//大致延时1mS
delayus(245);
delayus(245);
}
}
/*------------------------------------------------
主函数
------------------------------------------------*/
main()
{
ucharkey;
flag=0;//定义一个无符号字符型
keyscan();
Init_time0();
while
(1)
{
key=keyscan();
/****定时和正常显示的切换标识******/
if(key==5)
{
flag=~flag;
}
else
/****时钟调时******/
if(key==3)
{
miu++;
if(miu==60)
miu=0;
}
else
if(key==4)
{
miu--;
if(miu==0xff)
miu=0;
}
/****定时功能处理*****/
if(flag==1)
{
if(key==3)
{
d_fen++;
if(d_fen==60)
d_fen=0;
}
else
if(key==4)
{
d_fen--;
if(d_fen==0xff)
d_fen=0;
}
/****定时功能分秒处理*****/
d_fen_shi=d_fen/10;
d_fen_ge=d_fen%10;
d_miu_shi=d_miu/10;
d_miu_ge=d_miu%10;
dtemp[0]=duanma[d_fen_shi];
dtemp[1]=duanma[d_fen_ge];
dtemp[2]=duanma[d_miu_shi];
dtemp[3]=duanma[d_miu_ge];
display();
}//定时程序结束
if(flag==0)
{/****时钟正常显示分秒处理*****/
fen_shi=fen/10;
fen_ge=fen%10;
miu_shi=miu/10;
miu_ge=miu%10;
if(fen_shi>0)
{temp[0]=duanma[fen_shi];
temp[1]=duanma[fen_ge];
temp[2]=duanma[miu_shi];
temp[3]=duanma[miu_ge];
}
else
if(fen_ge>=0)
{
temp[1]=duanma[fen_ge];
temp[2]=duanma[miu_shi];
temp[3]=duanma[miu_ge];
}
display();
/****定时时钟的比较处理*****/
if(d_fen==fen)
{
daring=1;
}
}
}
}
/*************定时器程序******************/
voidtime0()interrupt1
{unsignedinti;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
i++;
if(i==1000)
{i=0;
miu++;
D1=~D1;
if(daring==1)
{daring=~daring;
D5=~D5;D6=~D6;
}
else
{D5=1;D6=1;}
if(miu==60)
{
miu=0;
fen++;
if(fen==60)
{
fen=0;
miu=0;
}
}
}
}
/********显示程序******************/
voiddisplay()
{
ucharx,i;
/***正常显示**/
if(flag==0)
{
P0=P0|0x0f;//把位选拉高关数码管
x=0x0e;
for(i=0;i<4;i++)
{
P0=x;//开位选
P1=temp[i];//送段值
delayus(220);
x=((x<<1)&0X0F|0x01);//利用移位开位选
}
}
/**定时显示*/
if(flag==1)
{
P0=P0|0x0f;//把位选拉高关数码管
x=0x0e;
for(i=0;i<4;i++)
{
P0=x;//开位选
P1=dtemp[i];//送段值
delayus(220);
x=((x<<1)|0x01&0X0F);//利用移位开位选
}
}
}
/********按键扫描程序******************/
unsignedcharkeyscan(void)
{
ucharx;
H1=0;
H2=0;
L1=1;
L2=1;
L3=1;
if((L1&L2&L3)==0)
{
delayms
(2);
if((L1&L2&L3)==0)
{
/********第一行扫描***************/
H1=0;
H2=1;
L1=1;
L2=1;
L3=1;
if((L1&L2&L3)==0)
{
delayms(10);
if((L1&L2&L3)==0)
{
if(L1==0)
{
x=10;
while(L1==0);
return(x);
}
if(L2==0)
{
x=1;
while(L2==0);
return(x);
}
if(L3==0)
{
x=2;
while(L3==0);
return(x);
}
}
}
/********第二行扫描***************/
H1=1;
H2=0;
L1=1;
L2=1;
L3=1;
if((L1&L2&L3)==0)
{
delayms(11);
if((L1&L2&L3)==0)
{
if(L1==0)
{
x=3;
while(L1==0);
return(x);
}
if(L2==0)
{
x=4;
while(L2==0);
return(x);
}
if(L3==0)
{
x=5;
while(L3==0);
return(x);
}
}
}//第二行扫描完
}//检测按键有无按下消抖
}//检测有无按键按下
}
五、实验过程中遇到的问题及解决方法
1)数码管显示过程中,显示内容不稳定?
解决方法:
首先自己试了试很多种方法,通道不断的调整程序结构和显示点亮数码管过程中延时时间,将会得到较好的显示效果。
2)如何进行按键扫描,使得每一次按键都能有效?
解决方法:
通过反复实验,总结中使用按键消抖可以实现按键功能的稳定性,增加抗干扰能力。
指导老师签字:
日期:
实验三双机通信实验
一、实验目的
UART串行通信接口技术应用
二、实验实现的功能
双机通信,可实现双机互发。
当主机向从机发送数据时,现在本单板上的数码管1显示发送数据,从机在数码管4显示接受数据。
主机和从机都通过按键4实习发送。
三、系统硬件设计
实验中用到硬件有:
两块课程设计核心板,两根杜邦线
四、系统软件设计
试验程序如下:
#include
#include
sbitH1=P3^6;
sbitH2=P3^7;
sbitW1=P0^0;
sbitW2=P0^1;
sbitW3=P0^2;
sbitW4=P0^3;
sbitL1=P0^5;
sbitL2=P0^6;
sbitL3=P0^7;
unsignedcharTable[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsignedchartemp[12];
unsignedcharBuff[20];//数据缓冲区
unsignedcharflag,flag_rec;
//延时1ms函数
/****WEIMIAO**/
voiddelayus(unsignedintt)
{
while(--t);
}
/****HAOMIAO**/
voiddelayms(unsignedintt)
{
while(t--)
{
//大致延时1mS
delayus(245);
delayus(245);
}
}
//缓冲区初始化
voidBuff_init()
{
unsignedchari;//将Table里的数据放到缓冲区里
for(i=0;i<9;i++)
{
Buff[i]=Table[i];
delayms(100);
}
}
//串口初始化函数
voidserial_init()
{
TMOD=0x20;//定时器1工作于方式2
TH1=0xfd;
TL1=0xfd;//波特率为9600
PCON=0;
SCON=0x50;//串口工作于方式1
TR1=1;//开启定时器
TI=0;
RI=0;
EA=1;
ES=1;
}
//发送数据函数
voidSEND_data(unsignedcharBuff)
{
SBUF=Buff;
while(!
TI);
TI=0;
}
voidmain()
{
unsignedinti;
Buff_init();
serial_init();
while
(1)
{
H1=0;
H2=0;
L1=1;
L2=1;
L3=1;
if((L1&L2&L3)==0)
{
delayms(6);
if((L1&L2&L3)==0)
{
if(L1==0)
flag=1;
}
}
while(flag==1)
{
for(i=0;i<12;i++)
{
SEND_data(Buff[i]);
P1=Buff[i];
W1=0;
delayms(500);
W1=1;
}
}
}
voidUART_SER(void)interrupt4//串行中断服务程序
{
unsignedchari=0;
if(RI)//判断是接收中断产生
{
RI=0;
W4=1;//标志位清零
temp[i]=SBUF;//读入缓冲区的值
P1=temp[i];
W4=0;
i++;
if(i==12)
i=0;
}
if(TI)//如果是发送标志位,清零
TI=0;
}
五、实验过程中遇到的问题及解决方法
1)串口发送的工作过程不理解。
解决方法:
通过看书,并在实验中发送接受过程中,设置相应的标识。
通过反复实验和修改参数,对比标识,逐渐的理解了串口的工作原理。
指导老师签字:
日期:
实验四交通灯实验
一、实验目的
1)按键、数码管、发光二极管综合应用编程技术
2)数据存储于EEPROM的技术(也可以不使用)
3)定时中断技术
4)按键中断技术
二、实验实现的功能
模拟交通灯:
通过按键4,进行紧急交通管制和自动红绿灯转换。
自动红绿灯模式下:
按键5实习绿灯时间增加,绿灯最大时间25秒。
按键6实习黄灯时间增加,黄灯最大时间25秒。
通过数码管1、2显示红绿灯时间。
交通管制模式下:
全部红灯亮,数码管关闭。
三、系统硬件设计
实验中用到的硬件有:
1块stc51单片机、12个发光二极管、6个按键、1个共阴极四位数码管
四、系统软件设计
实验程序如下:
/*按键4加绿灯时间
按键5加黄灯时间
按键3加紧急全红灯
*/
#include
#defineucharunsignedchar
bitflag,flag1,flag2,flag3,flag4,flag_yel=1;
unsignedchargreen,yellow;
sbitH1=P3^6;
sbitH2=P3^7;
sbitW1=P0^0;
sbitW2=P0^1;
sbitW3=P0^2;
sbitW4=P0^3;
sbitL1=P0^5;
sbitL2=P0^6;
sbitL3=P0^7;
sbitD1=P2^0;
sbitD2=P2^1;
sbitD3=P2^2;
sbitD4=P2^3;
sbitD5=P2^4;
sbitD6=P2^5;
sbitD7=P2^6;
sbitD8=P2^7;
sbitD9=P3^2;
sbitD10=P3^3;
sbitD11=P3^4;
sbitD12=P3^5;
unsignedchartemp[5];//绿灯和黄灯时间存储
unsignedchardis_green,dis_yellow;
unsignedcharcodeduanma[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极数码管
#definezhu_red{D1=0;D7=0;D2=1;D3=1;D8=1;D9=1;}
#definezhu_green{D2=0;D8=0;D1=1;D9=1;D3=1;D7=1;}
#definezhu_yellow{D3=0;D9=0;D1=1;D2=1;D7=1;D8=1;}
#definefu_red{D4=0;D10=0;D5=1;D6=1;D11=1;D12=1;}
#definefu_green{D5=0;D11=0;D4=1;D6=1;D10=1;D12=1;}
#definefu_yellow{D6=0;D12=0;D4=1;D5=1;D10=1;D11=1;}
//函数声明------------------------------------------------*/
unsignedcharkeyscan(void);//按键扫描
voiddisplay();//显示程序
/******定时器0初始化**********/
voidInit_time0()
{
TMOD=TMOD|0x01;
TH0=0X00;
TL0=0X00;
EA=1;
ET0=1;
TR0=1;
}
/****微秒**/
voiddelayus(unsignedchart)
{
while(--t);
}
/****毫秒**/
voiddelayms(unsignedintt)
{
while(t--)
{
//大致延时1mS
delayus(245);
delayus(245);
}
}
/******主函数**************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 河南 理工大学 单片机