2 qq 19978205 qq_19978205 于 2016.05.06 22:52 提问

关于C语言编译C51单片机程序的一点疑问

1.为什么两段不相干的代码会互相影响
在主程序里有一段点亮发光二极管的代码,和一段计数器计数并在数码管上显示的代码。同时工作时,二极管正常点亮,数码管几秒才点亮一回,而且十位显示是闪烁一下就不显示了
2.数码管显示时,位选和段选顺序不能改变吗?
按照书上的方法是先段选再位选,但是点亮的数码管是本来不应该点亮的,段选和位选顺序换了之后就能正常显示了

2个回答

bealing
bealing   Rxr 2016.05.06 23:33
已采纳

问题1)你所谓的同时工作是指led亮的同时数码管也在显示,是这样的吗?单片机跑的程序都是单线程的,所以函数可能会受到中断的影响
问题2)理论上,位选和段选是不要求顺序的,如果交换顺序会出现不一样的效果,说明你的程序写的有问题,根据你说的现象,我认为你段选和位选没设置好

qq_19978205
qq_19978205 好的,谢谢
大约 2 年之前 回复
bealing
bealing 不管是仿真还是在开发板上运行,结果应该是一样的,如果不一样,可能你仿真中的连线和开发板上的连线有差别
大约 2 年之前 回复
qq_19978205
qq_19978205 我是用proteus仿真时发生的的,用开发版进行的时候没问题,和这个有关系吗?
大约 2 年之前 回复
CSDNXIAOD
CSDNXIAOD   2016.05.06 23:02

51单片机C语言程序(二)定…
51单片机 Keil C 延时程序
51单片机 Keil C 延时程序的简单研究
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
不用keil,命令行编译51单片机的C语言程序
最近学习51单片机编程,C语言的,刚入手,好难啊,记录一点刚开始做出来的东西,以备后用。 我个人习惯,不喜欢安装文件,所以就各种找办法,最后还真让我找到了,参考这个文章http://www.cnblogs.com/gleam/archive/2012/02/14/2350990.html。 原作者说写了批处理命令,不过没有贴,好吧,求人不如求自己,自己写吧,肯定没有人家的好用,不过聊胜于无。代码如下
单片机编程中的const和code
今天xi 在单片机使用C语言进行编程的时候,经常使用到code。code是keil C51(也就是说,在其它的编译器中可能是其它形式,例如IAR中的CODE)里面的关键字,一般用于定义常量数组,意思是告诉编译说把这个数组放在ROM存储。使用ROM(程序存储器)的好处是加快读取速度,不占用系统资源。 unsigned char code table[]; 表示分配一个指向code区的指针,指针本
51单片机PID的算法实现程序C语言
51单片机PID的算法实现程序 /* 用整型变量来实现PID算法,由于是用整型数来做的,所以也不是很精确,但是对于很多的使用场合,这个精度也够了, 关于系数和采样电压全部是放大10倍处理的.所以精度不是很高. 但是也不是那么低,大部分的场合都够了. 实在觉得精度不够,  可以再放大10倍或者100倍处理,但是要注意不超出整个数据类型的范围就可以了.本程序包括PID计算和输出两部分.
51单片机抢答器c语言代码
51单片机 抢答器 c语言代可以进行犯规处理 让那个犯规的人不能抢答
基于51单片机的c语言程序 交通灯
部分源程序如下: //-------------------------------------------------------- //| SN | EW //| 红 | 黄 | 绿 |左绿| 红 | 黄 | 绿 |左绿| //|P1.7|P1.6|P1.5|P1.4|P1.3|P1.2|P1.1|P1.0| //| 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 |;0X28 //| 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 |;0X48 //| 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 |;0X18 //| 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 |;0X48 //| 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |;0X82 //| 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |;0X84 //| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |;0X81 //| 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |;0X84 //| 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |;0X88 //================================================ //-------------------------------------------------------- void delay1ms(void) { unsigned char i,j; for(i=2;i>0;i--) for(j=248;j>0;j--); } //================================================ void delay5ms(void) { unsigned char i,j; for(i=10;i>0;i--) for(j=248;j>0;j--); } /*****************显示子函数**************************/ void Display(void) { P0=table[Time_EW]; EW_LED2=1; delay1ms(); EW_LED2=0; P0=table[Time_EW/10]; EW_LED1=1; delay1ms(); EW_LED1=0; //---------------------------- P0=table[Time_SN]; SN_LED2=1; delay1ms(); SN_LED2=0; P0=table[Time_SN/10]; SN_LED1=1; delay1ms(); SN_LED1=0; }
单片机C语言任何位置跳转到任何指定地址 -转
用C语言写的程序为求模块化,一般函数数量较多,函数调用的嵌套层数也多,要从一个较深的嵌套立刻跳出到主函数,是非常困难的。用break或者return是跳不出来的,一般的解决方法或是使用C51的库函数setjmp()和longjmp()实现长跳转,但是这两个函数在中断函数内部是无能为力的;再或是在C函数中嵌入汇编。虽然用汇编指令可以实现程序的长距离跳转,但是这种方法的调试过程十分烦琐,而且程序的可移
单片机关于定时计数器的C编程
/********************************************************************************************* 函数名:定时/计数器初始化函数 调  用:T_C_init(); 参  数:无 返回值:无 结  果:设置SFR中T/C1和(或)T/C0相关参数 备  注:本函数控制T/C1和T/C0,不需要使用
单片机C语言之指针变量
本来通过一个实例来解释C语言指针。
51单片机之时钟(C语言和汇编两种方式实现)
1.C语言实现  #include typedef  unsigned char   uint8; typedef  unsigned int    uint16; typedef  unsigned long   uint32;  //共阳数码管0-9 uint8 number[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80
Keil C51对C语言的关键词扩展之八: far
far的出现,是Keil 编译器为了支持新出现的8051家族增强型MCU,这些增强型MCU可能拥有大于64KB的存储器。使用far可访问扩展的RAM,使用const far可访问扩展的ROM。 NXP 51MX架构51单片机提供通过通用指针访问多大8MB的code和xdata存储空间。Dallas 390架构的51单片机通过24位的DPTR寄存器结合传统MOVX 、MOVC指令来访问扩展的RAM