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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5053|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

單片機方波發(fā)生器程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:113739 發(fā)表于 2016-4-12 15:28 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
一個課程設(shè)計,方波發(fā)生器的,數(shù)碼管顯示
全部文件下載: 程序.zip (47.9 KB, 下載次數(shù): 17)

  1. #include "reg52.h"
  2. #include <intrins.h>

  3. #define  uchar unsigned char
  4. #define  uint unsigned int

  5. #define  PCF8591 0x90    //PCF8591 地址

  6. #define  THCO   0xee      //11.0592MHZ晶振
  7. #define  TLCO   0x00          //定時5ms時間常數(shù)值


  8. #define  NOP()   _nop_()   /* 定義空指令 */
  9. unsigned char cnt=0,hz=10;
  10. float fd=1.0,t,a;
  11. unsigned char Data_Buffer[4]={1,2,3,4};
  12. uchar code Duan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x76};

  13. sbit  P24=P2^4;                //四個數(shù)碼管的位碼口定義
  14. sbit  P25=P2^5;
  15. sbit  P26=P2^6;
  16. sbit  P27=P2^7;


  17. sbit  P20=P2^0;         //四個獨立按鍵
  18. sbit  P21=P2^1;
  19. sbit  P22=P2^2;
  20. sbit  P32=P3^2;


  21. bit   flag=0;
  22. sbit  P14=P1^4;

  23. sbit  SCL=P3^6;       //I2C  時鐘
  24. sbit  SDA=P3^7;       //I2C  數(shù)據(jù)
  25. bit   ack;            /*應(yīng)答標志位*/


  26.    

  27. /*******************************************************************
  28.                      起動總線函數(shù)               
  29. 函數(shù)原型: void  Start_I2c();  
  30. 功能:     啟動I2C總線,即發(fā)送I2C起始條件.  
  31. ********************************************************************/
  32. void Start_I2c()
  33. {
  34.   SDA=1;         /*發(fā)送起始條件的數(shù)據(jù)信號*/
  35.   NOP();
  36.   SCL=1;
  37.   NOP();        /*起始條件建立時間大于4.7us,延時*/
  38.   NOP();
  39.   NOP();
  40.   NOP();
  41.   NOP();   
  42.   SDA=0;         /*發(fā)送起始信號*/
  43.   NOP();        /* 起始條件鎖定時間大于4μs*/
  44.   NOP();
  45.   NOP();
  46.   NOP();
  47.   NOP();      
  48.   SCL=0;       /*鉗住I2C總線,準備發(fā)送或接收數(shù)據(jù) */
  49.   NOP();
  50.   NOP();
  51. }

  52. /*******************************************************************
  53.                       結(jié)束總線函數(shù)               
  54. 函數(shù)原型: void  Stop_I2c();  
  55. 功能:     結(jié)束I2C總線,即發(fā)送I2C結(jié)束條件.  
  56. ********************************************************************/
  57. void Stop_I2c()
  58. {
  59.   SDA=0;      /*發(fā)送結(jié)束條件的數(shù)據(jù)信號*/
  60.   NOP();       /*發(fā)送結(jié)束條件的時鐘信號*/
  61.   SCL=1;      /*結(jié)束條件建立時間大于4μs*/
  62.   NOP();
  63.   NOP();
  64.   NOP();
  65.   NOP();
  66.   NOP();
  67.   SDA=1;      /*發(fā)送I2C總線結(jié)束信號*/
  68.   NOP();
  69.   NOP();
  70.   NOP();
  71.   NOP();
  72. }

  73. /*******************************************************************
  74.                  字節(jié)數(shù)據(jù)發(fā)送函數(shù)               
  75. 函數(shù)原型: void  SendByte(UCHAR c);
  76. 功能:     將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并對
  77.           此狀態(tài)位進行操作.(不應(yīng)答或非應(yīng)答都使ack=0)     
  78.            發(fā)送數(shù)據(jù)正常,ack=1; ack=0表示被控器無應(yīng)答或損壞。
  79. ********************************************************************/
  80. void  SendByte(unsigned char  c)
  81. {
  82. unsigned char  BitCnt;

  83. for(BitCnt=0;BitCnt<8;BitCnt++)  /*要傳送的數(shù)據(jù)長度為8位*/
  84.     {
  85.      if((c<<BitCnt)&0x80)SDA=1;   /*判斷發(fā)送位*/
  86.        else  SDA=0;               
  87.      NOP();
  88.      SCL=1;               /*置時鐘線為高,通知被控器開始接收數(shù)據(jù)位*/
  89.       NOP();
  90.       NOP();             /*保證時鐘高電平周期大于4μs*/
  91.       NOP();
  92.       NOP();
  93.       NOP();         
  94.      SCL=0;
  95.     }
  96.    
  97.     NOP();
  98.     NOP();
  99.     SDA=1;                /*8位發(fā)送完后釋放數(shù)據(jù)線,準備接收應(yīng)答位*/
  100.     NOP();
  101.     NOP();   
  102.     SCL=1;
  103.     NOP();
  104.     NOP();
  105.     NOP();
  106.     if(SDA==1)ack=0;     
  107.        else ack=1;        /*判斷是否接收到應(yīng)答信號*/
  108.     SCL=0;
  109.     NOP();
  110.     NOP();
  111. }

  112. /*******************************************************************
  113.                  字節(jié)數(shù)據(jù)接收函數(shù)               
  114. 函數(shù)原型: UCHAR  RcvByte();
  115. 功能:        用來接收從器件傳來的數(shù)據(jù),并判斷總線錯誤(不發(fā)應(yīng)答信號),
  116.           發(fā)完后請用應(yīng)答函數(shù)應(yīng)答從機。  
  117. ********************************************************************/   
  118. unsigned char   RcvByte()
  119. {
  120.   unsigned char  retc;
  121.   unsigned char  BitCnt;
  122.   
  123.   retc=0;
  124.   SDA=1;                     /*置數(shù)據(jù)線為輸入方式*/
  125.   for(BitCnt=0;BitCnt<8;BitCnt++)
  126.       {
  127.         NOP();           
  128.         SCL=0;                  /*置時鐘線為低,準備接收數(shù)據(jù)位*/
  129.         NOP();
  130.         NOP();                 /*時鐘低電平周期大于4.7μs*/
  131.         NOP();
  132.         NOP();
  133.         NOP();
  134.         SCL=1;                  /*置時鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效*/
  135.         NOP();
  136.         NOP();
  137.         retc=retc<<1;
  138.         if(SDA==1)retc=retc+1;  /*讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中 */
  139.         NOP();
  140.         NOP();
  141.       }
  142.   SCL=0;   
  143.   NOP();
  144.   NOP();
  145.   return(retc);
  146. }

  147. /********************************************************************
  148.                      應(yīng)答子函數(shù)
  149. 函數(shù)原型:  void Ack_I2c(bit a);
  150. 功能:      主控器進行應(yīng)答信號(可以是應(yīng)答或非應(yīng)答信號,由位參數(shù)a決定)
  151. ********************************************************************/
  152. void Ack_I2c(bit a)
  153. {
  154.   
  155.   if(a==0)SDA=0;              /*在此發(fā)出應(yīng)答或非應(yīng)答信號 */
  156.   else SDA=1;
  157.   NOP();
  158.   NOP();
  159.   NOP();      
  160.   SCL=1;
  161.   NOP();
  162.   NOP();                    /*時鐘低電平周期大于4μs*/
  163.   NOP();
  164.   NOP();
  165.   NOP();  
  166.   SCL=0;                     /*清時鐘線,鉗住I2C總線以便繼續(xù)接收*/
  167.   NOP();
  168.   NOP();   
  169. }


  170. bit ISendByte(unsigned char sla,unsigned char c);
  171. unsigned char IRcvByte(unsigned char sla);
  172. void delay(unsigned int t);
  173. bit DACconversion(unsigned char sla,unsigned char c,  unsigned char Val);
  174. /******************************/
  175. void main(void) //主程序
  176. {
  177.        
  178.          TMOD=0x11;                          //設(shè)置定時器0工作模式,16位計數(shù)模式
  179.          TH0=THCO;                  
  180.          TL0=TLCO;
  181.          TR0=1;                                  //啟動定時器
  182.          ET0=1;                                //使能定時器中斷                  
  183.          EA=1;                                //開總中斷
  184.          P14=0;               
  185.         while(1)
  186.         {
  187.          
  188.           if(P20==0&&hz<90)
  189.           {
  190.                   delay(7000);
  191.                 if(P20==0)
  192.                 {
  193.                          hz++;               
  194.                 }
  195.           }
  196.            if(P21==0&&hz>10)
  197.           {
  198.                   delay(7000);
  199.                 if(P21==0)
  200.                 {
  201.                          hz--;               
  202.                 }
  203.           }
  204.           if(P22==0&&fd<=4)
  205.           {
  206.                   delay(7000);
  207.                 if(P22==0)
  208.                 {
  209.                         fd=fd+0.1;
  210.                 }
  211.           }               
  212.           if(P32==0&&fd>0)
  213.           {
  214.                   delay(7000);
  215.                 if(P32==0)
  216.                 {                                                                                                                                                                                                          
  217.                         fd=fd-0.1;
  218.                 }
  219.           }

  220.           a=fd*51;                          
  221.           if(flag==1)
  222.           {
  223.       flag=0;
  224.       cnt++;
  225.                         if(cnt%2==1)  DACconversion(PCF8591,0x40,a);
  226.       else DACconversion(PCF8591,0x40,0);
  227.                         Data_Buffer[0]=hz/10;
  228.                         Data_Buffer[1]=hz%10;
  229.                         Data_Buffer[2]=(int)fd;
  230.       Data_Buffer[3]=(int)(fd*10)%10;
  231.           }
  232.    }
  233. }


  234. void timer0() interrupt 1         //定時器中斷服務(wù)子程序
  235. {
  236.          static unsigned int count=0;//軟計時變量定義
  237.          static unsigned char Bit=0;        //靜態(tài)變量,退出程序后,值保留
  238.          
  239.          TH0=THCO;
  240.          TL0=TLCO;
  241.        
  242.          Bit++;       
  243.          if(Bit>=4)Bit=0;
  244.          P2|=0xf0;                                        //先關(guān)位碼
  245.          P0=Duan[Data_Buffer[Bit]];        //開段碼
  246.          if(Bit==2)P0|=0x80;
  247.          switch(Bit)                                //送位碼
  248.          {
  249.           case 0: P24=0;break;
  250.           case 1: P25=0;break;
  251.           case 2: P26=0;break;
  252.           case 3: P27=0;break;
  253.          }

  254.          t=(float)1/hz;
  255.          t=t/2;
  256.          t=t*1000;
  257.          count++;
  258.          if(count>=(t/5))                                //半個周期時間到
  259.          {
  260.             count=0;   
  261.             flag=1;       
  262.          }            
  263. }



  264. /*******************************************************************
  265. DAC 變換, 轉(zhuǎn)化函數(shù)               
  266. *******************************************************************/
  267. bit DACconversion(unsigned char sla,unsigned char c,  unsigned char Val)
  268. {
  269.    Start_I2c();              //啟動總線
  270.    SendByte(sla);            //發(fā)送器件地址
  271.    if(ack==0)return(0);
  272.    SendByte(c);              //發(fā)送控制字節(jié)
  273.    if(ack==0)return(0);
  274.    SendByte(Val);            //發(fā)送DAC的數(shù)值  
  275.    if(ack==0)return(0);
  276.    Stop_I2c();               //結(jié)束總線
  277.    return(1);
  278. }

  279. /*******************************************************************
  280. ADC發(fā)送字節(jié)[命令]數(shù)據(jù)函數(shù)               
  281. *******************************************************************/
  282. bit ISendByte(unsigned char sla,unsigned char c)
  283. {
  284.    Start_I2c();              //啟動總線
  285.    SendByte(sla);            //發(fā)送器件地址
  286.    if(ack==0)return(0);
  287.    SendByte(c);              //發(fā)送數(shù)據(jù)
  288.    if(ack==0)return(0);
  289.    Stop_I2c();               //結(jié)束總線
  290.    return(1);
  291. }

  292. void delay(unsigned int t)
  293. {
  294.         while(t--);
  295. }
