[资料分享与下载] 飞思卡尔单片机DZ60---SCI(中断接收)

[复制链接]
niuyaliang 发表于 2015-2-27 20:12 | 显示全部楼层 |阅读模式
  1. [cpp] view plaincopy
  2. #include <hidef.h> /* for EnableInterrupts macro */  
  3. #include "derivative.h" /* include peripheral declarations */  
  4.   
  5.   
  6. #define LED_D1      PTDD_PTDD0  
  7. #define LED_D1_DIR  PTDDD_PTDDD0  
  8.   
  9. #define LED_ON      0  
  10. #define LED_OFF     1  
  11.   
  12. unsigned char SCANF_SEND_STRINGS[] = "HELLO MCU WORLD";  
  13. unsigned char *pSendString = SCANF_SEND_STRINGS;  
  14. unsigned char ReceiveString;  
  15.   
  16. /*************************************************************/  
  17. /*                  初始化总线时钟PEE模式                    */  
  18. /*              外部晶振频率为4MHz,总线频率16MHz            */  
  19. /*************************************************************/  
  20. void INIT_MCG(void)   
  21. {  
  22.   MCGC2=0x36;         
  23.   while(!MCGSC_OSCINIT);      
  24.   MCGC1=0xb8;  
  25.   while(MCGSC_IREFST);  
  26.   while(MCGSC_CLKST!=0b10);  
  27.   MCGC2_LP = 1;  
  28.   MCGC1 = 0x90;  
  29.   MCGC3 = 0x48;      
  30.   MCGC2_LP = 0;  
  31.   while(!MCGSC_PLLST);  
  32.   while(!MCGSC_LOCK);  
  33.   MCGC1 = 0x10;  
  34.   while(MCGSC_CLKST!=0b11);  
  35. }   
  36.   
  37.   
  38. //延时函数  
  39. void delay(void)   
  40. {  
  41.   unsigned int i;  
  42.   unsigned int j;  
  43.      
  44.      
  45.   for(i = 0; i < 100; i++)  
  46.      for(j = 0; j < 4000; j++);  
  47.    
  48. }  
  49.   
  50.   
  51. void main(void) {  
  52.   
  53.   DisableInterrupts;  
  54.   SOPT1 = 0;  
  55.   INIT_MCG();  
  56.   EnableInterrupts; /* enable interrupts */  
  57.   /* include your code here */  
  58.    
  59.   LED_D1_DIR = 1;  
  60.   LED_D1     = LED_OFF;  
  61.    
  62.    
  63.    
  64. //以下为设置波特率,以及初始化SCI1控制寄存器   
  65.   SCI1BDH = 0X00;  
  66.   SCI1BDL = 0X68;//波特率设置为9600  
  67.   SCI1C1 = 0x00; //设置SCI1为正常模式,八位数据位,无奇偶校验  
  68.   SCI1C2 = 0x2C; //RE = 1(bit2)接收器打开  
  69.                  //TE = 1(bit3)发送器打开  
  70.    
  71.   while(1)   
  72.   {  
  73.    
  74.   }  
  75.    
  76.       
  77.   
  78.    
  79.   for(;;) {  
  80.     __RESET_WATCHDOG(); /* feeds the dog */  
  81.   } /* loop forever */  
  82.   /* please make sure that you never leave main */  
  83. }  
  84.   
  85.   
  86. /*************************************************************/  
  87. /*                SCI1中断向量接收函数                       */  
  88. /*                向量编号为17,中断来源RDRF等               */  
  89. /*************************************************************/  
  90. interrupt 17 void SCI1_RECEIVE(void)   
  91. {  
  92.     while(!SCI1S1_RDRF);// SCI1S1_RDRF = 1时,表示接收数据寄存器满,可以取出数据  
  93.     ReceiveString = SCI1D; //将接收寄存器中的数据保存至ReceiveString  
  94.    LED_D1 = ~LED_D1;  
  95.   
  96.       
  97.     while(!SCI1S1_TDRE);//SCI1S1_TDRE = 1时,发送数据寄存器(缓存区)空,可以发送数据  
  98.     SCI1D = ReceiveString;//将接收到的数据,放至发送数据寄存器(缓存区),发送  
  99.       
  100. }  


ccw1986 发表于 2015-2-28 08:41 | 显示全部楼层
谢谢分析哦
多多娃娃 发表于 2016-1-2 21:48 | 显示全部楼层
是否写一个 多字节的  串口中断接收呢?  假设 0.5 秒内 再没有接收到数据 ,就认为 接收完毕了   
您需要登录后才可以回帖 登录 | 注册

本版积分规则

212

主题

2427

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部