搜索
bottom↓
回复: 11

请各位大神看看这个程序哪里有问题 找半天就是不能正常工作

[复制链接]

出0入0汤圆

发表于 2014-11-13 07:33:07 来自手机 | 显示全部楼层 |阅读模式
帮一位朋友问的,他的问题是



我是剛入門單晶片不久的渣新,
很多語法都不太懂,這問題困擾了我好幾天 ,翻書也翻了很久都沒找到答案。真的腦子已經快崩潰 ,所以前來跪求各位科技大大幫忙><請科技大大可以幫我看看我哪裡有錯。
我想將blinky和uart0結合, 利用uart在終端機控制 閃燈速度 但我才剛開始寫就卡關了。。。。。
但 主程式跳不到uart0的interrupt 只在裡面一直開關開關  。我有兩個中斷 一個是控制閃燈 一個是控制uart0的。
uart0的接收有成功, 但是接收到的資訊不對,(我已經檢查也算過很多次baudrate 我覺得我是算對的),所以到要傳送的時候他條件不合不能傳送。目前苦於找不到錯誤原因可以的話, 請告訴我有甚麼錯 或不好的寫法也可以跟我講(我知道我錯很多的樣子。。。。或者是有甚麼辦法可以測試或解決。

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

 楼主| 发表于 2014-11-13 07:35:09 来自手机 | 显示全部楼层
本帖最后由 shejian001 于 2014-11-13 07:48 编辑

对不起,渣手机,只能上传照片,不能上传附件。
我还是复制吧,如果是乱码,请整理一下看。
点击下载程序附件
//------------------------------------------------------------------------------------// Blinky.c//------------------------------------------------------------------------------------//------------------------------------------------------------------------------------// Includes//------------------------------------------------------------------------------------#include <c8051f020.h> // SFR declarations#include <UART.h>//------------------------------------------------------------------------------------// 16-bit SFR Definitions for 'F02x//------------------------------------------------------------------------------------//sfr16 TMR2 = 0xCC; // Timer2sfr16 DP = 0x82; // data pointersfr16 TMR3RL = 0x92; // Timer3 reload valuesfr16 TMR3 = 0x94; // Timer3 countersfr16 ADC0 = 0xbe; // ADC0 datasfr16 ADC0GT = 0xc4; // ADC0 greater than windowsfr16 ADC0LT = 0xc6; // ADC0 less than windowsfr16 RCAP2 = 0xca; // Timer2 capture/reloadsfr16 T2 = 0xcc; // Timer2sfr16 RCAP4 = 0xe4; // Timer4 capture/reloadsfr16 T4 = 0xf4; // Timer4sfr16 DAC0 = 0xd2; // DAC0 datasfr16 DAC1 = 0xd5; // DAC1 data//------------------------------------------------------------------------------------// Global CONSTANTS//------------------------------------------------------------------------------------#define SYSCLK 16000000 // approximate SYSCLK frequency in Hz#define ACTIVE 1#define DEACTIVE 0#define MACC 0#define MALC 1#define BAUDRATE 9600 // Baud rate of UART0 in bps#define SYSTEMCLOCK 16000000sbit LED = P3^3; // green LED: '1' = ON; '0' = OFF//------------------------------------------------------------------------------------// Function PROTOTYPES//------------------------------------------------------------------------------------void PORT_1_Init (void);void Timer3_Init (int counts);void Timer3_ISR (void);void OSCILLATOR_Init (void);void UART0_Init (void);//------------------------------------------------------------------------------------// MAIN Routine//------------------------------------------------------------------------------------void main (void) {// disable watchdog timerWDTCN = 0xde;WDTCN = 0xad;OSCILLATOR_Init (); // Initialize oscillatorPORT_1_Init ();Timer3_Init (SYSCLK / 12 / 10); // InitTimer3 to generate interrupts// UART0_Init (); // Initialize UART0EA = 1; // enable global interruptswhile (1) {// If the complete word has been entered via the hyperterminal followed by// carriage returnif((TX_Ready == 1) && (UART_Buffer_Size != 0) && (Byte == 13)){TX_Ready = 0; // Set the flag to zeroSCON0 = (SCON0 | 0x02); // Set transmit flag to 1} // spin forever}}//-----------------------------------------------------------------------------// OSCILLATOR_Init//-----------------------------------------------------------------------------//// Return Value : None// Parameters : None//// This function initializes the system clock to use the external 22.1184MHz// crystal.////-----------------------------------------------------------------------------void OSCILLATOR_Init (void){OSCICN = 0x07; //16MHZ}//-----------------------------------------------------------------------------// PORT_1_Init//-----------------------------------------------------------------------------//// Return Value : None// Parameters : None//// This function configures the crossbar and GPIO ports.//// P0.0 digital push-pull UART TX// P0.1 digital open-drain UART RX//-----------------------------------------------------------------------------void PORT_1_Init(void){// char *mode[5];XBR0 = 0x07;// XBR1 = 0x14;XBR2 = 0x40;P1MDIN = 0x00;P0MDOUT = 0xFF;// P1MDOUT = 0x37;P2MDOUT = 0xFF;P3MDOUT = 0xFC;}//------------------------------------------------------------------------------------// Timer3_Init//------------------------------------------------------------------------------------//// Configure Timer3 to auto-reload and generate an interrupt at interval// specified by <counts> using SYSCLK/12 as its time base.//void Timer3_Init (int counts){TMR3CN = 0x00; // Stop Timer3; Clear TF3;// use SYSCLK/12 as timebaseTMR3RL = -counts; // Init reload valuesTMR3 = 0xffff; // set to reload immediatelyEIE2 |= 0x01; // enable Timer3 interruptsTMR3CN |= 0x04; // start Timer3}void UART0_Init (void){SCON0 = 0x50; // SCON1: mode 1, 8-bit UART, enable RXTMOD &= ~0xF0; // 0TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit reloadif ( (((SYSTEMCLOCK/BAUDRATE)/256)/16) < 1 ){PCON |= 0x80; // SMOD1 (PCON.4)= 1 --> UART1 baudrate// divide-by-two disabledCKCON |= 0x10; // Timer1 uses the SYSTEMCLOCKTH1 = - ((SYSTEMCLOCK/BAUDRATE)/16/2);}else if ( (((SYSTEMCLOCK/BAUDRATE)/256)/32) < 1 ){PCON &= ~0x80; // SMOD1 (PCON.4) = 0 --> UART1 baudrate// divide-by-two enabledCKCON |= 0x10; // Timer1 uses the SYSTEMCLOCKTH1 = - ((SYSTEMCLOCK/BAUDRATE)/32/2);}else if ( ((((SYSTEMCLOCK/BAUDRATE)/256)/16)/12) < 1 ){PCON |= 0x80; // SMOD1 (PCON.4)= 1 --> UART1 baudrate// divide-by-two disabledCKCON &= ~0x10; // Timer1 uses the SYSTEMCLOCK/12TH1 = - (((SYSTEMCLOCK/BAUDRATE)/16)/12/2);}else if ( ((((SYSTEMCLOCK/BAUDRATE)/256)/32)/12) < 1 ){PCON &= ~0x80; // SMOD1 (PCON.4) = 0 --> UART1 baudrate// divide-by-two enabledCKCON &= ~0x10; // Timer1 uses the SYSTEMCLOCK/12TH1 = - (((SYSTEMCLOCK/BAUDRATE)/32)/12/2);}TL1 = TH1; // init Timer1TR1 = 1; // START Timer1TX_Ready = 1; // Flag showing that UART can transmitES0 = 1; // Enable UART0 interruptsIP =0x10;}//------------------------------------------------------------------------------------// Interrupt Service Routines//------------------------------------------------------------------------------------//------------------------------------------------------------------------------------// Timer3_ISR//------------------------------------------------------------------------------------// This routine changes the state of the LED whenever Timer3 overflows.//void Timer3_ISR (void) interrupt 14{TMR3CN &= ~(0x80); // clear TF3LED = ~LED; // change state of LED}//-----------------------------------------------------------------------------// UART1_Interrupt//-----------------------------------------------------------------------------//// This routine is invoked whenever a character is entered or displayed on the// Hyperterminal.////-----------------------------------------------------------------------------void UART0_Interrupt (void) interrupt 4{if ((SCON0 & 0x01) == 0x01){// Check if a new word is being enteredif( UART_Buffer_Size == 0) {UART_Input_First = 0; }SCON0 = (SCON0 & 0xFE); //RI1 = 0;Byte = SBUF0; // Read a character from Hyperterminalif (UART_Buffer_Size < UART_BUFFERSIZE){UART_Buffer[UART_Input_First] = Byte; // Store characterUART_Buffer_Size++; // Update array's sizeUART_Input_First++; // Update counter}}if ((SCON0 & 0x02) == 0x02) // Checkif transmit flag is set{SCON0 = (SCON0 & 0xFD);if (UART_Buffer_Size != 1) // If buffernot empty{// Check if a new word is being outputif ( UART_Buffer_Size == UART_Input_First ){UART_Output_First = 0;}// Store a character in the variable byteByte = UART_Buffer[UART_Output_First];if ((Byte >= 0x61) && (Byte <= 0x7A)){ // If lower case letterByte -= 32; }SBUF0 = Byte;UART_Output_First++; // Update counterUART_Buffer_Size--; // Decrease array size}else{UART_Buffer_Size = 0; // Set the array size to 0TX_Ready = 1; // Indicate transmission complete}}}//-----------------------------------------------------------------------------// End Of File//-------------------------------------------------------

出0入0汤圆

发表于 2014-11-13 07:59:47 | 显示全部楼层
台湾兄弟吗
头像被屏蔽

出0入0汤圆

发表于 2014-11-13 08:06:56 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

 楼主| 发表于 2014-11-13 08:07:27 来自手机 | 显示全部楼层
my二月兰 发表于 2014-11-13 07:59 台湾兄弟吗

不是湾就是港,不知道澳门是不是繁体字。

出0入0汤圆

 楼主| 发表于 2014-11-13 08:08:18 来自手机 | 显示全部楼层
xinxinyu2013 发表于 2014-11-13 08:06 太乱了,没法看

下载附件看,手机复制的,没法排序。

出0入0汤圆

发表于 2014-11-13 08:08:30 | 显示全部楼层
台湾兄弟,你这神一样的代码排列没人看得懂啊

出0入0汤圆

发表于 2014-11-13 08:29:59 | 显示全部楼层
先一個一個來,先把UART搞定。
樓主沒有描述異常現象,不好確認問題點。

出0入0汤圆

发表于 2014-11-13 08:48:12 | 显示全部楼层
太乱啦  , 看得眼睛都花啦   

出0入0汤圆

发表于 2014-11-13 09:10:33 | 显示全部楼层
代码好乱。。。。

出0入0汤圆

发表于 2014-11-13 09:20:39 | 显示全部楼层
帮楼主一把。
  1. //------------------------------------------------------------------------------------   
  2. // Blinky.c   
  3. //------------------------------------------------------------------------------------   

  4. //------------------------------------------------------------------------------------   
  5. // Includes   
  6. //------------------------------------------------------------------------------------   
  7. #include <c8051f020.h>                    // SFR declarations   
  8. #include <UART.h>      
  9. //------------------------------------------------------------------------------------   
  10. // 16-bit SFR Definitions for 'F02x   
  11. //------------------------------------------------------------------------------------   
  12. //sfr16 TMR2           = 0xCC;                              // Timer2  
  13. sfr16 DP       = 0x82;                    // data pointer   
  14. sfr16 TMR3RL   = 0x92;                    // Timer3 reload value   
  15. sfr16 TMR3     = 0x94;                    // Timer3 counter   
  16. sfr16 ADC0     = 0xbe;                    // ADC0 data   
  17. sfr16 ADC0GT   = 0xc4;                    // ADC0 greater than window   
  18. sfr16 ADC0LT   = 0xc6;                    // ADC0 less than window   
  19. sfr16 RCAP2    = 0xca;                    // Timer2 capture/reload   
  20. sfr16 T2       = 0xcc;                    // Timer2   
  21. sfr16 RCAP4    = 0xe4;                    // Timer4 capture/reload   
  22. sfr16 T4       = 0xf4;                    // Timer4   
  23. sfr16 DAC0     = 0xd2;                    // DAC0 data   
  24. sfr16 DAC1     = 0xd5;                    // DAC1 data   


  25. //------------------------------------------------------------------------------------   
  26. // Global CONSTANTS   
  27. //------------------------------------------------------------------------------------   
  28.   
  29. #define SYSCLK 16000000                         // approximate SYSCLK frequency in Hz   
  30. #define ACTIVE                1
  31. #define DEACTIVE        0
  32. #define MACC                                0
  33. #define MALC                                1

  34. #define BAUDRATE     9600            // Baud rate of UART0 in bps
  35. #define SYSTEMCLOCK    16000000          

  36. sbit  LED = P3^3;                         // green LED: '1' = ON; '0' = OFF   
  37.    
  38. //------------------------------------------------------------------------------------   
  39. // Function PROTOTYPES   
  40. //------------------------------------------------------------------------------------   
  41. void PORT_1_Init (void);   
  42. void Timer3_Init (int counts);   
  43. void Timer3_ISR (void);   
  44. void OSCILLATOR_Init (void);
  45. void UART0_Init (void);
  46. //------------------------------------------------------------------------------------   
  47. // MAIN Routine   
  48. //------------------------------------------------------------------------------------   
  49. void main (void) {   
  50.    
  51.    // disable watchdog timer   
  52.    WDTCN = 0xde;   
  53.    WDTCN = 0xad;   
  54.    
  55.    OSCILLATOR_Init ();                     // Initialize oscillator   
  56.    PORT_1_Init ();   
  57.    Timer3_Init (SYSCLK / 12 / 10);        // Init Timer3 to generate interrupts   
  58.    
  59.    
  60.   // UART0_Init ();                      // Initialize UART0                                 
  61.    
  62.    EA = 1;                                          // enable global interrupts   
  63.    
  64.    while (1) {  
  65.       
  66.           // If the complete word has been entered via the hyperterminal followed by
  67.       // carriage return
  68.       if((TX_Ready == 1) && (UART_Buffer_Size != 0) && (Byte == 13))
  69.       {
  70.          TX_Ready = 0;                  // Set the flag to zero
  71.          SCON0 = (SCON0 | 0x02);        // Set transmit flag to 1

  72.       }                          // spin forever   
  73.    }   
  74. }   



  75. //-----------------------------------------------------------------------------
  76. // OSCILLATOR_Init
  77. //-----------------------------------------------------------------------------
  78. //
  79. // Return Value : None
  80. // Parameters   : None
  81. //
  82. // This function initializes the system clock to use the  external 22.1184MHz
  83. // crystal.
  84. //
  85. //-----------------------------------------------------------------------------
  86. void OSCILLATOR_Init (void)
  87. {
  88.    OSCICN   = 0x07;     //16MHZ

  89.    

  90. }
  91.   

  92. //-----------------------------------------------------------------------------
  93. // PORT_1_Init
  94. //-----------------------------------------------------------------------------
  95. //
  96. // Return Value : None
  97. // Parameters   : None
  98. //
  99. // This function configures the crossbar and GPIO ports.
  100. //
  101. // P0.0   digital   push-pull     UART TX
  102. // P0.1   digital   open-drain    UART RX
  103. //-----------------------------------------------------------------------------
  104. void PORT_1_Init(void)
  105. {
  106. //        char *mode[5];
  107.        
  108.         XBR0 = 0x07;
  109. //        XBR1 = 0x14;
  110.         XBR2 = 0x40;

  111.         P1MDIN = 0x00;               
  112.         P0MDOUT = 0xFF;
  113. //        P1MDOUT = 0x37;               
  114.         P2MDOUT = 0xFF;
  115.         P3MDOUT = 0xFC;
  116.        

  117. }



  118. //------------------------------------------------------------------------------------   
  119. // Timer3_Init   
  120. //------------------------------------------------------------------------------------   
  121. //   
  122. // Configure Timer3 to auto-reload and generate an interrupt at interval   
  123. // specified by <counts> using SYSCLK/12 as its time base.   
  124. //   
  125. void Timer3_Init (int counts)   
  126. {   
  127.    TMR3CN = 0x00;                      // Stop Timer3; Clear TF3;   
  128.                                        // use SYSCLK/12 as timebase   
  129.    TMR3RL  = -counts;                  // Init reload values   
  130.    TMR3    = 0xffff;                   // set to reload immediately   
  131.    EIE2   |= 0x01;                     // enable Timer3 interrupts   
  132.    TMR3CN |= 0x04;                     // start Timer3   
  133. }   






  134. void UART0_Init (void)
  135. {  

  136.    
  137.    SCON0   = 0x50;                     // SCON1: mode 1, 8-bit UART, enable RX

  138.    TMOD   &= ~0xF0;                     // 0
  139.    TMOD   |=  0x20;                    // TMOD: timer 1, mode 2, 8-bit reload


  140.    if ( (((SYSTEMCLOCK/BAUDRATE)/256)/16) < 1 )
  141.    {
  142.       PCON |= 0x80;                    // SMOD1 (PCON.4) = 1 --> UART1 baudrate
  143.                                        // divide-by-two disabled
  144.       CKCON |= 0x10;                   // Timer1 uses the SYSTEMCLOCK
  145.       TH1 = - ((SYSTEMCLOCK/BAUDRATE)/16/2);
  146.    }
  147.    else if ( (((SYSTEMCLOCK/BAUDRATE)/256)/32) < 1 )
  148.    {
  149.       PCON &= ~0x80;                   // SMOD1 (PCON.4) = 0 --> UART1 baudrate
  150.                                        // divide-by-two enabled
  151.       CKCON |= 0x10;                   // Timer1 uses the SYSTEMCLOCK
  152.       TH1 = - ((SYSTEMCLOCK/BAUDRATE)/32/2);
  153.    }
  154.    else if ( ((((SYSTEMCLOCK/BAUDRATE)/256)/16)/12) < 1 )
  155.    {
  156.       PCON |= 0x80;                    // SMOD1 (PCON.4) = 1 --> UART1 baudrate
  157.                                        // divide-by-two disabled
  158.       CKCON &= ~0x10;                  // Timer1 uses the SYSTEMCLOCK/12
  159.       TH1 = - (((SYSTEMCLOCK/BAUDRATE)/16)/12/2);
  160.    }
  161.    else if ( ((((SYSTEMCLOCK/BAUDRATE)/256)/32)/12) < 1 )
  162.    {
  163.       PCON &= ~0x80;                   // SMOD1 (PCON.4) = 0 --> UART1 baudrate
  164.                                        // divide-by-two enabled
  165.       CKCON &= ~0x10;                  // Timer1 uses the SYSTEMCLOCK/12
  166.       TH1 = - (((SYSTEMCLOCK/BAUDRATE)/32)/12/2);
  167.    }

  168.    TL1 = TH1;                          // init Timer1
  169.    TR1 = 1;                            // START Timer1
  170.    TX_Ready = 1;                       // Flag showing that UART can transmit
  171.    ES0                = 1;                   // Enable UART0 interrupts


  172.     IP     =0x10;

  173. }   
  174. //------------------------------------------------------------------------------------   
  175. // Interrupt Service Routines   
  176. //------------------------------------------------------------------------------------   
  177.    
  178. //------------------------------------------------------------------------------------   
  179. // Timer3_ISR   
  180. //------------------------------------------------------------------------------------   
  181. // This routine changes the state of the LED whenever Timer3 overflows.   
  182. //   
  183. void Timer3_ISR (void) interrupt 14   
  184. {   
  185.    TMR3CN &= ~(0x80);                     // clear TF3   
  186.    LED = ~LED;                         // change state of LED   
  187. }



  188. //-----------------------------------------------------------------------------
  189. // UART1_Interrupt
  190. //-----------------------------------------------------------------------------
  191. //
  192. // This routine is invoked whenever a character is entered or displayed on the
  193. // Hyperterminal.
  194. //
  195. //-----------------------------------------------------------------------------

  196. void UART0_Interrupt (void) interrupt 4
  197. {
  198.    if ((SCON0 & 0x01) == 0x01)
  199.    {
  200.       // Check if a new word is being entered
  201.       if( UART_Buffer_Size == 0)  {
  202.          UART_Input_First = 0; }

  203.       SCON0 = (SCON0 & 0xFE);          //RI1 = 0;
  204.       Byte = SBUF0;                    // Read a character from Hyperterminal

  205.       if (UART_Buffer_Size < UART_BUFFERSIZE)
  206.       {
  207.          UART_Buffer[UART_Input_First] = Byte;  // Store character

  208.          UART_Buffer_Size++;            // Update array's size

  209.          UART_Input_First++;            // Update counter
  210.       }
  211.    }

  212.    if ((SCON0 & 0x02) == 0x02)         // Check if transmit flag is set
  213.    {
  214.       SCON0 = (SCON0 & 0xFD);
  215.       if (UART_Buffer_Size != 1)        // If buffer not empty
  216.       {

  217.          // Check if a new word is being output
  218.          if ( UART_Buffer_Size == UART_Input_First )  
  219.          {
  220.             UART_Output_First = 0;
  221.          }

  222.          // Store a character in the variable byte
  223.          Byte = UART_Buffer[UART_Output_First];

  224.          if ((Byte >= 0x61) && (Byte <= 0x7A)) { // If lower case letter
  225.             Byte -= 32; }

  226.          SBUF0 = Byte;

  227.          UART_Output_First++;           // Update counter
  228.          UART_Buffer_Size--;            // Decrease array size
  229.       }
  230.       else
  231.       {
  232.          UART_Buffer_Size = 0;           // Set the array size to 0
  233.          TX_Ready = 1;                   // Indicate transmission complete
  234.       }
  235.    }
  236. }

  237. //-----------------------------------------------------------------------------
  238. // End Of File
  239. //-------------------------------------------------------
复制代码

出0入0汤圆

发表于 2014-11-13 10:50:31 | 显示全部楼层
shejian001 发表于 2014-11-13 08:07
不是湾就是港,不知道澳门是不是繁体字。

看了好几年的繁体字,有点怀念
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 00:48

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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