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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC15W408AS單片機串口通訊帶串口移植功能+ADC采集+定時器+EEPROM綜合程序

  [復制鏈接]
跳轉到指定樓層
樓主
ID:280979 發表于 2023-7-11 13:07 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
【聲明】此程序僅用于學習與參考!  
*********************************************************************/
  1. #include<STC15W408AS.h>
  2. #include<math.h>                  //計算小數點的頭文件
  3. #include <intrins.h>          //用nop函數延時的頭文件
  4. #define uchar unsigned char//宏定義無符號字符型
  5. #define uint unsigned int  //宏定義無符號整型
  6. /*數據類型定義*/
  7. typedef signed char        int8;
  8. typedef signed int        int16;
  9. typedef signed long        int32;
  10. typedef unsigned char        uint8;
  11. typedef unsigned int        uint16;
  12. typedef unsigned long        uint32;

  13. #define S1_S0 0x40    //P_SW3.6
  14. #define S1_S1 0x80    //P_SW3.7

  15. #define ENABLE_IAP 0x83 //系統工作時鐘<12MHz 時,對IAP_CONTR 寄存器設置此值
  16. #define CMD_IDLE 0
  17. #define CMD_READ 1
  18. #define CMD_PROGRAM 2
  19. #define CMD_ERASE 3
  20. #define ENABLE_IAP 0x83//SYSCLK<12MH
  21. #define IAP_ADDRESS 0x0000        //存儲地址
  22. #define FOSC 11059200L  
  23. #define BAUD 9600   

  24. #define ADC_POWER   0x80            //ADC電源控制位
  25. #define ADC_FLAG    0x10            //ADC完成標志
  26. #define ADC_START   0x08            //ADC起始控制位
  27. #define ADC_SPEEDLL 0x00            //540個時鐘
  28. #define ADC_SPEEDL  0x20            //360個時鐘
  29. #define ADC_SPEEDH  0x40            //180個時鐘
  30. #define ADC_SPEEDHH 0x60            //90個時鐘
  31. uint AD_H=0,AD_L=0,AD_Dat=0;
  32. /*定義遙控引腳*/
  33. sbit IN1 = P1^2;                        /*下*/
  34. sbit IN2 = P1^3;                        /*上*/
  35. sbit IN3 = P1^4;                        /*西*/
  36. sbit IN4 = P1^5;                        /*東*/
  37. sbit IN5 = P1^6;                        /*北*/
  38. sbit IN6 = P1^7;                        /*南*/
  39. sbit IN7 = P5^4;                        /*2*/
  40. sbit IN8 = P5^5;                        /*1*/
  41. /*AD采集引腳*/
  42. sbit ADC1=P1^1;//電池電壓檢測
  43. /*供電自鎖引腳*/
  44. sbit gong_dian=P1^0;//電池電壓檢測
  45. /*指示燈引腳*/
  46. sbit RUN=P3^2;//運行指示燈
  47. sbit dian_chi=P3^3;//電池指示燈
  48. /*控制引腳*/
  49. sbit MD0=P3^4;//工作模式
  50. sbit MD1=P3^5;//工作模式

  51. uchar DATE=0x00;//遙控器按鍵
  52. uchar add=0X01; //遙控器地址

  53. bit write=0;
  54. bit flag_zx=0;
  55. uchar sendBuf[10];          //發送緩沖區
  56. uchar receBuf[10];    //接收緩沖區
  57. uchar r=0;//串口接收數據計數值
  58. uint tcnt=0;//定時器時間計數值
  59. uchar sec=0;//定時器時間計數值
  60. uchar k=100;//延時函數時間函數
  61. bit bz1=0;//輸入按鍵標志
  62. bit bz2=0;//輸入按鍵標志
  63. bit bz3=0;//輸入按鍵標志
  64. bit bz4=0;//輸入按鍵標志
  65. bit bz5=0;//輸入按鍵標志
  66. bit bz6=0;//輸入按鍵標志
  67. bit bz7=0;//輸入按鍵標志
  68. bit bz8=0;//輸入按鍵標志

  69. bit dian_liang_bj=0;//電量報警
  70. bit fa_she_bj=0;//數據發射標志

  71. uchar adc1=0;//AD采集的數據值
  72. /********************************************************************
  73.                             定義 ISP/IAP/EEPROM 命令
  74. *********************************************************************/

  75. void IapIdle();//禁用 ISP/IAP/EEPROM functionmake 單片機 在 一 安全 狀態
  76. uint8 IapReadByte(uint16 addr);//讀數據
  77. void IapProgramByte(uint16 addr, uint8 dat);//寫數據
  78. void IapEraseSector(uint16 addr);//擦除數據
  79. void KEY1();//模式1函數
  80. void delay(uchar t);//擦除數據
  81. void clear_receBuf();//清空發送緩沖區
  82. void send_date1();//數據函數
  83. void senduart1();//發送函數
  84. void InitADC();//AD轉換初始化程序
  85. uchar ADCRead(uchar px); //轉換輸出的數據 (PX為通道口)
  86. /********************************************************************
  87.                          AD轉換初始化程序
  88. *********************************************************************/
  89. void InitADC()//AD轉換初始化程序
  90. {
  91. P1ASF = 0x02;          //設置P1.1口AD轉換,必須加//   P1M0=0X1E;
  92. ADC_RES = 0;                   //AD數據寄存器清空
  93. ADC_CONTR = ADC_POWER | ADC_SPEEDLL;//打開AD電源,轉換周期210
  94. _nop_();                        //延時一個機器周期
  95. _nop_();
  96. _nop_();                        //延時一個機器周期
  97. }
  98. /********************************************************************
  99.                          AD轉換控制程序
  100. *********************************************************************/
  101. uchar ADCRead(uchar px)          //轉換輸出的數據 (PX為通道口)
  102. {
  103.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL |px| ADC_START;//開始轉換
  104.     _nop_();                        //延時一個機器周期
  105.     _nop_();                                                //延時一個機器周期
  106.     _nop_();                                                //延時一個機器周期
  107.     _nop_();                                                //延時一個機器周期
  108.     while (!(ADC_CONTR & ADC_FLAG));//等待轉換結束
  109.     ADC_CONTR &= ~ADC_FLAG;         //關閉AD轉換
  110. //        AD_H = ADC_RES;                                        // 修改的 注:把高8位AD值付給AD_H
  111. //        AD_H <<= 2;                                           // 修改的  注:高八位左移2位
  112. //        AD_L = ADC_RESL & 0x03;                   // 修改的  注:取低兩位
  113. //        AD_Dat =        AD_H | AD_L;          // 修改的          注:把高八位和低兩位合并在一起
  114. //        AD_Dat =        AD_H | AD_L;          // 修改的          注:把高八位和低兩位合并在一起
  115.     AD_Dat = ADC_RES;
  116.     return AD_Dat;                //返回數據
  117. }
  118. /********************************************************************
  119.                             延時函數
  120. *********************************************************************/
  121. void delay(uchar t)
  122. {
  123.   uchar i,j;
  124.    for(i=0;i<t;i++)
  125.    {
  126.             for(j=130;j>0;j--);
  127.          { ;
  128.          }
  129.    }
  130. }
  131. /****************數據函數*********************/
  132. void send_date1()//數據函數
  133. {         
  134. adc1=ADCRead(1);        
  135. sendBuf[0]=0xAA;
  136. sendBuf[1]=add;
  137. sendBuf[2]=adc1;
  138. sendBuf[3]=DATE;
  139. sendBuf[4]=0xBB;
  140. }
  141. /****************發送函數*********************/
  142. void senduart1()//發送函數
  143. {           
  144. SBUF=sendBuf[0];while(!TI);TI=0;
  145. SBUF=sendBuf[1];while(!TI);TI=0;
  146. SBUF=sendBuf[2];while(!TI);TI=0;
  147. SBUF=sendBuf[3];while(!TI);TI=0;
  148. SBUF=sendBuf[4];while(!TI);TI=0;
  149. }


  150. /********************************************************************
  151.                             模式1函數
  152. *********************************************************************/
  153. void KEY1()
  154. {
  155. //if(gong_dian==0){gong_dian=0;}
  156. if((IN1==0)&&(bz1==0)){delay(k);if((IN1==0)&&(bz1==0)){fa_she_bj=1;DATE=0x01;send_date1();senduart1();bz1=1;}}if((IN1==1)&&(bz1==1)){delay(k);if((IN1==1)&&(bz1==1)){bz1=0;fa_she_bj=0;}}//輸入按鍵
  157. if((IN2==0)&&(bz2==0)){delay(k);if((IN2==0)&&(bz2==0)){fa_she_bj=1;DATE=0x02;send_date1();senduart1();bz2=1;}}if((IN2==1)&&(bz2==1)){delay(k);if((IN2==1)&&(bz2==1)){bz2=0;fa_she_bj=0;}}//輸入按鍵
  158. if((IN3==0)&&(bz3==0)){delay(k);if((IN3==0)&&(bz3==0)){fa_she_bj=1;DATE=0x03;send_date1();senduart1();bz3=1;}}if((IN3==1)&&(bz3==1)){delay(k);if((IN3==1)&&(bz3==1)){bz3=0;fa_she_bj=0;}}//輸入按鍵
  159. if((IN4==0)&&(bz4==0)){delay(k);if((IN4==0)&&(bz4==0)){fa_she_bj=1;DATE=0x04;send_date1();senduart1();bz4=1;}}if((IN4==1)&&(bz4==1)){delay(k);if((IN4==1)&&(bz4==1)){bz4=0;fa_she_bj=0;}}//輸入按鍵
  160. if((IN5==0)&&(bz5==0)){delay(k);if((IN5==0)&&(bz5==0)){fa_she_bj=1;DATE=0x05;send_date1();senduart1();bz5=1;}}if((IN5==1)&&(bz5==1)){delay(k);if((IN5==1)&&(bz5==1)){bz5=0;fa_she_bj=0;}}//輸入按鍵
  161. if((IN6==0)&&(bz6==0)){delay(k);if((IN6==0)&&(bz6==0)){fa_she_bj=1;DATE=0x06;send_date1();senduart1();bz6=1;}}if((IN6==1)&&(bz6==1)){delay(k);if((IN6==1)&&(bz6==1)){bz6=0;fa_she_bj=0;}}//輸入按鍵
  162. if((IN7==0)&&(bz7==0)){delay(k);if((IN7==0)&&(bz7==0)){fa_she_bj=1;DATE=0x07;send_date1();senduart1();bz7=1;}}if((IN7==1)&&(bz7==1)){delay(k);if((IN7==1)&&(bz7==1)){bz7=0;fa_she_bj=0;}}//輸入按鍵
  163. if((IN8==0)&&(bz8==0)){delay(k);if((IN8==0)&&(bz8==0)){fa_she_bj=1;DATE=0x08;send_date1();senduart1();bz8=1;}}if((IN8==1)&&(bz8==1)){delay(k);if((IN8==1)&&(bz8==1)){bz8=0;fa_she_bj=0;}}//輸入按鍵
  164. //if((IN1==0)||(IN2==0)||(IN3==0)||(IN4==0)||(IN5==0)||(IN6==0)||(IN7==0)||(IN8==0)){RUN=0;}
  165. if(dian_liang_bj==0)
  166. {
  167. if((IN1==1)&&(IN2==1)&&(IN3==1)&&(IN4==1)&&(IN5==1)&&(IN6==1)&&(IN7==1)&&(IN8==1)){RUN=0;}//電量正常時綠燈亮
  168. }
  169. else{RUN=1;dian_chi;sec=0;}//當電池電量低時,紅燈亮
  170. }
  171. /********************************************************************
  172.                             定時中斷服務函數
  173. *********************************************************************/
  174. void t0(void) interrupt 1 using 0 //定時中斷服務函數

  175. {
  176. tcnt++; //每過250ust tcnt 加一
  177. if(tcnt==400) //計滿400 次(1/10 秒)時
  178. {
  179. tcnt=0; //重新再計
  180. sec++;
  181. if(dian_liang_bj==0){if(fa_she_bj==1){if(sec>=1){RUN=!RUN;sec=0;}}}               
  182. if(dian_liang_bj==1){if(sec>=20){dian_chi=!dian_chi;sec=0;}}

  183. //if(sec==10){RUN=!RUN;sec=0;}
  184. //if(sec>=20){dian_chi=!dian_chi;sec=0;}
  185. }
  186. }

  187. /*****************清空發送緩沖區*************************/
  188. void clear_receBuf()
  189. {
  190.     uchar i;
  191.         for(i=0;i<5;i++)
  192.         {
  193.             receBuf[i]=0;
  194.         }
  195. }
  196. /********************************************************************
  197.                             主函數
  198. *********************************************************************/
  199. void main()                                   
  200. {
  201.         
  202. P1M0 = 0x00; P1M1 = 0x02; //IO定義
  203. P3M0 = 0x00; P3M1 = 0x00; //IO定義

  204. SCON = 0x50;
  205. T2L = (65536 - (FOSC/4/BAUD));
  206. T2H = (65536 - (FOSC/4/BAUD))>>8;
  207. AUXR = 0x14;               
  208. AUXR |= 0x01;              
  209. ES = 1;                  
  210. EA = 1;
  211. add= IapReadByte(0x01);//讀取存儲的值
  212. if(add>=100){add=1;}
  213. //sj2= IapReadByte(0x02);//讀取存儲的值
  214. TMOD=0x02; //定時器工作在方式2
  215. TH0=0x06; //對TH0 TL0 賦值
  216. TL0=0x06;
  217. TR0=1; //開始定時
  218. ET0=1;
  219. EA=1;
  220. /*串口移植*/
  221. ACC = P_SW1;
  222. ACC &= ~(S1_S0 | S1_S1);    //S1_S0=1 S1_S1=0
  223. ACC |= S1_S0;               //(P3.6/RxD_2, P3.7/TxD_2)
  224. P_SW1 = ACC;  

  225. InitADC();//AD轉換初始化程序
  226. sec=0;
  227. MD0 = 0;//工作模式
  228. MD1 = 0;//工作模式
  229. gong_dian=0;
  230. while(1)
  231. {         
  232. KEY1();//按鍵函數

  233. if(write==1)  //修改板子地址
  234. {
  235. write=0;
  236. add=1;
  237. IapEraseSector(0);  //擦除扇區
  238. IapProgramByte(0x01,add);//寫入新的地址                           
  239. //IapProgramByte(0x02,sj2);//寫入新的地址        
  240. }
  241. }               
  242. }
  243. /********************************************************************
  244.                             串口中斷函數
  245. *********************************************************************/
  246. void Uart() interrupt 4 using 1
  247. {
  248. if (RI)
  249. {
  250. RI=0; //接收標志清零
  251. receBuf[r++&0x0F]=SBUF;     //把接受的數據存儲到BUT數組中
  252. if(receBuf[0]!=0xaa){r=0;}
  253. if(r>=5)
  254. {        r=0;

  255. flag_zx=1;
  256. }
  257. }
  258. if(flag_zx==1)
  259. {                     

  260. flag_zx=0;

  261. if((receBuf[0]==0xaa)&&(receBuf[1]==0x00)&&(receBuf[2]==0x00)&&(receBuf[3]==0x00)&&(receBuf[4]==0xbb))
  262. {
  263. write=1;        
  264. sendBuf[0]=0xaa;
  265. sendBuf[1]=add;
  266. sendBuf[2]=0x00;
  267. sendBuf[3]=0x00;
  268. sendBuf[4]=0xbb;
  269. senduart1();                  
  270. }
  271. if((receBuf[0]==0xaa)&&(receBuf[1]==0xff)&&(receBuf[2]==0xff)&&(receBuf[3]==0xff)&&(receBuf[4]==0xbb))
  272. {
  273. sendBuf[0]=0xaa;
  274. sendBuf[1]=add;
  275. sendBuf[2]=0xff;
  276. sendBuf[3]=0xff;
  277. sendBuf[4]=0xbb;
  278. senduart1();                  
  279. }
  280. clear_receBuf();
  281. }
  282. }


  283. /********************************************************************
  284.                               結束
  285. *********************************************************************/
  286. void IapIdle(){//禁用 ISP/IAP/EEPROM functionmake 單片機 在 一 安全 狀態
  287.     IAP_CONTR = 0;           //
  288.         IAP_CMD = 0;           //
  289.         IAP_TRIG = 0;           //
  290.         IAP_ADDRH = 0x80;  //
  291.         IAP_ADDRL = 0;           //
  292. }
  293. uint8 IapReadByte(uint16 addr){//讀數據
  294.    uint8 dat;
  295.    IAP_CONTR = ENABLE_IAP;
  296.    IAP_CMD = CMD_READ;
  297.    IAP_ADDRL = addr;
  298.    IAP_ADDRH = addr >> 8;
  299.    IAP_TRIG = 0x5A;
  300.    IAP_TRIG = 0xA5;
  301.    _nop_();
  302.    dat = IAP_DATA;
  303.    IapIdle();
  304.    return dat;
  305. }
  306. void IapProgramByte(uint16 addr, uint8 dat){//寫數據
  307.    IAP_CONTR = ENABLE_IAP;
  308.    IAP_CMD = CMD_PROGRAM;
  309.    IAP_ADDRL = addr;
  310.    IAP_ADDRH = addr >> 8;
  311.    IAP_DATA = dat;
  312.    IAP_TRIG = 0x5A;
  313.    IAP_TRIG = 0xA5;
  314.    _nop_();
  315.    IapIdle();
  316. }
  317. void IapEraseSector(uint16 addr){//擦除數據
  318.    IAP_CONTR = ENABLE_IAP;
  319.    IAP_CMD = CMD_ERASE;
  320.    IAP_ADDRL = addr;
  321.    IAP_ADDRH = addr >> 8;
  322.    IAP_TRIG = 0x5A;
  323.    IAP_TRIG = 0xA5;
  324.    _nop_();
  325.    IapIdle();
  326. }
  327. /********************************************************************
  328.                               結束
  329. *********************************************************************/
