A. 单片机用c语言编写计算器如何实现大于65535的数字加减乘除
用长整型变量(四字节),或者手动实现进位。
编译系统一般已经在内部实现了双字节或四字节的数值类型转换。
有问题HI上找我。
B. 单片机c的加法为什么会比减法运算速度慢
加法减法是一样的,造成两个循环时间不同的原因,不是出在增减上,而是判断上。
两个for 的结束循环判断,第一个是跟50000比较,第二个是跟0比较,在汇编中,跟0比较是省时间的。
你要是看的懂汇编代码的话,你可以在编译出来LST文件中看看它们的不同。
C. 单片机C语言加减法指令怎么算时间
用C没法具体算,如果是51的话,stc下载器又在带算延时函数生成;也可以用示波器慢慢自己测,也可以网络一下看看有谁上传过此类芯片的延时函数
D. 51单片机C语言编程两个按键加减显示0-99的加减,求程序,自己编的有警告,不知道哪里错了
你硬件我都不知到怎么给你写,是用数码管显示还是液晶显示。
你还是把程序贴上来我给你找找错误吧
E. 51单片机C语言程序4个独立按键实现对数码管数字显示的加减清零等
#include<reg52.h>
//P0是数码管。P1是LED.P2是按键
sbitKEY_OUT_1=P2^3;
sbitKEY_OUT_2=P2^2;
sbitKEY_OUT_3=P2^1;
sbitKEY_OUT_4=P2^0;
#defineucharunsignedchar
#defineulintunsignedlong
#defineFrequency10//定时器中断时间=f*T
#defineTime1//一个周期1ms
#defineTubeNumber6//数码管个数
#defineKeyLine4//矩阵按键行数
#defineKeyColumn4//矩阵按键列数
//数码管真值表
ucharcodeLED_Number[]={0x0C,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//ucharcodeLED_Alphabet[]={0x88,0x83,0xC6,0xA1,0x86,0x8E,0x89,0xC7,0x8C,0xC1,0x91,0x9C};
/*0~9
A~F(b、d为小写)HLPUyo*/
ucharLED_Buff[TubeNumber]={0xff,0xff,0xff,0xff,0xff,0xff};
/*数码管显示缓冲区,0xff确保初始时都不亮.
不可写成ucharcodeLED_Buff[]。code定义变量写入room,不可修改*/
//矩阵按键编号到标准盘码的映射表
ucharcodeKeyCodeMap[4][4]={
(0x31,0x32,0x33,0x26),//数字键1、数字键2、数字键3、向上键
(0x34,0x35,0x36,0x25),//数字键4、数字键5、数字键6、向左键
(0x37,0x38,0x39,0x28),//数字键7、数字键8、数字键9、向下键
(0x30,0x1B,0x0D,0x27)};//数字键0、ESC键、回车键、向右键
ucharStaFlag[KeyLine][KeyColumn]={(1,1,1,1),(1,1,1,1),(1,1,1,1),(1,1,1,1)};//按键是否稳定标志
voidStartTime0();
voidTubeDisplay(ulintsec);
ulintpow(x,y);
voidTubeScan();
voidKeyAction(ucharkeycode);
voidKeyDriver();
voidKeyScan();
voidmain()
{
P1=0x08;//使能U3,选择数码管。
StartTime0();
while(1)KeyDriver();
}
//定时器0启动函数
voidStartTime0()
{
EA=1;
ET0=1;
TMOD=0x01;
TH0=(65536-Time*100)/256;
TL0=(65536-Time*100)%256;
PT0=1;
/*定时器0优先中断控制位。
IP这个寄存器的每一位,表示对应中断的抢占优先级,每一位的复值都是0,当我们把某一位设置为1的时候,这一位优先级就比其它位的优先级高了。
比如我们设置了PT0位为1后,当单片机在主循环或其他中断程序执行时,一旦TO发生中断,作为更高优先级,程序马上执行T0.若在T0程序执行时,
其他中断程序发生中断,仍执行TO直到T0中断结束后再执行其他程序。
*/
}
//中断服务函数
voidTo_time0()interrupt1using0
{
staticucharcnt;//记录TO中断次数
// staticulintsec;//记录经过秒速
//判断是否溢出
if(TF0==1)
{
TF0=0;
TH0=(65536-Time*100)/256;
TL0=(65536-Time*100)%256;
}
if(cnt>=Frequency)
{
cnt=0;
//sec++;
// Tube_Display(sec);
TubeScan();
KeyScan();
}
}
//数码管显示函数
voidTubeDisplay(ulintnom)
{
ucharm=2;//小数部分位数
uchari;//传输索引
//秒速达到上限清零
if(nom>pow(10,TubeNumber-m))nom=0;
//分别传输小数部分和整数部分
for(i=0;i<m;i++)
LED_Buff[i]=LED_Number[nom/pow(10,i)%10];
for(i=0;i<(TubeNumber-m);i++)
LED_Buff[i+m]=LED_Number[nom/pow(10,i)%10];
//点亮小数点
LED_Buff[m]&=0x7f;
}
//平方运算函数
ulintpow(x,y)//x为底,为幂
{
ulintp,i=1;
//平方运算
for(i=1;i<=y;i++)
p*=x;
//输出结果
returnp;
}
//数码管动态函数
voidTubeScan()
{
staticuchari=0;//动态扫描索引
//关闭所有段选位,数码管消隐
P0=0xff;
//for(i=0;i<Tube_number;i++)
P1=(P1&0xf8)|i;//位选索引赋值到P1口低3位
P0=LED_Buff[i];//缓冲区中的索引位置数据传输到P0口
if(++i>=TubeNumber)i=0;//索引递增循环,遍历整个缓冲区
}
//矩阵按键动作函数
voidKeyAction(ucharkeycode)
{
staticulintresult;
ulintnom=0;
//输入数字0~9
if((keycode>=0x30)&&(keycode<=39))
{
nom=(nom*10)+(keycode-0x30);//十进制整体左移,新数进入各位
TubeDisplay(nom);
}
//输入方向键
if((keycode>=0x25)&&(keycode<=28))
switch(keycode)
{
case0x26:result+=nom;nom=0;TubeDisplay(result);
case0x28:result-=nom;nom=0;TubeDisplay(result);
case0x25:result=1;result*=nom;nom=0;TubeDisplay(result);
case0x27:result=1;result/=nom;nom=0;TubeDisplay(result);
}
elseif(keycode==0x0d)TubeDisplay(result);//输入回车键,输出最终结果
elseif(keycode==0x1b)//输入ESC键,清零
{
nom=result=0;
TubeDisplay(nom);
}
}
//矩阵按键驱动函数
voidKeyDriver()
{
ucharl,c;
staticucharbackup[KeyLine][KeyColumn]={(1,1,1,1),(1,1,1,1),(1,1,1,1),(1,1,1,1)};//按键值备份,保存前一次值
for(l=0;l<KeyLine;l++)
{
for(c=0;c<KeyColumn;c++)
{
if(backup[l][c]!=StaFlag[l][c])
{//检测按键动作
if(backup[l][c]==1)//按键按下时执行
KeyAction(KeyCodeMap[l][c]);//调用动作函数
backup[l][c]=StaFlag[l][c];//刷新前一次备份值
}
}
}
}
//矩阵按键扫描函数
voidKeyScan()
{
ucharl=0;//矩阵按键扫描输出索引
ucharc=0;//矩阵按键扫描列索引
ucharkeybuff[KeyLine][KeyColumn]={(0xff,0xff,0xff,0xff),(0xff,0xff,0xff,0xff),
(0xff,0xff,0xff,0xff),(0xff,0xff,0xff,0xff)};//矩阵按键扫描缓冲区
//将一行的四个按键移入缓冲区
for(l=0;l<KeyColumn;l++)
keybuff[l][c]=((0xfe|(P2>>(4+l))&0x01));
//按键消抖
for(l=0;l<KeyLine;l++)
{
if((keybuff[l][c]&0x0f)==0x00)//连续4次扫描都为0,判断4*4ms内都是按下状态,可认为按键已稳定按下
StaFlag[l][c]=0;
elseif((keybuff[l][c]&0x0f)==0x0f)//连续4次扫描都为1,判断4*4ms内都是弹起状态,可认为按键已稳定弹起
StaFlag[l][c]=1;
}
for(c=0;c<KeyColumn;c++)
{
switch(c)//根据索引,释放当前输出脚拉低下次的根据索引
{
case0:KEY_OUT_4=1;KEY_OUT_1=0;break;
case1:KEY_OUT_1=1;KEY_OUT_2=0;break;
case2:KEY_OUT_2=1;KEY_OUT_3=0;break;
case3:KEY_OUT_3=1;KEY_OUT_4=0;break;
default:break;
}
}
}
F. 51单片机中如何用C语言实现两个测量量的相加减
51单片机
中用C语言实现两个测量量的相加减,是最简单的计算了,设两个测量的数据分别为x1,x2,总量为x0,则相加计算,x0=x1+x2,相减计算,x0=x1-x2。
G. 有无52单片机学的很明白的人,帮我讲一个程序,是C语言十以内的加减乘除计算器
计算器上的按键都对应一个矩阵键盘按键这样就像你做一般的处理一样了,按下一个数a,当加号键按下时就执行a+num(设置变量),再按b,当按下=时 执行num=b,进而得到a+b的值,只是这种想法在执行=运算时就要就要有好几种情况了,不过也算是一种方法吧,希望对你有帮组。
H. 单片机C语言 怎么处理减法
用if语句判断就可以了.
if(a>b)
{
}
else
{
}
I. 单片机(c语言):3个按键控制2个温度的加减,其中有一个键是选择哪个温度,两个键是分别加减。
其中有一个键是选择哪个温度,让它控制一个标志位,每按一次这个键,标志位改变一次,标志位为0,选第一个温度,为1选择第二个温度。
其余两个键加/减时,先根据标志位的选择,再去加/减哪个温度了。加/减温度控制会吧。
J. 51单片机C语言编程时能不能比较两个数的大小,能不能进行加减法运算
完全没问题