单片机/MCUwilliam hill官网
直播中

糊涂仙子

10年用户 30经验值
擅长:可编程逻辑
私信 关注
[问答]

数码管动态显示

1、在STC89C52实验平台的4位数码管上实现动态显示01231234234534564567567867897890890190120123→不断反复,每隔2s切换显示内容。2、4位数码管显示的内容中有“1”时,蜂鸣器蜂鸣。

这是要求,其中p0端口输出段码,p1端口中输出位选信号。 四个数码管共阳极连接。请问如何编写代码?刚学到中断章节,对此有疑惑,请大牛们解答下,希望有些注解。非常感谢!
捕获.PNG
  • 捕获.PNG

回帖(8)

糊涂仙子

2014-5-7 01:41:32
希望各位教下我,第一次在此william hill官网 发帖求助,希望能学好单片机
举报

陈锐文

2014-5-7 11:23:09
代码就不帮你写了,我就说一下细路。具体怎么实现还得靠你自己。
首先设置一个数组Num[4];分别保存四个要显示的数。
主函数就是讲Num[4]里面的数不断扫描显示。这个我想你应该会。
主函数里面还得初始化定时器0和定时器1,定时器1设置为蜂鸣器的频率对应的时间。
设置定时器0定时时间2s,定时器不能直接设置2s的必须计算多次中断实现。
定时器0中断里面就改变Num[4]里面的数,每个元素加1,如果元素值大于10则置零。同时判断Num[4]里面时候有1,如果有1开启定时器1,否则关闭定时器0.
思路就这样,不懂再上来问。
举报

糊涂仙子

2014-5-10 17:05:13
引用: 依然落叶飘零 发表于 2014-5-7 11:23
代码就不帮你写了,我就说一下细路。具体怎么实现还得靠你自己。
首先设置一个数组Num[4];分别保存四个要显 ...

我编写的代码,麻烦看下。但在proteul上仿真时,不知道是参数设置不对的原因,还是代码的原因,出现乱码。那个蜂鸣器的我没有实现。麻烦帮忙看下,我纠结了好久的一道题目。

#include
unsigned char i;   //记录中断次数
unsigned int x;    //x%10为千位的数字
unsigned char code Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};   //数码管显示0~9的段码表

/***********************************************************************
函数功能:快速动态扫描延时,延时约0.9毫秒
************************************************************************/
void delay(void)
{
  unsigned int i;
  for(i=0;i<300;i++)
    ;
}

/***********************************************************************
函数功能:4位数的数码显示器显示
***********************************************************************/
void display(unsigned int k)   
{

   P1=0xfe;//即P1=1111 1110B,P1.0引脚输出低电平,数码显示器千位接通电源
   P0=Tab[k%10];//显示千位
   delay();

   P1=0xfd;//即P1=1111 1101B,P1.1引脚输出低电平,数码显示器百位位接通电源
   P0=Tab[(k+1)%10];//显示百位
   delay();
   P1=0xff;

   P1=0xfb;//即P1=1111 1011B,P1.2引脚输出低电平,数码显示器十位接通电源         
   P0=Tab[(k+2)%10];//显示十位
   delay();
   P1=0xff;

   P1=0xf7;//即P1=1111 0111B ,P1.3引脚输出低电平,数码显示器个位接通电源               
   P0=Tab[(k+3)%10];//显示个位
   delay();
   P1=0xff;
}

void main(void)//主函数
{  
   i=0;
   x=0;

   TMOD=0x01;//使用定时器T0
   TH0=(65536-46083)/256;//将定时器计时时间设定为46083×1.085微秒=50000微秒=50毫秒
   TL0=(65536-46083)%256;
   EA=1;//开启总中断
   ET0=1;//定时器T0中断允许
   TR0=1;//启动定时器T0开始运行               

   while(1)
   {
         display(x);   //调用检测结果的显示程序
   }  
       
}

/********************************************************
      函数功能:定时器T0的中断服务程序
*******************************************************/

void Time0(void) interrupt 1 using 1
{
   TR0=0;    //关闭定时器T0
   i++;        //每来一次中断,i自加1       
   if(i==40)   //够40次中断,即2秒钟进行一次检测结果采样
   {
       x++;     
       i=0;             //将i清0,重新统计中断次数
   }          
   TH0=(65536-46083)/256;   //重新给计数器T0赋初值
   TL0=(65536-46083)%256;
   TR0=1;  //启动定时器T0       
}




proteul的图像在附件里。我想请教一下,proteul里面是否也要设置参数的,我一直以为它们只是逻辑器件,不需要设置参数。
举报

糊涂仙子

2014-5-10 20:19:25
引用: 依然落叶飘零 发表于 2014-5-7 11:23
代码就不帮你写了,我就说一下细路。具体怎么实现还得靠你自己。
首先设置一个数组Num[4];分别保存四个要显 ...

哈哈,编写完毕,运行通过了,谢谢指教。那个proteul的图,某些参数我没设置对,弄了一个晚上,总之很感谢你啦。
举报

陈锐文

2014-5-10 20:30:22
引用: 糊涂仙子 发表于 2014-5-10 20:19
哈哈,编写完毕,运行通过了,谢谢指教。那个proteul的图,某些参数我没设置对,弄了一个晚上,总之很感 ...

我看电影还没有空回你,你就弄出来了,还是不错的嘛……
举报

我要学单片机

2014-5-27 10:44:15
我想了解一下proteus图里面的具体参数如何设置,我按照上图画的图,但是数码管只能动态显示一个
举报

我要学单片机

2014-5-27 11:25:42
求大神帮忙改改,我想知道参数如何设置,以及这么设置的原因。还有出现如图警告的原因,以及如何改正
举报
  • 动态数码管无法显示
  • 而且运行时显示如图警告

h1654155960.8359

2017-2-27 09:56:06
不错的文档,值得收藏
举报

更多回帖

发帖
×
20
完善资料,
赚取积分