找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3656|回复: 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 单片机教程网

快速回复 返回顶部 返回列表