久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3417|回復: 3
打印 上一主題 下一主題
收起左側

基于51單片機計算器仿真C語言程序設計

[復制鏈接]
跳轉到指定樓層
樓主
這個設計是本人今天搞定出來的特意分享給大家學習學習數碼管顯示+矩陣鍵盤的使用,怕新手不會接線,我在里面加了個仿真proteus,可以方便大家一目明了

功能:計算器可以  加減乘除,4為數碼管顯示數值
本設計絕對可以用,真實可用(希望能幫到大家)
一起加油哈
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. # include<STC12C5A60S2.h>//單片機型號頭文件
  2. # define uchar unsigned char
  3. # define uint32 unsigned long int
  4. # define sint32 signed long int
  5. # define vtime        3000   //定時3ms,一幀8*3=24ms,頻率=40Hz
  6. //共陰數碼管段碼表
  7. uchar code distable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X00,0x40,0x31};
  8. //位選碼表
  9. uchar  code numi[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  10. //顯示緩存
  11. uchar V_ram[]={0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10};
  12. uchar        error=0,wi=0,dot1=0,dot2=0,dot=0xff;  //位選循環變量
  13. uint32        num1=0,num2=0,num=0,sum=0;
  14. void dispsum();
  15. void delay(uchar);
  16. uchar scan_key();
  17. main()                                                 //m1:m0  00=標準;   01=推挽;   10=輸入;   11=開漏輸出
  18. {
  19.         uchar        ni,nj,fn='+',key_V=0,dotp=0,j,k,i=0;
  20.         uint32        temp=0;
  21.         //m1:m0  00=標準;   01=推挽;   10=輸入;   11=開漏輸出
  22.         P1M1 = 0X0f;
  23.         P1M0 = 0XF0;        //設定低4位為輸入,高4位為輸出
  24.         P0M1 = 0X00;
  25.         P0M0 = 0Xff;
  26.         P2M1 = 0X00;
  27.         P2M0 = 0Xff; //設定P0,P2推挽輸出
  28.           TMOD = 0X01; //設定定時器0為16位計數方式
  29.           TH0 = (65536-vtime )/256;
  30.           TL0 = (65536-vtime )%256; //賦定時器0初值
  31.           ET0 = 1;  //開定時器0中斷
  32.           EA = 1;          //開總中斷
  33.            TR0 = 1;  //啟動定時器0計數
  34.         //sum=123456;

  35.         while(1)
  36.           {
  37.                 key_V=scan_key();
  38.                 //dispsum();
  39.                 if(key_V)
  40.                 {
  41.                         //有鍵按下
  42.                         key_V--;
  43.                         switch(key_V)
  44.                         {
  45.                            case 0:
  46.                            case 1:
  47.                            case 2:
  48.                            case 3:
  49.                            case 4:
  50.                            case 5:
  51.                            case 6:
  52.                            case 7:
  53.                            case 8:
  54.                            case 9:
  55.                                            if((num+i)==0)       
  56.                                         {        //如果是第一個數字輸入,則清黑屏
  57.                                                 dot=0xff; //關閉小數點
  58.                                                 for(j=0;j<8;j++)
  59.                                                          V_ram[j]=0x10;         //清黑屏
  60.                                         }
  61.                                    num=num*10+key_V;  //鍵盤輸入的數字轉化為十進制的數值
  62.                                         if(i==8)  //如果顯示緩沖滿了
  63.                                         {
  64.                                                 i=7;
  65.                                                 for(j=0;j<7;j++)
  66.                                                          V_ram[j]=V_ram[j+1];//顯示緩存串行移位
  67.                                         }
  68.                                         V_ram[i]=key_V;          //鍵值放入顯示緩存
  69.                                         i++;
  70.                                         break;

  71.                                 case 10:  //dot          小數點符號
  72.                                         dotp=i;                  //記錄下小數點位置
  73.                                         dot=dotp-1;  //顯示小數點
  74.                                         break;

  75.                                 case 11:   //+         加法符號
  76.                                         for(j=0;j<8;j++)
  77.                                                  V_ram[j]=0x10;         //清黑屏
  78.                                         num1=num;                         //獲取從鍵盤輸入的第一個數值
  79.                                         if(dotp==0)
  80.                                         {
  81.                                                 dot1=0;
  82.                                         }
  83.                                         else
  84.                                         {
  85.                                                 dot1=i-dotp;
  86.                                         }
  87.                                         ni=i;
  88.                                         dotp=0;
  89.                                         dot=0xff;
  90.                                         num=0;
  91.                                         fn='+';
  92.                                         i=0;
  93.                                         break;

  94.                                 case 12:   //-           減法符號
  95.                                         for(j=0;j<8;j++)
  96.                                                  V_ram[j]=0x10;          //清黑屏
  97.                                         num1=num;                          //獲取從鍵盤輸入的第一個數值
  98.                                         if(dotp==0)
  99.                                         {
  100.                                                 dot1=0;
  101.                                         }
  102.                                         else
  103.                                         {
  104.                                                 dot1=i-dotp;
  105.                                         }
  106.                                         ni=i;
  107.                                         dotp=0;
  108.                                         dot=0xff;
  109.                                         num=0;
  110.                                         fn='-';
  111.                                         i=0;
  112.                                         break;

  113.                                 case 13:   //*                  乘法符號
  114.                                         for(j=0;j<8;j++)
  115.                                                  V_ram[j]=0x10;           //清黑屏
  116.                                         num1=num;                           //獲取從鍵盤輸入的第一個數值
  117.                                         if(dotp==0)
  118.                                         {
  119.                                                 dot1=0;
  120.                                         }
  121.                                         else
  122.                                         {
  123.                                                 dot1=i-dotp;
  124.                                         }
  125.                                         ni=i;
  126.                                         dotp=0;
  127.                                         dot=0xff;
  128.                                         num=0;
  129.                                         fn='*';
  130.                                         i=0;
  131.                                         break;

  132.                                 case 14:   // /                         除法符號
  133.                                         for(j=0;j<8;j++)
  134.                                                  V_ram[j]=0x10;                //清黑屏
  135.                                         num1=num;                           //獲取從鍵盤輸入的第一個數值
  136.                                         if(dotp==0)
  137.                                         {
  138.                                                 dot1=0;
  139.                                         }
  140.                                         else
  141.                                         {
  142.                                                 dot1=i-dotp;
  143.                                         }
  144.                                         ni=i;
  145.                                         dotp=0;
  146.                                         dot=0xff;
  147.                                         num=0;
  148.                                         fn='/';
  149.                                         i=0;
  150.                                         break;

  151.                                 case 15:   //=                  等于符號
  152.                                         if(dotp==0)                   //計算第二個運算數的小數位數
  153.                                         {
  154.                                                 dot2=0;
  155.                                         }
  156.                                         else
  157.                                         {
  158.                                                 dot2=i-dotp;
  159.                                         }
  160.                                         dotp=0;
  161.                                         nj=i;
  162.                                         temp=1;
  163.                                         if(fn!='*')
  164.                                         {        if(dot1>dot2)                //第一個運算數與第二個運算進行對齊
  165.                                                 {
  166.                                                         for(j=dot1-dot2;j>0;j--)
  167.                                                         {
  168.                                                                         //if(num>0x19999999)error=1;
  169.                                                                         num=num*10;
  170.                                                                         nj++;
  171.                                                                         if(nj>9)
  172.                                                                         {
  173.                                                                                 j--;
  174.                                                                                 for(k=j;k>0;k--)
  175.                                                                                         num1=num1/10;
  176.                                                                                         dot1=dot1-j;
  177.                                                                                 break;
  178.                                                                         }

  179.                                                         }
  180.                                                 }
  181.                                                 else
  182.                                                 {
  183.                                                         for(j=dot2-dot1;j>0;j--)
  184.                                                         {
  185.                                                                         //if(num1>0x19999999)error=1;
  186.                                                                         num1=num1*10;
  187.                                                                         ni++;
  188.                                                                         if(ni>9)
  189.                                                                         {
  190.                                                                                 j--;
  191.                                                                                 for(k=j;k>0;k--)
  192.                                                                                         num=num/10;
  193.                                                                                         dot2=dot2-j;
  194.                                                                                 break;
  195.                                                                         }
  196.                                                         }
  197.                                                 }
  198.                                         }
  199.                                         //準備好后,進行運算
  200.                                         if(fn=='+')         //做加法運算
  201.                                         {
  202.                                                 sum=num+num1;
  203.                                                 if(sum<(num|num1))error=1;
  204.                                                 dispsum();           //顯示對齊后的運算結果
  205.                                                 if(dot2>dot1)        //顯示實際小數點的位置
  206.                                                         dot=dot-dot2;
  207.                                                 else
  208.                                                         dot=dot-dot1;
  209.                                                 i=0;         //計算結束,初始化關鍵變量
  210.                                                 num1=0;
  211.                                                 num=0;
  212.                                                 break;
  213.                                         }

  214.                                         if(fn=='-')          //做減法運算
  215.                                         {

  216.                                                 if(num1<num)         //判斷結果是負還是正
  217.                                                 {
  218.                                                         sum=num-num1;
  219.                                                 }
  220.                                                 else
  221.                                                         sum=num1-num;
  222.                                                 dispsum();          //顯示對齊后的運算結果
  223.                                                 if(num>num1)  //是負數則第一位顯示“-”,其它位順序往后顯示
  224.                                                 {
  225.                                                         for(j=7;j>0;j--)
  226.                                                                  V_ram[j]=V_ram[j-1]; //順序往后顯示
  227.                                                         V_ram[0]=0x11;        //第一位顯示“-”
  228.                                                         dot++;          //小數點也順延一位
  229.                                                 }
  230.                                                 if(dot2>dot1)         //顯示實際小數點的位置
  231.                                                         dot=dot-dot2;
  232.                                                 else
  233.                                                         dot=dot-dot1;

  234.                                                 i=0;        //計算結束,初始化關鍵變量
  235.                                                 num1=0;
  236.                                                 num=0;
  237.                                                 break;
  238.                                         }
  239.                                         if(fn=='*')           //做乘法運算
  240.                                         {
  241.                                                 sum=num1*num;
  242.                                                 if((ni+nj)>10)error=1;
  243.                                                 dispsum();        //顯示對齊后的運算結果
  244.                                                 //if(dot2>dot1)  //顯示實際小數點的位置
  245.                                                         dot=dot-dot2-dot1;
  246.                                                 //else
  247.                                                 //        dot=dot-dot1-dot1;
  248.                                                 i=0;         //計算結束,初始化關鍵變量
  249.                                                 num1=0;
  250.                                                 num=0;
  251.                                                 break;
  252.                                         }
  253.                                         if(fn=='/')                //做除法運算
  254.                                         {
  255.                                                 sum=num1/num;
  256.                                                 dispsum();         //顯示對齊后的運算結果,對于除法,就是實際結果
  257.                                                 temp=num1%num; //顯示小數部分
  258.                                                   for(j=dot;j<7;j++)
  259.                                                   {
  260.                                                         temp=temp*10;
  261.                                                         V_ram[j+1]=temp/num;
  262.                                                         temp=temp%num;
  263.                                                         if(temp==0)break;
  264.                                                 }
  265.                                                 i=0;        //計算結束,初始化關鍵變量
  266.                                                 num1=0;
  267.                                                 num=0;
  268.                                                 break;
  269.                                         }
  270.                                         break;
  271.                                                
  272.                                    default:
  273.                                         break;   
  274.                         }
  275.                    delay(200);//延時去抖
  276.                 }
  277.                
  278.            }

  279. }

  280. void t0_isp() interrupt 1
  281. {
  282.         uchar dm,wx;
  283.           TH0 = (65536-vtime )/256;
  284.           TL0 = (65536-vtime )%256; //賦定時器0初值
  285.           dm=distable[V_ram[wi]];        //取顯示段碼
  286.         wx=numi[wi];                           //取位選碼
  287.         P2=0x00;                           //關顯示
  288.         //P0=dm;                                   //段碼賦給P0口
  289.         if(dot==wi)
  290.         {
  291.                 P0=dm|0x80;                  //點亮位選的那個數碼管+小數點
  292.         }
  293.         else
  294.         {
  295.                 P0=dm;                                   //點亮位選的那個數碼管
  296.         }
  297.         P2=wx;
  298.         wi++;
  299.         if(wi==8)wi=0;
  300. }
  301. /////////////////////////////////////
  302. uchar         scan_key()
  303. {
  304.                 uchar        i,j,vlume=0,temp[4]={0xef,0xdf,0xbf,0x7f};
  305.                 for(j=0;j<4;j++)
  306.                 {
  307.                         P1=temp[j];
  308.                         i=P1|0xf0;
  309.                         if(i != 0xff) //判斷按鍵
  310.                         {        //有鍵按下
  311.                                 i=~i;
  312.                                 if(i==4)i=3;
  313.                                 if(i==8)i=4;
  314.                                 i--;  // 計算按鍵所在行號(0--3)
  315.                                 vlume=i*4+j+1;        //計算鍵值
  316.                                 //delay(200);//延時去抖
  317.                         }
  318.                 }
  319.                 return        vlume;
  320. }
  321. ////////////////////////////////////////  
  322. void delay(uchar k )
  323. {
  324.         uchar x,y,z;
  325.         for(x=k;x>0;x--)
  326.         for(y=20;y>0;y--)
  327.         for(z=250;z>0;z--);
  328. }
  329. ////////////////////////////////////////
  330. void        dispsum()
  331. ……………………

  332. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
51單片機計算器 數碼管顯示.zip (149.9 KB, 下載次數: 41)


評分

參與人數 1黑幣 +70 收起 理由
admin + 70 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:942472 發表于 2021-6-22 15:28 | 只看該作者
用不了大哥
回復

使用道具 舉報

板凳
ID:328014 發表于 2021-6-22 17:54 | 只看該作者

程序編譯沒有錯誤 你是不是沒有頭文件:http://www.zg4o1577.cn/bbs/dpj-36960-1.html

不過樓主的程序 估計是按鍵沒有消抖,按鍵得快速按下 不然結果不正確
回復

使用道具 舉報

地板
ID:699194 發表于 2021-6-28 19:06 | 只看該作者
51hei團團 發表于 2021-6-22 17:54
程序編譯沒有錯誤 你是不是沒有頭文件:http://www.zg4o1577.cn/bbs/dpj-36960-1.html

不過樓主的程序 估 ...

可以加個延時,去消抖就好了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品国产黄a∨片高清在线 成人区精品一区二区婷婷 日本一区二区视频 | 国产99久久久国产精品 | 伊人色综合久久久天天蜜桃 | 日韩欧美国产精品一区二区三区 | 99精品99 | 黄视频免费观看 | 成人国产一区二区三区精品麻豆 | 中文精品视频 | 99久久精品一区二区成人 | 超碰人人爱 | 久久精品亚洲精品国产欧美 | 日韩在线观看 | 国产精品成人一区二区三区吃奶 | 粉嫩一区二区三区国产精品 | 中文二区 | 成人精品福利 | 麻豆精品国产91久久久久久 | a级片在线观看 | 91久久精品国产免费一区 | 久久宗合色 | 中文字幕成人 | 午夜视频在线 | 久久综合一区 | 中文字幕在线观看视频网站 | 成人精品一区二区三区中文字幕 | 久久久成人一区二区免费影院 | 成人精品国产 | 男女视频在线免费观看 | 日韩日韩日韩日韩日韩日韩日韩 | 国产精品国产三级国产aⅴ无密码 | 精品毛片 | 亚洲欧洲中文日韩 | 91av视频在线观看 | 91夜夜夜| 99视频免费在线 | 国产高清一区 | 亚洲黄色av网站 | 成人一区在线观看 | 99精品久久久久久中文字幕 | 992人人草 | 精品国产乱码久久久久久中文 |