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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC8A8k64S4A12單片機例程

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:535176 發(fā)表于 2019-8-25 20:20 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include "all.h"

  2. uchar xdata W25X16_Write_Buffer[256];//寫入的數(shù)據(jù)
  3. uchar xdata W25X16_Read_Buffer[256];//讀出的數(shù)據(jù)
  4. ////發(fā)送數(shù)據(jù)
  5. //uchar SPI_Flash_Send_Byte(uchar dat)
  6. //{
  7. // while(!(SPI_DIO&0x02));//等待發(fā)送緩沖區(qū)為空//SPI_SR=TXE位
  8. //         Flash_DO=dat;//將發(fā)送的數(shù)據(jù)送到數(shù)據(jù)寄存器
  9. //  while(!(SPI_DIO&0x01));//等待接收緩沖區(qū)非空//SPI_SR=RXNE位
  10. //                return SPI_DR;
  11. //}

  12. //向W25X16發(fā)送一個字節(jié)
  13. void SPI_Flash_Send_Reg(uchar dat)
  14. {
  15. uchar idata i;
  16.         _nop_();
  17.         _nop_();
  18.         Flash_SCLK=1;
  19.         _nop_();
  20.                 _nop_();
  21.         for(i=0;i<8;i++)
  22.         {
  23.          Flash_SCLK=0;
  24.                 _nop_();
  25.                 _nop_();
  26.         Flash_DIO=(bit)(dat&0x80);//先傳送高位
  27.                 _nop_();
  28.                 _nop_();
  29.         Flash_SCLK=1;//上升沿輸入數(shù)據(jù)
  30.                 _nop_();
  31.                 _nop_();
  32.                 dat<<=1;
  33.         }
  34. }

  35. //向W25X16讀一個字節(jié)
  36. uchar SPI_Flash_Read_Data()
  37. {
  38. uchar idata i;
  39. uchar idata dat;
  40.         _nop_();
  41.                 _nop_();
  42.         Flash_SCLK=1;
  43. //        _NOP_();
  44. //        _NOP_();
  45.         for(i=0,dat=0;i<8;i++)
  46.         {
  47.          Flash_SCLK=0;
  48.                 _nop_();
  49.                 _nop_();
  50.                 dat<<=1;//高位
  51.         if(Flash_DO)//如果高位為1
  52.                 dat|=0x01;
  53.         Flash_SCLK=1;//一個上升沿讀一次
  54.                 _nop_();
  55.                 _nop_();
  56.         }
  57.         return dat;
  58. }

  59. //1、寫使能
  60. void SPI_Flash_Write_Enable()
  61. {
  62.   Flash_CS=0;//拉低選中芯片
  63.         SPI_Flash_Send_Reg(0x06);//
  64.         Flash_CS=1;//拉高不選中芯片
  65. }

  66. ////2.寫禁止指令
  67. //void SPI_Flash_Write_Forbid()
  68. //{
  69. //  Flash_CS=0;//拉低選中芯片
  70. //        SPI_Flash_Send_Reg(0x04);//
  71. //        Flash_CS=1;//拉高不選中芯片
  72. //}

  73. //3.讀狀態(tài)寄存器//測試擦除是否完成
  74. void SPI_Flash_Read_Status()
  75. {
  76.         uchar Flash_statue=0;//狀態(tài)寄存器值變量
  77.   Flash_CS=0;//拉低選中芯片
  78.         SPI_Flash_Send_Reg(0x05);//
  79.         do
  80.         {
  81.         //Flash_statue=SPI_Send_byte(0xff);//
  82.                 Flash_statue=SPI_Flash_Read_Data();//
  83.         }
  84.         while(Flash_statue&0x01);//等待芯片非忙綠狀態(tài)

  85.   Flash_CS=1;  //拉高不選中芯片       
  86.        
  87.        
  88. }

  89. ////4.寫狀態(tài)寄存器指令
  90. //void SPI_Flash_Write_Status()
  91. //{

  92. //  Flash_CS=0;//拉低選中芯片
  93. //        SPI_Flash_Write_Enable();//使能
  94. //        SPI_Flash_Send_Reg(0x01);//
  95. //        SPI_Flash_Send_Reg(0x00);//寫入狀態(tài)的數(shù)據(jù)
  96. //        //通過寫入的狀態(tài)的值可以把芯片的部分或全部設(shè)置成只讀
  97. //        //
  98. //  Flash_CS=1;//拉高不選中芯片       
  99. //}


  100. //5.讀數(shù)據(jù)指令
  101. void SPI_Flash_Read_Byte(uchar *pBuffer,ulong ReadAddr,uint NumRead)
  102. {
  103. Flash_CS=0;//拉低選中芯片
  104.         SPI_Flash_Send_Reg(0x03);//
  105.         //24位地址
  106.         SPI_Flash_Send_Reg((ReadAddr&0xff0000)>>16);//先發(fā)送高8位
  107.         SPI_Flash_Send_Reg((ReadAddr&0xff00)>>8);//再發(fā)送中間8位
  108.         SPI_Flash_Send_Reg(ReadAddr&0xff);//低8位
  109.        
  110.         while(NumRead--)
  111.         {
  112.          *pBuffer=SPI_Flash_Read_Data();//讀一個字節(jié)的數(shù)據(jù)
  113.                 pBuffer++;//指向下一個要讀取的地址
  114.         }
  115.        
  116.         Flash_CS=1;//拉高不選中芯片
  117. }

  118. ////6.快速讀數(shù)據(jù)指令
  119. //void SPI_Flash_Fast_Read_Data(uchar *pBuffer,ulong *ReadAddr,uint NumRead)
  120. //{
  121. //  Flash_CS=0;//拉低選中芯片
  122. //        SPI_Flash_Send_Reg(0x0B);//
  123. //       
  124. //        SPI_Flash_Send_Reg((ReadAddr&0xff0000)>>16);先發(fā)送高8位
  125. //        SPI_Flash_Send_Reg((ReadAddr&0xff00)>>8);再發(fā)送中間8位
  126. //        SPI_Flash_Send_Reg(ReadAddr&0xff);低8位
  127. //       
  128. //        SPI_Flash_Send_Reg(0xff);//等待8個時鐘
  129. //       
  130. //        while(NumRead--)
  131. //        {
  132. //         *pBuffer=SPI_Flash_Read_Data();//讀一個字節(jié)的數(shù)據(jù)
  133. //                pBuffer++;//指向下一個要讀取的地址
  134. //        }
  135. //       
  136. //        Flash_CS=1;//拉高不選中芯片
  137. //}

  138. ////7.快速讀雙輸出數(shù)據(jù)指令
  139. ////雙讀數(shù)據(jù)的讀取函數(shù)
  140. //uchar SPI_Flash_Fast_Read_Data()
  141. //{
  142. //        uchar idata i;
  143. //  uchar idata dat=0;
  144. //       
  145. //        //雙讀
  146. //        for(i=0;i<4;i++)
  147. //        {
  148. //                //讀取DO 的數(shù)據(jù)
  149. //         Flash_SCLK=1;
  150. //        _NOP_();
  151. //        _NOP_();
  152. //                dat<<=1;//高位
  153. //        if(Flash_DO)//如果高位為1
  154. //                dat|=0x01;
  155. //        Flash_SCLK=0;//下降沿
  156. //                _NOP_();
  157. //        _NOP_();       
  158. //        //讀取DIO的數(shù)據(jù)
  159. //                dat<<=1;//高位
  160. //        if(Flash_DIO)//如果高位為1
  161. //                dat|=0x01;
  162. //        Flash_SCLK=1;//上升沿
  163. //                _NOP_();
  164. //        _NOP_();       
  165. //        }
  166. //}
  167. //void SPI_Flash_Fast_Two_Read_Data(uchar *pBuffer,ulong *ReadAddr,uint NumRead)
  168. //{

  169. //  Flash_CS=0;//拉低選中芯片
  170. //        SPI_Flash_Send_Reg(0x3B);//
  171. //       
  172. //        SPI_Flash_Send_Reg((ReadAddr&0xff0000)>>16);先發(fā)送高8位
  173. //        SPI_Flash_Send_Reg((ReadAddr&0xff00)>>8);再發(fā)送中間8位
  174. //        SPI_Flash_Send_Reg(ReadAddr&0xff);低8位
  175. //       
  176. //        SPI_Flash_Send_Reg(0xff);//等待8個時鐘

  177. //        while(NumRead--)
  178. //        {
  179. //         *pBuffer=SPI_Flash_Fast_Read_Data();//讀一個字節(jié)的數(shù)據(jù)
  180. //                pBuffer++;//指向下一個要讀取的地址
  181. //        }
  182. //       
  183. //        Flash_CS=1;//拉高不選中芯片
  184. //}
  185. //8.頁編程指令
  186. void SPI_Flash_Write_Page(uchar *pBuffer,ulong WriteAddr,uint NumWrite)
  187. {
  188.         SPI_Flash_Write_Enable();//先使能對芯片的操作
  189. Flash_CS=0;//拉低選中芯片
  190.         SPI_Flash_Send_Reg(0x02);//
  191.        
  192.         SPI_Flash_Send_Reg((WriteAddr&0xff0000)>>16);//先發(fā)送高8位
  193.         SPI_Flash_Send_Reg((WriteAddr&0xff00)>>8);//再發(fā)送中間8位
  194.         SPI_Flash_Send_Reg(WriteAddr&0xff);//低8位
  195.        
  196.         while(NumWrite--)
  197.         {
  198.          SPI_Flash_Send_Reg(*pBuffer);//發(fā)送欲寫入flash的數(shù)據(jù)
  199.                 pBuffer++;//指向下一個要寫入的地址
  200.         }
  201.         Flash_CS=1;//拉高不選中芯片
  202.         SPI_Flash_Read_Status();//等待寫操作結(jié)束
  203. }

  204. ////頁地址不對齊
  205. //void SPI_Flash_Write_Addr(uchar *pBuffer,ulong WriteAddr,uint NumWrite)
  206. //{
  207. // uchar Numofpage=0,Numofsingle=0,addr=0,count=0,time=0;//剩下的
  208. //        addr=WriteAddr%256;//判斷要寫入的地址是否頁對齊
  209. //        count=256-addr;//剩下的地址
  210. //        Numofpage=NumWrite/256;//一共寫多少整頁
  211. //        Numofsingle=NumWrite%256;//還剩多少字節(jié)
  212. //       
  213. //        if(addr==0)//判斷寫入的地址是否頁對齊
  214. //        {
  215. //          if(Numofpage===0)//如果只需寫一頁
  216. //                {
  217. //                  SPI_Flash_Write_Page(pBuffer,WriteAddr,NumWrite);
  218. //                }
  219. //                else//不止寫一頁
  220. //                {
  221. //                  while(Numofpage--)
  222. //                        {
  223. //                          SPI_Flash_Write_Page(pBuffer,WriteAddr,256);
  224. //                                WriteAddr+=256;//換下一頁
  225. //                                pBuffer+=256;
  226. //                        }
  227. //                        SPI_Flash_Write_Page(pBuffer,WriteAddr,Numofsingle);//把剩下的字節(jié)寫完
  228. //                }
  229. //        else //要寫入的地址不是頁對齊的地址
  230. //        {
  231. //          if(Numofpage==0)//只需要寫一頁
  232. //                {
  233. //                  if(count<Numofsingle)//判斷要剩下的地址如果不夠?qū)懽止?jié)
  234. //                        {
  235. //                         temp=Numofsingle-count;//還剩下的字節(jié)
  236. //                        SPI_Flash_Write_Page(pBuffer,WriteAddr,count);//寫滿一頁
  237. //                                WriteAddr+=count;//換下一頁
  238. //                                pBuffer+=count;
  239. //                                SPI_Flash_Write_Page(pBuffer,WriteAddr,temp);//往新的一頁里寫剩下的數(shù)據(jù)
  240. //                        }
  241. //                        else//剩下的地址夠?qū)懽止?jié)
  242. //                        {
  243. //                         SPI_Flash_Write_Page(pBuffer,WriteAddr,NumWrite);
  244. //                        }       
  245. //                }
  246. //                else//不止寫一頁
  247. //                {
  248. //                  NumWrite-=count;//先把空的地址填滿之后還剩的字節(jié)
  249. //                        Numofpage=NumWrite/256;//總共還要寫多少頁
  250. //                        Numofsingle=NumWrite%256;//還剩下的字節(jié)數(shù)
  251. //                        SPI_Flash_Write_Page(pBuffer,WriteAddr,count);//把空的地址填滿
  252. //                        WriteAddr+=count;//換下一頁
  253. //                                pBuffer+=count;
  254. //                        while(Numofpage--)//整頁
  255. //                        {
  256. //                          SPI_Flash_Write_Page(pBuffer,WriteAddr,256);
  257. //                                WriteAddr+=256;//換下一頁
  258. //                                pBuffer+=256;
  259. //                        }
  260. //                        if(Numofsingle!=0)
  261. //                        {
  262. //                          SPI_Flash_Write_Page(pBuffer,WriteAddr,Numofsingle);//把剩下的寫完
  263. //                        }
  264. //                }       
  265. //         }
  266. //        }
  267. //}

  268. ////9.塊擦除指令(64KB)256頁
  269. //void SPI_Flash_Block_Erase(ulong BlockAddr)
  270. //{
  271. //  SPI_Flash_Write_Enable();//寫使能
  272. //        Flash_CS=0;//拉低選中芯片
  273. //        SPI_Flash_Send_Reg(0xD8);//
  274. //       
  275. //        SPI_Flash_Send_Reg((BlockAddr&0xff0000)>>16);先發(fā)送高8位
  276. //        SPI_Flash_Send_Reg((BlockAddr&0xff00)>>8);再發(fā)送中間8位
  277. //        SPI_Flash_Send_Reg(BlockAddr&0xff);低8位
  278. //       
  279. //        Flash_CS=1;//拉高不選中芯片
  280. //        SPI_Flash_Read_Status();//等待塊清除操作完成
  281. //}

  282. //10.扇區(qū)擦除(4KB)16頁
  283. void SPI_Flash_Section_Erase(ulong SectionAddr)
  284. {
  285.   SPI_Flash_Write_Enable();//寫使能
  286.         Flash_CS=0;//拉低選中芯片
  287.         SPI_Flash_Send_Reg(0x20);//
  288.        
  289.         SPI_Flash_Send_Reg((SectionAddr&0xff0000)>>16);//先發(fā)送高8位
  290.         SPI_Flash_Send_Reg((SectionAddr&0xff00)>>8);//再發(fā)送中間8位
  291.         SPI_Flash_Send_Reg(SectionAddr&0xff);//低8位
  292.        
  293.         Flash_CS=1;//拉高不選中芯片
  294.         SPI_Flash_Read_Status();//等待扇區(qū)操作完成
  295. }

  296. ////11.芯片擦除指令
  297. //void SPI_Flash_Chip_Erase()
  298. //{
  299. // SPI_Flash_Write_Enable();//寫使能
  300. //        Flash_CS=0;//拉低選中芯片
  301. //        SPI_Flash_Send_Reg(0xc7);//
  302. //        Flash_CS=1;//拉高不選中芯片
  303. //        SPI_Flash_Read_Status();//等待塊清除操作完成
  304. //}

  305. ////12.芯片掉電命令
  306. //void SPI_Flash_Power-Fail()
  307. //{
  308. //        Flash_CS=0;//拉低選中芯片
  309. //        SPI_Flash_Send_Reg(0xB9);//
  310. //        Flash_CS=1;//拉高不選中芯片
  311. //        SPI_Flash_Read_Status();//等待塊清除操作完成
  312. //}


  313. //13.芯片掉電釋放/器件ID命令
  314. //14.芯片制造商/器件ID命令
  315. ////15.JEDEC ID序列指令
  316. //ulong SPI_Flash_Read_ID()
  317. //{
  318. //  ulong temp=0,temp1=0,temp2=0,temp3=0;//Flash暫存變量
  319. //        Flash_CS=0;//拉低選中芯片
  320. //        SPI_Flash_Send_Reg(0x9F);//
  321. //        SPI_Flash_Send_Reg(0xff);
  322. //        temp1=SPI_Flash_Read_Data();//從flash讀取第一個字節(jié)數(shù)據(jù)
  323. //        SPI_Flash_Send_Reg(0xff);
  324. //        temp2=SPI_Flash_Read_Data();//從flash讀取第一個字節(jié)數(shù)據(jù)
  325. //        SPI_Flash_Send_Reg(0xff);
  326. //        temp3=SPI_Flash_Read_Data();//從flash讀取第一個字節(jié)數(shù)據(jù)
  327. //  Flash_CS=1;//拉高不選中芯片
  328. //        temp=(((temp1<<16)|temp2<<8)|temp3);//拼合數(shù)據(jù)組成ID序列
  329. //        return temp;//返回序列號
  330. //}
