找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 7048|回復(fù): 7
收起左側(cè)

基于SCA100T制作的兩軸數(shù)字傾角儀 含單片機(jī)程序與圖紙

[復(fù)制鏈接]
ID:74513 發(fā)表于 2017-8-5 17:33 | 顯示全部樓層 |閱讀模式
公司項(xiàng)目需求,手臂抓取產(chǎn)品時(shí)為保證手臂夾抓處于水平位置,所以做了一款數(shù)字傾角儀。

該程序目前只完成通過(guò)單片機(jī)io模擬SPI通訊讀取SCA100T的數(shù)據(jù),并將數(shù)據(jù)簡(jiǎn)單的數(shù)字濾波一下顯示在1602上面;其中四顆按鈕的功能以及串口通訊部分還未完善。

已作出實(shí)際PCBA,顯示結(jié)果一切正常;源碼分享出來(lái)給有需要的朋友。
單片機(jī)型號(hào):STC12C5A60S2
雙軸傾角感應(yīng)芯片(感應(yīng)范圍雙軸±30°):SCA100T-D01
附件:源碼+SCA100T-D01的datasheet

圖紙:

原理圖

原理圖


0.png

單片機(jī)源程序如下:
  1. #include <STC12C5A60S2.h>
  2. #include <math.h>
  3. //#include <string.h>

  4. #define unint unsigned int
  5. #define unchar unsigned char

  6. #define N 30  //求平均的次數(shù)
  7. #define PI 3.141593       
  8. #define R 0x7e         //1602 右箭頭
  9. #define L 0x7f         //1602        左箭頭                               
  10. #define K 0xa0         //1602 空格



  11. //========SCA100T控制指令===
  12. #define MEAS 0x00//測(cè)量模式
  13. #define RWTR 0x08//讀寫(xiě)溫度數(shù)據(jù)寄存器
  14. #define RDSR 0x0a
  15. #define RLOAD 0x0b
  16. #define STX        0x0e//X通道自檢
  17. #define STY 0x0f//Y通道自檢
  18. #define RDAX 0x10 //讀X通道加速度值
  19. #define RDAY 0x11 //讀Y通道加速度值

  20. sbit Twinkle=P3^5;
  21. sbit sw1=P0^7;
  22. sbit sw2=P0^6;
  23. sbit sw3=P0^5;
  24. sbit sw4=P0^4;
  25. //========SCA100T  IO===========
  26. sbit SCK=P1^0;
  27. sbit MISO=P1^1;
  28. sbit MOSI=P1^2;
  29. sbit CSB=P1^5; //片選
  30. //=========子函數(shù)申明=========
  31. int count_x();
  32. int count_y();
  33.        
  34. //=========1602  IO=============數(shù)據(jù)端口在P0
  35. sbit RS=P4^0;// =1數(shù)據(jù),=0命令
  36. sbit RW=P3^7;// =1讀,=0寫(xiě)
  37. sbit EN=P3^6;//使能
  38. sbit BUSY=P2^7;//忙狀態(tài)線

  39. void init()
  40. {
  41. /*RI讀取完成時(shí)請(qǐng)求中斷的標(biāo)志,需軟件清零
  42.   TI發(fā)送完成時(shí)請(qǐng)求中斷的標(biāo)志,需軟件清零                  */
  43.         AUXR=0x40;//用定時(shí)器1做波特率發(fā)生器
  44.         SCON=0x50;//8bit工作模式,串口工作方式1_SM0=0/SM1=1,允許串口接收數(shù)據(jù)REN=1
  45.         TH1=TL1=-(11059200/12/32/9600);
  46.         TR1=1;
  47.         ES=1;  //串口中斷允許
  48.         EA=1;  //總中斷允許
  49.         IPH=IPH|0x10; //串口1的中斷優(yōu)先級(jí)最高
  50.         PS=1;//串口1的中斷優(yōu)先級(jí)最高
  51. }       

  52. /*void UART_T(unchar UART_data)        //發(fā)送數(shù)據(jù)到串口
  53. {          
  54.         SBUF=UART_data;        
  55.         while(!TI);
  56.         TI=0;//發(fā)送中斷標(biāo)志位清零
  57. }
  58. void UART_TC(unchar *str)        //發(fā)送字符到串口,用到string.h頭文件
  59. {
  60.         while(*str!='\0')
  61.         {
  62.                 UART_T(*str);
  63.                 *str=*str++;
  64.         }
  65.         *str=0;
  66. }                                                          */
  67.        
  68. void delay(unint z)        //延時(shí)函數(shù)
  69. {
  70.         unint i,j;
  71.         for(i=z;i>0;i--)
  72.                 for(j=110;j>0;j--);
  73. }                                                                                       
  74. void delay_spi(unint z)
  75. {
  76.         z*=12;
  77.         while(z--);
  78. }
  79. //==================SPI  SCA100T驅(qū)動(dòng)========
  80. void spi_stop()
  81. {
  82.         SCK=0;
  83.         CSB=1;//關(guān)閉片選
  84.         delay_spi(10);
  85. }
  86. void spi_reset()
  87. {
  88.         spi_stop();
  89. }
  90. void spi_start()
  91. {
  92.         SCK=0;
  93.         CSB=0;//開(kāi)片選,L有效
  94.         delay_spi(10);
  95. }
  96. void write_spi(unchar wdata)//寫(xiě)入一個(gè)字節(jié) 8 bit ,寫(xiě)指令用
  97. {
  98.         unchar i;

  99.         for(i=0;i<8;i++)
  100.         {
  101.                 SCK=0;
  102.                 delay_spi(10);
  103.                 if(wdata & 0x80)//按位于,取最高位
  104.                 {
  105.                         MOSI=1;
  106.                 }
  107.                 else
  108.                 {
  109.                         MOSI=0;
  110.                 }
  111.                 SCK=1;//上升沿SCA100T開(kāi)始讀自己的MOSI引腳
  112.                 wdata=wdata<<1;
  113.                 delay_spi(10);
  114.         }
  115.         SCK=0; //歸還時(shí)鐘總線
  116. }

  117. unint read_spi(unchar n)//讀入n個(gè)數(shù)據(jù)
  118. {
  119.         unint temp=0;
  120.         unchar i;
  121.         MISO=1;//置高,準(zhǔn)備接收數(shù)據(jù)
  122.         for(i=0;i<n;i++)
  123.         {
  124.                 temp=temp<<1;
  125.                 SCK=1;
  126.                 delay_spi(10);
  127.                 if(MISO==1)
  128.                 {
  129.                         temp=temp|0x01;
  130.                 }
  131.                 else
  132.                 {
  133.                         temp=temp&0x0ffe;
  134.                 }                                                               
  135.                 SCK=0; //下降沿時(shí),傾角儀輸出
  136.                 delay_spi(10);
  137.         }
  138.         return temp;
  139. }
  140. void init_spi()
  141. {
  142.         spi_reset();
  143.         delay_spi(1000);

  144.         spi_start();
  145.         write_spi(MEAS);
  146.         spi_stop();
  147.         delay_spi(1000);
  148. }

  149. unint read_x() //讀X軸加速度
  150. {
  151.         unint x_data;
  152.         spi_start();
  153.         write_spi(RDAX);
  154.         x_data=read_spi(11);
  155.         spi_stop();

  156.         return x_data;
  157. }
  158. unint read_y() //讀Y軸加速度
  159. {
  160.         unint y_data;
  161.         spi_start();
  162.         write_spi(RDAY);
  163.         y_data=read_spi(11);
  164.         spi_stop();

  165.         return y_data;
  166. }
  167. //==============顯示1602驅(qū)動(dòng)================
  168. void wait_1602()//檢測(cè)忙狀態(tài)

  169. ……………………

  170. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………

  171. ……………………

  172. void main()
  173. {
  174.     init_spi();
  175.     init_1602();
  176.     while(1)
  177.     {        
  178.         show(count_x(),count_y());
  179. //        delay(2000);
  180. //        Twinkle=~Twinkle;
  181.     }
  182. }
