请问怎样通过源码知道用的多大的晶振。谢谢

2019-07-15 09:10发布

各位大神帮忙看看用的多大的晶振,。不胜感激!

#include <AT89X52.H>
//1,到计时管脚定义
//地址IO口定义
#define adr5           P0_0
#define adr4           P0_1
#define adr3           P0_2
#define adr2           P0_3
#define adr1           P0_4
unsigned char  adr_self = 1;  
void fun_adr(void);

//红灯检测
#define red_check     P3_5
bit red_flag = 0;
void red_fun(void);
void red_show(void);

//绿灯检测
#define gree_check    P3_4
bit gree_flag = 0;   
void gree_fun(void);
void gree_show(void);

//黄灯检测
#define yellow_check    P3_3
bit yellow_flag = 0;
void yellow_fun(void);   
void yellow_show(void);

unsigned char copy_time_r = 0;
unsigned char copy_time_g = 0;
unsigned char copy_time_y = 0;
//485收发控制
#define CON_485   P0_7

//喂看门狗
#define watch_dog     P3_7

//显示个位
#define one_a        P1_3 // P1_3
#define one_b         P1_1 //P1_1
#define one_c        P1_5 // P1_5
#define one_d         P1_4//P1_4
#define one_e         P1_6 //P1_6
#define one_f        P1_7 // P1_7
#define one_g         P1_2 //P1_2



//显示十位  J3
#define two_a          P2_6
#define two_b          P2_5
#define two_c          P2_4
#define two_d          P2_3
#define two_e          P2_2
#define two_f          P2_1
#define two_g          P2_0

//绿灯共阳极电源
#define gree_power     P2_7
#define red_power      P2_6
#define yelow_power    P2_5
//波特率9600
#define Relaod_count 0xfa  //239
int  time1_counter = 0;

//共阳七段数码管0123456789
const unsigned char led_data[10] = {0x00,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};      
unsigned char address = 1;

//显示标志
unsigned char show_flag = 0;
unsigned char show_copy = 0;
unsigned char show_color = 0;
unsigned char adr_copy = 1;
#define                true                 1
#define                faulse               0
#define   begin_time   1
#define   cycle        2
unsigned char   cycle_counter = 0;  


bit   rx_ok = 0;
unsigned char rx_counter = 0;
unsigned char rx_buffer[50] = {0x5a,0x5a,0,0,0,0,0,0};
void system_initial(void);
void send_uart(unsigned char order);
void uart_interrupt_receive(void);
void receive_process(void);

//3,子程序
void disp_one(unsigned char order)
     {

        one_a = (led_data[order] & 0x01);
                one_b = ((led_data[order] & 0x02)>>1);
                one_c = ((led_data[order] & 0x04)>>2);
                one_d = ((led_data[order] & 0x08)>>3);
                one_e = ((led_data[order] & 0x10)>>4);
                one_f = ((led_data[order] & 0x20)>>5);
                one_g = ((led_data[order] & 0x40)>>6);


         }

void disp_two(unsigned char order)
    {

             two_a = ((led_data[order] & 0x01));
                two_b = ((led_data[order] & 0x02)>>1);
                two_c = ((led_data[order] & 0x04)>>2);
                two_d = ((led_data[order] & 0x08)>>3);
                two_e = ((led_data[order] & 0x10)>>4);
                two_f = ((led_data[order] & 0x20)>>5);
                two_g = ((led_data[order] & 0x40)>>6);
         }
//串口工作模式3,波特率9600,奇校验(enev)数据位8,停止为1
//scon SMO SM1 SM2 REN TB8 RB8 TI RI
//TMOD GATE C/T M1 M0 GATE C/T M1 M0
//PCON SMOD - - - GFI GFO FD IDL
//fb =
//
void system_initial(void)
     {
     SCON = 0Xd0;//1101 0000位可变拨特拨特率,方式3 11位异步收发
     TMOD = 0X21;//设置定时器1位8位重装,定时器0为16位定时器
     PCON &= 0x7f;//
     TH0  = 0;
     TL0  = 0;
     ET0 = 1;
     TR0 = 1;
     TH1 = Relaod_count;
     TL1 = Relaod_count;
     TR1 = 1;//开定时器1
     ES  = 0;//BU允许串口中断
     EA  = 1;//开总中断

     CON_485 = 0;
     TXD = 1;
     RXD = 1;
     //关闭LED电源
         red_power = 1;
     gree_power = 1;
     P1 =0X00;
     P2 = 0Xff;
     //disp_one(0x00);
     //disp_two(0x00);
     }
