课程设计题目:电子计数器

要程序,是基于单片机的。紧急啊!

单片机C51计数器要求:编写一个计数器程序,将T0作为计数器来使用,对外部信号计数,将所计数字显示在数码管上。 该部分的硬件电路如图所示,U1的P0口和P2口的部份引脚构成了6位LED数码管驱动电路,数码管采用共阳型,使用PNP型三极管作为片选端的驱动,所有三极管的发射极连在一起,接到正电源端,它们的基极则分别连到P2.0…P2.5,当P2.0…P2.5中某引脚输是低电平时,三极管导通,给相应的数码管供电,该位数码管点亮哪些笔段,则取决于笔段引脚是高或低电平。图中看出,所有6位数码管的笔段连在一起,通过限流电阻后接到P0口,因此,哪些笔段亮就取决于P0口的8根线的状态。   编写程序时,首先根据硬件连线写出LED数码管的字形码、位驱动码,然后编写程序如下: #include "reg51.h"#define uchar unsigned char#define uint unsigned int uchar code BitTab[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB}; //位驱动码uchar code DispTab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF}; //字形码uchar DispBuf[6]; //显示缓冲区 void Timer1() interrupt 3{ uchar tmp;uchar Count; //计数器,显示程序通过它得知现正显示哪个数码管TH1=(65536-3000)/256;TL1=(65536-3000)%256; //重置初值tmp=BitTab[Count]; //取位值P2=P2|0xfc; //P2与11111100B相或P2=P2&tmp; //P2与取出的位值相与tmp=DispBuf[Count];//取出待显示的数 tmp=DispTab[tmp]; //取字形码P0=tmp;Count++;if(Count==6)Count=0; }void main(){ uint tmp;P1=0xff;P0=0xff;TMOD=0x15; //定时器0工作于计数方式1,定时器1工作于定时方式1TH1=(65536-3000)/256;TL1=(65536-3000)%256; //定时时间为3000个周期TR0=1; //计数器0开始运行TR1=1;EA=1;ET1=1;for(;;){ tmp=TL0|(TH0<<8); //取T0中的数值DispBuf[5]=tmp%10;tmp/=10;DispBuf[4]=tmp%10; tmp/=10;DispBuf[3]=tmp%10;tmp/=10;DispBuf[2]=tmp%10;DispBuf[1]=tmp/10;DispBuf[0]=0;}}   这个程序中用到了一个新的知识点,即数组,首先作一个介绍。   数组是C51的一种构造数据类型,数组必须由具有相同数据类型的元素构成,这些数据的类型就是数组的基本类型,如:数组中的所有元素都是整型,则该数组称为整型数组,如所有元素都是字符型,则该数组称为字符型数组。   数组必须要先定义,后使用,这里仅介绍一维数组的定义,其方式为:   类型说明符 数组名[整型表达式]   定义好数组后,可以通过:数组名[整型表达式]来使用数组元素。   在定义数组时,可以对数组进行初始化,即给其赋予初值,这可用以下的一些方法实现:   1.在定义数组时对数组的全部元素赋予初值:  例:int a[5]={1,2,3,4,5};  2.只对数组的部分元素初始化;  例:int a[5]={1,2};   上面定义的a数组共有5个元素,但只对前两个赋初值,因此a[0]和a[1]的值是1、2,而后面3个元素的值全是0。   3.在定义数组时对数组元素的全部元素不赋初值,则数组元素值均被初始化为0   4.可以在定义时不指明数组元素的个数,而根据赋值部分由编译器自动确定  例:uchar BitTab[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB};则相当于定义了一个BitTab[6]这样一个数组。   5.可以为数组指定存储空间,这个例子中,未指定空间时,将数组定义在内部RAM中,可以用code关键字将数组元素定义在ROM空间中。  uchar code BitTab[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB};   用这两种定义分别编译,可以看出使用了code关键字后系统占用的RAM数减少了,这种方式用于编程中不需要改变内容的场合,如显示数码管的字形码等是很合适的。   6.C语言并不对越界使用数组进行检测,例如上例中数组的长度是6,其元素应该是从BitTab[0]~BitTab[5],但是如果你在程序中写上BitTab[6],编译器并不会认为这有语法错误,也不会给出警告(其他语言如BASCI等则有严格的规定,这种情况将视为语法错误),因此,编程者必须自己小心确认这是否是你需要的结果。   程序分析:程序中将定时器T1用作数码管显示,通过interrupt 3关键字定义函数Timer1()为定时器1中断服务程序,在这个中断服务程序中,使用 TH1=(65536-3000)/256;TL1=(65536-3000)%256;   来重置定时器初值,这其中3000即为定时周期,这样的写法可以直观地看到定时周期数,是常用的一种写法。其余程序段分别完成取位码以选择数码管、从显示缓冲区获得待显示数值、根据该数值取段码以点亮相应笔段等任务。其中使用了一个计数器,该计数器的值从0~5对应第1到第6位的数码管。   主程序的第一部分是做一些初始化的操作,设置定时器工作模式、开启定时器T1、开启计数器T0、开启T1中断及总中断,随后进入主循环,主循环首先用unsigned int型变量tmp取出T0中的数值,这里使用了“tmp=TL0|(TH0<<8);”这样的形式,这相当于tmp=TH0*256+TL0,但比之于后一种形式,该方式可以得到更高的效,其后就是将tmp值不断地除10取整,这样将int型数据的各位分离并送入相应的显示缓冲区 参考链接: http://www.picavr.com/news/2008-07/7075.htm
温馨提示:内容为网友见解,仅供参考
第1个回答  2016-03-24
  单片机C51计数器要求:编写一个计数器程序,将T0作为计数器来使用,对外部信号计数,将所计数字显示在数码管上。
  该部分的硬件电路如图所示,U1的P0口和P2口的部份引脚构成了6位LED数码管驱动电路,数码管采用共阳型,使用PNP型三极管作为片选端的驱动,所有三极管的发射极连在一起,接到正电源端,它们的基极则分别连到P2.0…P2.5,当P2.0…P2.5中某引脚输是低电平时,三极管导通,给相应的数码管供电,该位数码管点亮哪些笔段,则取决于笔段引脚是高或低电平。图中看出,所有6位数码管的笔段连在一起,通过限流电阻后接到P0口,因此,哪些笔段亮就取决于P0口的8根线的状态。
  编写程序时,首先根据硬件连线写出LED数码管的字形码、位驱动码,然后编写程序如下:
  #include "reg51.h"#define uchar unsigned char#define uint unsigned int uchar code BitTab[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB}; //位驱动码uchar code DispTab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF}; //字形码uchar DispBuf[6]; //显示缓冲区 void Timer1() interrupt 3{ uchar tmp;uchar Count; //计数器,显示程序通过它得知现正显示哪个数码管TH1=(65536-3000)/256;TL1=(65536-3000)%256; //重置初值tmp=BitTab[Count]; //取位值P2=P2|0xfc; //P2与11111100B相或P2=P2&tmp; //P2与取出的位值相与tmp=DispBuf[Count];//取出待显示的数 tmp=DispTab[tmp]; //取字形码P0=tmp;Count++;if(Count==6)Count=0; }void main(){ uint tmp;P1=0xff;P0=0xff;TMOD=0x15; //定时器0工作于计数方式1,定时器1工作于定时方式1TH1=(65536-3000)/256;TL1=(65536-3000)%256; //定时时间为3000个周期TR0=1; //计数器0开始运行TR1=1;EA=1;ET1=1;for(;;){ tmp=TL0|(TH0<<8); //取T0中的数值DispBuf[5]=tmp%10;tmp/=10;DispBuf[4]=tmp%10; tmp/=10;DispBuf[3]=tmp%10;tmp/=10;DispBuf[2]=tmp%10;DispBuf[1]=tmp/10;DispBuf[0]=0;}}   这个程序中用到了一个新的知识点,即数组,首先作一个介绍。   数组是C51的一种构造数据类型,数组必须由具有相同数据类型的元素构成,这些数据的类型就是数组的基本类型,如:数组中的所有元素都是整型,则该数组称为整型数组,如所有元素都是字符型,则该数组称为字符型数组。   数组必须要先定义,后使用,这里仅介绍一维数组的定义,其方式为:   类型说明符 数组名[整型表达式]   定义好数组后,可以通过:数组名[整型表达式]来使用数组元素。   在定义数组时,可以对数组进行初始化,即给其赋予初值,这可用以下的一些方法实现:
  1.在定义数组时对数组的全部元素赋予初值:  例:int a[5]={1,2,3,4,5};
  2.只对数组的部分元素初始化;  例:int a[5]={1,2};   上面定义的a数组共有5个元素,但只对前两个赋初值,因此a[0]和a[1]的值是1、2,而后面3个元素的值全是0。
  3.在定义数组时对数组元素的全部元素不赋初值,则数组元素值均被初始化为0
  4.可以在定义时不指明数组元素的个数,而根据赋值部分由编译器自动确定  例:uchar BitTab[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB};则相当于定义了一个BitTab[6]这样一个数组。
  5.可以为数组指定存储空间,这个例子中,未指定空间时,将数组定义在内部RAM中,可以用code关键字将数组元素定义在ROM空间中。  uchar code BitTab[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB};   用这两种定义分别编译,可以看出使用了code关键字后系统占用的RAM数减少了,这种方式用于编程中不需要改变内容的场合,如显示数码管的字形码等是很合适的。
  6.C语言并不对越界使用数组进行检测,例如上例中数组的长度是6,其元素应该是从BitTab[0]~BitTab[5],但是如果你在程序中写上BitTab[6],编译器并不会认为这有语法错误,也不会给出警告(其他语言如BASCI等则有严格的规定,这种情况将视为语法错误),因此,编程者必须自己小心确认这是否是你需要的结果。
  程序分析:程序中将定时器T1用作数码管显示,通过interrupt 3关键字定义函数Timer1()为定时器1中断服务程序,在这个中断服务程序中,使用 TH1=(65536-3000)/256;TL1=(65536-3000)%256;
  来重置定时器初值,这其中3000即为定时周期,这样的写法可以直观地看到定时周期数,是常用的一种写法。其余程序段分别完成取位码以选择数码管、从显示缓冲区获得待显示数值、根据该数值取段码以点亮相应笔段等任务。其中使用了一个计数器,该计数器的值从0~5对应第1到第6位的数码管。
  主程序的第一部分是做一些初始化的操作,设置定时器工作模式、开启定时器T1、开启计数器T0、开启T1中断及总中断,随后进入主循环,主循环首先用unsigned int型变量tmp取出T0中的数值,这里使用了“tmp=TL0|(TH0<<8);”这样的形式,这相当于tmp=TH0*256+TL0,但比之于后一种形式,该方式可以得到更高的效,其后就是将tmp值不断地除10取整,这样将int型数据的各位分离并送入相应的显示缓冲区