復(fù)制代碼

本人大二新生,暑假期間寫了一點點基本程序,開發(fā)版是STC8A8K的,我在初學(xué)期間發(fā)現(xiàn)在這個板子的資料比較少,學(xué)習(xí)起來不太方便。以下程序本人都親自測試過,有個別沒有搞明白的,本人也都做了標記,希望能給初學(xué)者一點幫助,另外歡迎大佬糾正錯誤,完善程序。

TIM圖片20190825201502.png (40.74 KB, 下載次數(shù): 65)

TIM圖片20190825201502.png

TIM圖片20190825201526.png (56.96 KB, 下載次數(shù): 62)

TIM圖片20190825201526.png

STC8A8K原理圖.pdf

258.34 KB, 下載次數(shù): 63, 下載積分: 黑幣 -5

原理圖

STC8手冊-20180507.pdf

8.21 MB, 下載次數(shù): 43, 下載積分: 黑幣 -5

數(shù)據(jù)手冊

stc8a8k單個程序.zip

1.01 MB, 下載次數(shù): 176, 下載積分: 黑幣 -5

單個程序

stc8a8k.zip

98.75 KB, 下載次數(shù): 125, 下載積分: 黑幣 -5

一個工程多個文件

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

使用道具 舉報

沙發(fā)
ID:535176 發(fā)表于 2019-9-3 12:54 | 只看該作者
怎么好的東西,怎么都沒有人看到嗎?
回復(fù)

