单片机最小系统实验报告.docx
《单片机最小系统实验报告.docx》由会员分享,可在线阅读,更多相关《单片机最小系统实验报告.docx(17页珍藏版)》请在冰豆网上搜索。
单片机最小系统实验报告
长沙学院
电子工艺实习报告
姓名:
潘舟
学号:
2009044211
系别:
电子与通信工程
时间:
2011.11.14-2011.11.25
专业:
电子信息工程
指导老师:
龙英、刘辉、王新辉、刘亮、马凌云
目录
1、引言
2、目的
3、任务
4、要求
5、主要原理图
6、主要程序
7、程序实现的功能
8、系统调试
9、总结
目的:
通过对单片机最小系统的研究,掌握单片机各引脚功能,理解单片机工作过程及原理,以及与各种外部扩展器件的连接,能够自己运用单片机来解决实际问题。
任务:
1、单片机实验板的设计与制作
2、声光控延时开光的焊接与调试
要求:
1、
(1)功能要求
单片机最小系统(晶振、复位电路);
按键输入部分,可以做简单按键输入实验;
键盘输入部分,可做矩阵式键盘扫描输入实验;
RS-232串行接口部分,可进行单片机与计算机通信实验;
LCD显示部分,可做LCD显示实验;
LED数码管显示器部分,可进行定时计数等数据显示实验;
喇叭发音部分,可做单片机发声实验;
LED发光二极管部分,可做基本输出功能实验;
稳压电源部分,可提供5V电源;
(2)设计要求
进行元器件及参数选择;画出电路原理图;PCB图,焊接电路并调试。
(3)制作要求
自行装配和调试,并能发现问题和解决问题。
(4)程序调试要求
编写秒表程序和彩灯控制程序,利用自己制作的实验板进行程序调试。
2、
(1)、能实现以下功能:
a、能够实现光控声控控制灯的点亮;
b、能够使灯包点亮后一段时间自动熄灭。
(2)设计要求
进行元器件及参数选择;画出电路原理图;PCB图,焊接电路并调试。
(3)制作要求
自行装配和调试,并能发现问题和解决问题。
主要原理图:
主要程序:
1)编写一程序,达到按键加减的功能。
按一下+1键,显示加一,加到255时,显示归零按。
按下-1键,显示减1,当减到零时,显示变为255。
程序:
#include
#include
#defineucharunsignedchar
sbitk1=P3^0;
sbitk2=P3^1;
sbitA1=P2^0;
sbitA2=P2^1;
sbitA3=P2^2;
sbitA4=P2^3;
ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
voiddelay(ucharj)
{
uchari;
for(i=0;i<100;i++)
{
_nop_();
j--;
}
}
voidxianshi(uchary)
{
ucharm,n,x,i;
m=y%10;
n=y/10%10;
x=y/100;
for(i=0;i<4;i++)
{
A1=0;
P0=table[m];
delay
(1);
A1=1;
A2=0;
P0=table[n];
delay
(1);
A2=1;
A3=0;
P0=table[x];
delay
(1);
A3=1;
}
}
main()
{
chart;
P2=0;
P0=0x80;
while
(1)
{
if(k1==0)
{
delay(10);
if(k1==0)
{
delay(10);
while(!
k1);
t++;
if(t>255)
t=0;
xianshi(t);
}
}
if(k2==0)
{
delay(10);
if(k1==0)
{
delay(10);
while(!
k1);
t--;
if(t<0)
t=255;
xianshi(t);
}
}
}
}
2)编写程序,实现跑秒功能。
程序:
#include
#defineucharunsignedchar
//******************************特殊位定义*******************************
sbitp30=P3^0;
sbitp31=P3^1;
sbitp32=P3^2;
sbitp33=P3^3;
sbitsten=P3^4;//P3.4用来控制计时器的走与停(复位清零)
sbitstoreshow=P3^5;//p3.4用来存计数与读计数
sbitp37=P3^7;
//*****************存放点量数码管的码(0~9)**************************
ucharcodetab1[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//存放点量数码管的段选码(0~9)
ucharcodetab2[4]={0x0fe,0x0fc,0x0fb,0x0f7};//存放点量数码管的位选码(3~0位)
//********************************变量定义****************************
uchartab3[10][4]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};//预存10个计时
uchartab4[4]={0,0,0,0};//用来放四位数即分、十秒、个秒、1/10秒//
ucharn,s,S1,m,k,a;//定义变量
//****************子程序申明//////////////////
voidinitT0(void);//定时器0的初始化
voiddisplay1(void);//数码管显示程序
voiddisplay2(void);//显示存入的计时数
voiddelay5ms(uchari);//延时5ms程序
voidspeak2(void);//按键提示音
voidspeak(void);//开机提示音
//*************子程序内容///////////////
voidspeak2(void)//***************************************按键提示音**********************
{
uchari;
for(i=0;i<5;i++)
{
p37=0;
delay5ms
(1);
p37=1;
delay5ms
(1);
}
}
voidspeak(void)//*********************开机提示音***********************
{
uchari;
for(i=0;i<5;i++)
{
p37=0;
delay5ms
(2);
p37=1;
delay5ms
(2);
}
}
voidinitT0(void)//****************************定时器0的初始化程序、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
{
TMOD=0x01;
TH0=0x63;
TL0=0x0c0;//定时50ms
EA=1;
ET0=1;
TR0=1;
}
voidtimer0(void)interrupt1//***************************************定时中断程序、、、、、、、、、、、、、、、、、、、、、、
{
TF0=0;
TH0=0x63;
TL0=0x0c0;//定时50ms
n++;
if(n==2)
{
n=0;//定时中断次数清0
s++;//十分之一秒加1
if(s==10)//***秒
{
s=0;
S1++;//秒加1
if(S1==60)//***分
{
S1=0;
m++;//分加1
}
}
tab4[0]=m;//将分存入数组
tab4[1]=S1/10;//取得秒十位
tab4[2]=S1%10;//取得秒个位
tab4[3]=s;
}
if(tab4[0]==9&tab4[1]==5&tab4[2]==9&tab4[3]==9)
{
speak();
delay5ms(10);
speak2();
TR0=0;
}
}
voiddisplay1(void)//*******************数码管动态显示程序、、、、、、、、、、、、、、、、、、、、、、、、、、、、
{
uchari;
while
(1)
{
for(i=0;i<4;i++)
{
P3=tab2[i];//选正位
P0=tab1[tab4[i]];//点量对应位的段码
delay5ms
(1);
}
if(!
sten)
{
delay5ms
(2);//消抖
if(!
sten)
{k++;
speak2();//按键提示音
while(!
sten);//等待sten按键释放
break;//按sten键k加1表示停止计时
}
}
if(!
storeshow)
{
delay5ms
(2);//消抖
if(!
storeshow)
{
a++;
speak2();//按键提示音
while(!
storeshow);//等待按键storeshow释放
break;//按storeshow表示存入一个当前计时数到tab3数组中
}
}
}
}
voiddisplay2(void)//*************************显示存入的计时数、、、、、、、、、、、、、、、、、、、、、、、
{
uchari;
while
(1)
{
while
(1)
{
for(i=0;i<4;i++)
{
P3=tab2[i];//选正位
P0=tab1[tab4[i]];//点量对应位的段码
delay5ms
(1);
}
if(!
storeshow)break;
if(!
sten)break;
}
delay5ms
(2);//消抖
if(!
sten)
{
k++;
speak2();//按键提示音
while(!
sten);
break;
}
if(!
storeshow)
{
speak2();//按键提示音
while(!
storeshow);//等待按键storeshow释放
break;//打断跳回显示下一个计时数
}
}
}
voiddelay5ms(uchari)//**********************延时5ms秒程序*、、、、、、、、、、、、、、、、、、、、、、、、
{
ucharj,f,g;
for(j=0;j
{
for(g=19;g>0;g--)
for(f=130;f>0;f--);
}
}
//************************************************************主程序段************************************************
voidmain()
{
ucharb;
speak();//开机提示音
while
(1)
{
a=0;
k=0;
n=0,s=0,S1=0,m=0;//变量初始化
while(sten);//等待开始按键
delay5ms
(2);
if(!
sten)//按键sten开始
{
speak2();//按键提示音
while(!
sten);//等待按键松开就开始计时
initT0();//定时器0初始化开始计时
while(k==0|k==1)
{
display1();//调用动态显示程序)
if(k==1)//按键sten
{
TR0=0;//按键sten表示关计时
display1();//按键sten后显示最后计时数
if(k==1)//按的是storeshow键即显示存入计时数(从最后一个开始)
{
a--;
while(a)
{
a--;
for(b=0;b<4;b++)
tab4[b]=tab3[a][b];//从tab3数组中取出之前存入的计时数
display2();//显示存入的计时数
}
}
}
if(k==0&a<=10)//k=0,按键storeshow表示存入一个当前计时数到tab3数组中
{
for(b=0;b<4;b++)
tab3[a-1][b]=tab4[b];//将当前计时数存入tab3数组中
}
if(k==2)
{
P3=0x0ff;//关位选(即清显示)
tab4[0]=0;//清零
tab4[1]=0;
tab4[2]=0;
tab4[3]=0;
n=0,s=0,S1=0,m=0;//清零
}
}
}
}
总结:
单片机最小系统经过我一段时间的调试,终于能够达到预定的功能,虽然只是简单的调试,但从中我也接触了不少的关于单片机的知识。
此次课程设计让我对单片机有了初步的认识,能够了解单片机工作的模式和具体过程,明白了怎样利用单片机来设计满足自己设定功能的作品,怎样利用单片机来控制系统。
同时,这也让我了解到怎样进行单片机编程。
掌握了这些就可以在大学期间利用单片机最小系统来拓展功能,制作自己想做的东西,对科研立项等活动有很大的帮助。