[活动专区] 【赛元95F】第一步:点灯

[复制链接]
2458|15
 楼主| gaoyang9992006 发表于 2020-3-15 13:45 | 显示全部楼层 |阅读模式
计算机编程第一步是实现Hello world!
单片机编程第一步实现:点灯
这包含着如何正确使用硬件连接电脑,如何安装开发软件,配置开发环境,如何编译成目标代码,如何烧录目标代码到芯片。
因为时间问题,硬件里的固件是跟目前官方提供的不一致的,因此需要安装开发软件,烧录软件,并升级固件。
这一切都在这个文件里。
SC LINK资料.rar (39.33 MB, 下载次数: 34)
然后升级固件
990455e6dbff1b7f58.png
按着SC-LINK上的那个按键,那个唯一的按键(start),然后连接到电脑,然后上图就变的升级固件可以用了,同时开发板上的红灯会一直闪。
434005e6dc07019f40.png
然后按照提示找到那个新的固件,升级就行了。
重新插拔SC-LINK
就可以正常烧录了。
接下来我分享一个我写的点灯程序。
  1. /*
  2. SC95F8617 test .
  3. GPIO说明
  4. PxCON=0x00;设置为高阻输入模式
  5. PxCON=0xFF;设置为推挽输出模式
  6. PxPH = 0xFF;设置上拉电阻
  7. */
  8. #include"SC95F861x_C.H"
  9. #include"stdio.h"
  10. #define LEDS P0
  11. void delay(void);
  12. void GPIO_Init(void);
  13. void Timer0_Init(void);

  14. void main(void)
  15. {
  16.         unsigned char i;

  17.         GPIO_Init();
  18.         Timer0_Init();
  19.                 while(1)
  20.         {
  21.                 for(i=0;i<8;i++)
  22.                 {
  23.                         LEDS=(1<<i);
  24.                         delay();
  25.                 }
  26.         }


  27. }

  28. void delay(void)
  29. {
  30.         char i=10;
  31.         while(i--)
  32.         {
  33.                 //定时50ms
  34.                 TH0 = 0x03C;
  35.                 TL0 = 0xB0;
  36.                 TR0=1;
  37.                 while(TF0==0);
  38.                 TF0=0;
  39.                 TR0=0;
  40.         }

  41. }

  42. void GPIO_Init(void)
  43. {
  44.         P0CON=0xFF;
  45. }
  46. void Timer0_Init(void)
  47. {
  48. /*
  49.         TCON,定时器控制寄存器,    |TF1|TR1|TF0|TR0|---|IE1|-|IE0|-|
  50.        
  51.         TMOD,定时器工作模式寄存器,|- |C/T1|M11|M01|---|C/T0|M10|M00|
  52.         模式0:13位定时器计数器模式
  53.         模式1:16位定时器计数器模式
  54.         模式2:8位自动重载模式
  55.         模式3:两个8位定时器计数器模式
  56. */
  57.         TMOD=0x01;
  58. }
测试效果如下,因为我还在家隔离,所以没有多余的测试元件,我从玩具里搞了几个LED。
1111111111111111111111.gif
 楼主| gaoyang9992006 发表于 2020-3-15 13:46 | 显示全部楼层
以上代码我是按照时钟晶振12Mhz,算的,实际上不是12,我要研究一下,默认是用的哪个竞争,内部振荡器非常快的,我要体验一下。
 楼主| gaoyang9992006 发表于 2020-3-15 14:29 | 显示全部楼层
本帖最后由 gaoyang9992006 于 2020-3-15 14:58 编辑

经过测试默认是12分频的32Mhz时钟。然后这样就可以实现1S频率的闪烁了。
  1. /*
  2. /*
  3. SC95F8617 test .
  4. GPIO说明
  5. PxCON=0x00;设置为高阻输入模式
  6. PxCON=0xFF;设置为推挽输出模式
  7. PxPH = 0xFF;设置上拉电阻
  8. */
  9. #include"SC95F861x_C.H"
  10. #include"stdio.h"
  11. #define LEDS P0
  12. void delay(void);
  13. void GPIO_Init(void);
  14. void Timer0_Init(void);

  15. void main(void)
  16. {
  17. //        unsigned char i;

  18.         GPIO_Init();
  19.         Timer0_Init();
  20.                 while(1)
  21.         {
  22.                 P00=~P00;
  23.                 delay();
  24. /*
  25.                 for(i=0;i<8;i++)
  26.                 {
  27.                         LEDS=(1<<i);
  28.                         delay();
  29.                 }
  30.                 */
  31.         }


  32. }

  33. void delay(void)
  34. {
  35.         int i=320;
  36.         while(i--)
  37.         {
  38.                 TL0 = (65536 - 50000)%256;    //时钟为Fsys,则溢出时间=50000*(1/Fsys);
  39.                 TH0 = (65536 - 50000)/256;
  40.                 TR0=1;
  41.                 while(TF0==0);
  42.                 TF0=0;
  43.                 TR0=0;
  44.         }

  45. }

  46. void GPIO_Init(void)
  47. {
  48.         P0CON=0xFF;
  49. }
  50. void Timer0_Init(void)
  51. {
  52. /*
  53.         TCON,定时器控制寄存器,    |TF1|TR1|TF0|TR0|---|IE1|-|IE0|-|
  54.        
  55.         TMOD,定时器工作模式寄存器,|- |C/T1|M11|M01|---|C/T0|M10|M00|
  56.         模式0:13位定时器计数器模式
  57.         模式1:16位定时器计数器模式
  58.         模式2:8位自动重载模式
  59.         模式3:两个8位定时器计数器模式
  60. */
  61. //设置定时器0工作模式1       
  62.         TMOD        |=        0x01;
  63. //设置定时器0时钟源不分频,32MHz;默认是12分频       
  64.         TMCON        |=        0x01;
  65. }
