印张计数器的设计与实现源代码+实习报告.docx
- 文档编号:8036171
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:14
- 大小:168.93KB
印张计数器的设计与实现源代码+实习报告.docx
《印张计数器的设计与实现源代码+实习报告.docx》由会员分享,可在线阅读,更多相关《印张计数器的设计与实现源代码+实习报告.docx(14页珍藏版)》请在冰豆网上搜索。
印张计数器的设计与实现源代码+实习报告
#include
#defineLEDLen6
xdataunsignedcharOUTBIT_at_0x8002;//位控制口
xdataunsignedcharOUTSEG_at_0x8004;//段控制口
xdataunsignedcharIN_at_0x8001;//键盘读入口
unsignedcharLEDBuf[LEDLen];//显示缓冲
codeunsignedcharLEDMAP[]={//八段管显示码
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
intnum;//六位数
intnum2,num1;
sbitLED1=P1^0;
voidDelay(unsignedcharCNT)
{
unsignedchari;
while(CNT--!
=0)
for(i=100;i!
=0;i--);
}
voidDisplayLED()
{
unsignedchari;
unsignedcharPos;
unsignedcharLED;
Pos=0x20;//从左边开始显示
for(i=0;i OUTBIT=0;//关所有八段管 LED=LEDBuf[i]; OUTSEG=LED; OUTBIT=Pos;//显示一位八段管 Delay (1); Pos>>=1;//显示下一位 } } codeunsignedcharKeyTable[]={//键码定义 0x16,0x15,0x14,0xff, 0x13,0x12,0x11,0x10, 0x0d,0x0c,0x0b,0x0a, 0x0e,0x03,0x06,0x09, 0x0f,0x02,0x05,0x08, 0x00,0x01,0x04,0x07 }; unsignedcharTestKey() { OUTBIT=0;//输出线置为0 return(~IN&0x0f);//读入键状态(高四位不用) } unsignedcharGetKey() { unsignedcharPos; unsignedchari; unsignedchark; i=6; Pos=0x20;//找出键所在列 do{ OUTBIT=~Pos; Pos>>=1; k=~IN&0x0f; }while((--i! =0)&&(k==0));//键值=列x4+行 if(k! =0){ i*=4; if(k&2) i+=1; elseif(k&4) i+=2; elseif(k&8) i+=3; OUTBIT=0; doDelay(10);while(TestKey());//等键释放 return(KeyTable[i]);//取出键码 }elsereturn(0xff); } voidExtInt0()interrupt0 { num1++; num2--; } voidzhengzhuan()//正转计数 { unsignedchari; TCON=0x01;//外部中断0下降沿触发 IE=0x81;//打开外部中断允许位(EX0)及总中断允许位(EA) do{ 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]; DisplayLED(); if(num1==num){ 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]; DisplayLED(); break; } }while(num1<=num); } voidfanzhuan()//反转计数 { unsignedchari; TCON=0x01;//外部中断0下降沿触发 IE=0x81;//打开外部中断允许位(EX0)及总中断允许位(EA) while(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]; DisplayLED(); if(num2==0){ LED1=1; for(i=0;i<6;i++)LEDBuf[i]=LEDMAP[0]; DisplayLED(); break; } } } voidmain() { unsignedchari=0xff,j; unsignedcharno[6]; unsignedcharch;//LEDBuf1=0; LED1=0;//LED2=0; for(j=0;j<6;j++){ LEDBuf[j]=0x00; no[j]=0xff; } while (1){ DisplayLED(); if(TestKey()){ ch=GetKey(); if(ch<0x0a){//输入数据 i++; LEDBuf[i]=LEDMAP[ch&0x0f]; no[i]=ch; } elseif(ch==0x0f){//按下确定键(F) num=0; for(j=0;j<6;j++){ if(no[j]! =0xff)num=num*10+no[j]; } } elseif(ch==0x0e){//按下正转键(E) LED1=0; num1=0; zhengzhuan(); } elseif(ch==0x0d){//按下反转键(D) LED1=0; num2=num; fanzhuan(); } elseif(ch==0x0a){//按下复位键(A) i=0xff; LED1=0; for(j=0;j<6;j++){ LEDBuf[j]=0x00; no[j]=0xff; } DisplayLED(); } } } } 北京印刷学院 微机原理及接口技术课程设计报告 设计名称: 印张计数器 设计题目: 印张计数器的设计与实现 专业: 班级: 学生姓名: 学号: 指导老师: 微机原理及接口技术“印张计数器”实验报告 一、设计任务要求 1)能够进行6位数码显示,显示当前的印张数 2)能够进行印数的预置,能够进行正/反计数 3)当计数结束时,可以示警 二、设计方案 1、系统功能(基本功能,使用说明) 本产品主要用于印刷过程中对于纸张的计数.。 1)、基本功能 ①预设初始计数值: 可通过数字键键入所需计量的印张数,计数范围为: 000000—999999,当输入不正确时可按清除键修改,按下“确定”键后开始。 ②正向\反向计数: 可通过键盘上的“正向\反向”键切换正向计数或者反向计数。 当选择正向计数时,显示屏显示从0开始,每印刷一张,数值加1,直到遇到暂停或者到达预设值时停止计数;当选择反向计数时,显示屏从预设值开始,每印刷一张,数值减1,直到遇到暂停或者到达0时停止计数。 ③报警提示: 当计数为0或者到预设值时,停止计数,发出报警,此时红灯亮。 2、操作说明 (1)——显示屏: 6位7段LED显示,用于在置数或计数过程中显示指数置或计数值。 (2)——复位键: 用于计数完毕后清零,使印张计数器回到初始状态。 (3)——确定键: 用于开始计数。 (4)——正计键: 从0到设定数值正向计数,当达到设定数值时,灯亮 (5)——反计键: 从设定数值到0反向计数,当达到0时,灯亮 (6)——数字键: 用于键入预设值。 基本使用方法: 开启电源后,通过键盘输入数字键并按确认键预设所要印刷纸张的数量,按“正计\反计”键选择正向计数或者反向计数,设置好之后按脉冲键,系统则开始进行计数操作,在正计到达预置数或者反计为0时,警示灯亮。 通过键盘按下“复位”键恢复初始状态。 3、系统设计 (一)、硬件部分分析说明 1)、显示部分 实验箱提供了6位8段码LED显示电路,只要按地址输出相应数据,就可以实现对显示器的控制。 显示共有6位,用动态方式显示。 8位段码、6位位码是由两片74LS374输出。 位码经MC1413或ULN2003倒相驱动后,选择相应显示位。 在实验箱中8位段码输出地址为0X004H,位码输出地址为0X002H。 此处X是由KEY/LEDCS决定,参见地址译码。 做键盘和LED实验时,需将KEY/LEDCS接到相应的地址译码上。 以便用相应的地址来访问。 将KEY/LEDCS接到CS0上,则段码地址为08004H,位码地址为08002H。 其显示电路连接图为: 2)、键盘部分 实验箱提供了一个6×4的小键盘,向列扫描码地址(0X002H)逐列输出低电平,然后从行码地址(0X001H)读回。 如果有键按下,则相应行的值应为低,如果无键按下,由于上拉的作用,行码为高。 这样就可以通过输出的列码和读取的行码来判断按下的是什么键。 在判断有键按下后,要有一定的延时,防止键盘抖动。 地址中的X是由KEY/LEDCS决定,将KEY/LEDCS接到CS0上,则列扫描码地址为08002H,行码地址为08001H。 列扫描码还可以分时用作LED的位选通信号。 其原理图为: 其显示器和键盘的连接电路图为: 掉电保护: 3)、实验箱各连接线 连线 连接孔1 连接孔2 1 KEY/LED_CS CS0 2 P1.0 LED1 3 单脉冲输出 INT0(P3.2) 说明: 1、LED1(黄)为计数警示灯,灯亮时表示达到数值数状态; (2)软件部分介绍: 1)流程图: 图1: 主程序流程图 图2: 键盘扫描显示流程图 图3: 计数程序流程图 图4: 数码管显示流程图 三、设计总结与心得 通过此次的微机原理课程,我感受最深的是实践与理论相结合,也是对我们以前学的知识的总结和概括,使得我们在设计的过程中体会到了电子的重要性,体会到了我们所学的知识的用途和方向。 这次的设计让我感受到,我们不管做什么事情都要认真,都要肯钻研。 单片机的学习比一般编程困难在于,要完成一个单片机系统,不仅要掌握编程技术,更为重要的是要知道如何针对实际应用的需要选择合理的单片机方案和外围器件,并为此为基础,设计硬件电路。 在实习之初我认为这个实习会非常的难,有可能自己做不出来,但真正坐下来才发现,这个题目并不是想象的那样高不可攀。 只要认真钻研,慢慢的就能体会到其中的乐趣,并融入其中,最终不管多难的东西都能弄出来。 在学习的过程中,我发现我还有很多不足之处,我会在业余时间弥补我的不足,希望罗老师时刻监督我,时刻提出我的缺点和不足,这样可以使我尽快地改正错误。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 印张 计数器 设计 实现 源代码 实习 报告