① 單片機簡單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進制。