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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

用單片機做一個帶存儲一功能的秒表,現在程序有點問題,可以正常計... 求幫助

[復制鏈接]
跳轉到指定樓層
樓主
ID:476044 發表于 2019-5-3 18:50 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include "reg52.h"                        

  2. typedef unsigned int u16;          //對數據類型進行聲明定義
  3. typedef unsigned char u8;

  4. void delay(); //短暫延時
  5. void start(); //開始信號
  6. void stop(); //停止信號
  7. void respons();         //應答
  8. void init();   //初始化 兩條線都拉高
  9. void write_byte(u8);        //寫一個字節
  10. u8 read_byte();           //讀一個字節,帶帶返回值的函數
  11. void write_add(u8,u8);//寫入 指定地址 數據
  12. u8 read_add(u8);                //讀出  指定地址 數據
  13. u8 fanye=0;         //定義外部中斷1 存數次數標志位,翻頁次數
  14. u8 gg=0;                //定義存第幾數 ,翻到第幾個數
  15. u16 cc=0;                  //定義定時器0溢出次數

  16. sbit LSA=P2^2;
  17. sbit LSB=P2^3;
  18. sbit LSC=P2^4;
  19. sbit int0=P3^2; //外部中斷0,端口
  20. sbit int1=P3^3; //外部中斷1,端口
  21.   sbit  scl=P1^3;         //時鐘線
  22.   sbit  sda=P1^4;         //數據線

  23. u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  24.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值

  25. u8 ssec,sec,min;
  26. u8 DisplayData[8];
  27. u8 qc=0;                 //定義長按外部中斷0 取出保存的數
  28. u8 zant=0;          //暫停開始標志位,外部中斷0控制
  29. /*******************************************************************************
  30. * 函 數 名         : delay
  31. * 函數功能                   : 延時函數,i=1時,大約延時10us
  32. *******************************************************************************/
  33. void delay(u16 i)
  34. {
  35.         while(i--);        
  36. }

  37. /*******************************************************************************
  38. * 函 數 名         : Timer0Init
  39. * 函數功能                   : 定時器0初始化
  40. * 輸    入         : 無
  41. * 輸    出         : 無
  42. *******************************************************************************/
  43. void Timer0Init()
  44. {
  45.         TMOD|=0X01;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。

  46.         TH0=0Xd8;        //給定時器賦初值,定時10ms
  47.         TL0=0Xf0;        
  48.         ET0=1;//打開定時器0中斷允許
  49.         EA=1;//打開總中斷
  50.         TR0=1;//打開定時器                        
  51. }


  52. /*******************************************************************************
  53. * 函 數 名         : DigDisplay
  54. * 函數功能                   : 數碼管動態掃描函數,循環掃描8個數碼管顯示
  55. *******************************************************************************/
  56. void DigDisplay()
  57. {
  58.         u8 i;
  59.         for(i=0;i<8;i++)
  60.         {
  61.                 switch(i)         //位選,選擇點亮的數碼管,
  62.                 {
  63.                         case(7):
  64.                                 LSA=0;LSB=0;LSC=0; break;//顯示第0位
  65.                         case(6):
  66.                                 LSA=1;LSB=0;LSC=0; break;//顯示第1位
  67.                         case(5):
  68.                                 LSA=0;LSB=1;LSC=0; break;//顯示第2位
  69.                         case(4):
  70.                                 LSA=1;LSB=1;LSC=0; break;//顯示第3位
  71.                         case(3):
  72.                                 LSA=0;LSB=0;LSC=1; break;//顯示第4位
  73.                         case(2):
  74.                                 LSA=1;LSB=0;LSC=1; break;//顯示第5位
  75.                         case(1):
  76.                                 LSA=0;LSB=1;LSC=1; break;//顯示第6位
  77.                         case(0):
  78.                                 LSA=1;LSB=1;LSC=1; break;//顯示第7位        
  79.                 }
  80.                 P0=DisplayData[i];//發送段碼
  81.                 delay(100); //間隔一段時間掃描        
  82.                 P0=0x00;//消隱
  83.         }
  84. }
  85. /*************************延時********************************/
  86. void delayms(u16 x)   //延時函數
  87. {
  88.   u16 p,q;
  89.   for(p=x;p>0;p--)
  90.         for(q=110;q>0;q--);
  91. }
  92. void datapros()
  93. {
  94.         DisplayData[0]=smgduan[ssec%10];
  95.         DisplayData[1]=smgduan[ssec/10];
  96.         DisplayData[2]=0x40;        
  97.         DisplayData[3]=smgduan[sec%10];
  98.         DisplayData[4]=smgduan[sec/10];
  99.         DisplayData[5]=0x40;
  100.         DisplayData[6]=smgduan[min%10];
  101.         DisplayData[7]=smgduan[min/10];
  102. }
  103. /*******************外部中斷0*******************/
  104. void wbzd0()interrupt 0
  105. {
  106.    u8 p=0;    //判斷按鍵按下的時間
  107.    delayms(20); //消抖
  108.    if(int0==0)
  109.    {
  110.           while(!int0&&p<250)        //最多按25秒
  111.               {        p++;
  112.                         delayms(100);}
  113.      if(p>15)        //長按2秒 調出數據,
  114.            {
  115.                 qc=1;           //主程序開始 讀eeprom數據
  116.                 TR0=0;          //停止定時器工作
  117.                 }
  118.           else                // 低于兩秒
  119.      {
  120.        zant=~zant;
  121.        TR0=zant;        //來回反轉實現定時器0的啟停
  122.       }
  123.         }
  124. }
  125. void wbzd1()interrupt 2
  126.   {
  127.    delayms(20); //消抖
  128.    if(int1==0)
  129.    {
  130.            fanye=1;   //主程序進入存數據,后跳出,直到下次按鍵按下
  131.          gg++;           //用于判斷存數據位,和讀數據位,在不同的位置實現的功能不同
  132.          if(gg==5)
  133.             {gg=1;}
  134.          while(!int1);        //按鍵不松,程序不往下執行
  135.         }
  136.   }
  137. void T0_time()interrupt 1                 //八位自動裝填
  138. {
  139.     cc++;
  140.    if(cc>=400)         //0.1秒到來
  141.         {
  142.          cc=0;
  143.          ssec++;         
  144.         }
  145. }
  146. /*******************************************************************************
  147. * 函 數 名       : main
  148. * 函數功能                 : 主函數
  149. * 輸    入       : 無
  150. * 輸    出             : 無
  151. *******************************************************************************/
  152. void main()
  153. {        
  154.         Timer0Init();  //定時器0初始化
  155.         while(1)
  156.         {        IT0=1;                //外部0低電平觸發
  157.             EX0=1;                //開外部中斷0

  158.                IT1=1;                //外部1低電平觸發
  159.             EX1=1;                //開外部中斷1

  160.             ET0=1;                //開定時器0
  161.             EA=1;                // 開總中斷
  162.                            
  163.            IP=0x04;        //外部1優先
  164.                  datapros();
  165.                 DigDisplay();
  166.         /**************************按鍵處理*************************/
  167. if(fanye==1)                  //存數據 判斷外部中斷1是否按下
  168.            {                  
  169.                 switch(gg)                  //通過gg的值“按第幾下”,存到不同的位置
  170.                   {
  171.                    case 1:
  172.                    init();
  173.            write_add(0x01,DisplayData[0]);
  174.            init();
  175.            write_add(0x02,DisplayData[1]);
  176.                    init();
  177.            write_add(0x03,DisplayData[2]);
  178.                    init();
  179.            write_add(0x04,DisplayData[3]);
  180.                    init();
  181.            write_add(0x05,DisplayData[4]);
  182.                    init();
  183.            write_add(0x06,DisplayData[5]);
  184.                           break;
  185.                   /* case 2:
  186.                    init();
  187.            write_add(0x03,num0);
  188.            init();
  189.            write_add(0x04,num1);
  190.                           break;
  191.                    case 3:
  192.                    init();
  193.            write_add(0x05,num0);
  194.            init();
  195.            write_add(0x06,num1);
  196.                           break;
  197.                    case 4:
  198.                    init();
  199.            write_add(0x07,num0);
  200.            init();
  201.            write_add(0x08,num1);
  202.                           break;  */
  203.                   }
  204.                    fanye=0;                 //退出存數,直到下次外部中斷1到來
  205.            }

  206.            if(qc==1)                //判斷外部中斷0長按鍵 開始讀存進EEPROM的數據
  207.            {        
  208.                    while(1)         
  209.                  {
  210.                         switch(gg)          //通過判斷外部中斷1,按鍵次數gg實現翻頁功能
  211.                         {                          //因為又進入到現在這個大循環 所以外部中斷1中的
  212.                          case 1:          //fanye=1;不能在返回上面控制 存第幾個數據了,相當與無用
  213.                          init();
  214.              DisplayData[0]=read_add(0x01);
  215.                          init();
  216.              DisplayData[1]=read_add(0x02);
  217.                          init();
  218.              DisplayData[2]=read_add(0x03);
  219.                          init();
  220.              DisplayData[3]=read_add(0x04);
  221.                          init();
  222.              DisplayData[4]=read_add(0x05);
  223.                          init();
  224.              DisplayData[5]=read_add(0x06);

  225.                                           break;
  226.                          /*case 2:
  227.                          init();
  228.              num0=read_add(0x03);
  229.                          init();
  230.              num1=read_add(0x04);
  231.                                          break;
  232.                          case 3:
  233.                          init();
  234.              num0=read_add(0x05);
  235.                          init();
  236.              num1=read_add(0x06);
  237.                                           break;
  238.                          case 4:
  239.                          init();
  240.              num0=read_add(0x07);
  241.                          init();
  242.              num1=read_add(0x08);
  243.                                            break; */
  244.                         }
  245.                          /*mb[0]=num1%10;           //秒表個位
  246.                                mb[1]=num1/10;           //秒表十位
  247.                            mb[2]=num0;  */
  248.                     //display(num0,num1);                  //程序將在此一直判斷gg,實現翻頁,顯示存的數據
  249.                 }                                          //若想再次計數,按下單片機的RST復位鍵,程序重頭執行
  250.          }     
  251.   }                        
  252. }        
  253.                         


  254. /*******************************************************************************
  255. * 函 數 名         : void Timer0() interrupt 1
  256. * 函數功能                   : 定時器0中斷函數
  257. * 輸    入         : 無
  258. * 輸    出         : 無
  259. *******************************************************************************/
  260. void Timer0() interrupt 1
  261. {
  262.         TH0=0Xd8;        //給定時器賦初值,定時10ms
  263.         TL0=0Xf0;
  264.         ssec++;
  265.         if(ssec>=100)  //1s
  266.         {
  267.                 ssec=0;
  268.                 sec++;
  269.                 if(sec>=60)
  270.                 {
  271.                         sec=0;
  272.                         min++;
  273.                         if(min>=60)
  274.                         {
  275.                                 min=0;
  276.                         }
  277.                 }        
  278.         }        
  279. }
  280. /*void delay2()
  281.   {;;} */
  282.            
  283. void start() //開始信號
  284. {
  285.   sda=1;
  286.   delay2();
  287.   scl=1;
  288.   delay2();
  289.   sda=0;
  290.   delay2();
  291. }

  292.   void stop() //停止信號
  293. {
  294.   sda=0;
  295.   delay2();
  296.   scl=1;
  297.   delay2();
  298.   sda=1;
  299.   delay2();
  300. }

  301. void respons()         //應答
  302. {
  303.   u8 i;
  304.   scl=1;
  305.   delay2();
  306.   while((sda==1)&&(i<250))        //防止一直沒有收到應答,程序停止
  307.         {i++;}
  308.   scl=0;
  309.   delay2();
  310. }

  311. void init()   //初始化 兩條線都拉高
  312. {
  313.    sda=1;
  314.    delay2();
  315.    scl=1;
  316.    delayms(1); //加延時,否則用不了
  317. }

  318.   void write_byte(u8 date)        //寫一個字節
  319. {
  320.   u8 i,temp;
  321.   temp=date;
  322.         for(i=0;i<8;i++)
  323.           {
  324.           temp=temp<<1;
  325.           scl=0;
  326.           delay2();
  327.           sda=CY; //最高位移入PSW寄存器中CY位中
  328.           delay2(); //將CY中的值賦給sda
  329.           scl=1;
  330.           delay2();
  331.          }
  332.           scl=0;
  333.          delay2();
  334.          sda=1;
  335.          delay2();
  336. }

  337. u8 read_byte()           //讀一個字節,帶帶返回值的函數
  338. {
  339.   u8 i,k;
  340.   scl=0;
  341.   delay2();
  342.   sda=1;
  343.   delay2();
  344.    for(i=0;i<8;i++)
  345.    {
  346.          scl=1;
  347.          delay2();
  348.          k=(k<<1)|sda;        //將K左移一位后與sda進行或運算,
  349.          scl=0;                        //依次把8個位放入一個字節中來完成接收
  350.          delay2();
  351.         }
  352.         return k;                  //返回值為k
  353. }


  354.   void write_add(u8 address,u8 date)         //寫入 指定地址 數據
  355.   {
  356.    start();
  357.    write_byte(0xa0);  //接下來為寫操作
  358.    respons();
  359.    write_byte(address);        //送入地址
  360.    respons();
  361.    write_byte(date);        //寫入數據
  362.    respons();
  363.    stop();
  364.     delayms(1);         //加延時,否則用不了
  365.   }

  366.   u8 read_add(u8 address)                                //讀出  指定地址 數據
  367.   {
  368.         u8 date;
  369.         start();
  370.         write_byte(0xa0);        //接下來為寫操作
  371.    respons();
  372.    write_byte(address);          //送入地址 ,下面讀數據的地址
  373.    respons();
  374.    start();
  375.    write_byte(0xa1);        //接下來為讀操作 存儲器發送數據
  376.    respons();
  377.    date=read_byte();         //把SDA數據線上的數據用date存
  378.    stop();
  379.    return date;
  380.    delayms(1);        //加延時,
  381.   }
