如何解决无缘蜂鸣器频率 被数码管刷新干扰

2019-07-15 12:21发布

本帖最后由 4147313 于 2016-12-12 15:47 编辑

功能:数码管时钟,整点报时。按键调整时间。

实现步骤:
1、动态刷新数码管,将DS1302寄存器中的值赋给刷新函数用来显示当前时间。
2、定时器0以10ms计时刷新数码管。
3、每小时的0分、0秒-2秒 无缘蜂鸣器响。(闹铃2秒钟)
4、通过按键调整DS1302的初始值,来更改当前时间(或闹钟时间)

遇到问题:
刷新数码管的定时器中断会影响无缘蜂鸣器的声音频率。
         



调试过程:
一:定时器0刷新数码管,主函数中判断时间,如果时间到就闹钟。
结果:蜂鸣器频率被数码管和按键扫描打乱。

二:另外加了一个定时器1,在main()函数中只做按键扫描,和判断当前时间是否等于闹钟时间。如果是定时器1打开。(TR1  = 1;)          否则关闭定时器1;并将定时器1的优先级高于定时器0 。
结果:发现声音频率还是会被10ms的刷新打断。

请高手点拨!!

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
blust
1楼-- · 2019-07-15 15:17
没看到你有设置中断优先级的啊。。。 最佳答案
4147313
2楼-- · 2019-07-15 20:33
  1. /*******************************************************************************
  2. * 实 验 名                 : DS1302时钟显示试验
  3. * 实验说明       : 数码管显示时钟信息
  4. * 连接方式       : 见连接图
  5. * 注    意                 :
  6. *******************************************************************************/

  7. #include<reg51.h>
  8. #include"ds1302.h"
  9. //#include"smg.h"

  10. //--定义使用的IO--//
  11. sbit Beep =  P3^7 ;
  12. #define KEY P1                   //8位按键
  13. #define DUAN_SMG P0 //数码管段选
  14. sbit LSA=P2^2;                   //数码管位选
  15. sbit LSB=P2^3;
  16. sbit LSC=P2^4;

  17. //--定义全局变量--//
  18. unsigned char  keyTime; //保存按键时间长短
  19. //unsigned char  beepNum;        //滴次数
  20. unsigned int  beep1m;        //一分钟内不在滴  
  21. unsigned char DisplayData[8];        //用来存放要显示的8位数的值
  22. unsigned char SMG_CODE[17]={          //数码管显示十进制数值
  23. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  24. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

  25. //--声明使用到的函数--//
  26. void DigDisplay();                                //刷新数码管
  27. void Delay10ms(unsigned int c);        //延时函数
  28. void delay(unsigned int i);
  29. void Timer0Cofig(void);                        //初始化定时器0
  30. void Timer1Cofig(void);                        //初始化定时器1
  31. void KEY_Scan();                                   //扫描按键
  32. unsigned char IncBcdLow(unsigned char bcd);          
  33. unsigned char IncBcdHigh(unsigned char bcd);        //加时间
  34. unsigned char DecBcdLow(unsigned char bcd);                //减时间
  35. unsigned char keyTimeOK();                //按键时长

  36. /*******************************************************************************
  37. * 函 数 名         : main
  38. * 函数功能                   : 主函数
  39. * 输    入         : 无
  40. * 输    出         : 无
  41. *******************************************************************************/

  42. void main()
  43. {          
  44.     EA=1;//打开总中断
  45.         TMOD = 0x11;     //定时器0选择工作方式1
  46. //        //Ds1302Init();  //---初始化DS1302.写入初始值--- 注释后,断电重启不被初始化
  47.         Timer0Cofig();
  48.         Timer1Cofig();
  49.         while(1)
  50.         {       
  51.                  KEY_Scan();
  52.                  if (TIME[1]==0x10&&TIME[0]<0x05)
  53.                  {          
  54.                         TR1  = 1;                 //启动定时器0                               
  55.                  }else{
  56.                           TR1  = 0;                 //启动定时器0
  57.                  }
  58.         }       
  59. }
  60. /*******************************************************************************
  61. * 函 数 名         : KEY_Scan
  62. * 函数功能                   : 扫描按键
  63. * 输    入         : 无
  64. * 输    出         : 无
  65. *******************************************************************************/
  66. void KEY_Scan()
  67. {         
  68.           if (KEY!=0xFF)
  69.                 {
  70.                 //        delay(50);
  71.                           if (KEY!=0xFF)
  72.                           {
  73.                                   switch (KEY)
  74.                                 {
  75.                                 case(0xFE) :          //返回按键K1的数据
  76.                                          keyTimeOK();
  77.                                        
  78.                                         while (keyTime>=20&& KEY != 0xFF)         //按键时间到达就快速+时间
  79.                                         {
  80.                                                 Delay10ms(1);
  81.                                                 TIME[0] = IncBcdLow(TIME[0]);
  82.                                                 Ds1302Init();                                       
  83.                                         }
  84.                                         TIME[0] = IncBcdLow(TIME[0]);
  85.                                         Ds1302Init();
  86.                                         break;
  87.                                 case(0xFD) :          //返回按键K2的数据
  88.                                         keyTimeOK();
  89.                                         while (keyTime>=20&& KEY != 0xFF)         //按键时间到达就快速+时间
  90.                                         {
  91.                                                 Delay10ms(1);
  92.                                                 TIME[1] = IncBcdLow(TIME[1]);
  93.                                                 Ds1302Init();               
  94.                                         }
  95.                                         TIME[1] = IncBcdLow(TIME[1]);
  96.                                         Ds1302Init();
  97.                                         break;
  98.                                 case(0xFB) :          //返回按键K3的数据
  99.                                                 keyTimeOK();
  100.                                         while (keyTime>=20&& KEY != 0xFF)         //按键时间到达就快速+时间
  101.                                         {
  102.                                                 Delay10ms(1);
  103.                                                 TIME[2] = IncBcdLow(TIME[2]);
  104.                                                 Ds1302Init();               
  105.                                         }
  106.                                         TIME[2] = IncBcdLow(TIME[2]);
  107.                                         Ds1302Init();
  108.                                         break;
  109.                                 case(0xF7) :          //返回按键K4的数据
  110.                                         keyTimeOK();
  111.                                         while (keyTime>=20&& KEY != 0xFF)         //按键时间到达就快速+时间
  112.                                         {
  113.                                                 Delay10ms(1);
  114.                                                 TIME[3] = IncBcdLow(TIME[3]);
  115.                                                 Ds1302Init();               
  116.                                         }
  117.                                         TIME[3] = IncBcdLow(TIME[3]);
  118.                                         Ds1302Init();
  119.                                         break;
  120.                                 case(0xEF) :          //返回按键K5的数据
  121.                                         keyTimeOK();
  122.                                         while (keyTime>=20&& KEY != 0xFF)         //按键时间到达就快速+时间
  123.                                         {
  124.                                                 Delay10ms(1);
  125.                                                 TIME[0] = DecBcdLow(TIME[0]);
  126.                                                 Ds1302Init();               
  127.                                         }
  128.                                         TIME[0] = DecBcdLow(TIME[0]);
  129.                                         Ds1302Init();
  130.                                         break;
  131.                                 case(0xDF) :          //返回按键K6的数据
  132.                                         keyTimeOK();
  133.                                         while (keyTime>=20&& KEY != 0xFF)         //按键时间到达就快速+时间
  134.                                         {
  135.                                                 Delay10ms(1);
  136.                                                 TIME[1] = DecBcdLow(TIME[1]);
  137.                                                 Ds1302Init();               
  138.                                         }
  139.                                         TIME[1] = DecBcdLow(TIME[1]);
  140.                                         Ds1302Init();
  141.                                         break;
  142.                                 case(0xBF) :          //返回按键K7的数据
  143.                                                 keyTimeOK();
  144.                                         while (keyTime>=20&& KEY != 0xFF)         //按键时间到达就快速+时间
  145.                                         {
  146.                                                 Delay10ms(1);
  147.                                                 TIME[2] = DecBcdLow(TIME[2]);
  148.                                                 Ds1302Init();               
  149.                                         }
  150.                                         TIME[2] = DecBcdLow(TIME[2]);
  151.                                         Ds1302Init();
  152.                                         break;
  153.                                 case(0x7F) :          //返回按键K8的数据
  154.                                         keyTimeOK();
  155.                                         while (keyTime>=20&& KEY != 0xFF)         //按键时间到达就快速+时间
  156.                                         {
  157.                                                 Delay10ms(1);
  158.                                                 TIME[3] = DecBcdLow(TIME[3]);
  159.                                                 Ds1302Init();               
  160.                                         }
  161.                                         TIME[3] = DecBcdLow(TIME[3]);
  162.                                         Ds1302Init();
  163.                                         break;
  164.                                 default:
  165.                                         break;
  166.                                 }
  167.                           }
  168.                 }
  169. }
  170. /*******************************************************************************
  171. * 函 数 名         : Timer0Cofig
  172. * 函数功能                   : 配置定时器
  173. * 输    入         : 无
  174. * 输    出         : 无
  175. *******************************************************************************/

  176. void Timer0Cofig(void)
  177. {

  178.     TH0  = 0xd8;         //设置初始值,定时10MS
  179.     TL0  = 0xf0;
  180.    // EA   = 1;             //打开总中断
  181.     ET0  = 1;                 //打开定时器0中断
  182.     TR0  = 1;                 //启动定时器0       
  183. }

  184. /*******************************************************************************
  185. * 函 数 名         : Timer0
  186. * 函数功能                   : 定时器0中断函数
  187. * 输    入         : 无
  188. * 输    出         : 无
  189. *******************************************************************************/                  

  190. void Timer0() interrupt 1
  191. {
  192.     TH0  = 0xd8;         //设置初始值,定时10MS(55536)
  193.     TL0  = 0xf0;
  194.             Ds1302ReadTime(); //---读取时钟信息---
  195.                 DisplayData[0] = SMG_CODE[TIME[2]/16];                                //时
  196.                 DisplayData[1] = SMG_CODE[TIME[2]&0x0f];                                 
  197.                 DisplayData[2] = 0x40;
  198.                 DisplayData[3] = SMG_CODE[TIME[1]/16];                                //分
  199.                 DisplayData[4] = SMG_CODE[TIME[1]&0x0f];       
  200.                 DisplayData[5] = 0x40;
  201.                 DisplayData[6] = SMG_CODE[TIME[0]/16];                                //秒
  202.                 DisplayData[7] = SMG_CODE[TIME[0]&0x0f];
  203.                 DigDisplay();                                                                         //  使用数码管显示
  204. }
  205. /*******************************************************************************
  206. * 函 数 名         : Timer1Cofig
  207. * 函数功能                   : 配置定时器
  208. * 输    入         : 无
  209. * 输    出         : 无
  210. *******************************************************************************/

  211. void Timer1Cofig(void)
  212. {
  213.     TH1  =(65536-200)/256;         //设置初始值,定时200uS(55536)
  214.     TL1  =(65536-200)%256;
  215.     ET1  = 1;                 //打开定时器0中断
  216.     TR1  = 0;                 //初始化不开启定时器0       
  217. }
  218. /*******************************************************************************
  219. * 函 数 名         : Timer1
  220. * 函数功能                   : 定时器1中断函数
  221. * 输    入         : 无
  222. * 输    出         : 无
  223. *******************************************************************************/                  

  224. void Timer1() interrupt 3
  225. {
  226.     TH1  = (65536-200)/256;         //设置初始值,定时200uS(55536)
  227.     TL1  =(65536-200)%256;
  228. //                beep1m++;
  229. //                if(beep1m==6000) beep1m=0;
  230.         Beep=~Beep;
  231. }
  232. /*******************************************************************************
  233. * 函 数 名         : Delay10ms
  234. * 函数功能                   : 延时函数,延时10ms
  235. * 输    入         : 无
  236. * 输    出         : 无
  237. *******************************************************************************/

  238. void Delay10ms(unsigned int c)   //误差 0us
  239. {
  240.     unsigned char a, b;

  241.         //--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
  242.     for (;c>0;c--)
  243.         {
  244.                 for (b=38;b>0;b--)
  245.                 {
  246.                         for (a=130;a>0;a--);
  247.                 }      
  248.         }      
  249. }

  250. /*******************************************************************************
  251. * 函 数 名         : DigDisplay
  252. * 函数功能                   : 使用数码管显示
  253. * 输    入         : 无
  254. * 输    出         : 无
  255. *******************************************************************************/
  256. void DigDisplay()
  257. {
  258.         unsigned char i;
  259.         unsigned int j;
  260.         for(i=0;i<8;i++)
  261.         {
  262.                 switch(i)         //位选,选择点亮的数码管,
  263.                 {
  264.                         case(0):
  265.                                 LSA=0;LSB=0;LSC=0; break;//显示第0位
  266.                         case(1):
  267.                                 LSA=1;LSB=0;LSC=0; break;//显示第1位
  268.                         case(2):
  269.                                 LSA=0;LSB=1;LSC=0; break;//显示第2位
  270.                         case(3):
  271.                                 LSA=1;LSB=1;LSC=0; break;//显示第3位
  272.                         case(4):
  273.                                 LSA=0;LSB=0;LSC=1; break;//显示第4位
  274.                         case(5):
  275.                                 LSA=1;LSB=0;LSC=1; break;//显示第5位
  276.                         case(6):
  277.                                 LSA=0;LSB=1;LSC=1; break;//显示第6位
  278.                         case(7):
  279.                                 LSA=1;LSB=1;LSC=1; break;//显示第7位       
  280.                 }
  281.                 DUAN_SMG=DisplayData[i];//发送段码
  282.                 j=50;                                                 //扫描间隔时间设定
  283.                 while(j--);       
  284.                 DUAN_SMG=0x00;//消隐
  285.         }
  286. }
  287. /*******************************************************************************
  288. * 函 数 名         : IncBcdLow
  289. * 函数功能                   : 60内,以BCD码格式从低位递增
  290. * 输    入         : bcd(这里用于输入时间(或日期))
  291. * 输    出         : bcd
  292. *******************************************************************************/

  293. // /* 递增一个BCD码的高位 */
  294. //unsigned char IncBcdHigh(unsigned char bcd)
  295. //{
  296. //    if ((bcd&0xF0) < 0x90)
  297. //        bcd += 0x10;
  298. //    else
  299. //        bcd &= 0x0F;
  300. //   
  301. //    return bcd;
  302. //}
  303. /* 60内递增一个BCD码的低位 */
  304. unsigned char IncBcdLow(unsigned char bcd)
  305. {
  306.     if ((bcd&0x0F) < 0x09)                        //加个位
  307.         bcd += 0x01;
  308.     else{
  309.         bcd &= 0xF0;                                //加十位
  310.                 if ((bcd&0xF0) < 0x50)
  311.                 bcd += 0x10;
  312.             else
  313.                 bcd &= 0x00;       
  314.      }
  315.     return bcd;
  316. }
  317. ///* 递减一个BCD码的高位 */
  318. //unsigned char DecBcdHigh(unsigned char bcd)
  319. //{
  320. //    if ((bcd&0xF0) > 0x00)
  321. //        bcd -= 0x10;
  322. //    else
  323. //        bcd |= 0x90;
  324. //   
  325. //    return bcd;
  326. //}
  327. /* 60内递减一个BCD码的低位 */
  328. unsigned char DecBcdLow(unsigned char bcd)
  329. {
  330.     if ((bcd&0x0F) > 0x00)                   //减个位
  331.         bcd -= 0x01;
  332.     else{
  333.         bcd |= 0x09;
  334.                 if ((bcd&0xF0) > 0x00)          //减十位
  335.                 bcd -= 0x10;
  336.                    else
  337.                        bcd |= 0x50;
  338.      }
  339.     return bcd;
  340. }
  341. /*******************************************************************************
  342. * 函 数 名         : keyTimeOK
  343. * 函数功能                   : 按键时间长度达到200ms
  344. * 输    入         : 无
  345. * 输    出         : 1(真)
  346. *******************************************************************************/
  347. unsigned char keyTimeOK()
  348.   {

  349.                                         keyTime = 0;
  350.                                          while (keyTime<20&&KEY != 0xFF)         //检测按键按下时长
  351.                                         {
  352.                                                 Delay10ms(1);
  353.                                                    keyTime++;
  354.                                         }
  355.                        
  356. }
  357. /*******************************************************************************
  358. * 函 数 名         : delay
  359. * 函数功能                   : 延时函数,延时1ms
  360. * 输    入         : 无
  361. * 输    出         : 无
  362. *******************************************************************************/
  363. void delay(unsigned int i)
  364. {
  365.     char j;
  366.     for(i; i > 0; i--)
  367.         for(j = 200; j > 0; j--);
  368. }
复制代码
4147313
3楼-- · 2019-07-15 21:24
  1. #include<reg51.h>
  2. #include"ds1302.h"
  3. //#include"smg.h"

  4. //--定义使用的IO--//
  5. sbit Beep =  P3^7 ;
  6. #define KEY P1                   //8位按键
  7. #define DUAN_SMG P0 //数码管段选
  8. sbit LSA=P2^2;                   //数码管位选
  9. sbit LSB=P2^3;
  10. sbit LSC=P2^4;

  11. //--定义全局变量--//
  12. unsigned char keyTime; //保存按键时间长短
  13. unsigned char DisplayData[8];        //用来存放要显示的8位数的值
  14. unsigned char SMG_CODE[17]={          //数码管显示十进制数值
  15. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  16. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

  17. //--声明使用到的函数--//
  18. void DigDisplay();                                //刷新数码管
  19. void Delay10ms(unsigned int c);        //延时函数
  20. void delay(unsigned int i);
  21. void Timer0Cofig(void);                        //初始化定时器0
  22. void Timer1Cofig(void);                        //初始化定时器1
  23. void KEY_Scan();                                   //扫描按键
  24. unsigned char IncBcdLow(unsigned char bcd);          
  25. unsigned char IncBcdHigh(unsigned char bcd);        //加时间
  26. unsigned char DecBcdLow(unsigned char bcd);                //减时间
  27. unsigned char keyTimeOK();                //按键时长

  28. /*******************************************************************************
  29. * 函 数 名         : main
  30. * 函数功能                   : 主函数
  31. * 输    入         : 无
  32. * 输    出         : 无
  33. *******************************************************************************/
  34. void main()
  35. {          
  36.     EA=1;//打开总中断
  37.         TMOD = 0x11;     //定时器0选择工作方式1
  38. //        //Ds1302Init();  //---初始化DS1302.写入初始值--- 注释后,断电重启不被初始化
  39.         Timer0Cofig();
  40.         Timer1Cofig();
  41.         while(1)
  42.         {       
  43.                  KEY_Scan();
  44.                  if (TIME[1]==0x10&&TIME[0]<0x05)
  45.                  {          
  46.                         TR1  = 1;                 //启动定时器0                               
  47.                  }else{
  48.                           TR1  = 0;                 //启动定时器0
  49.                  }
  50.         }       
  51. }

  52. /*******************************************************************************
  53. * 函 数 名         : Timer0Cofig
  54. * 函数功能                   : 配置定时器
  55. * 输    入         : 无
  56. * 输    出         : 无
  57. *******************************************************************************/
  58. void Timer0Cofig(void)
  59. {
  60.     TH0  = 0xd8;         //设置初始值,定时10MS
  61.     TL0  = 0xf0;
  62.     ET0  = 1;                 //打开定时器0中断
  63.     TR0  = 1;                 //启动定时器0       
  64. }

  65. /*******************************************************************************
  66. * 函 数 名         : Timer0
  67. * 函数功能                   : 定时器0中断函数
  68. *******************************************************************************/                  
  69. void Timer0() interrupt 1
  70. {
  71.     TH0  = 0xd8;         //设置初始值,定时10MS(55536)
  72.     TL0  = 0xf0;
  73.             Ds1302ReadTime(); //---读取时钟信息---
  74.                 DisplayData[0] = SMG_CODE[TIME[2]/16];                                //时
  75.                 DisplayData[1] = SMG_CODE[TIME[2]&0x0f];                                 
  76.                 DisplayData[2] = 0x40;
  77.                 DisplayData[3] = SMG_CODE[TIME[1]/16];                                //分
  78.                 DisplayData[4] = SMG_CODE[TIME[1]&0x0f];       
  79.                 DisplayData[5] = 0x40;
  80.                 DisplayData[6] = SMG_CODE[TIME[0]/16];                                //秒
  81.                 DisplayData[7] = SMG_CODE[TIME[0]&0x0f];
  82.                 DigDisplay();                                                                         //  使用数码管显示
  83. }
  84. /*******************************************************************************
  85. * 函 数 名         : Timer1Cofig
  86. * 函数功能                   : 配置定时器
  87. *******************************************************************************/
  88. void Timer1Cofig(void)
  89. {
  90.     TH1  =(65536-200)/256;         //设置初始值,定时200uS(55536)
  91.     TL1  =(65536-200)%256;
  92.     ET1  = 1;                 //打开定时器0中断
  93.     TR1  = 0;                 //初始化不开启定时器0       
  94. }
  95. /*******************************************************************************
  96. * 函 数 名         : Timer1
  97. * 函数功能                   : 定时器1中断函数
  98. *******************************************************************************/                  
  99. void Timer1() interrupt 3
  100. {
  101.     TH1  = (65536-200)/256;         //设置初始值,定时200uS(55536)
  102.     TL1  =(65536-200)%256;
  103.         Beep=~Beep;
  104. }
复制代码
4147313
4楼-- · 2019-07-15 22:41
  1. #include<reg51.h>
  2. #include"ds1302.h"
  3. //#include"smg.h"

  4. //--定义使用的IO--//
  5. sbit Beep =  P3^7 ;
  6. #define KEY P1                   //8位按键
  7. #define DUAN_SMG P0 //数码管段选
  8. sbit LSA=P2^2;                   //数码管位选
  9. sbit LSB=P2^3;
  10. sbit LSC=P2^4;

  11. //--定义全局变量--//
  12. unsigned char keyTime; //保存按键时间长短
  13. unsigned char DisplayData[8];        //用来存放要显示的8位数的值
  14. unsigned char SMG_CODE[17]={          //数码管显示十进制数值
  15. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  16. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

  17. //--声明使用到的函数--//
  18. void DigDisplay();                                //刷新数码管
  19. void Delay10ms(unsigned int c);        //延时函数
  20. void delay(unsigned int i);
  21. void Timer0Cofig(void);                        //初始化定时器0
  22. void Timer1Cofig(void);                        //初始化定时器1
  23. void KEY_Scan();                                   //扫描按键
  24. unsigned char IncBcdLow(unsigned char bcd);          
  25. unsigned char IncBcdHigh(unsigned char bcd);        //加时间
  26. unsigned char DecBcdLow(unsigned char bcd);                //减时间
  27. unsigned char keyTimeOK();                //按键时长

  28. /*******************************************************************************
  29. * 函 数 名         : main
  30. * 函数功能                   : 主函数
  31. * 输    入         : 无
  32. * 输    出         : 无
  33. *******************************************************************************/
  34. void main()
  35. {          
  36.     EA=1;//打开总中断
  37.         TMOD = 0x11;     //定时器0选择工作方式1
  38. //        //Ds1302Init();  //---初始化DS1302.写入初始值--- 注释后,断电重启不被初始化
  39.         Timer0Cofig();
  40.         Timer1Cofig();
  41.         while(1)
  42.         {       
  43.                  KEY_Scan();
  44.                  if (TIME[1]==0x10&&TIME[0]<0x05)
  45.                  {          
  46.                         TR1  = 1;                 //启动定时器0                               
  47.                  }else{
  48.                           TR1  = 0;                 //启动定时器0
  49.                  }
  50.         }       
  51. }

  52. /*******************************************************************************
  53. * 函 数 名         : Timer0Cofig
  54. * 函数功能                   : 配置定时器
  55. * 输    入         : 无
  56. * 输    出         : 无
  57. *******************************************************************************/
  58. void Timer0Cofig(void)
  59. {
  60.     TH0  = 0xd8;         //设置初始值,定时10MS
  61.     TL0  = 0xf0;
  62.     ET0  = 1;                 //打开定时器0中断
  63.     TR0  = 1;                 //启动定时器0       
  64. }

  65. /*******************************************************************************
  66. * 函 数 名         : Timer0
  67. * 函数功能                   : 定时器0中断函数
  68. *******************************************************************************/                  
  69. void Timer0() interrupt 1
  70. {
  71.     TH0  = 0xd8;         //设置初始值,定时10MS(55536)
  72.     TL0  = 0xf0;
  73.             Ds1302ReadTime(); //---读取时钟信息---
  74.                 DisplayData[0] = SMG_CODE[TIME[2]/16];                                //时
  75.                 DisplayData[1] = SMG_CODE[TIME[2]&0x0f];                                 
  76.                 DisplayData[2] = 0x40;
  77.                 DisplayData[3] = SMG_CODE[TIME[1]/16];                                //分
  78.                 DisplayData[4] = SMG_CODE[TIME[1]&0x0f];       
  79.                 DisplayData[5] = 0x40;
  80.                 DisplayData[6] = SMG_CODE[TIME[0]/16];                                //秒
  81.                 DisplayData[7] = SMG_CODE[TIME[0]&0x0f];
  82.                 DigDisplay();                                                                         //  使用数码管显示
  83. }
  84. /*******************************************************************************
  85. * 函 数 名         : Timer1Cofig
  86. * 函数功能                   : 配置定时器
  87. *******************************************************************************/
  88. void Timer1Cofig(void)
  89. {
  90.     TH1  =(65536-200)/256;         //设置初始值,定时200uS(55536)
  91.     TL1  =(65536-200)%256;
  92.     ET1  = 1;                 //打开定时器0中断
  93.     TR1  = 0;                 //初始化不开启定时器0       
  94. }
  95. /*******************************************************************************
  96. * 函 数 名         : Timer1
  97. * 函数功能                   : 定时器1中断函数
  98. *******************************************************************************/                  
  99. void Timer1() interrupt 3
  100. {
  101.     TH1  = (65536-200)/256;         //设置初始值,定时200uS(55536)
  102.     TL1  =(65536-200)%256;
  103.         Beep=~Beep;
  104. }
复制代码
4147313
5楼-- · 2019-07-15 23:56
 精彩回答 2  元偷偷看……
4147313
6楼-- · 2019-07-16 02:21
#include<reg51.h>
#include"ds1302.h"
//#include"smg.h"

//--定义使用的IO--//
sbit Beep =  P3^7 ;
#define KEY P1                   //8位按键
#define DUAN_SMG P0 //数码管段选
sbit LSA=P2^2;                   //数码管位选
sbit LSB=P2^3;
sbit LSC=P2^4;

//--定义全局变量--//
unsigned char keyTime; //保存按键时间长短
unsigned char DisplayData[8];        //用来存放要显示的8位数的值
unsigned char SMG_CODE[17]={          //数码管显示十进制数值
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//--声明使用到的函数--//
void DigDisplay();                                //刷新数码管
void Delay10ms(unsigned int c);        //延时函数
void delay(unsigned int i);
void Timer0Cofig(void);                        //初始化定时器0
void Timer1Cofig(void);                        //初始化定时器1
void KEY_Scan();                                   //扫描按键
unsigned char IncBcdLow(unsigned char bcd);          
unsigned char IncBcdHigh(unsigned char bcd);        //加时间
unsigned char DecBcdLow(unsigned char bcd);                //减时间
unsigned char keyTimeOK();                //按键时长

/*******************************************************************************
* 函 数 名         : main
* 函数功能                   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void main()
{          
    EA=1;//打开总中断
        TMOD = 0x11;     //定时器0选择工作方式1
//        //Ds1302Init();  //---初始化DS1302.写入初始值--- 注释后,断电重启不被初始化
        Timer0Cofig();
        Timer1Cofig();
        while(1)
        {       
                 KEY_Scan();
                 if (TIME[1]==0x10&&TIME[0]<0x05)
                 {          
                        TR1  = 1;                 //启动定时器0                               
                 }else{
                          TR1  = 0;                 //启动定时器0
                 }
        }       
}

/*******************************************************************************
* 函 数 名         : Timer0Cofig
* 函数功能                   : 配置定时器
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Timer0Cofig(void)
{
    TH0  = 0xd8;         //设置初始值,定时10MS
    TL0  = 0xf0;
    ET0  = 1;                 //打开定时器0中断
    TR0  = 1;                 //启动定时器0       
}

/*******************************************************************************
* 函 数 名         : Timer0
* 函数功能                   : 定时器0中断函数
*******************************************************************************/                  
void Timer0() interrupt 1
{
    TH0  = 0xd8;         //设置初始值,定时10MS(55536)
    TL0  = 0xf0;
            Ds1302ReadTime(); //---读取时钟信息---
                DisplayData[0] = SMG_CODE[TIME[2]/16];                                //时
                DisplayData[1] = SMG_CODE[TIME[2]&0x0f];                                 
                DisplayData[2] = 0x40;
                DisplayData[3] = SMG_CODE[TIME[1]/16];                                //分
                DisplayData[4] = SMG_CODE[TIME[1]&0x0f];       
                DisplayData[5] = 0x40;
                DisplayData[6] = SMG_CODE[TIME[0]/16];                                //秒
                DisplayData[7] = SMG_CODE[TIME[0]&0x0f];
                DigDisplay();                                                                         //  使用数码管显示
}
/*******************************************************************************
* 函 数 名         : Timer1Cofig
* 函数功能                   : 配置定时器
*******************************************************************************/
void Timer1Cofig(void)
{
    TH1  =(65536-200)/256;         //设置初始值,定时200uS(55536)
    TL1  =(65536-200)%256;
    ET1  = 1;                 //打开定时器0中断
    TR1  = 0;                 //初始化不开启定时器0       
}
/*******************************************************************************
* 函 数 名         : Timer1
* 函数功能                   : 定时器1中断函数
*******************************************************************************/                  
void Timer1() interrupt 3
{
    TH1  = (65536-200)/256;         //设置初始值,定时200uS(55536)
    TL1  =(65536-200)%256;
        Beep=~Beep;
}

一周热门 更多>