急求数字电路课程设计要求:设计一个矩形波计数器,能计数1到99,还可以...
5.两片74LS90都要CP1接Q0(使芯片构成10进制计数器)。两片74LS90都要R01、R02、S91、S92接地(置位端和复位端,你用不上)。6.矩形波送到个位74ls90的CP0上,个位74ls90的Q3和十位74ls90的CP0相连接。(级联,构成100进制计数器)7.4个芯片都接上电源和地线。 ok!注意:先去找到这...

产品成品计数器课程设计
当成品从流过,通过光源和光电二极管组成的特殊计数轨道时,造成瞬时遮光,使用发光电阻其电阻值能随着外界光照强弱(明暗)变化而变化,进而把光信号能够用电压来表示,使用555定时器改装成的施密特触发器对电压信号整形获得比较理想的矩形脉冲波形,送入4个74160并联计数器的计数输入口,计数器能够从0000-999...

电气控制与plc课程设计。一个按钮控制三台电机顺序起停工作。具体要求看...
按钮的信号连接个计数器,计数为1时电机1开,计数为2时电机2开,计数为3时电机3开,计数为4时断开所有的输出,同时复位计数器C。程序可以这样写。

如何设计74LS192与74LS193构成的十进制计数器?
(一)首先要使用74LS192或40192设计一个4进制计数器和一个7进制计数器,然后通过数码管来显示状态。两种进制间的切换可以通过一个单刀双掷开关来实现。其重点和难点在于设计一个4进制计数器和一个7进制计数器。(二)通过分析74LS192和40192的特点,发现可以使用清零法来设计一个4进制计数器,而7进制...