使用道具 舉報

板凳
ID:427492 發(fā)表于 2019-9-24 22:14 來自手機 | 只看該作者
你的SD卡,帶文件系統(tǒng)嗎
回復(fù)

使用道具 舉報

地板
ID:371527 發(fā)表于 2019-9-26 11:20 | 只看該作者
看了,下載了,很好,
回復(fù)

使用道具 舉報

5#
ID:371527 發(fā)表于 2019-9-26 11:21 | 只看該作者
我在用W25Q32
回復(fù)

使用道具 舉報

6#
ID:371527 發(fā)表于 2019-9-26 11:22 | 只看該作者
再加上SD那個有文件系統(tǒng)的應(yīng)用,更好,
回復(fù)

使用道具 舉報

7#
ID:371527 發(fā)表于 2019-9-26 11:24 | 只看該作者
8a8k,我用時,其芯片總是出故障,燒壞ADC輸入(加保護電阻了)看在AD精度還可以,就盡量采用
回復(fù)

使用道具 舉報

8#
ID:371527 發(fā)表于 2019-9-26 11:27 | 只看該作者
其它的,就是懷疑該芯片在制造上還有缺陷,開發(fā)板三個月?lián)Q個芯片,不是我電源就是他芯片在電源耐沖擊上有問題,不知你有何經(jīng)驗?
回復(fù)

