找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8477|回复: 20
打印 上一主题 下一主题
收起左侧

STC15W204S 8脚封装的单片机,2个定时器测试代码,我太难啦

  [复制链接]
跳转到指定楼层
楼主
ID:475031 发表于 2020-2-27 20:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STC15W204S 8脚封装的单片机,2个定时器测试代码,这个资料太少了,我也东拼西凑组合起来才弄明白,我太喜欢这个小单片机。,麻雀虽小五脏俱全,一些小功能,就不需要搞什么89C51了,直接它可以搞定。
至于需要大功能动作多复杂的的,可以用一个89C51做主控芯片。,外围加若干STC15W204S芯片来搭配,
功能强大。不输于STM32哦
电路简洁,代码也简单。适合新手初学者。



单片机源程序如下:

  1. //=========================================================
  2. //1. 晶振为11.0592M,每计数一次用时12/11.0592M=1.085us
  3. //2. TMOD取0x10,即模式1——16位计数器(0~65535)
  4. //3. 计时2ms,1ms=921.5,则2ms/1.085us=1843,故TH1=(65536-1843)/256,TL1=(65536-1843)%256
  5. //65536微秒(μs)=最大定时65.536毫秒(ms)
  6. //12MHZ的51单片机,定时器最大只能定时65.535ms,所以要定时500ms的时间,
  7. //需要产生10次50ms的定时。
  8. //步骤如下:
  9. //1、每隔50ms定时器中断溢出,计数+1。
  10. //2、当计数达到10次时,便产生了500ms的定时啦,然后,你自己根据你的设计,需要让单片机做什么就自己写些什么(比如让某个io口取反)
  11. //3、计数达到10次后,不要忘了初始化计数。
  12. //最后给点建议:1、要让定时器计数50ms,只能在定时器的工作方式1下进行;
  13. //2、定时器初值: TH0 = 0x3C; TL0 = 0x0B0;(我使用的是定时器0)
  14. //定时1ms,0xfc18 == 64536
  15. //=========================================================

  16. /************1s 定时器+中断控制led翻转 ***********/
  17. #include<STC15W.h>
  18. //#include "reg51.h"
  19. //#include "reg52.h"
  20. //#ifndef __STC15F2K60S2_H_
  21. //#define __STC15F2K60S2_H_
  22. #include <intrins.h>
  23. typedef unsigned int u16;
  24. typedef unsigned char u8;
  25. #define uchar unsigned char
  26. #define uint unsigned int

  27. sbit led = P3^0;
  28. sbit led2 = P3^3;




  29. void timer_init()
  30.         {
  31.     //设置定时器的初始计数值
  32.     //计算方法
  33.     //假设定时器为1ms,一个机器周期为 1/单片机的晶振频率  即: 1/12M = 1us
  34.     //而1个机器周期 = 12个时钟周期 所以: n x 机器周期 = 1ms ===> n x 1us = 1ms
  35.     //所以n = 1000,也就是经过1000个机器周期,定时器要溢出(从0开始计数)
  36.     //所以定时器的初始值为65535 - 1000 + 1 = 64536 ===> 0xFC18,拆分成TH0 = 0xFC; TL0 = 0x18;
  37.                 TMOD |= 0x01;  //TMOD |= 0x01;等价于TMOD = TMOD | 0x01; // 将TMOD的最低位置1,
  38.                                //也即表示将定时/计数器的其工作方式调整为方式1(16位定时器/计数器)。
  39.                                //0x00方式0 13位计数器
  40.                                                                         //0x01方式1 16位计数器
  41.                                                                         //0x10方式2 自动重装8位计数器
  42.                                                                         //0x11方式3 T0分为2个8位独立计数器,T1为无中断重装8位计数器
  43. //                &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
  44.                                                                         //程序运行中TMOD |=0x01不会改变其它位的状态,
  45.                                                                         //TMOD =0x01会改变其它位的状态。
  46.                                                                         //比如,原先TMOD = 0x10(二进制数00010000的第4位置1),
  47.                                                                         //程序运行中为了让TMOD的最低位也置1,但又不改变第4位的状态,
  48.                                                                         //那么,使用TMOD |=0x01,这样TMOD 变成 0x11,
  49.                                                                         //即保留了第4位的状态,如果使用TMOD =0x01第4位的状态就被覆盖了。
  50.     TH0 = (65536-1843)/256;   //12M晶振1ms这样TH0 = 0xFC; TL0 = 0x18; 11.0592M晶振1ms这样TH0 = (65536-1843)/256;
  51.     TL0 = (65536-1843)%256;   //12M晶振1ms这样TH0 = 0xFC; TL0 = 0x18; 11.0592M晶振1ms这样(TL0 =65536-1843)%256;
  52.                 ET0 = 1; //T0中断   
  53.     TR0 = 1;//启动T0定时器
  54.     EA = 1;  //总中断开关
  55. }
  56.         

  57. void timer2_init()
  58.         {
  59. TMOD |= 0x01;  //TMOD |= 0x01;等价于TMOD = TMOD | 0x01; // 将TMOD的最低位置1,
  60.         AUXR |= 0x04;                //定时器时钟1T模式
  61.         T2L = 0xF5;                //设置定时初值
  62.         T2H = 0xFF;                //设置定时初值
  63.         IE2 |= 0x04;  //开定时器2中断
  64.         AUXR |= 0x10;                //定时器2开始计时
  65. EA = 1;  //总中断开
  66. }









  67. void main(){
  68.     timer_init();
  69.           timer2_init();
  70.     while(1);
  71. }

  72. void trigger_timer0() interrupt 1 //定时器中断0;
  73.         
  74. {
  75.     static u16 i = 0;
  76.     TH0 = (65536-1843)/256;
  77.     TL0 = (65536-1843)%256;
  78.     i++;//计数
  79.     if( i == 500 ) //这里1000ms=1秒
  80.                         {
  81.         i = 0;//计数清零
  82.         led = ~led;//时间到 LED翻转,形成闪烁
  83.     }
  84. }


  85. void trigger_timer2() interrupt 12 //定时器中断2;
  86.         
  87. {
  88.     static u16 v = 0;
  89.         T2L = 0xF5;                //设置定时初值
  90.         T2H = 0xFF;                //设置定时初值
  91.     v++;//计数
  92.     if( v == 500 ) //这里1000ms=1秒
  93.                         {
  94.         led2 = ~led2;//时间到 LED翻转,形成闪烁
  95.     }
  96. }



