单片机C51 C语言编程问题!!!!
是这样一个程序,用定时器1的方式1实现数码管前两位循环计时。
小弟将数码管的位线和P0相连 段线和P2相连 程序如下
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar num,count,num2,shi,ge;
uchar code table[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //段选数据表
uchar code wei[2] = {0xfe,0xfd}; //位选数据表
void display(uchar,uchar);
void delay(uint);
void main()
{
TMOD=0x10; //设定定时器1工作在方式1
TH1=(65536-50000)/256; //装载初值
TL1=(65536-50000)%256; //开总中断
EA=1; //开定时器1中断
ET1=1; //启动定时器1
TR1=1; //程序在此不停对于数码管动态扫描 等待中断
while(1)
{
display(shi,ge); //显示函数
}
}
void display(uchar shi,uchar ge)
{
uint ledout[1],i;
ledout[0]= table[shi]; //段选数据 十位
ledout[1]= table[ge]; // 段选数据 各个
for (i=0;i<2;i++)
{ //用P0输出位选数据
P0=wei;
这里用查表的方式来赋值
P2=ledout; //用P2输出段选数据
delay(1); //扫描间隔
}
}
//1S中断函数
void T1_time() interrupt 3
{
TH0=(65536-50000)/256; //重新装载初值
TL0=(65536-50000)%256;
count++;
if(count==20) //如果到了20次,说明1秒到
{ //把COUNT清零 重新计数20次
count=0;
num2++; // 用NUM2向来数码管显示 到60后归零
if(num2==60)
num2=0;
shi=(num2)/10; //把NUM2分成2个数 十位和个位
ge=(num2)%10;
}
}
void delay(uint xms)
{
uint i,j;
for(i=xms; i > 0; i--) //延时程序
for(j = 110 ;j > 0; j--);
}
开发板上的结果是,十那个数码管正常工作 但是个位那个数码管就一直亮着a段 最上面一段
弄了一个下午还是找不到问题所在 希望师兄们可以开导下小弟哈 不盛感谢!
补充下 HC573 LE一直接VCC
上面有个地方打错了
应该是
P0=wei[i];
P2=ledout[i];
还有1楼的方法试过了 没有用
数据定义成ledout[1]里面就包括了0和1 不是就1.
电路不好贴 我是用开发板的 连接不会有问题 P0~位线 P2~段线 展开
void display(uchar shi,uchar ge)
{
uint ledout[1],i; //这里应该是ledout[2]
我在proteus上进行了仿真,但是不知道什么原因,只对共阳极LED数码管好使。我就把程序稍微做了改动,仿真结果可以正确计时。
我把程序贴在下面供参考
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar num=0,count=0,num2=0,shi=0,ge=0;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//共阳//段选数据表
//uchar code table[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
uchar code wei[2] = {0xfe,0xfd}; //位选数据表
void display(uchar,uchar);
void delay(uint);
void main()
{
TMOD=0x10; //设定定时器1工作在方式1
TH1=(65536-50000)/256; //装载初值
TL1=(65536-50000)%256; //开总中断
//开定时器1中断
ET1=1; //启动定时器1
TR1=1; //程序在此不停对于数码管动态扫描 等待中断
EA=1;
while(1)
{
display(shi,ge); //显示函数
}
}
void display(uchar shi,uchar ge)
{
uint ledout[2],i;
ledout[0]= table[shi]; //段选数据 十位
ledout[1]= table[ge]; // 段选数据 各个
for (i=0;i<2;i++)
{ //用P0输出位选数据
P0=wei[i];
//这里用查表的方式来赋值
P2=ledout[i]; //用P2输出段选数据
delay(1); //扫描间隔
}
}
//1S中断函数
void T1_time() interrupt 3
{
TH0=(65536-50000)/256; //重新装载初值
TL0=(65536-50000)%256;
count++;
if(count==20) //如果到了20次,说明1秒到
{ //把COUNT清零 重新计数20次
count=0;
num2++; // 用NUM2向来数码管显示 到60后归零
if(num2==60)
num2=0;
shi=num2/10; //把NUM2分成2个数 十位和个位
ge=num2%10;
}
}
void delay(uint xms)
{
uint i,j;
for(i=xms; i > 0; i--) //延时程序
for(j = 110 ;j > 0; j--);
}
在这个地方数组定义,这里只定义了一个数,在接下的地方你出现了
ledout[0]= table[shi]; //段选数据 十位
ledout[1]= table[ge]; // 段选数据 各个
这是其一,还有就是你的uchar code table[] 是无符号字符型,而uint ledout[1],i;是无符号整形。把uint ledout[1],改成uchar ledout[2],i;试试!
希望那个可以给你建议,言辞可能有点直接,希望你能接受!