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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

如何讓單片機在采集AD信號時(ADC是查詢方式),通過中斷串口控制單片機1.3和1.5管...

[復制鏈接]
跳轉到指定樓層
樓主
ID:973635 發表于 2021-10-20 17:20 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
如何讓單片機在采集AD信號時(ADC是查詢方式),通過中斷串口控制單片機1.3和1.5管腳的燈的亮滅。單獨測試ADC可以,加入中斷就沒反應了。代碼如下如何讓單片機在采集AD信號時(ADC是查詢方式),通過中斷串口控制單片機1.3和1.5管腳的燈的亮滅。單獨測試ADC可以,加入中斷就沒反應了。代碼如下
  1. #include <stc15w408as.h>
  2. #include <intrins.h>
  3. #define FOSC    11059200L
  4. #define BAUD    9600

  5. typedef unsigned char BYTE;
  6. typedef unsigned int WORD;

  7. #define     URMD    0           //0:使用定時器2作為波特率發生器
  8.                                 //1:使用定時器1的模式0(16位自動重載模式)作為波特率發生器                                //2:使用定時器1的模式2(8位自動重載模式)作為波特率發生器                        
  9. sfr ADC_LOW2    =   0xBE;           //ADC低2位結果

  10. #define ADC_POWER   0x80            //ADC電源控制位
  11. #define ADC_FLAG    0x10            //ADC完成標志
  12. #define ADC_START   0x08            //ADC起始控制位
  13. #define ADC_SPEEDLL 0x00            //540個時鐘
  14. #define ADC_SPEEDL  0x20            //360個時鐘
  15. #define ADC_SPEEDH  0x40            //180個時鐘
  16. #define ADC_SPEEDHH 0x60            //90個時鐘

  17. sbit addA = P1^3;
  18. sbit addB = P1^5;
  19. BYTE ch = 0;
  20. void InitUart();
  21. void InitADC();
  22. void SendData(BYTE dat);
  23. BYTE GetADCResult(BYTE ch);
  24. void Delay(WORD n);
  25. void ShowResult(BYTE ch);

  26. void main()
  27. {
  28.     InitUart();                     //初始化串口
  29.     InitADC();                      //初始化ADC
  30.     while (1)
  31.     {
  32.              ShowResult(0);              //顯示通道0
  33.     }
  34. }

  35. /*----------------------------發送ADC結果到PC----------------------------*/
  36. void ShowResult(BYTE ch)
  37. {
  38. //    SendData(ch);                   //顯示通道號
  39.     SendData(GetADCResult(ch));     //顯示ADC高8位結果

  40. //    SendData(ADC_LOW2);           //顯示低2位結果
  41. }

  42. /*----------------------------讀取ADC結果----------------------------*/
  43. BYTE GetADCResult(BYTE ch)
  44. {
  45.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
  46.     _nop_();                        //等待4個NOP
  47.     _nop_();
  48.     _nop_();
  49.     _nop_();
  50.     while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉換完成
  51.     ADC_CONTR &= ~ADC_FLAG;         //Close ADC

  52.     return ADC_RES;                 //返回ADC結果
  53. }

  54. /*----------------------------初始化串口----------------------------*/
  55. void InitUart()
  56. {
  57.     SCON = 0x5a;                //設置串口為8位可變波特率
  58.     T2L = (65536 - (FOSC/4/BAUD));
  59.     T2H = (65536 - (FOSC/4/BAUD)) >> 8;
  60.     AUXR = 0x14;                //T2為1T模式, 并啟動定時器2
  61.     AUXR |= 0x01;               //選擇定時器2為串口1的波特率發生器
  62.       EA = 1;
  63.       ES = 1;
  64. }

  65. /*----------------------------初始化ADC----------------------------*/
  66. void InitADC()
  67. {
  68.     P1ASF = 0xff;                   //設置P1口為AD口
  69.     ADC_RES = 0;                    //清除結果寄存器
  70.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
  71.     Delay(2);                       //ADC上電并延時
  72. }

  73. /*----------------------------發送串口數據----------------------------*/
  74. void SendData(BYTE dat)
  75. {
  76.     while (!TI);                    //等待前一個數據發送完成
  77.     TI = 0;                         //清除發送標志
  78.     SBUF = dat;                     //發送當前數據
  79. }

  80. /*----------------------------軟件延時----------------------------*/
  81. void Delay(WORD n)
  82. {
  83.     WORD x;

  84.     while (n--)
  85.     {
  86.         x = 5000;
  87.         while (x--);
  88.     }
  89. }

  90. // 串口中斷處理函數 (串口接收到數據,發送數據完畢都可以引起串口中斷)
  91. void uart_interrupt(void) interrupt 4         //也叫串行中斷服務程序
  92. {
  93.     unsigned char recv_data;// 用來存放接收到的數據
  94.    
  95.     if(RI) //接收數據(1字節)完畢,RI會被硬件置1
  96.     {
  97.         RI = 0;                    // 將接收中斷標志位 清零(讓串口可以繼續接收數據)
  98.         recv_data = SBUF;               //讀取接收到的數據,并存放到data

  99.         if(recv_data == '1')//如果收到的字符是'0',就讓燈滅
  100.         {
  101. //            ShowResult(0);              //顯示通道4
  102.             addA = 1;
  103.             addB = 0; //  引腳低電平,LED燈1亮
  104.         }
  105.         else if(recv_data == '2')//如果收到的字符是'0',就讓燈滅
  106.         {
  107. //            ShowResult(0);
  108.             addA = 0;
  109.             addB = 1;//  引腳低電平,LED燈2亮
  110.         }
  111.     else if(recv_data == '3')//如果收到的字符是'0',就讓燈滅
  112.         {
  113. //            ShowResult(0);
  114.             addA = 1;
  115.             addB = 1;//  引腳低電平,LED燈3亮
  116.         }
  117.     }
  118.     if(TI)// 發送數據(1字節)完畢
  119.     {
  120.         TI = 0;// 將 發送中斷標志位 清零(讓串口可以繼續發送數據)
  121.     }
  122. }
