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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

求一個STC15W4K單片機程序的分析

[復制鏈接]
跳轉到指定樓層
樓主
ID:386561 發表于 2018-10-7 16:44 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
50黑幣
這是一個STC15W4K的單片機程序,我希望給我分析一下這些語句都是什么意思,重點分析一下ad方面的就行,12864,矩陣那些可以可無,程序我放在壓縮包里了
  1. #include        "STC15W4K.H"
  2. #include    "intrins.h"
  3. #include  "LCD12864.h"

  4. #define     MAIN_Fosc      24000000L   //定義主時鐘

  5. #define SDO            0x02           

  6. #define ADS7950_SCLK_HIGH    P10=1
  7. #define ADS7950_SCLK_LOW     P10=0
  8. #define ADS7950_SDI_HIGH     P12=1
  9. #define ADS7950_SDI_LOW      P12=0
  10. #define ADS7950_CS_HIGH      P13=1
  11. #define ADS7950_CS_LOW       P13=0
  12. #define ADS7950_IN           P1

  13. #define MODE_MANUAL_CH0        0x1800
  14. #define MODE_MANUAL_CH1        0x1880
  15. #define MODE_MANUAL_CH2        0x1900
  16. #define MODE_MANUAL_CH3        0x1980
  17. //extern u32 s;
  18. u16 s=0;
  19. u8 k;
  20. //void ADS7950_PORT_Init();
  21. void  delay_us(u16 us);

  22. unsigned char i;
  23. unsigned char        key_Pressed;
  24. unsigned char        key_val=0;
  25. unsigned char        key_flag;

  26. unsigned char LCD_First_Line0[] ={"日期: 2015:10:30"};
  27. unsigned char LCD_Second_Line0[] ={"時間:   10:30:00"};
  28. unsigned char LCD_third_Line0[] ={"電壓:        V          "};  
  29. unsigned char LCD_fourth_Line[] ={"矩陣按鍵:       "};
  30.   
  31. void LCD_Display_Fresh(void);
  32. void    LCDInit(void);  

  33. sbit   press_flag1= P4^4;
  34. sbit   press_flag2= P4^5;
  35. sbit   press_flag3= P4^6;
  36. sbit   press_flag4= P4^7;

  37. unsigned int ADS7950_ReadResultAndSetNextSample(unsigned int uiSendData);


  38. void main(void)
  39. {
  40.          u8 num;
  41.         volatile unsigned int spi_result;
  42.         volatile unsigned int sample_result;
  43.         //volatile unsigned int sample_channel[11];
  44.         volatile unsigned long int voltage;
  45.         //unsigned char times;
  46. //        volatile unsigned int ok_times,error_times;

  47.     P0M1 = 0;   P0M0 = 0;   //設置為準雙向口
  48.     P1M1 = 0;   P1M0 = 0;   //設置為準雙向口
  49.     P2M1 = 0;   P2M0 = 0;   //設置為準雙向口
  50.     P3M1 = 0;   P3M0 = 0;   //設置為準雙向口
  51.     P4M1 = 0;   P4M0 = 0;   //設置為準雙向口
  52.     P5M1 = 0;   P5M0 = 0;   //設置為準雙向口
  53.     P6M1 = 0;   P6M0 = 0;   //設置為準雙向口
  54.     P7M1 = 0;   P7M0 = 0;   //設置為準雙向口
  55.        
  56.        
  57.         P6 |= 0xf0;
  58.     spi_result = ADS7950_ReadResultAndSetNextSample(MODE_MANUAL_CH2);
  59.          LCDInit();
  60.           while(1)  
  61.         {
  62.                 Key_Event();
  63.                 spi_result = ADS7950_ReadResultAndSetNextSample(MODE_MANUAL_CH2);
  64.             sample_result = spi_result & 0xFFF;
  65.                 delay_us(10);
  66.                          
  67.            //voltage[times] =  sample_result[times]*2500/4096    //--->2500/4096=0.610
  68.                 voltage =  sample_result*(unsigned long int)610/1000;   //mV
  69.                 delay_us(500);
  70.                 //num++;
  71.                 //if(num==100)
  72.                 //{
  73.                  // num=0;
  74.                     
  75.                         //s=voltage;                                                        //模式1
  76.                     s=voltage*2;                                                        //模式2
  77.                 //}
  78.                 LCD_Display_Fresh();
  79.         }                                                              
  80. }
  81. /* Simulate SPI Read and Write ADS7950;
  82. *
  83. * SDO--The first bit clocks out at the falling edge of  CS;
  84. *    --next 15 bits clocks out at the falling edge of SCLK;
  85. * SDI--latch data on the rising edge of SCLK;
  86. *
  87. * */

  88. unsigned int ADS7950_ReadResultAndSetNextSample(unsigned int uiSendData)
  89. {
  90.           unsigned int uiSendTimes,result;

  91.           result=0;

  92.           ADS7950_CS_HIGH;
  93.           ADS7950_SCLK_LOW;
  94.           delay_us(50);                        //__delay_cycles(30);//delay 20ns at least
  95.           ADS7950_CS_LOW;
  96.           delay_us(50);                         //__delay_cycles(30);//delay 40ns at least  for the first SDO

  97.           for(uiSendTimes=16;uiSendTimes>0;uiSendTimes--)                                 //讀16次數據
  98.           {

  99.                     //prepare one bit to send
  100.                     if((uiSendData & 0x8000)== 0x8000) ADS7950_SDI_HIGH;                //輸入第一位
  101.                 else  ADS7950_SDI_LOW;

  102.                     uiSendData <<=1;

  103.                     //read one bit
  104.                     result<<=1;
  105.                     if(( ADS7950_IN & SDO)== SDO) result |= 0x0001;

  106.                     //delay 20ns at least  to set sclk high
  107.                      delay_us(50);                       //__delay_cycles(50);

  108.                     ADS7950_SCLK_HIGH; //rising edge of SCLK, latch one bit
  109.                     delay_us(50);
  110.                     ADS7950_SCLK_LOW;  //falling edge of SCLK, SDO clocks on one bit
  111.                     delay_us(50);
  112.           }

  113.           ADS7950_CS_HIGH;
  114.           return result;

  115. }

  116. void LCD_Display_Fresh(void)
  117. {
  118.                   
  119.           LCD_Position(1,0);                              // "日期:"
  120.           for(i=0;i<16;i++)
  121.           {
  122.               WriteDataLCD(LCD_First_Line0[i]);
  123.           }
  124.                            
  125.            
  126.           LCD_Position(2,0);                              // Set second line display
  127.           for(i=0;i<16;i++)                                // "時間:"
  128.           {
  129.               WriteDataLCD(LCD_Second_Line0[i]);
  130.           }
  131.          
  132.          
  133.           LCD_Position(3,0);
  134.                   for(i=0;i<6;i++)                              
  135.             {
  136.                 WriteDataLCD(LCD_third_Line0[i]);
  137.             }
  138.                   WriteDataLCD(0x30+s/1000%10);
  139.                   WriteDataLCD(0x20+0x0E);
  140.                   WriteDataLCD(0x30+s/100%10);
  141.                   WriteDataLCD(0x30+s/10%10);
  142.                   WriteDataLCD(0x30+s%10);
  143.                    for(i=12;i<16;i++)                                
  144.           {
  145.              WriteDataLCD(LCD_third_Line0[i]);
  146.           }
  147.           LCD_Position(4,0);                              
  148.           for(i=0;i<10;i++)                                
  149.           {
  150.               WriteDataLCD(LCD_fourth_Line[i]);
  151.           }
  152.                   
  153.                    WriteDataLCD(0x30+key_val/10);
  154.                    WriteDataLCD(0x30+key_val%10);
  155.                    //WriteDataLCD(0x30+ KeyCode/10);
  156.                    //WriteDataLCD(0x30+ KeyCode%10);
  157.                   for(i=13;i<16;i++)                                
  158.           {
  159.               WriteDataLCD(LCD_fourth_Line[i]);
  160.           }
  161.                   
  162.          delay_us(2000);
  163.       
  164. }

  165. //========================================================================
  166. // 函數:void  delay_us(u16 us)
  167. // 描述: 延時函數。
  168. // 參數: 自動適應主時鐘.
  169. // 返回: none.
  170. // 版本: VER1.0
  171. // 日期:
  172. // 備注:
  173. //========================================================================
  174. void  delay_us(u16 us)
  175. {
  176.      u16 i;
  177.      do{
  178.           i = MAIN_Fosc / 13000000;
  179.           while(--i)    ;   //14T per loop
  180.      }while(--us);
  181. }