unsigned char  show_time = 0;
unsigned char  red_time = 0;
unsigned char  red_counter = 38;
unsigned char  gree_time = 0;
unsigned char  gree_counter = 30;
unsigned char  yellow_time = 0;
unsigned char  yellow_counter = 3;
unsigned char gewei = 0;
unsigned char shiwei = 0;
unsigned char show_counter = 0;
unsigned char delay_begin  = 0;
void  time0(void) interrupt 1
      {
      if(++time1_counter > 20)//t = 8/12*0xffff/1000=98.3ms
         {
         time1_counter = 0;
         watch_dog = ~watch_dog;
         TXD = ~TXD;
         }

      show_time++;     
      if(show_time > 200)
          {
           delay_begin++;
           show_time = 0;
           if(red_flag == 1)
             {
             //red_time 红 {MOD}信号灯亮灯时间,每1秒加1
            //red_counter 红 {MOD}信号灯亮灯时间备份。
             red_time++;
             if(red_counter > begin_time) red_counter--;
             }
           if(gree_flag == 1)
             {
             gree_time++;
             if(gree_counter > begin_time) gree_counter--;
             }
            if(yellow_flag == 1)
             {
             yellow_time++;
             if(yellow_counter > begin_time) yellow_counter--;
             }
     }
      //1秒没有收到显示数据,关闭显示
      if(show_flag == 1)
          {
           show_counter++;
           if(show_counter > 30)
             {
             show_flag = 0;
             show_counter = 0;
             //red_power = 1;
             //gree_power = 1;
             }
          }


         
      TH0  = 0Xdb;//0x24;//24原来0XDB 0XD4.   STC 软件算//定时器时钟12T模式 0x00 0xdc //定时器时钟12T模式
      TL0  = 0XDc;//0x2b;
      ET0 = 1;
      TR0 = 1;
      }

void send_uart(unsigned char order)
     {
     ES = 0;
     TI = 0;
     P = 0;
     ACC = order;
     TB8 = P;
     SBUF = order;
     while(TI == 0)
          ;
     TI = 0;
     ES = 1;
     TXD = 1;
     RXD = 1;
     }
void uart_interrupt_receive(void) interrupt 4
      {

      unsigned char k = 0;
      unsigned char jiaoyan = 0;
      unsigned char tem = 0;

      if(RI == 1)
         {
         RI = 0;
         ACC = SBUF;
         if(P == RB8)  //奇校验
            {
            rx_buffer[rx_counter] = SBUF;
            ++rx_counter;
            }
            else
            {
             rx_counter=0;
             rx_ok = 0;
            }
         if(rx_buffer[0] != 0x55)
            {
            rx_counter=0;
            rx_ok = 0;
            }
         if((rx_buffer[1] != 0xff) && (rx_buffer[0] != 0x55))
            {
            rx_counter=0;
            rx_ok = 0;
            }
         //if((rx_buffer[2] != 0x1) && (rx_buffer[0] != 0x55))
           // {
           // rx_counter=0;
           // rx_ok = 0;
           // }
         if(rx_counter == (5+3*rx_buffer[3]))
               {
               rx_ok = 1;
               rx_counter=0;

               }
         }
       }
void delay_ms(unsigned int x)
      {
          unsigned int tem = 0;
          unsigned char m = 0;
          unsigned char n = 0;
          for(tem = 0;tem  < x;tem++)
              {
                  for(m = 0;m < 10;m++)
                      {
                          for(n = 0;n < 100;n++)
                              ;
                          }
                  }     
          }
void show_one_09(void)
      {
      unsigned char tem =0;
      for (tem = 0;tem <10;tem++)
           {
           disp_one(tem);
           delay_ms(1000);
           }
      }
void show_two_09(void)
      {
      unsigned char tem = 0;
      for (tem = 0;tem < 10;tem++)
           {
           disp_two(tem);
           delay_ms(1000);
           }
      }