復(fù)制代碼


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:186122 發(fā)表于 2017-4-4 21:10 | 只看該作者
lllllllllllllllllllllllllllllllllllllllllllllllll21332威威威威
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美三级不卡 | 男女免费视频网站 | 欧美电影免费网站 | 亚洲视频在线一区 | 日日摸日日添日日躁av | 成人精品一区 | www亚洲精品 | 欧美日韩在线播放 | 亚洲一区视频 | 一级黄在线观看 | 欧美一区二区三区小说 | 卡通动漫第一页 | 黑色丝袜三级在线播放 | 一区二区在线不卡 | 久久久久亚洲精品国产 | 国产成人免费视频网站高清观看视频 | 黑人中文字幕一区二区三区 | 国产乱码精品一区二区三区中文 | 日韩午夜在线播放 | 久久精品视频91 | 久久久精品国产 | 国产一区在线看 | 中文字幕蜜臀av | 久久精品二区亚洲w码 | 久草欧美| 日韩精品亚洲专区在线观看 | 欧美在线一二三 | 亚洲综合大片69999 | 毛片入口| 日韩中文字幕在线观看 | 中文字幕 国产精品 | 米奇狠狠鲁 | 国产精品呻吟久久av凹凸 | 国产欧美一区二区三区国产幕精品 | 福利电影在线 | 成人三级网址 | 香蕉视频久久久 | 精品乱码一区二区三四区视频 | 狠狠操狠狠操 | 日韩av在线不卡 | 亚洲人成在线播放 |