单模先声 发表于 2020-3-15 15:36 | 显示全部楼层
这个延时是来搞笑的?

评论

定时器延时而已,不用大惊小怪。  发表于 2020-3-15 16:40
zhuotuzi 发表于 2020-3-15 15:43 | 显示全部楼层
单模先声 发表于 2020-3-15 15:36
这个延时是来搞笑的?

??大神,延时应该怎么做,我没看懂。
 楼主| gaoyang9992006 发表于 2020-3-15 16:39 | 显示全部楼层
优化了一下这个点灯程序。
  1. /*
  2. SC95F8617 test .
  3. GPIO说明
  4. PxCON=0x00;设置为高阻输入模式
  5. PxCON=0xFF;设置为推挽输出模式
  6. PxPH = 0xFF;设置上拉电阻
  7. */
  8. #include"SC95F861x_C.H"
  9. #include"stdio.h"
  10. #define LEDS P0
  11. void delay(void);
  12. void GPIO_Init(void);
  13. void Timer0_Init(void);

  14. void main(void)
  15. {
  16.         unsigned char i;

  17.         GPIO_Init();
  18.         Timer0_Init();
  19.                 while(1)
  20.         {

  21.                 for(i=0;i<8;i++)
  22.                 {
  23.                         LEDS=(1<<i);
  24.                         delay();
  25.                 }
  26.         }


  27. }

  28. void delay(void)
  29. {
  30. //设置为320,延时0.5S,设置到80即延时0.125S,8个IO口跑马灯则每个IO的闪烁频率刚好是1Hz
  31.         int i=80;
  32.         TR0=1;
  33.         while(i--)
  34.         {
  35.                 TL0 = (65536 - 50000)%256;    //时钟为Fsys,则溢出时间=50000*(1/Fsys);
  36.                 TH0 = (65536 - 50000)/256;
  37.                 while(TF0==0);
  38.                 TF0=0;
  39.         }
  40.                 TR0=0;
  41. }

  42. void GPIO_Init(void)
  43. {
  44.         P0CON=0xFF;
  45. }
  46. void Timer0_Init(void)
  47. {
  48. /*
  49.         TCON,定时器控制寄存器,    |TF1|TR1|TF0|TR0|---|IE1|-|IE0|-|
  50.        
  51.         TMOD,定时器工作模式寄存器,|- |C/T1|M11|M01|---|C/T0|M10|M00|
  52.         模式0:13位定时器计数器模式
  53.         模式1:16位定时器计数器模式
  54.         模式2:8位自动重载模式
  55.         模式3:两个8位定时器计数器模式
  56. */
  57. //设置定时器0工作模式1       
  58.         TMOD        |=        0x01;
  59. //设置定时器0时钟源不分频,32MHz;默认是12分频       
  60.         TMCON        |=        0x01;
  61. }


qwe123zxc 发表于 2020-3-15 18:12 来自手机 | 显示全部楼层
真不错,程序都有了
一路向北lm 发表于 2020-3-15 20:09 | 显示全部楼层
gaoyang9992006 发表于 2020-3-15 16:39
优化了一下这个点灯程序。

板子都已经收到了?
一路向北lm 发表于 2020-3-15 20:09 | 显示全部楼层
板子还没有呢
 楼主| gaoyang9992006 发表于 2020-3-15 21:01 | 显示全部楼层

如果申请了,应该很快就收到了,坐等吧,或者关注顺丰公众号。会微信提醒。
小灵通2018 发表于 2020-3-16 11:13 | 显示全部楼层
例子很棒,多谢分享。学了一招51内核单片机的延时函数编写方法。
磊子忆君遥 发表于 2020-3-16 14:56 | 显示全部楼层
屌炸天的延时,哈哈哈
 楼主| gaoyang9992006 发表于 2020-3-16 15:39 | 显示全部楼层
磊子忆君遥 发表于 2020-3-16 14:56
屌炸天的延时,哈哈哈

哈哈,这是赞美之词吗?上面还有喷我搞笑的,我觉得吧,延时函数大于50个时钟周期的尽量用定时器延时法。跑空指令那种太不准了。
磊子忆君遥 发表于 2020-3-16 15:59 | 显示全部楼层
gaoyang9992006 发表于 2020-3-16 15:39
哈哈,这是赞美之词吗?上面还有喷我搞笑的,我觉得吧,延时函数大于50个时钟周期的尽量用定时器延时法。 ...

是好久没用延时了,大学的时候用的也是空指令,看你这个延时还挺有特色的,现在主要用中断定时做灯的闪烁,延时用在eep模拟i2c和SPI上,其他很少用到。
 楼主| gaoyang9992006 发表于 2020-3-16 16:59 | 显示全部楼层
磊子忆君遥 发表于 2020-3-16 15:59
是好久没用延时了,大学的时候用的也是空指令,看你这个延时还挺有特色的,现在主要用中断定时做灯的闪烁 ...

这个是仿照ARM内核的单片机的库函数做的。一般ARM内核的单片机厂家提供的库函数里面会有个延时函数。就是用这种方式实现。我是借鉴过来的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2052

主题

16403

帖子

222

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