void receive_process(void)
      {
       unsigned char tem = 0;
       unsigned char copy_rx_buffer[]={0,0};
       unsigned char tem_show = 0;
       unsigned char tem_color = 0;
       rx_ok = 0;
           CON_485 = 1;
       for (tem = 0;tem < (5+3*rx_buffer[3]);tem++)
          {
          send_uart(rx_buffer[tem]);
          copy_rx_buffer[tem] = rx_buffer[tem];
          }
           delay_ms(2);
       CON_485 = 0;
       for(tem = 0;tem <copy_rx_buffer[3];tem++)
       if((adr_self == rx_buffer[4+3*tem]))//是本机地址进入
             {
             tem_color = rx_buffer[5+3*tem];//显示颜 {MOD}  

             switch(tem_color)
                 {
                 case 1: gree_power = 0;
                         red_power = 1;
                         break;
                 case 2: red_power = 1;

                         break;
                 case 3: gree_power = 0;
                         red_power = 0;
                         break;
                 default:
                         gree_power = 1;
                         red_power = 1;
                 }
             tem_show = rx_buffer[6+3*tem];
             //防止1秒钟内收到同一数据,闪烁(只同一颜 {MOD}和时间)
             if((show_copy != tem_show) || (show_color != tem_color))
                   {disp_two(tem_show);}
             show_copy = tem_show;
             show_color = tem_color;
             //red_power = 0;
             show_flag = 1;
             show_counter = 0;
             }
      }


void fun_adr(void)
        {
         unsigned char tem = 0;
         unsigned char iii = 0;
         unsigned char nnn = 0;
         for(iii = 0;iii < 20;iii++)
              {
              P2|= 0X1F;
              tem  = P2;
              tem &= 0x1f;
              if(iii == 0)
                 {                  
                 adr_self = tem;
                 }
                 else
                 {
                 if(tem == adr_self)
                      nnn = nnn+1;
                  }
                 }                  
              if(nnn > 10)
                 adr_self = adr_self+1;
                 else
                 adr_self = 1;
           }   


////////////////////////////////
///////////////////////////////
void red_fun(void)
        {
        unsigned char tem = 0;
        unsigned char v0 = 0;
        red_check = 1;
        for(tem = 0;tem < 100;tem++)
           {
           if(red_check == 0)
              {
              v0++;
              }
            red_check = 1;
            //delay_ms(10);
            }
         if(v0 > 95)//亮红灯
            {
            red_flag = 1;
            gree_power = faulse;
            //黄灯结束,红灯开始
            yellow_flag = 0;
            if(yellow_time > begin_time)
               {
               yellow_counter = yellow_time;   
               show_time = 200;   
               TH0 = 0XFB;
               TL0 = 0X00;   
               ET0 = 1;
               TR0 = 1;
               }
            yellow_time = begin_time;
            copy_time_y = begin_time;
            ///////////////////////////////
            }
            else
            {/*
            red_flag = 0;
            if(red_time > 0)
               red_counter = red_time;//红灯亮开始计时,红灯灭停止计时,计时完毕备份。
            red_time = 0;
            copy_time_r = 0;
            */
            }
          }
void gree_fun(void)
        {
        unsigned char tem = 0;
        unsigned char v0 = 0;
        gree_check = 1;
        for(tem = 0;tem < 100;tem++)
           {
           if(gree_check == 0)
              {
              v0++;
              }
            gree_check = 1;
            //delay_ms(10);
            }
         if(v0 > 95)
            {
            gree_flag = 1;
            //红灯结束,绿灯开始
            //关红灯
            red_flag = 0;
            if(red_time > begin_time)
               {
               red_counter = red_time;//红灯亮开始计时,红灯灭停止计时,计时完毕备份。
               show_time = 200;
               show_time = 200;   
               TH0 = 0XFB;
               TL0 = 0X00;   
               ET0 = 1;
               TR0 = 1;
               }
            red_time = begin_time;//-1,20150621改,倒计时从2直接到0          (原来in time -1
            copy_time_r = begin_time-1;
            }
            else
            {

            /*
            gree_flag = 0;
            if(gree_time > 0)//绿灯计时最后3秒关断两次,闪烁提示
               gree_counter = gree_time;
            gree_time = 0;
            copy_time_g = 0;
            */
            }
          }
