51单片机C语言问题

#include<reg52.h> //51头文件
#define uchar unsigned char //重定义变量
#define uint unsigned int
sbit u1=P2^6; //申明U1锁存器锁存端
sbit u2=P2^7; //申明U2
uchar code cbw[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void cc(uchar);
uchar num0,num;
void timeplay(uchar num) //数码管显示函数
{
uint shi,ge;
shi=num/10; //分离出要显示数字
ge=num%10;

u1=1;
P0=cbw[shi]; //送十位段选数据
u1=0;
P0=0xff; //防混乱
u2=1;
P0=0xfe;
u2=0;
cc(5); //延时

u1=1;
P0=cbw[ge]; //送个位段选数据
u1=0;
P0=0xff; //防混乱
u2=1;
P0=0xfd;
u2=0;
cc(5); //延时
}

void mian() //主函数
{
TMOD=0x01; //设置定时器0为工作方式1
TH0=(65536-45872)/256; //装入初值50ms一次中断
TL0=(65536-45872)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0

while(1) //数码管循环扫描
{
timeplay(num);
}
}

void cc(uchar a) //延时函数
{
uint i,j;
for(i=a;i>0;i--) //延时a毫秒
for(j=110;j>0;j--);
}

void T0_time() interrupt 1
{
TH0=(65536-45872)/256; //重装初值
TL0=(65536-45872)%256;
num0++;
if(num0==20) //如遇到20次中断,1秒到了,重新再记20次
{
num0=0;
num++;
if(num==60) //60秒到了,记秒变量归零
num=0;
}
}

编译程序的时候有
WARNING L16:UNCALLED SEGMENT , IGNORED FOR OVERLAY PROCESS
SEGMENT: ?RR?MIAN? P2_5
而且在实验板上运行也有严重问题,数码管全部都在亮,而且还有“哔哔哔”的声音。
PS:运行说明,这个程序是让TX-1C学习板上的数码管一二位显示60秒倒计时的。

这个程序有2个重要错误
//第一个
虽然不知道你的锁存芯片是什么。
注意看这里 你的程序:
u1=1; //U1 锁存芯片 使能 打开
P0=cbw[shi]; //送 十位段选数据
u1=0; //U1 锁存芯片 使能 关闭 U1 锁存十位段选数据
P0=0xff; //防混乱 (这句不能理解)
u2=1; //U2 锁存芯片 使能 打开
P0=0xfe; //U2 锁存 位选数据 1111 1110
u2=0; ////U2 锁存芯片 使能 关闭 U2 锁存位选数据
cc(5); //延时

u1=1; //U1 锁存芯片 使能 打开
P0=cbw[ge]; //送 个位段选数据
u1=0; //U1 锁存芯片 使能 关闭 U1 锁存个位段选数据
P0=0xff; //防混乱 (这句不能理解)
u2=1; //U2 锁存芯片 使能 打开
P0=0xfd; //U2 锁存 位选数据 1111 1010
u2=0; ////U2 锁存芯片 使能 关闭 U2 锁存位选数据
cc(5); //延时

如果我的理解没错的话 看下面程序:

u1=1; //U1 锁存芯片 使能 打开
P0=cbw[shi]; //送 十位段选数据
u1=0; //U1 锁存芯片 使能 关闭 U1 锁存十位段选数据
u2=1; //U2 锁存芯片 使能 打开
P0=0xfe; //U2 锁存 位选数据 1111 1110
u2=0; ////U2 锁存芯片 使能 关闭 U2 锁存位选数据
cc(5); //延时 //滞留下显示数据 增加亮度
//以上 正常 显示了 十位
//接下来我们清 U2 选中数据为 下一个段 做准备
//为啥要清除 U2的数据呢 若 在下一个段 送完显示数据之前 上一个段的位选任然有效 是不是 下一个段的数据 显示在了上一个段 所以我们进行清除
u2 = 1;
P0 = 0xFF;//位选都不选中
u2 = 0;

//接下来是下一位的显示
u1=1; //U1 锁存芯片 使能 打开
P0=cbw[ge]; //送 个位段选数据
u1=0; //U1 锁存芯片 使能 关闭 U1 锁存个位段选数据

u2=1; //U2 锁存芯片 使能 打开
P0=0xfd; //U2 锁存 位选数据 1111 1010
u2=0; ////U2 锁存芯片 使能 关闭 U2 锁存位选数据
cc(5); //延时

u2 = 1;
P0 = 0xFF;//位选都不选中
u2 = 0;

//以上是数码管显示驱动的问题, 程序结构不合理,要多多参看写系统性的大程序,提高程序结构水平 这个由你以后自己学习 这里不做多解释 这是你第一个问题

//第二个是 main 写成了 mian 所以编译器报错 这个问题你自己要多多注意追问

程序结构上是没有任何问题的,郭老师这么教的....
主要问题已经发现了,是main写错了,其他运行良好。
P0=0xff //防混乱
这个事郭老师书上写的防止位选出现混乱,他的程序里面都是这样写的哦

追答

呵呵

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-03-24
我试了,程序没有问题。
另外,这是从1加到60的程序吧。
你用的是郭天祥的板子,还是自己焊的板子?追问

郭天祥的...发现是main出问题了哈,谢谢您的热心哦

第2个回答  2012-03-24
void mian() //主函数
楼主同志,请问这是你的主函数吗?应该是main,你都写错了,程序还能运行吗?追问

还是wolf同志比较犀利哈,一语中的~

本回答被提问者采纳
相似回答