使用道具 舉報

9#
ID:535176 發(fā)表于 2019-9-27 21:29 | 只看該作者
楓樹566 發(fā)表于 2019-9-24 22:14
你的SD卡,帶文件系統(tǒng)嗎

這個還沒搞好,不好意思啊,非常抱歉
回復(fù)

使用道具 舉報

10#
ID:535176 發(fā)表于 2019-9-27 21:30 | 只看該作者
1113634577 發(fā)表于 2019-9-26 11:22
再加上SD那個有文件系統(tǒng)的應(yīng)用,更好,

抱歉啊,還沒搞好哈
回復(fù)

使用道具 舉報

11#
ID:535176 發(fā)表于 2019-9-27 21:32 | 只看該作者
1113634577 發(fā)表于 2019-9-26 11:27
其它的,就是懷疑該芯片在制造上還有缺陷,開發(fā)板三個月?lián)Q個芯片,不是我電源就是他芯片在電源耐沖擊上有問 ...

芯片應(yīng)該沒問題吧,我的就正常使用,直接連接點電腦的USB,12V輸出,
回復(fù)

使用道具 舉報

12#
ID:613800 發(fā)表于 2019-9-28 16:31 | 只看該作者
樓主在嗎?能加你qq請教下嗎
回復(fù)

使用道具 舉報