void yellow_fun(void)
        {
        unsigned char tem = 0;
        unsigned char v0 = 0;
        yellow_check = 1;
        for(tem = 0;tem < 100;tem++)
           {
           if(yellow_check == 0)
              {
              v0++;
              }
            yellow_check = 1;
            //delay_ms(10);
            }
         if(v0 > 95)
            {
            yellow_flag = 1;
            gree_power = true;
            {//绿灯结束,黄灯开始
            gree_flag = 0;
            if(gree_time > begin_time)//绿灯计时最后3秒关断两次,闪烁提示
                {//定时器对齐
                 gree_counter = gree_time;
                 show_time = 200;
                 show_time = 200;   
                 TH0 = 0XFB;
                 TL0 = 0X00;   
                 ET0 = 1;
                 TR0 = 1;
                 }
            gree_time = begin_time;////-1,20150621改,倒计时从2直接到0
            copy_time_g = begin_time-1;
            ///////////////////////////
            }
            }
            else
            {
            /*
            yellow_flag = 0;
            if(yellow_time > 0)
               yellow_counter = yellow_time;
            yellow_time = 0;
            */
            }
          }
void red_show(void)
        {
        unsigned char tem = 0;
        if(red_flag == 1)
           {
           if(red_counter > 99)
                  {
                  gewei = 9;
                  shiwei = 9;
                  }  
                  else
                  {
                  gewei = (red_counter % 10);
                  shiwei = (red_counter / 10);
                  }

           if(cycle_counter == 18)
             cycle_counter = 19;



           if(cycle_counter == 8)
             cycle_counter = 9;


             cycle_counter = 1;
           if(cycle_counter == 3)
             cycle_counter = 4;
           if(cycle_counter == 5 ||cycle_counter == 10 ||cycle_counter == 21)
             {         
                          if(red_counter<=8)
                                        {if(red_counter==1)
                                                             {disp_one(gewei);
                                                                 delay_ms(2000);
                                                                 red_counter=0;
                                                                 P1=0x00;
                                                                 }
                                                                 
                              disp_one(gewei);
                                                         }
                                 else{P1=0x00;}
             //disp_two(shiwei);
             }
           }
     }
void gree_show(void)
        {
        unsigned char tem = 0;
        if(gree_flag == 1)
           {
           if(gree_counter > 99)
                  {
                  gewei = 9;
                  shiwei = 9;
                  }  
                  else
                  {
                  gewei = (gree_counter % 10);
                  shiwei = (gree_counter / 10);
                  }

          if(cycle_counter == 19)
             cycle_counter = 20;


           if(cycle_counter == 0)
                      cycle_counter = 7;
                   if(cycle_counter == 9)
             cycle_counter = 10;


           if(cycle_counter == 1)
             cycle_counter = 2;
           if(cycle_counter == 4)
             cycle_counter = 5;
           if(cycle_counter == 5 ||cycle_counter == 10 ||cycle_counter == 21)
             {  if(gree_counter<=8)
                                        {        if(gree_counter==1)
                                                             { disp_one(gewei);
                                                                 
                                                                 delay_ms(2000);
                                                                 gree_counter=0;
                                                                 P1=0x00;
                                                                 }
                              disp_one(gewei);
                                                         }
                                 else{P1=0x00;}

       }

void yellow_show(void)
        {
        unsigned char tem = 0;
        if(yellow_flag == 1)
           {
           if(yellow_counter > 99)
                  {
                  gewei = 9;
                  shiwei = 9;
                  }  
                  else
             、
                   ///////////////////////////////////
                  if(yellow_counter > 3)
                     yellow_counter = 4;
                  ///////////////////////////////////
                  ///////////////////////////////////
                  gewei = (yellow_counter % 10);
                  shiwei = (yellow_counter / 10);
                  }

          if(cycle_counter == 0)
          、


           if(cycle_counter == 7)
             cycle_counter = 8;


           if(cycle_counter == 2)
             cycle_counter = 3;
           if(cycle_counter == 5 ||cycle_counter == 10 ||cycle_counter == 21)
             {
             disp_one(gewei);
             disp_two(shiwei);

             }
           }
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
熊猫儿
1楼-- · 2019-07-15 16:27
人中狼 发表于 2017-12-11 15:26
根据波特率的设定,应该可以反算出晶振是多少

我刚接触单片机不久,定时器这没太搞明白。。。。。
人中狼
2楼-- · 2019-07-15 19:59
确定波特率之后,通过晶振频率和定时器的设置计算出定时器的初始值,所以反算就是通过波特率,定时器初始值和定时器的设置来判断晶振。查看如何计算根据波特率来计算定时器初始值部分的内容。

一周热门 更多>