求大侠帮忙看一个单片机程序,主要问题是在数码管上显示的只能是百位,把百位屏蔽了显示十位,串口不发字

作者&投稿:甫史 (若有异议请与网页底部的电邮联系)
用89c51单片机写一个数码管显示HELLO的程序,是在一个七段数码管上依次出现几个字母~

在数码管依次排列好这一句话,首先取模,然后写显示函数,写完函数放置while(1)中无限循环下去
代码如下:
#include; //用的是单独操作,没有用总线
sbit led1 = P1^0;
sbit led2 = P1^1;
sbit led3 = P1^2;
sbit led4 = P1^3;
sbit led5 = P1^4;
sbit led6 = P1^5;
sbit led7 = P1^6; //看清楚自己的管脚,不一定对应,这里采用P0对应段选
code unsigned char led_paly[5] = {0x76,0x79,0x38,0x38,0x5c};// H E L L Ovoid delay(unsigned int um)//延时函数
{
int i,j;
for(i = 0;i < um;i++){for(j = 0;j < 200;j++);}}void display(){P0 = led_paly[0];//显示Hled2 = 0;delay(50);led2 = 1;P0 = led_paly[1];//显示Eled3 = 0;delay(50);led3 = 1;P0 = led_paly[2];//显示Lled4 = 0;delay(50);led4 = 1;P0 = led_paly[3];//显示Eled5 = 0;delay(50);led5 = 1;P0 = led_paly[4];//显示Oled6 = 0;delay(50);led6 = 1; }void main(void){while(1){display();}}

扩展资料:
51单片机的接口作用
P0口:可以被定义为数据/地址的低八位,能够用于外部程序/数据存储器。在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:标准输入输出I/O,P1口管脚写入1后,被内部上拉为高,可用作输入。在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:既可用于标准输入输出I/O,也可用于外部程序存储器或数据存储器访问时的高八位地址。
P3口:既可以做标准输入输出I/O,也可作为AT89C51的一些特殊功能口。

#include
#include
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long


#define Nop() {_nop_(); _nop_(); _nop_(); _nop_(); _nop_();}



volatile ulong IRcode=0x00000000; //32位的键代码
volatile ulong Irdcode=0x00000000;
volatile uint customcode=0x0000; //16位用户码
volatile uint time_us=0x0000; //两个下降沿之间的时间

volatile uchar timeH,timeL; //保存TH1 TL的值

uchar Lcustomcode; //低8用户码
uchar Hcustomcode; //高8
uchar datacode; //8位键数据码
uchar mycode;
uchar Rdatacode; //8位键数据反码
uchar uc1ms;
uchar uc10ms;
uchar uc3ms;


uchar ucDispTime;
uchar ucDispOrder;
uchar ucDispCon;
uchar ucSpeakerTime;
unsigned char code LedData[16] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
unsigned char code LedCon[2] = {0x8f,0x4f};
unsigned char ucDispData[2]; // 存放显示数据
sbit led1 = P3^7;
sbit led2 = P3^6;
sbit power=P1^0; //电源开关
sbit BEEP= P2^1;
bit NewIRcode=0; //指示当处理完了32位码后,就有了新的遥控码
bit DataRight=0; //为1时读取数据正确
bit bSampleOk;
bit bSampling;
bit b10msInt;
bit b1msInt;
bit bKeySound;
bit b1msMain;
bit IR_E; //表示有新的遥控键控下就更新扫描数据
bit b3msint;

void SendDataToDispDevice();
void Ir_process();
void display();
void beeping();

/****** 晶振为12 MHZ*******/
/**定时器1,12 MHZ最大定时为65.53ms***/
//------------------------------------------------------------------------------
void init()
{
IP=0x09; //定时器1,外部中断0优先级高
TMOD=0x11; //定时器0,工作方式1 ; 定时器1,工作方式1
TCON=0x01; //外中断0下降沿触发,(包括TR1=0,TR0=0)
TH0=0xff; //初始化定时器0,定时0.2ms
TL0=0x47;
TH1=0x00; //初始化定时器1
TL1=0x00;

EA=1; //开全中断
ET0=1; //开放T0中断
ET1=1; //开放T1中断
EX0=1; //开放INT0
TR1=0;
TR0=1;

}
//--------------------------------------
void TimeProg(void)
{
b1msMain = b1msInt;
b1msMain=0;
b10msInt = 0;


if(b1msInt == 1)
{
b1msMain=1;
if(++uc10ms == 10)
{
uc10ms = 0;
b10msInt = 1;
if(bKeySound==1)
{ beeping();
bKeySound=0;
}
}

}
}//void TimeProg(void)
//-------------------------------------interrupt0-------------------------------------
void IR_ISR() interrupt 0 using 1 //遥控器中断处理函数
{
static uchar cn;

TR1=0;
timeH=TH1;
timeL=TL1;
TH1=0;
TL1=0;
TR1=1; //开定时器中断1

time_us=(unsigned int)timeH;
time_us=time_us<<8;
time_us=time_us|timeL;

if(time_us>12200&&time_us<13000) {cn=1;IRcode=0;} //遇到引导码,就把cn清0,IRcode清0
//引导码的时间长度为9ms+4.5ms
if(cn<34)
{
if(time_us>950&&time_us<1120) //0
{
IRcode=IRcode|0x00000000;
if(cn>1;
}

else if(time_us>1920&&time_us 1950 && t < 2150
{
IRcode=IRcode|0x80000000;
if(cn>1;
}


//else if(time_us>10000&&time_us<11000) {Irdcode=IRcode;cn=34; } //遇到重复码
//cn用于记录接收到的数据位
}
cn++;
if(cn==34)
{ NewIRcode=1;
TR1=0;

Irdcode= IRcode; cn=0;
} //读完32位码,则有新码产生

}

//--------------------------------------timer_ISR------------------------------
void Timer0_ISR() interrupt 1 using 2 //定时器0中断函数
{
TR0=0;
TH0=0xff; //初始化定时器0,定时0.2ms 晶振为11.0592 MHZ
TL0=0x47;
TR0=1;
if(++uc1ms == 5)
{
uc1ms = 0;
b1msInt=1;
if(++uc3ms==8)
{
uc3ms=0;
b3msint=1;
SendDataToDispDevice(); //n* ms送一次显示
}


}
}//void Timer0IntProg() interrupt 1 using 1

void Timer1_ISR() interrupt 3 using 3 //定时器1中断函数
{
TR1=0;
TH1=0x00; //初始化定时器1
TL1=0x00;
TR1=1;

}
//--------------------SendDataToDispDevice----------
void SendDataToDispDevice()
{
unsigned char n;
//watchdog();
if(++ucDispOrder >= 2) ucDispOrder = 0; // 下一显示巡回

// 下面为发送控制数据 位控

if(ucDispOrder==0)
{led1=0;
led2=1;
Nop();
Nop();

}
if(b3msint==1)
{if(ucDispOrder==1)
{led2=0;
led1=1;
Nop();
Nop();
}
}
// 下面为发送显示数据
n = LedData[ucDispData[ucDispOrder]];
P0=n;



} //void SendDataToDispDevice()

//------------------------------------main()----------------------------------------------
void main()
{

init();
beeping();
while(1)
{
TimeProg();
Ir_process();
display();

}

}

void Ir_process()

{

if(NewIRcode==1) //如果有新的遥控码就读
{
NewIRcode=0; //读完之后清零,表示新码已读
customcode=(Irdcode>>16); //取红外码中的按码键
//取低8位用户码
Lcustomcode=customcode>>8;//取低8位按码键
datacode=(unsigned char)(customcode&0x00ff); //取高8位按码键


Rdatacode=Lcustomcode; //取低8位按码键的反码

if(~Rdatacode!=datacode)
{ DataRight=0;
Irdcode=0;
datacode=Rdatacode=0;
} //校验用户码,反码

else
{ DataRight=1;
IR_E=1;
mycode=datacode;}
if(DataRight==1) { bKeySound = 1;DataRight=0; }

}



}

void display()
{
/* unsigned char a[2];
a[0] = mycode & 0x0f;
mycode = mycode >> 4;
a[1] = mycode & 0x0f;
ET0 = 0;
ucDispData[0] = a[0];
ucDispData[1] = a[1];
ET0 = 1;*/
if(IR_E==1)
{
ET0 = 0;
ucDispData[0] = mycode & 0x0f;
mycode = mycode >> 4;
ucDispData[1] = mycode & 0x0f;
IR_E=0;
ET0 = 1;
}
}

/**********************************************************/
void delay(unsigned char x) //x*0.14MS
{
unsigned char a;
while(x--)
{
for (a = 0; a<13; a++) {;}
}
}


/**********************************************************/
void beeping()
{
unsigned char i;

for (i=0;i<100;i++)
{
delay(4);
BEEP=!BEEP; //BEEP取反
}
BEEP=1;
//关闭蜂鸣器
}

最近发现自己真的是闲得蛋疼,连楼主这样什么注释也没有,光一大段程序然后提出问题,我居然还能一段一段的给全看一遍,并且下载到自己的开发板上一段程序一段程序的调试。楼主你要是不把分给我,那真是没天理了。(写完后才发现这问题分值是0分,真悲剧……)
首先说明楼主的两个问题都是很小的问题,应该算是楼主粗心打错字的……
1.显示问题:错误出现在你的延时程序中。仔细看看这句“for(x=z;z>0;x--)”不是“z>0”而是“x>0”z一直都大于0的,当然就一直显示第一位喽。当时我根本就没注意延时这个地方,还一直以为是你的显示部分出错,害我看了好久……
2.串口不发字的问题:也是很小的问题,楼主说的串口不发字不是不发字而是发的全是0。为什么会出现这个问题了?楼主你自己看看“ad_vo”你定义的是什么类型!!!唉,好吧,把“ad_vo”定义成“float”吧……

楼主,我不得不再次抱怨你这两个小错误不但把你害惨了,更是把我也害惨了,浪费了我不少的时间啊。悲剧……

楼主可不可以加点注释呢?


电影大侠帮忙推荐几部电影!!我的品味比较低啊!!喜欢看象《变脸...
我是传奇 霸王别姬 杀死比尔 花花型警 我的最爱 虚拟偶像 摇滚学院 变形金刚 粉红豹 这些都比较有情节

...部奥黛利赫本的电影,好象是叫做《龙凤配》,但不确定,请大侠帮忙!
龙凤配 (Sabrina)导 演: 悉尼·波拉克 主 演: 奥黛丽·赫本 汉弗莱·博加特 上 映: 1954年9月9日 地 区: 美国 语 言: 国语 时 长: 113 分钟 颜 色: 黑白 声 音: 单声道 类 型: 爱情片 喜剧片 剧情介绍 萨布丽娜是长岛富有的拉腊比庄园司机的女儿,从小在这里长大。虽已成年,...

帮忙找部电影
影片名称:《晚娘2》类别:故事片 片源格式:rmvb 码流速率:400 播放时长:110 剧情简介 父亲,儿子,和后母之间的纠缠,作为摄影者在世界各地旅行的太普回到了故乡,辽阔的海边,村庄,曾经做过警察的父亲是首长,且父亲和一位即年轻又漂亮的姑娘结婚,生活在一起,里安和太普第一眼相见就彼此产生好感...

小时候看过一个电影或者电视剧,古装武侠,各位大侠帮找找,非常感谢...
1993年香港电视剧《魔刀侠情》剧情简介 故事发生於一百年前,一座一夕之间被冰封的火焰山,人称"天冰山″山内隐藏着绝世武功,而一位中年汉子目睹真相,其为曲忍(张兆辉)的祖父,故此,而被活活烧死,因故忍自小就被歧视,而誓找出封住冰山的钥匙和洞内位置图"夜叉射月图″於是混入少林寺,此为经营...

求一部好看的动画片!各位大侠帮帮我吧!我都快疯了!我都看了许多回答了...
爱丽丝学院,守护甜心,蔷薇少女,灼眼的夏娜,地狱少女,公主恋人,小女神花铃,,神风怪盗贞德,天使怪盗 ,死亡笔记,死神,

各位大侠给我推荐一部巨恐怖的鬼片
以下都是鬼片,都是本人看过,觉得还不错的··估计大多数你看过了··筛选着看吧·《半身怨灵》《鬼营》《灵魂的盒子》《鬼怪森林》《灵虐》《死亡隧道》《灵魂密码》《预言》《鬼使神差》《废家》《机械女》《折磨》《富江》《灵异异动》《隙》《金发怪谈》《6:66》《死前凶兆》《鬼月杀机》...

以前看过个电影,不记得名字了,哪位大侠能告诉我是哪部片子吗
《赤脚小子》主演:郭富城,吴倩莲,狄龙,张曼玉等 剧情简介:幼家贫的关丰曜(郭富城),父亲逝世后便往省城投靠父之好友段南(狄龙),一同在“四季织”当工人。“四季织”老板是年青寡妇白筱君(张曼玉),对段暗生情愫。旗人喀和布(曾江)藉着举办擂台比武而开设赌局,更罗致大批江湖中人为自己...

各位电影大侠,我想求一部关于美国恶魔岛监狱的电影,片中是讲述三个人...
史泰龙和库尔特拉塞尔主演了一部《浴血擒魔》,不知道是不是你要的。《破茧威龙》也是史泰龙主演的,也是越狱的片子。

我好喜欢林大叔演的僵尸片,谁能给我一个林大叔的僵尸片的列单。
金衣大侠(1970)富贵列车(1986)玩命双雄(1990)笑傲江湖(1990)群龙戏凤(1989)天地玄门(穿梭时空五百年)-1991 非洲和尚(1991)洪福齐天(1991)妖怪都市(1992)双龙出海(1984)锺馗嫁妹(鬼王锺馗)-1994 僵尸至尊(灵幻家族)-1987 誓不忘情(1991)神勇双雄炮(1984)新僵尸先生(新暂时停止呼吸)-1992 黐线枕边...

求一部电影
片名叫 记忆裂痕他不是被政府洗脑的,是被一家大公司.我帮你找这部电影的资料来---【中文片名】《致命报酬》 【又名】《记忆裂痕》、《空头支票》 【英文片名】《paycheck》 【导演】吴宇森John Woo 【原著】菲利普·迪克Philip K. Dick 【编剧】迪恩·乔格瑞斯Dean Georgaris 【主演】 本·阿弗莱克Ben Affleck...

尼勒克县18076945590: 求一单片机程序????? -
甘匡培古: 程序如下: ANL 30H, #11110000B ;低四位“与”上0 MOV A, 30H ;取出30H内容. ANL A, #00000001B ;只是保留D0位. JNZ ZZZ ;非0退出. MOV 31H, #1 ;为0则在31H单元置1 ZZZ: SJMP $ ;完

尼勒克县18076945590: 帮忙看看单片机的一个c程序,能详细注释一下吗?怎么看不懂啊,请指教 -
甘匡培古: 非常简单的IIC通讯的一个程序,你参考IIC的通讯协议和时序看,非常简单的 我给你简单的注释了下,不明白再给我发邮件todhong@163.com main(void) {uchar i;SDA = 1; //IIC的数据位 SCL = 1; //IIC的时钟位 fill_byte(72,0xff); // 将前72字节填...

尼勒克县18076945590: 哪位大侠帮我看下这个程序!我这个程序要求52单片机的P1^0口输出大小不同的脉冲! -
甘匡培古: count=table[i]; th=(65536-count)/256; tl=(65536-count)%256; TH0=th; TL0=tl; TR0=1; while(P3!=0xf0); delay...

尼勒克县18076945590: 求51单片机大神帮忙看看一小段代码 -
甘匡培古: XBYTE[0xE000] = 0xff; 是指向地址为0xE000的外部端口输出数据 0xff 同样 XBYTE[0xC000] = (1<<dspcom);是指向地址为0xC000的外部端口输出数据 数据是1左移dspcom位,若dspcom=0 则数据为1 即0000 0001 若dspcom=2 则数据为2 即0000 0010 若dspcom=3 则数据为4 即0000 0100 以此类推,一次只选中一个数码管 unsigned char dspbuf[8] = {10,10,10,10,10,0,0,0}; //显示缓冲区 数组用来存储待显示的数据

尼勒克县18076945590: 跪求高手指点如何看懂单片机C语言程序,我是初学者,C语言是没问题,对单片机知之甚少. -
甘匡培古: 看别人的程序确实是一件痛苦的事情.如果是高手编的程序还好,否则,可以让人生不如死!(特别是变量命名、模块化规范程度等等).不过,单片机程序分几个模块:初始化:各个寄存器的初始化、中断、定时器、端口初始化;中断程序:高级别优先处理程序;定时程序:多数通过中断完成;串口程序:RS232/485通讯;并口程序:IO量的处理;模拟量程序:A/D D/A PWM:多用于电机控制

尼勒克县18076945590: 一段单片机汇编程序看不懂,哪位能帮忙分析下,谢谢! -
甘匡培古: 1,单片机复位时堆栈指针在内存(RAM)07H地址处,08H-1FH是寄存器区,而寄存器区是单片机使用较频繁的区域,为了避开这个区域,有时需要调整堆栈指针的位置,使之指向大于1FH的位置,8051单片机的内存只有128(80H)个字节,堆...

尼勒克县18076945590: 各位大侠帮忙看看这段单片机c语言程序
甘匡培古: 单从这一句看只是起到一个停止程序运行的功能.至于为什么要这么做就需要系统程序整体一起来判断.个人分析可能的原因有两个: 1.可能是系统要求在掉电之后不允许主程序运行而引起误动作. 2.可能在程序的别处(特别是更高级别的中断中)对LossPower进行了有条件的置位,使系统能够有条件的继续(恢复)执行.

尼勒克县18076945590: 求高手帮忙看一下一些单片机代码
甘匡培古: 具体不清楚 你的程序有几个问题 1,数组LED[]的第一个元素是LED[0],应该从LED[0]到LED[7]; 2,for循环里对n的值没有限定条件 #include <reg52.h>#define uint unsigned intsbit D1=P1^0;sbit D2=P1^1;sbit D3=P1^2;sbit D4=P1^3;sbit D5=P1^...

尼勒克县18076945590: 求一个单片机程序 -
甘匡培古: 12Mhz应该是晶振,系统时钟是1Mhz,则是1ms,那么就用计数器0或什么都行,是加计数,模式1,初值设为65530,用中断T0,查一下中断表得到中断号,中断服务程序就是P1.7=~P1.7取反就是方波.

尼勒克县18076945590: 大家帮忙看一下单片机C语言的这条程序,我是初学者不懂 -
甘匡培古: 两段都有问题.第一段P1口处理放在了中断函数中,却没有打开中断使能,所以进不了中断函数.第二段只有中断函数,没有主程序,单片机根本跑不起来.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网