復制代碼


STC15W408AS 串口 ADC 定時器 EEPROM.rar

57.87 KB, 下載次數: 121

Keil代碼

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

使用道具 舉報

沙發
ID:97678 發表于 2023-7-12 07:35 | 只看該作者
好東西! 只是還沒有看明白。學習之。
回復

使用道具 舉報

板凳
ID:227484 發表于 2023-10-28 19:42 | 只看該作者
好東西,正在學習下載看看
回復

使用道具 舉報

地板
ID:1085085 發表于 2023-10-30 09:53 | 只看該作者
感謝樓主的精彩分享,非常的權威!后續若需要更多的案例可參考ISP軟件上的范例程序
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美xxxx色视频在线观看免费 | а天堂中文最新一区二区三区 | 久久久国产一区二区 | 在线天堂免费中文字幕视频 | 久久精品亚洲精品国产欧美 | 日韩在线欧美 | 亚洲国产黄 | 国产一区二区三区在线免费观看 | 二区在线观看 | 亚洲最新网址 | 精品欧美一区免费观看α√ | 亚洲人成在线播放 | 在线看av网址 | 午夜视频免费在线观看 | 精品久久久久一区二区国产 | 久草新在线 | 久久久精 | 国产精品国产三级国产aⅴ无密码 | 国产成人免费视频网站高清观看视频 | 欧美v日韩| 久久亚洲国产精品日日av夜夜 | 国产成人精品免高潮在线观看 | 国产欧美一区二区久久性色99 | 欧美日韩手机在线观看 | 黑人粗黑大躁护士 | 黑人巨大精品欧美一区二区免费 | 亚洲欧美中文日韩在线v日本 | 户外露出一区二区三区 | 手机看片在线播放 | 在线看91 | 欧美一区二区另类 | 在线观看视频一区二区三区 | 精品久久国产视频 | www九色| 黄色一级大片在线观看 | 久久91精品国产 | 久久久高清| 欧美激情亚洲激情 | 国产精品一区二区三 | 欧美日韩三级视频 | 九九热这里只有精品6 |