復制代碼


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

使用道具 舉報

沙發
ID:170318 發表于 2019-5-3 23:47 | 只看該作者
樓主,請問要幫助解決什么問題?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 蜜桃精品噜噜噜成人av | 91久久久久久久久 | 亚洲永久 | 午夜无码国产理论在线 | 亚洲成人a v | 97久久精品午夜一区二区 | 在线观看黄色电影 | 日本视频中文字幕 | 日韩av免费在线电影 | 91精品久久久 | 日本在线看片 | 怡红院成人在线视频 | 午夜影院在线播放 | 成人在线精品视频 | 国产网站在线免费观看 | 日韩欧美一区二区三区四区 | 午夜精品一区二区三区在线视频 | 国产精品久久久久久模特 | 国产精品女人久久久 | 婷婷国产一区 | 精品人伦一区二区三区蜜桃网站 | 亚洲欧美日韩电影 | 久久成人一区 | 久久中文字幕一区 | 91.色 | 午夜国产羞羞视频免费网站 | 国产精品国产精品国产专区不片 | 久久国产精品一区二区三区 | 久久成人精品视频 | 天天操天天舔 | 日日夜夜视频 | 免费久久久| 四虎国产 | 国产精品视屏 | 夜夜爽99久久国产综合精品女不卡 | 中文字幕一区在线观看视频 | 欧美日韩专区 | 欧美精品一区二区三区四区五区 | 黄色一级大片在线免费看产 | av高清| 一区二区三区在线 |