数电实验如何用90芯片设计58进制计数器
1) 在设计过程中我查阅了大量的资料,了解了许多关于计数器设计方面的问题,进一步理解了各种元器件的使用方法。2) 这次课程设计让我学到了很多,不仅掌握了简单的电子电路的设计与制作,也掌握了毕业设计写作的方法和格式。在制作电路时,我深深体会到连接电路时一定要认真仔细,每一步骤都要认真分析。...

大学数字电子技术的课程设计:数字式电子钟的设计或交通灯控制电路设计...
题目一:数字式电子钟的设计一、 简要说明:利用数字电路的理论和知识进行设计,一般应具有时分秒计时功能,同时可以进行时间的调整;定点报时等。二、 设计任务和基本要求:设计数字式电子钟,基本要求如下:设计一个时分秒计数器,并具有译码显示。其中时为24进制,分秒为60进制。三、 提高要求:1、设计时钟脉冲信号产生电路...

设计数字钟(电子技术课程设计)
⑶时间计数器电路 时间计数电路由秒个位和秒十位计数器、分个位和分十位计数器及时个位和时十位计数器电路构成,其中秒个位和秒十位计数器、分个位和分十位计数器为60进制计数器,而根据设计要求,时个位和时十位计数器为12进制计数器。⑷译码驱动电路 译码驱动电路将计数器输出的8421BCD码转换为数码管需要的逻辑...

求助:大三课程设计《数字电子钟的设计》详细方案过程!!急!急!急!_百...
分频器电路将32768Hz的高频方波信号经32768()次分频后得到1Hz的方波信号供秒计数器进行计数.分频器实际上也就是计数器.⑶时间计数器电路 时间计数电路由秒个位和秒十位计数器,分个位和分十位计数器及时个位和时十位计数器电路构成,其中秒个位和秒十位计数器,分个位和分十位计数器为60进制计数器,而根据设计要求,...

数字电子技术课程设计 一、数字电子钟 要求: 1.用24小时制进行时间显示...
用十进制计数器来制作 或用单片机来做

数据结构课程设计《报数游戏》队列问题 c语言
约瑟夫环问题:如果你用队列做的话,设一个计数器,如果计数器<m就出队后再入队,等于m时那个元素只出队不入队,输出这个元素并且让m等于0。循环到队列为空就行了。

相似回答