搜索

[活动专区] 【赛元SC95F】+ 点灯和串口测试(二)

[复制链接]
392|5
 楼主 | 2020-3-25 21:22 | 显示全部楼层 |阅读模式
   点灯1秒闪一次。LED端口在P52和P53。串口端口P20,P21。代码如下:

  1. #include "SC95F861x_C.H"
  2. #include "intrins.H"

  3. volatile        unsigned int TimeTick;
  4. //==========================================================
  5. //=======================================================
  6. void Uart0_Init(unsigned long baud)
  7. {
  8.         //Uart0初始化        P20=RX,P21=TX
  9.         SCON = 0X50;        //异步10bit通信,允许接收
  10.         //Timer1波特率  baud=sysclk(32MHz)/(TH1:TL1)
  11.         TMOD = 0X11;
  12.         TCON = 0X00;
  13.         TMCON = 0X00;
  14.         TL1 = 32*1000000/baud;   //波特率低位控制
  15.         TH1 = (32*1000000/baud)>>8;   //波特率高位控制
  16.         TR1 = 0;
  17.         EUART = 0;                //串口中断使能off

  18. }
  19. void Uart0Send(unsigned char ch)
  20. {
  21.         SBUF = ch;
  22.         while(TI == 0);
  23.         TI = 0;
  24. }

  25. void Uart0SendStr(unsigned char *s)
  26. {
  27.         while(*s != 0)
  28.         {
  29.                  Uart0Send(*s++);       
  30.         }
  31. }

  32. void Uart0SendStrlen(unsigned char *s,unsigned int len)
  33. {
  34.         while(len != 0)
  35.         {
  36.                  Uart0Send(*s++);
  37.                 len--;       
  38.         }
  39. }

  40. //=================================================================
  41. //
  42. //=================================================================
  43. volatile unsigned int Time_1ms;
  44. void  Delay_ms(unsigned int ms)
  45. {
  46.         Time_1ms = ms;
  47.         while(Time_1ms);
  48. }

  49. //=============================================================
  50. void Timer0_Init(void)
  51. {
  52.         //Timer0
  53.         TMOD = 0X11;        //16位定时器
  54.         TCON = 0X00;
  55.         TMCON = 0X00;        //12分频
  56.         TL0 = (65536-(32000000)/(12*1000));                   //定时1ms
  57.         TH0 = (65536-(32000000)/(12*1000))>>8;           //
  58.         TR0 = 1;
  59.         ET0 = 1;        //中断
  60. }

  61. int main(void)
  62. {
  63.         P0CON = 0x00;  //设置P0为输入带上拉模式
  64.         P0PH  = 0xFF;
  65.         P1CON = 0x00;  //设置P1为高阻输入模式
  66.         P1PH  = 0x00;
  67.         P2CON = 0xFC;  //设置P20,P21为输入带上拉模式,其他推挽输出
  68.         P2PH  = 0xFF;
  69.         P3CON = 0xFF;  //设置P3为强推挽模式
  70.         P3PH  = 0x00;
  71.         P4CON = 0xFF;  //设置P4为强推挽模式
  72.         P4PH  = 0x01;
  73.         P5CON = 0xFF;  //设置P5为强推挽模式
  74.         P5PH  = 0x00;

  75.         TimeTick = 0;
  76.                                          
  77.         Uart0_Init(115200);
  78.         Timer0_Init();
  79.     EA = 1;       
  80.         Delay_ms(1000);

  81.         while(1)       
  82.         {
  83.                 Delay_ms(1000);
  84.                 P52 =~P52;
  85.                 P53 =~P53;
  86.                 Uart0SendStr("SinOne SC95F8617 Test. By WoodData.\n");
  87.         }
  88.         return 0;
  89. }


  90. //===============================================
  91. //中断
  92. void Timer0_ISR()        interrupt        1
  93. {
  94.         TL0 = (65536-(32000000)/(12*1000));                   //定时1ms
  95.         TH0 = (65536-(32000000)/(12*1000))>>8;           //       

  96.         if(Time_1ms)        Time_1ms--;
  97.         TimeTick++;

  98. }

  99. void Uart0_ISR()        interrupt        4
  100. {
  101.            if(TI)
  102.         {
  103.                  TI = 0;       
  104.         }
  105.            if(RI)
  106.         {
  107.                  RI = 0;       
  108.         }
  109. }