复制代码



STC15W204S单片机原理图.jpg (728.47 KB, 下载次数: 93)

STC15W204S单片机原理图.jpg

STC15W204S-8脚单片机.jpg (153.84 KB, 下载次数: 90)

STC15W204S-8脚单片机.jpg

STC15W204S尺寸图.JPG (69.95 KB, 下载次数: 69)

STC15W204S尺寸图.JPG

IMG_20200227_200221(1).jpg (1.05 MB, 下载次数: 74)

IMG_20200227_200221(1).jpg

IMG_20200227_200123.jpg (873 KB, 下载次数: 72)

IMG_20200227_200123.jpg

IMG_20200227_200107.jpg (682.33 KB, 下载次数: 69)

IMG_20200227_200107.jpg

评分

参与人数 2黑币 +62 收起 理由
STC庄伟 + 12
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏11 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:475031 发表于 2020-2-27 20:10 | 只看该作者
STC15W204S两个定时器测试
忘记上传完整代码了,这传上
STC15W204S两个定时器测试.rar (34.72 KB, 下载次数: 146)


回复

使用道具 举报

板凳
ID:475031 发表于 2020-2-27 20:20 | 只看该作者

回复

使用道具 举报

地板
ID:535242 发表于 2020-2-27 21:19 | 只看该作者
过来支持一下
回复

使用道具 举报

5#
ID:693716 发表于 2020-2-27 21:43 | 只看该作者
我的简介相同,这个小芯片确实不错,而且除了IO资源少了点外,运行速度比89C51快的多,如果扩展IO,可用74HC595
回复

使用道具 举报

