找回密码
 立即注册

QQ登录

只需一步,快速开始

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

这个单片机程序有些看不懂

[复制链接]
跳转到指定楼层
楼主
ID:272569 发表于 2018-1-6 22:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char          //数据类型宏定义
  4. #define uint unsigned int
  5. #define out  P0                                  //IO端口定义
  6. /*******共阳数码管 0 ,  1  ,2  ,3 , 4  ,5  ,6 , 7,  8  ,9 ******/
  7. uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x01};

  8. uint i = 0;         //全局变量
  9. uint cnt=0;
  10. /***********主函数*******************************************************/
  11. void main(void)
  12. {
  13.         int j;

  14.         TMOD=0x15;                          // 定时器0工作于计数方式,工作方式1,16位计数
  15.                                             // 定时器1工作于定时方式,工作方式1,16位定时
  16.         TH0=0;                                                                // 清零计数器
  17.         TL0=0;
  18.         TH1=0x4C;                                                        // 12M晶振工作下,定时50ms
  19.         TL1=0x00;
  20.         TR0=1;                                                                // 启动定时器0
  21.         TR1=1;                                                                // 启动定时器1
  22.         IE=0x88;                                                        // 打开定时中断1和总中断
  23.         while(1)
  24.         {                        
  25.                 P2=0x00;                                                  // 输出百位
  26.                 out = seg[cnt/100];        
  27.                 P2 = 0x01;
  28.                 for(j=0;j<100;j++);

  29.                 P2=0x00;
  30.                 out = seg[cnt%100/10];                        // 输出十位
  31.                 P2 = 0x02;         
  32.                 for(j=0;j<100;j++);         

  33.                 P2=0x00;                                                
  34.                 out = seg[cnt%10];                                 // 输出个位
  35.                 P2 = 0x04;
  36.                 for(j=0;j<100;j++);
  37.         }                  
  38. }

  39. /***********计数器T0中断处理函数******************************************/
  40. void Timer1_ISR() interrupt 3
  41. {
  42.         static char j = 0;
  43.          i++;
  44.         TH1=0x4C;                                                   // 重设定时器值,50ms @ 12MHz XTAL
  45.         TL1=0x00;
  46.         if(++j == 20)                                           // 50ms * 20 = 1S
  47.         {                          
  48.                 j = 0;
  49.                 i = (TH0 << 8) | TL0;                   // 1S内的计数值
  50.                 cnt=i;
  51.                 i=0;
  52.                 TH0 = 0;                                           // 清零计数
  53.                 TL0 = 0;         
  54.         }
  55. }
复制代码


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

使用道具 举报

沙发
ID:111634 发表于 2018-1-7 20:44 | 只看该作者
先学理论,打基础,否则,问题多多,事倍功半。
回复

使用道具 举报

板凳
ID:273285 发表于 2018-1-9 08:39 | 只看该作者
具体是哪些地方看不懂呢?简单浏览了一下代码,这就是个在数码管上显示计数器的计数次数的程序啊。
开始配置计时器为50ms产生一次中断,然后在中断中判断是否已经到了1s(即进入中断20次),如果已经到了1s就把定时器0的数值赋给cnt变量, 从而在主程序中通过数码管将定时器0的计数显示出来。
回复

使用道具 举报

地板
ID:7485 发表于 2018-1-9 10:26 | 只看该作者
你的程序里面,就没有TL0增加的语句,所以TH0、TL0会一直不变。

你需要在你认为合适的地方增加一句“TL0++;” (不知道你程序的意图,所以也不知道这一句加在哪儿合适)。


回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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