找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机每隔1秒计数加1,数码管显示 程序

[复制链接]
跳转到指定楼层
楼主


单片机源程序如下:
  1. #include"reg52.h"
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. /*****数码管位选****/
  5. sbit SMG_A = P2^2;
  6. sbit SMG_B = P2^3;
  7. sbit SMG_C = P2^4;

  8. /****数码管码表****/
  9. uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9

  10. /****函数声明*****/
  11. void Delay(uchar x);
  12. void Display_SMG();
  13. void Init();

  14. uchar count = 0;//计数20,T = 20*50ms = 1s
  15. int number = 0;

  16. /*****主函数*****/
  17. void main()
  18. {
  19.   Init();
  20.   while(1)
  21.   {
  22.           Display_SMG();  
  23.   }
  24. }

  25. /******初始化函数********/
  26. void Init()
  27. {
  28.         TMOD = 0x01;//定时器0,方式1
  29.         TH0 = (65536 - 46080)/256;//装初值,延时50ms
  30.         TL0 = (65536 - 46080)%256;
  31.         EA = 1;//开总中断
  32.         ET0 = 1;//开定时器中断
  33.         TR0 = 1;//启动定时器0         
  34. }

  35. /********数码管显示函数***********/
  36. void Display_SMG()
  37. {
  38.         uchar ge,shi,bai,qian;
  39.         qian = number / 1000;
  40.         bai = (number / 100)%10;
  41.         shi = (number / 10)%10;
  42.         ge = number % 10;
  43.         
  44.         //*****数码管显示个位******
  45.         SMG_A = 0;
  46.         SMG_B = 0;
  47.         SMG_C = 0;
  48.         P0 = table[ge];        
  49.         Delay(10);        

  50.         //*****数码管显示十位******
  51.         SMG_A = 1;
  52.         SMG_B = 0;
  53.         SMG_C = 0;
  54.         P0 = table[shi];        
  55.         Delay(10);

  56.          //*****数码管显示百位******
  57.         SMG_A = 0;
  58.         SMG_B = 1;
  59.         SMG_C = 0;
  60.         P0 = table[bai];        
  61.         Delay(10);

  62.         //*****数码管显示千位******
  63.         SMG_A = 1;
  64.         SMG_B = 1;
  65.         SMG_C = 0;
  66.         P0 = table[qian];        
  67.         Delay(10);
  68. }

  69. /********定时器中断函数**********/
  70. void time0() interrupt 1
  71. {
  72.         TH0 = (65536 - 46080)/256;//装初值,延时50ms
  73.         TL0 = (65536 - 46080)%256;
  74.         count++;
  75.         if(count == 20)        //延时1s后
  76.           {
  77.                   count = 0;
  78.                 number++;
  79.                 if(number == 9999)
  80.                   {
  81.                           number = 0;
  82.                   }
  83.           }
  84. }

  85. /*********延时函数*********/
  86. void Delay(uchar x)
  87. {
  88.         uchar y,z;
  89.         for(y = 30;y > 0;y--)
  90.            for(z = x;z > 0;z--);
  91. }
复制代码


评分

参与人数 1黑币 +30 收起 理由
admin + 30 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:863362 发表于 2022-4-20 08:35 | 只看该作者
请问一下,初始值46080是怎么计算出来的?50毫秒不是应该就是50000吗?
回复

使用道具 举报

板凳
ID:514317 发表于 2022-4-20 09:16 | 只看该作者
sonique0371 发表于 2022-4-20 08:35
请问一下,初始值46080是怎么计算出来的?50毫秒不是应该就是50000吗?

楼主使用的定时器中断来计时的    定时器是向上累加溢出的   所以 定时=65536--基础值
回复

使用道具 举报

地板
ID:928284 发表于 2022-4-21 15:58 | 只看该作者
利用定时中断扫描数码管位显示,可以使程序更简单明了。
回复

使用道具 举报

5#
ID:863362 发表于 2022-4-22 08:11 | 只看该作者
lzzasd 发表于 2022-4-20 09:16
楼主使用的定时器中断来计时的    定时器是向上累加溢出的   所以 定时=65536--基础值

我问的就是基础值为什么不是50000,而是46080?
回复

使用道具 举报

6#
ID:65369 发表于 2022-4-22 09:04 | 只看该作者
用Delay,好占用资源的,同时在定时器里面选择不是更好,一般都是在定时器里面刷新的
回复

使用道具 举报

7#
ID:71955 发表于 2022-4-23 12:06 | 只看该作者
本人很菜,请教下各大侠,数码管位选为啥只有三个位?
回复

使用道具 举报

8#
ID:1010435 发表于 2022-4-24 10:42 | 只看该作者
数码管位选用Switch函数
回复

使用道具 举报

9#
ID:220661 发表于 2022-4-24 15:38 | 只看该作者
sonique0371 发表于 2022-4-22 08:11
我问的就是基础值为什么不是50000,而是46080?

void Timer0Init(void)                //50毫秒@11.0592MHz
{
        AUXR &= 0x7F;                //定时器时钟12T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0x00;                //设置定时初始值
        TH0 = 0x4C;                //设置定时初始值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
}
回复

使用道具 举报

10#
ID:863362 发表于 2022-4-25 08:11 | 只看该作者
gongnn 发表于 2022-4-24 15:38
void Timer0Init(void)                //50毫秒@11.0592MHz
{
        AUXR &= 0x7F;                //定时器时钟12T模式

我也是刚搞清楚,如果是11.0592m晶振,初值就是46080,如果是12m晶振,初值就是50000
回复

使用道具 举报

11#
ID:603753 发表于 2022-4-25 10:06 | 只看该作者
如果是11.0592m晶振,初值就是46080

晶振11.0592M:
11.0592MHz除12为921600Hz,就是一秒921600次机器周期,50ms=46080次机器周期。
65536-46080=19456(4c00)
TH0=0x4c,TL0=0x00

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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