6#
ID:87000 发表于 2020-2-27 22:18 | 只看该作者
性价比不如STM32F0系列
回复

使用道具 举报

7#
ID:72649 发表于 2021-10-7 08:06 | 只看该作者
能不能做个能调用任意参数的延时程序?
回复

使用道具 举报

8#
ID:255559 发表于 2021-12-2 09:45 | 只看该作者
好帖子,讲的非常细,支持一下
回复

使用道具 举报

9#
ID:983947 发表于 2021-12-3 13:14 | 只看该作者
这种小芯片的实用价值很高,很多地方都可以用得上,成本也低!
回复

使用道具 举报

10#
ID:63317 发表于 2022-7-13 05:49 | 只看该作者
讲的非常细,支持一下
回复

使用道具 举报

11#
ID:496636 发表于 2022-7-13 19:02 | 只看该作者
hj08102 发表于 2020-2-27 21:43
我的简介相同,这个小芯片确实不错,而且除了IO资源少了点外,运行速度比89C51快的多,如果扩展IO,可用74HC ...

74HC595这个移位寄存器如果只是用在显示上,是可以用的,如果用在开关量输出上,安全性要求高,就不能用,如果数据传输过程过程中出点差错,就会导致输出错误,而数据传输没有较验,就是大的弱点。如输出驱动阀门的开关,如果某个阀门开错了,那是要发生生产事故的。
回复

使用道具 举报

12#
ID:1051955 发表于 2022-11-14 18:45 | 只看该作者
说的很祥细,好理解,受教了
回复

使用道具 举报

13#
ID:97678 发表于 2022-11-15 09:17 | 只看该作者
可以写一个ADC采集程序吗?
回复

使用道具 举报

14#
ID:919912 发表于 2022-11-25 13:55 | 只看该作者
鬼推磨 发表于 2020-2-27 20:10
STC15W204S两个定时器测试
忘记上传完整代码了,这传上

非常棒
回复

使用道具 举报

15#
ID:632514 发表于 2022-11-25 23:16 | 只看该作者
鬼推磨 发表于 2020-2-27 20:10
STC15W204S两个定时器测试
忘记上传完整代码了,这传上

楼主你这代码用keil编译不通过报错怎么回事?
回复

使用道具 举报

16#
ID:1087674 发表于 2023-7-7 23:02 来自手机 | 只看该作者
请问楼主,我要是延时350毫秒,怎么写呢?这个单时钟的不懂
回复

使用道具 举报

17#
ID:272119 发表于 2023-7-8 08:54 | 只看该作者
好久没有用STC 做案子了,最近和之后一段时间我做小案子基本会用CH32V003,这货价格低的离谱但IO和性能都很不错.
回复

使用道具 举报

18#
ID:1053359 发表于 2023-7-10 10:38 | 只看该作者
支持你,,,单片机开发有你更精彩
回复

使用道具 举报

19#
ID:1087927 发表于 2023-7-10 11:00 | 只看该作者
qq603599910 发表于 2023-7-8 08:54
好久没有用STC 做案子了,最近和之后一段时间我做小案子基本会用CH32V003,这货价格低的离谱但IO和性能都很不 ...

X宝搜下,果然。
你引起我好奇心了。搞几片玩下。
回复

使用道具 举报

20#
ID:464755 发表于 2023-7-10 18:34 | 只看该作者
qq603599910 发表于 2023-7-8 08:54
好久没有用STC 做案子了,最近和之后一段时间我做小案子基本会用CH32V003,这货价格低的离谱但IO和性能都很不 ...

开发环境不错,比KEIL强多了,就是要装晶振,也不方便,我还是喜欢内置的,测试最好是DIP的,我现在用8G1K08比较多,DIP8 DIP16的都有,装个插座,好焊好换。
回复

使用道具 举报

21#
ID:712097 发表于 2023-8-5 11:41 | 只看该作者
jovew 发表于 2022-11-15 09:17
可以写一个ADC采集程序吗?

这款芯片不支持ADC,型号后带A的才支持ADC,例如STC8G1K08A
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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