❶ 51单片机程序修改
现在,你显示的是num1,其范围是0~60。
可以把它的上限,改为30,这就符合你的要求了。
另外再增加一个变量num2,其范围是0~60。
用它来控制红绿黄的交替变化,即可。
voiddisplay(ucharge,ucharshi)
{
if(num2<=25){P1=0xfe;}
elseif(num2<=30){P1=0xff;delay(2);P1=0xfd;}
elseif(num2<=60){P1=0xfb;}
……
}
……
voidtime0()interrupt1
{
TH1=(65536-5000)/256;//--应该是TH0=...
TL1=(65536-5000)%256;//--应该是TL0=...
num++;
if(num==10){
num=0;
num1++;
if(num1==30)num1=0;//用于显示秒数
shi=num1/10;
ge=num1%10;
num2++;
if(num2==60)num2=0;//用于控制变换
}
}
❷ 单片机定时器中断改变全局变量
int h1,m1,s1; //时分秒全局变量
int tt; //定时器0进入中断的次数
void main()
{
init(); //初始化
while(1)
{
display(h1,m1,s1);
}
}
void dingshi0() interrupt 1 //定时器0中断
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
if(tt==20)
{
tt=0;
s1++; //秒数+1
if(s1==60){ s1=0; m1++;}//计满60秒分位进1,秒位清0
if(m1==60){ m1=0; h1++; }//计满60分时位进1
if(h1==24){ h1=0; }//计满24小时时位清0
}
}
在中断内,你可以直接写成这样
只用全局变量更方便
再有,你苦恼的问题是因为函数每次调用的时候
都是以0为数据传递的,错误在串口初始化部分以及你调用函数的时候
你的变量S,没有全局变量声明,切也没有局部变量声明
所以每次调用函数的时候,S都是以0开始,最多加到1,之后又从0开始递增
❸ 单片机中有一个整型变量,如何给它赋值。
嘿嘿 俺来帮你解答
1 先在片内RAM中定义一个字变量(装整型数据 16位数) 再传送数据(先传送低8位 再传送高8位)
2 参考程序:
IN16 DATA 40H ;在片内RAM中定义一个整型变量 40H单元为低旅宴8位 41H单元为高做数8位
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: MOV IN16,#12H ;将数据1234H传送拆胡银给整型变量
MOV IN16+1,#34H
呵呵 满意就给 满意回答吧
❹ 51单片机如何设置数组变量
因为,51单片机的位地址,只能直接寻址,不能间接寻址。
所以,51单片机的位地址,就不能用数组来进行操作。
不过,可以利用逻辑运算,进行位操作。
先定义一个数组:a[8] = [128, 64,...8, 4, 2, 1];
然后:P1 |= a[3]; ,这就是令 P1.3 置一。
其实,采用数组的方法,并非是最简单的。
直接:P1 |= (1 << 3); ,就可以了。
❺ 在单片机C语言中如何对变量的某一位进行操作或赋值。
在C语言中,一般有两种方法来操作位,一种是使用C语言提供的位运算操作符,一种是使用位域。
1、使用位域
在C语言中定义位域的一般格式如下:
struct位域结构名
{位域列表};
struct:在C语言中定义位域所使用的关键字是struct。
位域结构名:是一个C语言中的标识符,有字母、数字、下划线组成,而且第一个字符必须是字母或者下划线。
位域列表:组其中位域列表的形式为: 类型说明符 位域名:位域长度
下面的示例代码,通过位域来计算IEEE754浮点数编码中单精度数的最大值 、最小值和最小弱规范数。
#include<stdio.h>
typedefstructFP_SINGLE
{
unsigned__int32fraction:23;
unsigned__int32exp:8;
unsigned__int32sign:1;
}fp_single;
intmain()
{
floatx;
fp_single*fp_s=(fp_single*)&x;
fp_s->sign=0;
fp_s->exp=0xfe;
fp_s->fraction=0x7fffff;
printf("float最大数:%le ",(double)x);
fp_s->sign=0;
fp_s->exp=0x1;
fp_s->fraction=0x0;
printf("float最小数:%le ",(double)x);
fp_s->sign=0;
fp_s->exp=0;
fp_s->fraction=0x1;
printf("float最小弱规范数:%le ",(double)x);
return0;
}
2、使用位运算符
C语言中的位运算符有一个基本的常识,即只能操作整数,不能操作浮点数,因为浮点数是使用IEEE754编码的,使用位操作数没有任何意义。
C语言提供的位运算符列表:
&按位与如果两个相应的二进制位都为1,则该位的结果值为1,否则为0
|按位或两个相应的二进制位中只要有一个为1,该位的结果值为1
^按位异或若参加运算的两个二进制位值相同则为0,否则为1
~取反~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0
<<左移用来将一个数的各二进制位全部左移N位,右补0
>>右移将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0
❻ 怎么从单片机外部改变单片机中程序的变量
直接修改程序中的变量,危谨兆险性很清樱大呢,要是改错了字节让指令变成非法的,那程序就乱祥正租套了。最好是把那些变量分离出来单独放在一个地方,比如24C02存储器,这样修改方便。