印张计数器设计论文Word文档格式.docx
《印张计数器设计论文Word文档格式.docx》由会员分享,可在线阅读,更多相关《印张计数器设计论文Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
#defineLEDLen6//用6个八段管
xdataunsignedcharOUTBIT_at_0x8002;
//位码输出+列扫描地址
xdataunsignedcharOUTSEG_at_0x8004;
//段码输出
xdataunsignedcharIN_at_0x8001;
//行扫描地址入口
xdataunsignedcharCS0832_at_0x9000;
//产生电压启动直流电机
xdataunsignedcharcontrol_at_0xa003;
//control=0832---8255内部指令
xdataunsignedcharctl_at_0xa000;
//产生电流启动步进电动机
codeunsignedcharLEDMAP[]={//数码显示管段码
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
codeunsignedcharKeyTable[]={//4*6键盘定义码
0x16,0x15,0x14,0xff,
0x13,0x12,0x11,0x10,
0x0d,0x0c,0x0b,0x0a,
0x0e,0x03,0x06,0x09,
0x0f,0x02,0x05,0x08,
0x00,0x01,0x04,0x07};
//code,单片机中的ROM
unsignedcharLEDBuf[LEDLen];
//显示缓冲
unsignedcharch;
//ch=getkey
intnum,num1,num2,i;
//num(用户输入数)num1(正计)num2(反计)
sbitLED1=P1^0;
//正计指示灯
sbitLED2=P1^1;
//反计指示灯
sbitLED3=P1^2;
//结束指示灯
sbitSpeaker=P1^3;
//喇叭接口
//////////////////////////////////////////////////////////////////////////////延时程序
voidDelay(unsignedcharCNT)
{
unsignedchari;
while(CNT--!
=0)
for(i=100;
i!
=0;
i--);
}
voidDelay3()//喇叭延时
unsignedcharl;
for(l=0;
l<
100;
l++);
voiddelay2()////////////////////
unsignedchari,j;
j=30;
do{
for(i=250;
i!
i--);
{
TMOD=0x01;
/*定时器0工作在模式1下(16位计数器)*/
TH0=0xfd;
TL0=0x65;
TR0=1;
/*启动定时器*/
while(TF0==0);
TR0=0;
}
}while(--j);
////////////////////////////////////////////////////////////////////////数码管显示
voidDisplayLED()//数码管显示函数
unsignedcharPos;
Pos=0x20;
//从左边开始显示
for(i=0;
i<
LEDLen;
i++){
OUTBIT=0;
//关所有八段管
OUTSEG=LEDBuf[i];
OUTBIT=Pos;
//显示一位八段管
Delay
(1);
Pos>
>
=1;
//Pos的数据右移一位
/////////////////////////////////////////////////////////////////////////////键盘
unsignedcharTestKey()//键盘扫描函数(本实验属行-列扫描方式)4*6矩阵式键盘
//列设为低电平0
return(~IN&
0x0f);
//读入键状态(高四位不用)得到第几行
unsignedcharGetKey()//读取键值函数
unsignedchark;
i=6;
//i代表第几列
//得到第几列
do{
OUTBIT=~Pos;
//
//向下一列扫描
k=~IN&
0x0f;
}while((--i!
=0)&
&
(k==0));
//键值=列x4+行
if(k!
=0){
i*=4;
if(k&
2)i+=1;
elseif(k&
4)i+=2;
8)i+=3;
doDelay(10);
while(TestKey());
//等键释放
return(KeyTable[i]);
//取出键码
}elsereturn(0xff);
//////////////////////////////////////////////////////////////////////////步进电动机
voidStepmotor()
unsignedcharctl1[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
//A-AB-B-BC-C-CD-D-DA-A
//双八拍,一个周期转60度,8*7.5
unsignedinti,j;
ctl=0;
//步进电动机初始化-无电流
while
(1)
for(j=0;
j<
6;
j++)
for(i=0;
i<
8;
i++)
DisplayLED();
ctl=ctl1[i];
delay2();
DisplayLED();
break;
///////////////////////////////////////////////////////////////////////////中断
voidExtInt0()interrupt0
num1++;
num2--;
////////////////////////////////////////////////////////////////////////////////正计
voidzhengji()
TCON=0x01;
//外部中断0下降沿触发,定时/计数器控制寄存器,INT0=P3.2外部中断0输入
IE=0x81;
//打开外部中断允许位(EX0)及总中断允许位(EA)
CS0832=0xff;
//直流电动机转
while(num1<
=num){
if(num1<
num)
{LEDBuf[5]=LEDMAP[num1%10];
LEDBuf[4]=LEDMAP[num1/10%10];
LEDBuf[3]=LEDMAP[num1/100%10];
LEDBuf[2]=LEDMAP[num1/1000%10];
LEDBuf[1]=LEDMAP[num1/10000%10];
LEDBuf[0]=LEDMAP[num1/1000000%10];
elseif(num1==num)
CS0832=0x80;
//直流电动机停
LED1=1;
LEDBuf[5]=LEDMAP[num%10];
LEDBuf[4]=LEDMAP[(num/10)%10];
LEDBuf[3]=LEDMAP[(num/100)%10];
LEDBuf[2]=LEDMAP[(num/1000)%10];
LEDBuf[1]=LEDMAP[(num/10000)%10];
LEDBuf[0]=LEDMAP[(num/1000000)%10];
if(TestKey())
ch=GetKey();
if(ch==0x0d)//按下次品键
CS0832=0x80;
for(i=0;
10;
Speaker=0;
Delay3();
Speaker=1;
}
Stepmotor();
elseif(ch==0x0f)gotothen;
LED3=1;
LED1=0;
LED2=0;
while
(1){
if(TestKey()){ch=GetKey();
ch==0x0f;
then:
break;
////////////////////////////////////////////////////////////////////////反计
voidfanji()
//外部中断0下降沿触发
if(num2>
0)
LEDBuf[5]=LEDMAP[num2%10];
LEDBuf[4]=LEDMAP[(num2/10)%10];
LEDBuf[3]=LEDMAP[(num2/100)%10];
LEDBuf[2]=LEDMAP[(num2/1000)%10];
LEDBuf[1]=LEDMAP[(num2/10000)%10];
LEDBuf[0]=LEDMAP[(num2/1000000)%10];
elseif(num2==0)
i++)LEDBuf[i]=LEDMAP[0];
if(ch==0x0f)gotothen;
elseif(ch==0x0d)//按下次品键D
{CS0832=0xaf;
//步进电动机转
}while(num2>
=0);
LEDBuf[5]=LEDMAP[0];
LEDBuf[4]=LEDMAP[0];
LEDBuf[3]=LEDMAP[0];
LEDBuf[2]=LEDMAP[0];
LEDBuf[1]=LEDMAP[0];
LEDBuf[0]=LEDMAP[0];
then:
///////////////////////////////////////////////////////////////////////////主函数
voidmain()
unsignedchari=0xff,j;
unsignedcharno[6];
//每按一个数字键的缓冲
unsignedcharch;
//LEDBuf1=0;
control=0x82;
//8255内部指令
LED3=0;
j++){
LEDBuf[j]=0x00;
//----
no[j]=0xff;
//显示-----
while
(1){
if(ch<
0x0a){//输入数据
i++;
LEDBuf[i]=LEDMAP[ch&
0x0f];
no[i]=ch;
elseif(ch==0x0a){//确定(A)
num=0;
j++){if(no[j]!
=0xff)num=num*10+no[j];
elseif(ch==0x0b){//正计(B)
LED1=1;
num1=0;
zhengji();
main();
elseif(ch==0x0c)
{//反计(C)
LED2=1;
num2=num;
fanji();
elseif(ch==0x0f){//复位(F)
i=0xff;
LED1=0;
}
五.连线
1
直流电机
-8v~+8v
2
步进电机A
PA0
3
B
PA1
4
C
PA2
5
D
PA3
6
KEY/LEDCS
CS0
7
DA_CS
CS1
8
8255CS
CS2
9
L1
P1.0
10
L2
P1.1
11
L3
P1.2
12
脉冲输入
P1.3
13
单脉冲
P3.2
六.程序流程图
七.设计总结与心得
此次微机原理课程设计能够完好的完成,我首先感谢我的设计指导老师。
他严谨的治学态度和热忱的工作态度令我十分钦佩,他的知道使我受益匪浅。
通过此次课程设计,让我明白学好专业课的重要性。
虽然我的专业方向是自动化,但是电子和自动化是不分家的。
希望能在以后的学习和工作中,能紧记老师的教导,真正做到学以致用。