实验四 单片机设计实验.docx
《实验四 单片机设计实验.docx》由会员分享,可在线阅读,更多相关《实验四 单片机设计实验.docx(11页珍藏版)》请在冰豆网上搜索。
![实验四 单片机设计实验.docx](https://file1.bdocx.com/fileroot1/2023-6/13/7db2e916-25b0-43c7-98ce-a00915dd9329/7db2e916-25b0-43c7-98ce-a00915dd93291.gif)
实验四单片机设计实验
课程名称:
单片机实验
题目:
实验四单片机设计实验
学生姓名:
专业:
班级:
学号:
指导教师:
日期:
年月日
实验四单片机设计实验
一、实验目的
1、掌握单片机定时器、中断、键盘扫描、动态显示及数值计算的综合运用能力;
2、掌握编程的运用能力;
3、设计一只简易的16键计算器。
二、实验内容
图5-1
编程实现图5-1的简易16键4位十进制整数计算器的功能。
要求:
1.设计4*4的键盘,其中10个数字键0~9,其余6个为“+”“-”“*”“/”“=”和“C”
2.设计4位LED接口电路或LCD显示电路
3.实现2位数的简单运算
编程提示:
1、定时显示
开辟一显示缓冲区,显示中断程序定时读取缓冲区显示各位数字,每位显示2.5ms,显
示4位需要10ms,也就是显示的刷新频率是100Hz。
这样既保证亮度又不闪烁,同时CPU还
有足够时间做其他事情。
2、键盘中断扫描
利用键盘中断扫描程序,读出按键的键码,存入键盘缓冲区,供主程序读取。
3、计算器的主程序读取键盘缓冲区的键码,驱动计算器的运行。
4、计算中需要十进制与十六进制(或二进制)转化。
图5-2简易16键计算器主程序框图
三、系统硬件设计电路图
四、软件设计
#include
#include//循环位移头文件
#defineucharunsignedchar//宏定义
#defineuintunsignedint
sbitP1_4=P1^4;//I/O端口定义(矩阵扫描后4位端口)
sbitP1_5=P1^5;
sbitP1_6=P1^6;
sbitP1_7=P1^7;
uchari,nums;
ucharwei,wei2,ss,ss1,ss2,str[]={0,0,0,0,0,0,0};
longtemp,temp1,str[]={10,10,10,10,10,10,10};
ucharcodedutable[]={//段位编码
0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
ucharcodewetable[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
voidinit();//函数声明
voidpanduan();
voiddisplay();
voiddelay(uintz);
voidshaomiao();
voidmain()//主函数
{
init();//调用变量初始化函数
while
(1)//大循环
{
shaomiao();//调用矩阵扫描加处理函数
diaplay();//调用显示函数
}
}
voidinit()
{
ss2=0;
wei2=1;
temp1=0;
ss=0;
ss1=0;
temp=0;
wei=0;
num=0;
}
voiddelay(uintz)//延时函数(单位ms)
{
uchari;
uintj;
for(j=z;j>0;j--)
for(i=114;i>0;i--);
}
voidshaomiao()//扫描加处理函数
{
for(i=0,s=0xfe;i<4;i++)//低四位端口依次赋值1
{
P1=s;//对P1口赋值
panduan();//调用判断处理函数
s=_crol_(s,1);//s循环位左移
s=sl0xf0;//进行位或运算(使高4位复原)
}
}
voidpanduan()
{
ucharn;
if(P1_4==0||P1_5==0||P1_6==0||P1_7==0)
{
delay(10);
P1=sl0xf0;
if(P1_4==0||P1_5==0||P1_6==0||P1_7==0)
{
if(P1_4==0)
{n=1;num=i*4+n-1;}
elseif(P1_5==0)
{n=2;num=i*4+n-1;}
elseif(P1_6==0)
{n=3;num=i*4+n-1;}
elseif(P1_7==0)
{n=4;num=i*4+n-1;}
if(num<10&&wei!
=7)
{
wei++;
if(ss1==1)
{
temp=0;
str[6]=str[5]=str[4]=str[3]=str[2]=str[1]=10;
str1[6]=str1[5]=str1[4]=str1[3]=str1[2]=str1[1]=0;
ss1=0;
}
str[wei]=num;
if(str[1]!
=10)temp=str[1];
if(str[2]!
=10)temp=str[1]*10+str[2];
if(str[3]!
=10)temp=str[1]*100+str[2]*10+str[3];
if(str[4]!
=10)temp=str[1]*1000+str[2]*100+str[3]*10+str[4];
if(str[5]!
=10)temp=str[1]*10000+str[2]*1000+str[3]*100+str[4]*10+str[5];
if(str[6]!
=10)temp=str[1]*100000+str[2]*10000+str[3]*1000+str[4]*100+str[5]*10+str[6];
}
if(num>=10)
{
wei=0;
if(num==10)
{
temp=0;
l[1]=0;
wei=0;
temp1=0;
ss=0;
wei2=1;
}
if(ss1==0&&num==11||(ss1==0&&ss2!
=0&&num>>11&&num<16))
{
if(num==11)
ss2=0;
switch(ss)
{
case0:
break;
case1:
temp=temp1;break;
case2:
temp=temp1-temp;break;
case3:
temp=temp*temp1;break;
case4:
temp=temp1/temp;break;
}
if(temp>999999)
temp=0;
ss1=1;
}
if(num==12)
{
temp1=temp;
ss=1;ss1=1;ss2=1;
}
if(num==13)
{
temp1=temp;
ss=2;ss1=1;ss2=1;
}
if(num==14)
{
temp1=temp;
ss=3;ss1=1;ss2=1;
}
if(num==15)
{
ss=4;ss1=1;ss2=1;
}
}
}
str1[6]=temp/100000;
str1[5]=temp%100000/10000;
str1[4]=temp%10000/1000;
str1[3]=temp%1000/100;
str1[2]=temp%100/10;
str1[1]=temp%10/1;
if(str1[1]!
=0)
wei2=1;
if(str1[2]!
=0)
wei2=2;
if(str1[3]!
=0)
wei2=3;
if(str1[4]!
=0)
wei2=4;
if(str1[5]!
=0)
wei2=5;
if(str1[6]!
=0)
wei2=6;
}
while(P1_4==0||P1_5==0||P1_6==0||P1_7==0);
}
voiddisplay()
{
chari1;
for(i1=1;i1{
P2=wetable[0];
P3=dutable[14];
}
else
{
P2=wetable[i1-1];
P3=dutable[str1[i1]];
delay(10);
P3=0xff;
}
}
五、实验感想与体会
这一次的单片机设计实验我花了五天时间去完成,第一天我通过在网上和去图书馆找资料了解了这一方面的知识,第二,三天我在电脑上进行硬件电路的设计,第四,五天我进行了软件的设计并且进行了最后的仿真调试。
在这次单片机设计过程中我锻炼了自己的思考能力和动手能力,本次单片机设计实验加强了我思考问题的完整性和实际生活联系的可行性,在设计实验过程中,我培养起了综合应用单片机的能力,对单片机的各个管脚的功能也有了进一步的认识,还锻炼了个人的查阅技术资料的能力,动手能力,发现问题,解决问题的能力,并且熟练掌握了有关器件的性能及测试方法。