復制代碼




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

使用道具 舉報

沙發
ID:258566 發表于 2021-10-20 18:41 | 只看該作者
void SendData(BYTE dat)
{
    while (!TI);                    //等待前一個數據發送完成
    TI = 0;                         //清除發送標志
    SBUF = dat;                     //發送當前數據
}
回復

使用道具 舉報

板凳
ID:213173 發表于 2021-10-20 20:47 | 只看該作者
樓主這個程序是在STC官方ADC示例的基礎上添加了串口接收中斷函數。ADC轉換結果通過串口發送上位機,并不能通過串口中斷控制addA和addB亮滅。上位機必須下發'1'、'2'、'3'才能使單片機控制addA和addB亮滅。
回復

使用道具 舉報

地板
ID:973635 發表于 2021-10-20 20:47 | 只看該作者
cccc888 發表于 2021-10-20 18:41
void SendData(BYTE dat)
{
    while (!TI);                    //等待前一個數據發送完成

?什么意思呢
回復

使用道具 舉報

5#
ID:973635 發表于 2021-10-20 21:01 | 只看該作者
wulin 發表于 2021-10-20 20:47
樓主這個程序是在STC官方ADC示例的基礎上添加了串口接收中斷函數。ADC轉換結果通過串口發送上位機,并不能 ...

對啊對啊那我應該怎么改鴨,我比較小白
回復

使用道具 舉報

6#
ID:123289 發表于 2021-10-21 13:58 | 只看該作者
35.    while (1)
36.    {
37.             ShowResult(0);              //顯示通道0
38.    }
36,37之間增加一個標記BJ1判斷,當BJ1為真時,再做 ShowResult(0),否則不做。理由:
1、當數據無變化時,多次顯示同樣的數據無意義。
2、如果數據變化未穩定,則顯示異常。
3、在需要顯示的時候(如:ADC有變化了),置位BJ1,是可以辦到的。              
回復

使用道具 舉報

7#
ID:123289 發表于 2021-10-21 14:07 | 只看該作者
58.    while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉換完成
如果發生意外,等不到,則會死機。這是替在的危險,而且極不易查出來。
回復

使用道具 舉報

8#
ID:123289 發表于 2021-10-21 14:11 | 只看該作者
86.void SendData(BYTE dat)
87.{
88.    while (!TI);                    //等待前一個數據發送完成
89.    TI = 0;                         //清除發送標志
90.    SBUF = dat;                     //發送當前數據
程序有死在88句的危險!
91.}
回復

使用道具 舉報

9#
ID:973635 發表于 2021-10-21 16:26 | 只看該作者
yzwzfyz 發表于 2021-10-21 14:11
86.void SendData(BYTE dat)
87.{
88.    while (!TI);                    //等待前一個數據發送完成

為什么燈在打開串口的時候不亮了呢,串口中斷無法控制1.3和1.5管腳的高低電平
回復

使用道具 舉報

10#
ID:973635 發表于 2021-10-21 16:27 | 只看該作者
yzwzfyz 發表于 2021-10-21 14:11
86.void SendData(BYTE dat)
87.{
88.    while (!TI);                    //等待前一個數據發送完成

因為我之前有單獨用串口中斷控制led燈亮滅的,加了ADC采集就不行了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文在线一区 | 在线免费亚洲视频 | 日韩欧美中文字幕在线观看 | 日韩欧美二区 | 欧美aaa| 亚洲精品久久久一区二区三区 | 国产精品亚洲综合 | 亚洲欧美一区二区三区在线 | 久久久www成人免费精品张筱雨 | 日韩欧美一级精品久久 | 色黄爽| 国产精品久久777777 | 91精品国产92 | 情侣黄网站免费看 | 美女视频一区二区三区 | 天天综合干 | 日韩免费高清视频 | 91亚洲精品国偷拍自产在线观看 | 日韩精品在线观看一区二区三区 | 亚洲综合色视频在线观看 | 亚洲高清中文字幕 | 在线看av网址 | 亚洲福利精品 | 久久精品一区 | 久久久久久国产精品免费免费狐狸 | 中文字幕精品一区二区三区精品 | 热99在线 | 亚洲精品一区二区在线观看 | 成人免费一级 | 亚洲国产精品一区二区三区 | 99国产精品久久久久久久 | 91大神在线资源观看无广告 | 日韩一区和二区 | 欧美激情第一区 | 毛片av免费在线观看 | 四虎在线视频 | 午夜久久av | 中文字幕av亚洲精品一部二部 | 国产高清精品在线 | 欧美午夜精品久久久久久浪潮 | 亚洲在线一区二区三区 |