找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2342|回复: 2
收起左侧

带时钟日历的无线呼叫系统原理图PCB文件与单片机源程序

[复制链接]
ID:443852 发表于 2021-3-17 15:09 | 显示全部楼层 |阅读模式
无线呼叫系统,带日历时钟。这是可以生产的文件。MCU用STM8S103K3T6,呼叫号码4位数,呼叫深度20组,存储号码128组。
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
51hei.png 51hei.png

单片机源程序如下:
  1. /********************************************************
  2. 2012.06.08 增加“换钱”语音工作模式
  3. 2012.07.04  增加时钟、呼叫类型显示
  4. 2012.07.25  硬件匹配“MST_719_V02”以上
  5. 2012.08.25  配合新的硬件"MST_719_V04"取消换钱语音,恢复分区模式
  6. 2012.10.22  更改在设置时间和恢复出厂设置菜单退出时语音相反的错误
  7. 2013.12.14  增加报警音
  8. 2014.04.22  更改为“金麒龙”呼叫器速率和编码
  9. *********************************************************/
  10. #include <iostm8s103k3.h>
  11. #include<Prot_define.h>
  12. #include"ProJ_Voice.H"
  13. #include"Global_variable.h"
  14. #include"main.h"
  15. #include"Proj_Menu.H"

  16. unsigned int duty_vlue;
  17. unsigned char key_values;
  18.    

  19. //系统时钟设置
  20. void CLK_init(void)
  21. {
  22.   CLK_CKDIVR = 0x08;  
  23. }
  24. void EXIT_init(void)
  25. {           
  26.   PB_DDR_DDR4 = 0;   
  27.   PB_CR1_C14 = 1;   
  28.   PB_CR2_C24 = 1;   
  29.   EXTI_CR1 = 0x0c;  
  30. }
  31. void TIM1_init(void)
  32. {
  33.   TIM1_PSCRH = 0x00;  
  34.   TIM1_PSCRL = 0x07;  
  35.   TIM1_CR1 = 0x01;
  36. }
  37. void TIM2_init(void)
  38. {
  39.   CLK_PCKENR1 |= 0X20;
  40.   //TIM2_PSCRH = 0x00;  
  41.   TIM2_PSCR |= 0x03;
  42.   TIM2_ARRH = 0x13;
  43.   TIM2_ARRL = 0x88;
  44.   TIM2_IER |= 0x01;  
  45.   TIM2_CR1 |= 0x01;
  46. }
  47. void Sys_Port_Init(void)
  48. {
  49. //  PA_DDR = 0X00;
  50.   PA_CR1 |= 0X0E;   //0000 1110
  51. //  PA_CR2 = 0X00;
  52.   
  53.   PB_DDR |= 0X6F;
  54.   PB_CR1 |= 0X9F;
  55.   PB_CR2 |= 0X1f;

  56.   PC_DDR |= 0XFF;//
  57.   PC_CR1 |= 0XFF;
  58.   PC_CR2 |= 0XFF;
  59.   
  60.   PD_DDR |= 0X19;
  61.   PD_CR1 |= 0XCD;
  62. // PD_DDR &= 0XF7;
  63. // PD_DDR &= 0X37;//20110727
  64.   PD_CR2 |= 0X11;//20110727
  65.   
  66.   PE_DDR |= 0X00;
  67.   PE_CR1 |= 0X20;
  68.   
  69.   PF_DDR = 0X00;
  70.   PF_CR1 |= 0X10;
  71. }

  72. unsigned int tt1,tt2,tt_flag;
  73. #pragma vector=TIM2_OVR_UIF_vector
  74. __interrupt void TIM2_OVR_UIF(void)
  75. {
  76.   TIM2_SR1 = 0;  // 清除更新中断标记
  77.   tt2++;
  78.   flag_5ms = 1;
  79.   key_values=((PA_IDR&0X0E))>>1;
  80.   key_values|=((PF_IDR&0X10))>>1;
  81.   key_values|=((PB_IDR&0X80))>>3;
  82.   key_values|=((PD_IDR&0XC0))>>1;//增加按键于20110727
  83.   if(tt2 > 99)
  84.   {
  85.     if((Menu_Value==0)&&(Called_Number==0))
  86.       Prot_clock_LED = ~Prot_clock_LED;
  87.     else Prot_clock_LED = 0;
  88.     tt2=0;
  89.     flag_500ms = !flag_500ms;
  90.     if(key_values!=0x7f)
  91.     {
  92.       if(Key_downTime<50)
  93.         Key_downTime++;
  94.     }
  95.     if(flag_500ms)flag_1s=1;
  96.    
  97.     if(Onemin_del++>=120)
  98.     {
  99.       Onemin_del=0;
  100.       flag_1min=1;
  101.     }   
  102.   }   
  103. }

  104. #pragma vector=0x06
  105. __interrupt void EXTI_PB4(void)
  106. {
  107.   unsigned char temp;
  108.   temp = PB_IDR&0x10;
  109.   TIM1_CR1=0;
  110.   duty_vlue=TIM1_CNTRH;
  111.   duty_vlue=(duty_vlue<<8)+TIM1_CNTRL;
  112.   TIM1_CNTRH = 0;
  113.   TIM1_CNTRL = 0;
  114.   TIM1_CR1=1;
  115.   
  116.   if(PC<(Frame_L_+1))  
  117.   {
  118.     if(duty_vlue<Lower_Limit)
  119.     {
  120.       PC=0;
  121.     }
  122.     else  if(duty_vlue>Upper_Limit)
  123.     {
  124.       PC=0;
  125.     }
  126.     else
  127.     {
  128.       if(temp == 0)//if(temp == 0x10)20110727
  129.       {
  130.         
  131.         if(PC<Frame_L_)
  132.         {FS_H<<=1;
  133.         FS_H|=(FS_M>>7);
  134.         FS_M<<=1;
  135.         FS_M|=(FS_L>>7);
  136.         FS_L<<=1;
  137.         if(duty_vlue>Data_0_) FS_L|=0x01;
  138.         }
  139.         duty_vlue=0;
  140.         PC++;
  141.       }
  142.     }
  143.   }
  144.   else   
  145.   {
  146.     if(duty_vlue>Last_Lower)
  147.     {
  148.      // flag_FS_OVER=1;
  149.       TIM1_CR1=0;
  150.       TIM1_CNTRH = 0;
  151.       TIM1_CNTRL = 0;
  152.       TIM1_CR1=1;
  153.      if((FS_Hdata==FS_H)&&
  154.         (FS_Mdata==FS_M)&&
  155.         (FS_Ldata==FS_L))
  156.           flag_FS_OVER=1;
  157.      else      
  158.       {
  159.          FS_Hdata=FS_H;
  160.          FS_Mdata=FS_M;
  161.          FS_Ldata=FS_L;
  162.       }      
  163.     }
  164.      duty_vlue=0;
  165.      PC=0;   
  166.   }
  167. }

  168. void init_devices(void)
  169. {
  170.   asm("sim");  
  171.   CLK_init();
  172.   Sys_Port_Init();
  173.   EXIT_init();
  174.   TIM1_init();
  175.   TIM2_init();
  176.   IWDG_KR = 0XCC;  
  177.   IWDG_KR = 0x55;
  178.   IWDG_PR |= 0x04;
  179.   IWDG_KR = 0x55;
  180.   IWDG_RLR = 0XFF;
  181.   asm("rim");
  182. }
  183. /******************************************************************
  184. - 功能描述:时钟读取
  185. - 隶属模块:
  186. - 函数属性:供桌面刷新使用
  187. - 参数说明:无        
  188. - 返回说明:
  189. - 注:                每一秒读取一次8563的时钟信息
  190. ******************************************************************/
  191. void Right_Time(void)
  192. {
  193.   reed_rtc(0x02,&SystemTime[2],7);
  194.   system_sec &= 0x7f;
  195.   system_min &= 0x7f;
  196.   system_hour &= 0x3f;
  197.   system_day &= 0x3f;
  198.   system_week &= 0x07;
  199.   system_mon &= 0x1f;
  200. }
  201. void Pro_RF_Reseive(void)
  202. {  
  203.   unsigned char Re_Room;
  204.   flag_FS_OVER=0;
  205.   flag_blink=0;
  206.   flag_ProDisplay=1;
  207.   FS_keyvalue=FS_Ldata&0xf;
  208.   Re_Room=Lookup_RoomNumber();
  209.   if(Re_Room==0)
  210.   {Pro_yk();return;}
  211.   switch(Menu_Value)
  212.   {
  213.   case RECEIVE_MODE:
  214.     if(Re_Room==0xa5){ Add_call(); }  break;
  215.   case STUDY_COD:
  216.     if(Re_Room==0xaa) Stor_RoomNumber();  break;  
  217.   default:  break;
  218.   }
  219. }

  220. unsigned char warn_del,warn_del2,warn_out_1s;//BF20110317
  221. unsigned char warn_in; //BF20110317
  222. void Pro_5ms(void)
  223. {
  224.   flag_5ms=0;
  225.   flag_ProDisplay=1;
  226.   
  227.     //bf
  228. /*  if(Prot_WarnIN)
  229.   {
  230.     warn_del++;
  231.     if(warn_del>10)
  232.     {
  233.       warn_del2=0;
  234.       warn_in=1;
  235.       //warn_del=0;
  236.       if(warn_out_1s==0)
  237.       {
  238.         warn_out_1s=1;
  239.         Prot_Warnout=1;
  240.       }
  241.       if((warn_del>200)&&(Called_Number==0))
  242.         Prot_Warnout=0;
  243.     }
  244.   }
  245.   else
  246.   {
  247.     warn_del2++;
  248.     if(warn_del>10)
  249.     {
  250.       warn_del=0;
  251.       warn_in=0;
  252.       //warn_del2=0;
  253.       warn_out_1s=0;
  254.     }
  255.   }*/
  256.   if(key_values==0x7f)
  257.   {//bracket_1
  258.     flag_Key_Down=0;
  259.     KeyDown_del=0;
  260.     Key_downTime=0;
  261.     KeyValue=0;
  262.   }//bracket_1
  263.   else
  264.   {//bracket_2
  265.     if(!flag_Key_Down)
  266.     {//bracket_3
  267.       if(KeyDown_del++>5)
  268.       {
  269.         KeyDown_del=0;
  270.         flag_Key_Down=1;
  271.         flag_KeyPro=1;
  272.         asm("nop");asm("nop");
  273.         KeyValue=key_values;
  274.         asm("nop");asm("nop");
  275.         Send_data(0x4b,0x55);
  276.         Returnmod=0;
  277.       }
  278.     }//bracket_3
  279.     else  Long_Keydown();   
  280.   }//bracket_2
  281.   
  282.   if(flag_yk)
  283.   {  yk_del++;
  284.   if(yk_del>120)
  285.   {
  286.     yk_del=0;
  287.     flag_yk=0;
  288.   }
  289.   }
  290. }


  291. void Pro_1s(void)
  292. {
  293.   register uchar i;
  294.   unsigned char K;
  295.   unsigned char j,k1;
  296.   flag_1s=0;
  297.    if(Ptime)    //整点报时
  298.   {
  299.     if((system_min==0)&&(system_sec==0))
  300.     {
  301.       //     Pro_Display();
  302.       j=system_hour>>4;
  303.       k1=system_hour&0xf;
  304.       buff[0]=0x49;
  305.       buff[1]=0x31;
  306.       buff[2]=0x3a;
  307.       buff[3]=(j ? j : 0x53);
  308.       buff[4]=(j ? 0x3e : 0x53);
  309.       buff[5]=(k1 ? k1 :0x53);
  310.       buff[6]=0x41;
  311.       System_Sound(buff,7);
  312.     }
  313.   }  
  314.   if(Called_Number)
  315.   {
  316.     if(Rdis_Time)
  317.     {
  318.       Rdisp++;
  319.       if(Rdisp>=Rdis_Time)
  320.       {
  321.         Rdisp=0;
  322.         Pcall_dis++;
  323.         if(Pcall_dis>Called_Number)
  324.           Pcall_dis=1;
  325.       }
  326.     }
  327.     if(Clear_time)
  328.     {
  329.       if(Called_Number>20)
  330.         K=20;
  331.       else K=Called_Number;
  332.       for(i=0;i<K;i++)
  333.       {
  334.         Call_time[i]++;
  335.         if(Call_time[i]>=Clear_time)
  336.         {
  337.           Pcall_dis=i+1;
  338.           Dele_call();
  339.         }
  340.       }
  341.     }
  342.     if(Remind_time)
  343.     {
  344.      if(Called_Number>20)
  345.      K=20;
  346.      else K=Called_Number;
  347.      for(i=0;i<K;i++)
  348.      {
  349.        if(Remind_buff[i]<Remind_time)
  350.          Remind_buff[i]++;
  351.       }
  352.       if(Remind_buff[Pcall_dis-1]>=Remind_time)
  353.         flag_blink=1;
  354.       else flag_blink=0;
  355.     }
  356.   }
  357.   if(flag_V)
  358.   {
  359.     flag_V++;
  360.     if(flag_V>=3)
  361.     {
  362.       flag_V=0;
  363.       Menu_Value=0;
  364.     }
  365.   }
  366.   if(flag_stor)
  367.   {
  368.     Stor_del++;
  369.     if(Stor_del>=3)
  370.     {
  371.       Stor_del=0;
  372.       flag_stor=0;
  373.       Add_RoomNumber();
  374.       red_iic((Room_PageNumber<<5)+(RoomPage_addr*3)+2,buff2,1);//*
  375.       while((buff2[0]&0x0f)==0x0a)
  376.       {
  377.         ClearWdg();
  378.         Add_RoomNumber();
  379.         red_iic((Room_PageNumber<<5)+(RoomPage_addr*3)+2,buff2,1);
  380.       }//*
  381.     }
  382.   }
  383.    if(Menu_Value)
  384.   {
  385.      Returnmod++;
  386.      if(Returnmod>=240)
  387.      {  Returnmod=0;
  388.        Menu_Value=0;}
  389.   }
  390. }

  391. void Init_Value(void)
  392. {
  393.   unsigned char x;
  394.   Menu_Value=0;
  395.   KeyValue=0;
  396.   Returnmod=0;
  397.   flag_V=0;
  398.   flag_Time_Set=0;
  399. //  Prot_Warnout=1;//bf
  400.   red_iic(EEP_KEY_NUMBER,&Key_Number,25);
  401.   Prot_LED=1;
  402.   //Right_Time();
  403.   voice_set();    //语音设置
  404.   delay1ms(500);
  405.   ClearWdg();
  406.   delay1ms(50);
  407. //  Prot_Warnout=0;//bf
  408.   Set_Volume();
  409.   Send_code(0x8d);
  410.   Send_data(0x4a,0x71);//开机音乐
  411.   tm1640_init();
  412.   while (Onemin_del<10)
  413.   {
  414.     for(x=0;x<16;x++) {buff[x]=Onemin_del;}
  415.     Display(buff,16);
  416.     ClearWdg();
  417.     //if(flag_FS_OVER||(key_values!=0x7f))
  418.     if(key_values!=0x7f)
  419.       break;
  420.   }
  421.   Prot_LED=0;//20110727
  422.   //Send_voice(0x50);
  423. //  if(Volume_value)
  424.     Send_data(0x47,0x55);
  425.     Right_Time();
  426. }

  427. void main(void)   
  428. {  
  429.   init_devices();
  430.   Sys_Port_Init();
  431.   Init_Value();
  432.   Send_data(0x4a,0x71);//开机音乐
  433.   while(1)
  434.   {      
  435.     if(flag_KeyPro)     Pro_KEY();
  436.     if(flag_5ms==1)     Pro_5ms();
  437.     if(flag_FS_OVER)    Pro_RF_Reseive();
  438.     if(flag_ProDisplay) Pro_Display();
  439.     if(flag_1s)         Pro_1s();//Send_code(0x8d);
  440. //    if(flag_playtime && (flag_Key_Down==0)) Play_time(); //当前时间播报,由于代码长度受限,取消此功能
  441.     if(flag_HJ==1){HJ_sound();Send_code(0x8d);}
  442.     if(flag_modsound && (flag_Key_Down==0)) Work_mode_s();
  443.     if(Menu_Value == 0) Right_Time();
  444.     ClearWdg();
  445.   }
  446. }
复制代码
51hei.png

所有资料51hei提供下载:
MST_526_V04.zip (470.14 KB, 下载次数: 33)

评分

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

查看全部评分

回复

使用道具 举报

ID:328014 发表于 2021-3-17 15:50 | 显示全部楼层
这个程序是用的哪一种无线模块呢?433的?
回复

使用道具 举报

ID:762171 发表于 2021-6-17 09:46 | 显示全部楼层
楼主你用哪个编译器写的?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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