13#
ID:160834 發(fā)表于 2020-1-11 21:52 | 只看該作者
好資料
回復(fù)

使用道具 舉報

14#
ID:954112 發(fā)表于 2021-11-4 17:25 | 只看該作者
為什么12864上面是STC15.h 不是STC8.H
回復(fù)

使用道具 舉報

15#
ID:92810 發(fā)表于 2021-11-5 15:48 | 只看該作者
樓主為什么不打包一下呢
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲第一视频 | 天天色天天射天天干 | 中文字幕在线欧美 | 欧美精品二区 | 欧美日在线 | 欧美在线视频不卡 | 欧美中文一区 | 激情黄色在线观看 | 高清亚洲 | 亚洲人免费视频 | 国产精品久久久久久久久 | 99中文字幕 | 午夜视频大全 | 国产色网 | 九九热这里只有精品6 | 午夜av电影| 欧美视频一区二区三区 | 亚洲欧美在线观看 | 日本黄色大片免费 | 成年免费在线观看 | 久久er99热精品一区二区 | 国产精品久久久久久久久久久新郎 | 精品无码久久久久久久动漫 | 精品一二 | 国产欧美性成人精品午夜 | 成人国产在线观看 | 国产精品区一区二区三 | 综合中文字幕 | 亚洲一区在线日韩在线深爱 | 亚洲一区二区视频在线观看 | 网站一区二区三区 | 欧洲一级毛片 | 国产精品视频一区二区三区四区国 | 欧美色专区 | av激情影院| 激情综合五月天 | 国产精品精品视频一区二区三区 | 欧美日韩亚洲系列 | 中文字幕乱码一区二区三区 | 色女人天堂 | 日本午夜精品一区二区三区 |