数字方阵程序 单片机课程设计报告.docx
《数字方阵程序 单片机课程设计报告.docx》由会员分享,可在线阅读,更多相关《数字方阵程序 单片机课程设计报告.docx(19页珍藏版)》请在冰点文库上搜索。
数字方阵程序单片机课程设计报告
合肥师范学院
实验报告册
2013/2014学年第2学期
系别
计算机科学与技术系
实验课程
单片机原理及应用
专业
2011计算机软件
班级
一班
姓名
学号
指导教师
实验名称
课时
实验报告成绩
实验
(一)——流水灯
2
实验
(二)——中断与定时/计数器
2
实验(三)——串行口实验
2
实验(四)——矩阵键盘输入识别
2
备注:
实验一——流水灯
一、实验目的
通过对P3口地址的操作控制8位LED流水点亮,从而认识单片机的存储器
二、实验任务
通过对P3口地址的操作控制8位LED流水点亮,从而认识单片机的存储器
三、实验原理图设计
图1.1
四、实验程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sfrx=0xb0;
voiddelay()
{unsignedchari,j;
for(i=0;i<250;i++)
for(j=0;j<=i;j++);
}
voidfunction1()
{x=0xfe;
delay();
x=0xfd;
delay();
x=0xfb;
delay();
x=0xf7;
delay();
x=0xef;
delay();
x=0xdf;
delay();
x=0xbf;
delay();
x=0x7f;
delay();
}
voidfunction2()
{x=0x7e;
delay();
x=0xbd;
delay();
x=0xdb;
delay();
x=0xe7;
delay();
x=0xe7;
delay();
x=0xdb;
delay();
x=0xbd;
delay();
x=0x7e;
delay();
}
voidfunction3()
{x=0xff;
for(;x!
=0x00;)
{x=x-0x01;
delay();
}
}
voidfunction4()
{x=0x7f;
x=_cror_(x,1);
}
voidfunction5()
{x=0x7f;
x=_cror_(x,1);
delay();
x=0xfe;
x=_crol_(x,1);
}
voidmain()
{while
(1)
{function1();
function2();
function3();
function4();
function5();
}
}
五、实验结论
通过本次试验,我对单片机的一些性能有了大概的了解,学会了怎样控制LED灯的亮灭控制以及亮灭的顺序,亮度,时间等。
同时也了解了一些有关LED灯的使用方法和注意事项以及制图过程中所涉及的一些问题。
最终8个发光二极管从左到右流水依次点亮;LED灯亮的顺序先是先是按照LED0—>LED1—>……—>LED7的顺序依次点亮,然后是按照LED7—>LED6—>……—>LED0依次点亮,重复循环;LED灯先是全灭,然后按照LED0—>LED1—>LED0LED1—>LED2—>LED2LED0—>……—>LED7LED6LED5LED4LED3LED2LED1,然后全亮,实现用流水灯显示八位二进制加法计数器的结果。
六、总结与反思
在制图过程中对一些组件还是感觉挺陌生的,有的组件甚至要通过询问同学才能找到,这些都需要我在以后要多使用这些软件,做到熟练使用。
实验二——中断与定时器/计数器
一、实验目的
通过对P3.2、P3.3引脚的电平控制,实现外部中断处理,从而控制输出口P1的输出效果变化。
2、实验任务
1、实现中断控制的原理图(图一),通过对P3.2与P3.3的引脚控制,实现外部中断,实现对输出口P1的输出变化控制。
2、修改程序使用定时器T1的中断方式来控制P2.0、P2.1引脚的LED灯分别以200mshe800ms的周期闪烁。
(图二)
3、实验原理设计图
图2.1
图2.2
4、实验程序
代码一:
#include
#include
voidintt()
{EA=1;
IT0=0;
IT1=0;
EX0=1;
EX1=1;
PX0=0;//中断优先级0可改变优先级
PX1=1;//中断优先级1可改变优先级
}
voiddelay()
{unsignedinti,j;
for(i=0;i<255;i++)
for(j=0;j<255;j++);
}
voidmain()
{intt();
while
(1)
{P1=0xff;
delay();
P1=0x00;
delay();
}
}
voidaa()interrupt0
{unsignedchartemp=0xfe;
unsignedinti=0;
P1=temp;
delay();
i=7;
while(i--)
{temp=_crol_(temp,1);
P1=temp;
delay();
}
i=7;
while(i--)
{temp=_cror_(temp,1);
P1=temp;
delay();
}
}
voidbb()interrupt2
{P1=0xf0;
delay();
P1=0x0f;
delay();
}
代码二:
#include
sbitD1=P2^0;
sbitD2=P2^7;
unsignedcharCountor1;
unsignedcharCountor2;
voidmain()
{EA=1;
ET1=1;
TMOD=0x10;
TH1=(65536-15536)/256;
TL1=(65536-15536)%256;
TR1=1;
Countor1=0;
Countor2=0;
while
(1);
}
voidT()interrupt1using0
{Countor1++;
if(Countor1==2)
{D1=~D1;
Countor1=0;
}
Countor2++;
if(Countor2==8)
{D2=~D2;
Countor2=0;
}
TH1=(65536-15536)/256;
TL1=(65536-15536)%256;
}
5、实验结论
通过本次试验,我对定时器中断的基本功能有了一定的了解,对修改定时/计数器中断的优先级、类型以及LED的闪烁周期等也有一定的了解。
最终外部中断实验的中断通过开关SW1和SW2控制,且SW2控制的中断优先级高于SW1控制的中断优先级;定时器T1的中断方式控制的P2.0和P2.1引脚的LED灯分别以200ms、800ms周期闪烁
6、总结与反思
通过对该软件的熟练使用,我在组图过程中有了一定的速度,对其原理也有了一定的理解。
同时实验中仍然存在一些问题,在以后的实验中我会慢慢的改进自己的不足,争取早日做到精通使用。
实验三——串行口实验
1、实验目的
本实验要求单片机U1通过其串行口TXD向计算机发送一个数据“oxab”。
利用集成电路MAX232将单片机的输出信号转化成计算机能够识别的信号。
2、实验任务
单片机发送数据,计算机接收数据,控制LED的闪烁次序。
3、实验原理图设计
图3.1
四、实验程序
PC发送数据端代码:
#include
unsignedcharcodeTab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
voidSend(unsignedchardat)
{SBUF=dat;
while(TI==0);
TI=0;
}
voiddelay(void)
{unsignedcharm,n;
for(m=0;m<200;m++)
for(n=0;n<250;n++);
}
voidmain(void)
{unsignedchari;
TMOD=0x20;
SCON=0x40;
PCON=0x00;
TH1=0xfd;
TL1=0xfd;
TR1=1;
while
(1)
{for(i=0;i<8;i++)
{Send(Tab[i]);
delay();
}
}
}
PC接受数据端代码:
#include
#defineuintunsignedint
#defineucharunsignedchar
#defineDT50000
ucharreceiver;
voiddelay(uinti)
{
uchart=0;
while(i--)
{
for(;t<=250;t++);
}
}
voidinit()
{
EA=1;
SCON=0x50;
PCON=0x00;
REN=1;
ET1=1;
TMOD=0x20;
TL1=0xfd;
TH1=0xfd;
TR1=1;
}
ucharreceive()
{
uchartemp;
temp=SBUF;
while(!
RI)
{
;
}
RI=0;
returntemp;
}
voidmain()
{
init();
while
(1)
{
receiver=receive();
P1=receiver;
}
}
4、实验结论
通过本次的实验使我更加深刻的认识到了以及对所学知识的掌握至少以及融合之笨拙,在编写接受端代码时总是出现各种各样的错误。
最后U1成功向U2发送数据,U2也成功接收U1发送的数据,并在LED灯上显示了出来。
5、总结与反思
通过本次实验,我加深了对串行口通信的认识,并成功的实现了两台单片机的串行通信,对串行口的通信机制有了一定的了解。
尽管在实验中遇到了困难,但通过同学之间的相互协作,对所遇到的问题进行了依次解决,本次实验对我的最大感触是自己对知识的掌握太混乱,在以后我要慢慢学会融会贯通。
实验四——矩阵键盘输入识别
1、实验目的
设计一个4X4的矩阵键盘,键盘的号码0~15,要求编写出一个键盘输入扫描程序,要求单片机能根据键盘排列顺序,能将按下去键盘号正确识别出来,并采用两个数码管分别键盘号码的个位和十位。
2、实验任务
实现查询方式下矩阵式键盘的动态显示。
3、实验原理图设计
图4.1
四、实验代码
#include
sbitP14=P1^4;
sbitP15=P1^5;
sbitP16=P1^6;
sbitP17=P1^7;
unsignedcharcodeTab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsignedcharkeyval;
voidled_delay(void)
{unsignedcharj;
for(j=0;j<200;j++);
}
voiddisplay(unsignedchark)
{P2=0xbf;
P0=Tab[k/10];
led_delay();
P2=0x7f;
P0=Tab[k%10];
led_delay();
}
voiddelay20ms(void)
{unsignedchari,j;
for(i=0;i<100;i++)
for(j=0;j<60;j++);
}
voidmain(void)
{EA=1;
ET0=1;
TMOD=0x01;
TH0=(65536-500)/256;
TL0=(65536-500)%256;
TR0=1;
keyval=0x00;
while
(1)
{display(keyval);
}
}
voidtime0_interserve(void)interrupt1using1
{TR0=0;
P1=0xf0;
if((P1&0xf0)!
=0xf0)
delay20ms();
if((P1&0xf0)!
=0xf0)
{P1=0xfe;
if(P14==0)
keyval=1;
if(P15==0)
keyval=2;
if(P16==0)
keyval=3;
if(P17==0)
keyval=4;
P1=0xfd;
if(P14==0)
keyval=5;
if(P15==0)
keyval=6;
if(P16==0)
keyval=7;
if(P17==0)
keyval=8;
P1=0xfb;
if(P14==0)
keyval=9;
if(P15==0)
keyval=10;
if(P16==0)
keyval=11;
if(P17==0)
keyval=12;
P1=0xf7;
if(P14==0)
keyval=13;
if(P15==0)
keyval=14;
if(P16==0)
keyval=15;
if(P17==0)
keyval=16;
}
TR0=1;
TH0=(65536-500)/256;
TL0=(65536-500)%256;
}
4、实验结论
本次实验的最终结果是:
单片机能根据键盘排列顺序,能将按下去键盘号正确识别出来,并采用两个数码管分别显示键盘号码的个位和十位。
5、总结与反思
通过本次实验我对非编码键盘有了一些基础的了解,其包含独立式键盘和矩阵式键盘两种方式,并且对于矩阵式键盘的应用也有了一些认识。
本次实验使我学到了一些之前没有接触到的内容。
尽管如此本次实验过程中仍旧遇到了一些问题,最终在老师和同学的帮助下顺利解决并完成实验。