标题: 单片机每隔1秒计数加1,数码管显示 程序 [打印本页]

作者: 蓝柚子    时间: 2022-4-5 22:00
标题: 单片机每隔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. }
复制代码



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

楼主使用的定时器中断来计时的    定时器是向上累加溢出的   所以 定时=65536--基础值
作者: lsg0280    时间: 2022-4-21 15:58
利用定时中断扫描数码管位显示,可以使程序更简单明了。
作者: sonique0371    时间: 2022-4-22 08:11
lzzasd 发表于 2022-4-20 09:16
楼主使用的定时器中断来计时的    定时器是向上累加溢出的   所以 定时=65536--基础值

我问的就是基础值为什么不是50000,而是46080?
作者: cmyldd    时间: 2022-4-22 09:04
用Delay,好占用资源的,同时在定时器里面选择不是更好,一般都是在定时器里面刷新的
作者: uid71955    时间: 2022-4-23 12:06
本人很菜,请教下各大侠,数码管位选为啥只有三个位?
作者: mtt661    时间: 2022-4-24 10:42
数码管位选用Switch函数
作者: gongnn    时间: 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开始计时
}

作者: sonique0371    时间: 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
作者: noble64    时间: 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






欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1