復(fù)制代碼

所有資料51hei提供下載:
程序源碼 ICdatasheet.zip (2.49 MB, 下載次數(shù): 119)




評(píng)分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:187532 發(fā)表于 2018-3-28 11:42 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:128321 發(fā)表于 2018-3-29 09:32 | 顯示全部樓層
謝謝分享,正需要,可惜下載不了
回復(fù)

使用道具 舉報(bào)

ID:187532 發(fā)表于 2018-4-2 19:33 | 顯示全部樓層
老兄 sbit BUSY=P2^7是1602哪根線啊
回復(fù)

使用道具 舉報(bào)

ID:170098 發(fā)表于 2019-9-16 09:43 | 顯示全部樓層
不知道這個(gè)數(shù)字傾角儀器的精度是多少?
回復(fù)

使用道具 舉報(bào)

ID:372588 發(fā)表于 2019-11-7 15:17 | 顯示全部樓層
感謝,下載來(lái)看看,論壇能有這種分享真是太好了
回復(fù)

使用道具 舉報(bào)

ID:709057 發(fā)表于 2020-3-15 20:48 | 顯示全部樓層
想要這個(gè)分享
回復(fù)

使用道具 舉報(bào)

ID:86069 發(fā)表于 2020-3-20 13:38 | 顯示全部樓層
精度如何
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表