初学C51,就遇到问题,请各位先生指点。

2019-07-16 06:37发布

CPU是89C2051,用来驱动led数码管显示,电路搭接无误。11.0592MHZ晶振已经工作。keil C51编译正常,并生成HEX文件,用威龙编程器烧完(通过读芯片程序发现烧写正常),接电源后没任何反应,示波器只是测到震荡电路工作。
以下是是用c51编的小程序:

#include <reg51.h>
#include <intrins.h>
#include<math.h>
unsigned char data dis_digit;  // dis_digit --- 位选通值, 传送到P3口用于选通当前数码管的数值, 如等于0xfe时,
//    选通P3.0口数码管
unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3
                       0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off
unsigned char data dis_buf[8];    // dis_buf   --- 显于缓冲区基地址
unsigned char data dis_index; // dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
void delay(int t)
{
   int i;
   while(t--) {
   for(i=0;i<120;i++)
   
   {;}
   }
}
void main()
{
P1 = 0xff;
P3 = 0xff;
TMOD = 0x01;   //定时器0工作于方式1
TH0 = 0x8C;
TL0 = 0x8B;
IE = 0x8A;   //开总中断和定时器1中断允许
dis_buf[0] = dis_code[0x1];
dis_buf[1] = dis_code[0x2];
dis_buf[2] = dis_code[0x3];
dis_buf[3] = dis_code[0x4];
dis_buf[4] = dis_code[0x5];
dis_buf[5] = dis_code[0x6];
dis_buf[6] = dis_code[0x7];
dis_buf[7] = dis_code[0x8];

dis_digit = 0xf9;         //*控制在数码管上显示的数字效果* 按位
dis_index = 0;

TR0 = 1;
while(1);
}
void timer0() interrupt 1
// 定时器0中断服务程序, 用于数码管的动态扫描
// dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
// dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
//    选通P2.0口数码管
// dis_buf   --- 显于缓冲区基地址
{
TH0 = 0x8C;
TL0 = 0x8B;

P3 = 0xff;       // 先关闭所有数码管
P1 = dis_buf[dis_index];   // 显示代码传送到P1口
P3 = dis_digit;      //
dis_digit = _crol_(dis_digit,2); // 位选通值左移, 下次中断时选通下一位数码管
  delay(500);
dis_index++;      //
   
dis_index &= 0x07;   // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描
}


以下图片是KEIL版本及设置:
3.jpg 1.jpg 4.jpg 2.jpg
我在这先谢谢了!

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
wangka
1楼-- · 2019-07-16 12:06
你这一切正常 咋回事呢 等高人解答
diangongshi
2楼-- · 2019-07-16 16:30
EA引脚有没有接高电平
liuqiwang
3楼-- · 2019-07-16 16:50
 精彩回答 2  元偷偷看……
diangongshi
4楼-- · 2019-07-16 22:38
liuqiwang 发表于 2011-11-29 20:56
多谢几位学长的回复。我终于找到问题的原因了,原因是:编译的HEX文件,烧录时应选INTEL格式,其它格式(包 ...

问题解决了就好

一周热门 更多>