复制代码
效果如图:
QQ图片20200325204711.gif
QQ图片20200325204741.gif
QQ截图20200325203333.jpg

使用特权

评论回复
 楼主 | 2020-3-25 22:06 | 显示全部楼层
下面利用PWM实现呼吸灯:

  1. #include "SC95F861x_C.H"
  2. #include "intrins.H"

  3. volatile        unsigned int TimeTick;
  4. unsigned int Pwm_duty;
  5. unsigned char Pwm_flag;

  6. unsigned int xdata PWMRD_40  _at_  0x1040;
  7. unsigned int xdata PWMRD_41  _at_  0x1042;
  8. unsigned int xdata PWMRD_42  _at_  0x1044;
  9. unsigned int xdata PWMRD_43  _at_  0x1046;
  10. unsigned int xdata PWMRD_50  _at_  0x1048;
  11. unsigned int xdata PWMRD_51  _at_  0x104A;
  12. unsigned int xdata PWMRD_52  _at_  0x104C;
  13. unsigned int xdata PWMRD_53  _at_  0x104E;


  14. //==========================================================
  15. //=======================================================
  16. void Uart0_Init(unsigned long baud)
  17. {
  18.         //Uart0初始化        P20=RX,P21=TX
  19.         SCON = 0X50;        //异步10bit通信,允许接收
  20.         //Timer1波特率  baud=sysclk(32MHz)/(TH1:TL1)
  21.         TMOD = 0X11;
  22.         TCON = 0X00;
  23.         TMCON = 0X00;
  24.         TL1 = 32*1000000/baud;   //波特率低位控制
  25.         TH1 = (32*1000000/baud)>>8;   //波特率高位控制
  26.         TR1 = 0;
  27.         EUART = 0;                //串口中断使能off

  28. }
  29. void Uart0Send(unsigned char ch)
  30. {
  31.         SBUF = ch;
  32.         while(TI == 0);
  33.         TI = 0;
  34. }

  35. void Uart0SendStr(unsigned char *s)
  36. {
  37.         while(*s != 0)
  38.         {
  39.                  Uart0Send(*s++);       
  40.         }
  41. }

  42. void Uart0SendStrlen(unsigned char *s,unsigned int len)
  43. {
  44.         while(len != 0)
  45.         {
  46.                  Uart0Send(*s++);
  47.                 len--;       
  48.         }
  49. }

  50. //=================================================================
  51. //
  52. //=================================================================
  53. volatile unsigned int Time_1ms;
  54. void  Delay_ms(unsigned int ms)
  55. {
  56.         Time_1ms = ms;
  57.         while(Time_1ms);
  58. }

  59. //=============================================================
  60. void Timer0_Init(void)
  61. {
  62.         //Timer0
  63.         TMOD = 0X11;        //16位定时器
  64.         TCON = 0X00;
  65.         TMCON = 0X00;        //12分频
  66.         TL0 = (65536-(32000000)/(12*1000));                   //定时1ms
  67.         TH0 = (65536-(32000000)/(12*1000))>>8;           //
  68.         TR0 = 1;
  69.         ET0 = 1;        //中断
  70. }

  71. //============================================
  72. //周期                 (0x63F+1)/32(MHz) = 50us 周期
  73. //占空比         0x320/(0x63F+1) = 50%
  74. void PWM_Init(void)
  75. {
  76.     PWMMOD = 0x00;           //独立模式,边沿对齐
  77.     PWMCFG = 0x86;           //7:开关  5-4:时钟源选择  3-0:周期设置高4位
  78.         PWMCON = 0x3F;           //周期设置低8位,50us               
  79.         PWMRD_52 = 0x8000 | 0x320;     //开启PWM口,设置占空比
  80.         PWMRD_53 = 0x8000 | 0x320;     //开启PWM口,设置占空比
  81.     IE1 |= 0x02;        //开启中断标志位
  82. }


  83. //==============================================
  84. int main(void)
  85. {
  86.         P0CON = 0x00;  //设置P0为输入带上拉模式
  87.         P0PH  = 0xFF;
  88.         P1CON = 0x00;  //设置P1为高阻输入模式
  89.         P1PH  = 0x00;
  90.         P2CON = 0xFC;  //设置P20,P21为输入带上拉模式,其他推挽输出
  91.         P2PH  = 0xFF;
  92.         P3CON = 0xFF;  //设置P3为强推挽模式
  93.         P3PH  = 0x00;
  94.         P4CON = 0xFF;  //设置P4为强推挽模式
  95.         P4PH  = 0x01;
  96.         P5CON = 0xFF;  //设置P5为强推挽模式
  97.         P5PH  = 0x00;

  98.         TimeTick = 0;
  99.         Pwm_duty = 0x320;
  100.         Pwm_flag = 0;                         
  101.         Uart0_Init(115200);
  102.         Timer0_Init();
  103.         PWM_Init();
  104.     EA = 1;       
  105.         Delay_ms(1000);

  106.         while(1)       
  107.         {
  108.                 Delay_ms(100);
  109.                 Uart0SendStr("SinOne SC95F8617 Test. By WoodData.\n");
  110.                 PWMRD_52 = 0x8000 | Pwm_duty;     //开启PWM口,设置占空比
  111.                 PWMRD_53 = 0x8000 | Pwm_duty;     //开启PWM口,设置占空比
  112.                 if(Pwm_flag == 0)
  113.                 {
  114.                         Pwm_duty += 0x10;
  115.                         if(Pwm_duty >= 0x640)
  116.                         {
  117.                                   Pwm_flag = 1;
  118.                         }
  119.                 }else
  120.                 {
  121.                         Pwm_duty -= 0x10;
  122.                         if(Pwm_duty <= 0x320)
  123.                         {
  124.                                  Pwm_flag = 0;
  125.                         }
  126.                 }
  127.         }
  128.         return 0;
  129. }


  130. //===============================================
  131. //中断
  132. void Timer0_ISR()        interrupt        1
  133. {
  134.         TL0 = (65536-(32000000)/(12*1000));                   //定时1ms
  135.         TH0 = (65536-(32000000)/(12*1000))>>8;           //       

  136.         if(Time_1ms)        Time_1ms--;
  137.         TimeTick++;

  138. }

  139. void PWM_Interrup() interrupt 8
  140. {
  141.     if(PWMCFG & 0x40)
  142.     {
  143.         PWMCFG &= ~0x40;  //清除中断标志位
  144.     }
  145. }

  146. void Uart0_ISR()        interrupt        4
  147. {
  148.            if(TI)
  149.         {
  150.                  TI = 0;       
  151.         }
  152.            if(RI)
  153.         {
  154.                  RI = 0;       
  155.         }
  156. }


复制代码

使用特权

评论回复
 楼主 | 2020-3-25 22:19 | 显示全部楼层
QQ截图20200325212408.jpg
pwm计算。

使用特权

评论回复
 楼主 | 2020-3-25 22:19 | 显示全部楼层

pwm计算。

使用特权

评论回复
| 2020-3-25 22:22 | 显示全部楼层
不错不错,学习了

使用特权

评论回复
| 2020-3-26 09:43 | 显示全部楼层
感谢分享,奖励您100家园币,家园币可以兑换礼品或抽奖,欢迎体验~

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

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