復制代碼


IAP15W4K61S4-DCP-206 串口AD轉換電路(ADS7950).zip

57.31 KB, 下載次數: 18

我在這里

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

使用道具 舉報

沙發
ID:404160 發表于 2018-10-9 18:58 | 只看該作者
ADS7950是一個ADC轉換芯片(有IIC口或SPI口,具體每看)。ADS7950_ReadResultAndSetNextSample例程中,先啟動ADC芯片,然后按IIC(假定)接口格式讀ADC芯片內轉換后的數據16次。關ADC芯片(也許是讓ADC芯片重新開始轉換,為下次讀做準備),退出。看下ADS7950資料就明白了

評分

參與人數 1黑幣 +40 收起 理由
admin + 40 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

板凳
ID:386561 發表于 2018-10-12 15:56 | 只看該作者
飛云居士 發表于 2018-10-9 18:58
ADS7950是一個ADC轉換芯片(有IIC口或SPI口,具體每看)。ADS7950_ReadResultAndSetNextSample例程中,先啟 ...

額,其實并不是這樣,這個是根據電路板寫的程序,有一段是ad轉換,只有電路板上有模式1和2,直接使用模式1或2的數值就可以,接好線后直接就可以采集電壓......(過了幾天我終于弄懂了),也感謝你的幫助吧
回復

使用道具 舉報

地板
ID:977706 發表于 2021-11-6 16:56 | 只看該作者
樓主樓主能講的再詳細些嗎,這幾天我也遇到這個問題了,這段程序看不太懂。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久精品免费 | 黄色一级视频 | 91视频官网| 亚洲伊人精品酒店 | 在线国产一区二区三区 | 色性av| 国产成人在线视频免费观看 | 久久免费福利 | 看a网站 | 久久国| 视频一区二区在线观看 | 久久精品国产久精国产 | 日本不卡免费新一二三区 | 精品欧美色视频网站在线观看 | 99视频入口| 精品熟人一区二区三区四区 | 一区二区三区四区在线视频 | 色婷婷激情综合 | 国产精品视频在线观看 | 热99| 97久久精品 | 国产精品免费小视频 | 国产免费观看视频 | 亚洲精品久久久久久首妖 | 久久com | 国产精品视频免费看 | 在线成人av | 亚洲国产成人久久综合一区,久久久国产99 | 精品欧美一区二区精品久久 | 91国产视频在线观看 | 精品国产一二三区 | 国产亚洲高清视频 | 国产精品久久久久无码av | 日批日韩在线观看 | 拍真实国产伦偷精品 | 成人在线视频看看 | 日韩精品免费看 | 欧美aaa级 | 亚洲一区二区久久久 | 午夜欧美一区二区三区在线播放 | 老司机成人在线 |