① 单片机简单C语言问题,实现一个个位加法计算器
你的问题应该出现在键盘处理不完善造成的,稍微修改了一下你试试。
#include <reg52.h>
#define uchar unsigned char
#define unit unsigned int
#define OPdata P0 //十位数据口
#define OPdata1 P1//个位数据口
sbit se0=P3^6;//十位选择
sbit se1=P3^7;//个位选择
sbit Q=P2^6;
sbit W=P2^5;
sbit E=P2^4;
uchar cis; //按下键盘次数
uchar jia1; //加数1
uchar jia2; //加数2
uchar z; //中转数
uchar shi; //十位数
uchar ge; //个位数
uchar s; //译码结果
uchar j; //译码结果
uchar sum; //加法结果
uchar keytemp;
void judge(uchar m) //数码显像管译码
{
switch (m)
{
case 0: s=0x3F; break;
case 1: s=0x06; break;
case 2: s=0x5B; break;
case 3: s=0x4F; break;
case 4: s=0x66; break;
case 5: s=0x6D; break;
case 6: s=0x7D; break;
case 7: s=0x07; break;
case 8: s=0x7F; break;
case 9: s=0x6F; break;
}
}
void judge1(uchar h) //十位数码显像管译码
{
switch (h)
{
case 0: j=0x3F; break;
case 1: j=0x06; break;
}
}
void judgecis()
{
if (cis==1)
{
jia1=z;
ge=z;
shi=0;
}
else if (cis==2)
{
jia2=z;
ge=z;
shi=0;
cis=0;
}
}
void jiafa(uchar m,uchar n) //加法
{
sum=m+n;
if (sum>=10)
{
ge=sum-10;
shi=1;
}
else
{
ge=sum;
shi=0;
}
}
void main()
{
cis=0;
jia1=0;
jia2=0;
shi=0;
ge=0;
s=0;
j=0;
P2=0XFF;
se0=0;//开启十位
se1=0;//开启个位
OPdata=0x3f;//十位
OPdata1=0x3f;//个位
while (1)
{
Q=0;
keytemp=P2;
switch (keytemp)
{
case 0xbb: z=3; cis++;while(P2==0xbb); break;
case 0xbd: z=6; cis++;while(P2==0xbd); break;
case 0xbe: z=9; cis++;while(P2==0xbe); break;
case 0xb7: //等于号
jiafa (jia1,jia2); cis=0; break;
}
Q=1;
W=0;
keytemp=P2;
switch (keytemp)
{
case 0xde: z=8; cis++;while(P2==0xde); break;
case 0xdd: z=5; cis++;while(P2==0xdd); break;
case 0xdb: z=2; cis++;while(P2==0xdb); break;
case 0xd7: z=0; cis++;while(P2==0xd7); break;
}
W=1;
E=0;
keytemp=P2;
switch (keytemp)
{
case 0xee: z=7; cis++;while(P2==0xee); break;
case 0xed: z=4; cis++;while(P2==0xed); break;
case 0xeb: z=1; cis++;while(P2==0xeb); break;
}
judgecis();
judge(ge);
OPdata1=s;
judge1(shi);
OPdata=j;
E=1;
}
}
② 单片机加法运算
你的问题应该出现在键盘处理不完善造成的,稍微修改了一下你试试。 #include #define uchar unsigned char #define unit unsigned int #define OPdata P0 //十位数据口 #define OPdata1 P1//个位数据口 sbit se0=P3^6;//十位选择 sbit se1=P3^7;//个位选择 sbit Q=P2^6; sbit W=P2^5; sbit E=P2^4; uchar cis; //按下键盘次数 uchar jia1; //加数1 uchar jia2; //加数2 uchar z; //中转数 uchar shi; //十位数 uchar ge; //个位数 uchar s; //译码结果 uchar j; //译码结果 uchar sum; //加法结果 uchar keytemp; void judge(uchar m) //数码显像管译码 { switch (m) { case 0: s=0x3F; break; case 1: s=0x06; break; case 2: s=0x5B; break; case 3: s=0x4F; break; case 4: s=0x66; break; case 5: s=0x6D; break; case 6: s=0x7D; break; case 7: s=0x07; break; case 8: s=0x7F; break; case 9: s=0x6F; break; } } void judge1(uchar h) //十位数码显像管译码 { switch (h) { case 0: j=0x3F; break; case 1: j=0x06; break; } } void judgecis() { if (cis==1) { jia1=z; ge=z; shi=0; } else if (cis==2) { jia2=z; ge=z; shi=0; cis=0; } } void jiafa(uchar m,uchar n) //加法 { sum=m+n; if (sum>=10) { ge=sum-10; shi=1; } else { ge=sum; shi=0; } } void main() { cis=0; jia1=0; jia2=0; shi=0; ge=0; s=0; j=0; P2=0XFF; se0=0;//开启十位 se1=0;//开启个位 OPdata=0x3f;//十位 OPdata1=0x3f;//个位 while (1) { Q=0; keytemp=P2; switch (keytemp) { case 0xbb: z=3; cis++;while(P2==0xbb); break; case 0xbd: z=6; cis++;while(P2==0xbd); break; case 0xbe: z=9; cis++;while(P2==0xbe); break; case 0xb7: //等于号 jiafa (jia1,jia2); cis=0; break; } Q=1; W=0; keytemp=P2; switch (keytemp) { case 0xde: z=8; cis++;while(P2==0xde); break; case 0xdd: z=5; cis++;while(P2==0xdd); break; case 0xdb: z=2; cis++;while(P2==0xdb); break; case 0xd7: z=0; cis++;while(P2==0xd7); break; } W=1; E=0; keytemp=P2; switch (keytemp) { case 0xee: z=7; cis++;while(P2==0xee); break; case 0xed: z=4; cis++;while(P2==0xed); break; case 0xeb: z=1; cis++;while(P2==0xeb); break; } judgecis(); judge(ge); OPdata1=s; judge1(shi); OPdata=j; E=1; } }
③ 单片机定时
1、51单片机12M晶振下一个机器周期是1us;
2、TMOD=0X02,说明定时器0工作在方式2下(自动重装初值)。TL0每个机器周期+1,当其值计数达到255(0xFF)后,再来一个机器周期+1时产生溢出(0x100),由此引发定时中断,同时单片机自动将TH0的值再次赋给TL0继续开始下一轮计时。
3、TL0的初值取6,所以经过250个计数周期后TL0的值将达到256(0x100溢出),产生中断。
250*1us = 250us =0.25ms。
赋初值可以这样理解并赋值:TH0 = TL0 = 256-250;( =6)
④ 会单片机的讲讲下TMOD=0X06中0是定时器0,6是工作方式6吗
区别是tmod中有8bit
tmod
|=
0x01
这样第2~8bit原来是什么还是什么,不影响,第1bit赋值为1;
tmod=0x01
这样是给2~8bit赋值为0,第1bit赋值为1。
51单片机是对所有兼容intel
8031指令系统的单片机的统称。该系列单片机的始祖是intel的8031单片机,后来随着flash
rom技术的发展,8031单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是atmel公司的at89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。需要注意的是52系列的单片机一般不具备自编程能力。
⑤ 单片机中0x6=0x60吗
是06不是60,如果你用过WIN系统自带的计算器,就会发现在十六进制模式下,只能输入6而不能输入06,二进制也是一样,比如要输入0001,就只显示1,建议玩一下电脑里的这个计算器,2--10--16之间的转换真的很方便的。
⑥ 单片机中 0x06代表1;0x5b代表2 这是怎么算的。。。单片机初学者--
如下图:数码管8位一般定义为:DPGFEDCBA
BC亮表示1,即00000110=0x06;
ABGED亮表示2即01011011=0x5b;
依次类推,明白了吗?
⑦ 在单片机里。怎么计数。
#include<reg51.h>
#define uchar unsigned char
uchar number;
void t0isr() interrupt 1
{
number++;
}
main()
{
TMOD=0x06;//定时器0工作模式2计数器方式。P3.4为脉冲输入口
TH0=0xff;
TL0=0xff;
ET0=1;
TR0=1;
EA=1;
number=0;
while(1)
{
switch(number)
{
case 1:
case 2:
........
default:number=0;break;
}
}
}
⑧ 51单片机1602液晶屏 0x0c和0x06是什么意思,为什么这么表示
你说的是在给1602初始化的时候,要写两个命令字,
0x0c和0x06就是两个命令字。
前面的0x是表示为十六进制数。
⑨ 计算题:弱弱地问一下单片机中“~0x3f&0x7f,~0x06&0x7f”运算值各是多少
&这个符号是按位与的运算
~这个符号为取反
~0x3f&0x7f
=0xc0&0x7f
=0x40
~0x06&0x7f
=0xf9&0x7f
=0x79
⑩ 单片机中16进制数0x06是如何算出来的
根据二进制转换来计算的。
先弄清楚数制的转换吧。
二进制,十进制,16进制。