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版本及设置:
我在这先谢谢了!
问题解决了就好
一周热门 更多>