[原创] Show入门时的DIY小东西集

zhaojun_xf   2013-7-14 09:33 楼主
在学校读书时,做了好多小东西,这些东西都是用万用板焊接的,这么对年了,一直带在身边,现在Show出来,同时把代码图纸都完全开源,希望对还没人门的网友参考参考。
我的博客

回复评论 (101)

2推荐 zhaojun_xf 

2. 电子琴

IMG_5287.JPG



IMG_5288.JPG


IMG_5289.JPG


IMG_5290.JPG


IMG_5291.JPG


IMG_5292.JPG


IMG_5293.JPG
我的博客
点赞  2013-7-14 09:48

2推荐 zhaojun_xf 

1. 单片机音乐

IMG_5276.JPG



IMG_5277.JPG


IMG_5278.JPG


IMG_5279.JPG


IMG_5280.JPG


IMG_5282.JPG



IMG_5283.JPG


IMG_5284.JPG


IMG_5285.JPG


IMG_5286.JPG
我的博客
点赞  2013-7-14 09:38
1.png



原理图:
1.pdf (15.49 KB)
(下载次数: 85, 2013-7-14 09:40 上传)
我的博客
点赞  2013-7-14 09:40
资料和应用文档,非常详细的说明了其工作原理:
单片机音乐的应用.pdf (383.34 KB)
(下载次数: 106, 2013-7-14 09:46 上传)


代码:
单片机音乐的应用.c (29.12 KB)
(下载次数: 74, 2013-7-14 09:46 上传)
  1. #include "reg51.h"
  2.         #define uint    unsigned int
  3.         #define uchar   unsigned char
  4.         uchar *  TABLE  ;
  5.         code  uint   TABLE1 [15]={64260,64400,64524,64580,
  6.                                   64684,64777,64820,64898,
  7.                                   64968,65030,65058,65110,
  8.                                   65157,65178,65217};
  9.     code  uchar  SONG  [  ]={
  10.            //1. 迟来的爱
  11.            //0
  12.            0x08,0x08,
  13.            //1
  14.            0x02,0x12,0x42,0x62,0x52,0x42,0x21,11,
  15.            0x18,0x18,
  16.            0x02,0x22,0x42,0x82,0x92,0x82,0x61,0x51,0x42,
  17.            0x58,0x58,
  18.            //2
  19.            0x66,0x51,0x61,0x84,0x62,0x82,
  20.            0x52,0x62,0x42,0x52,0x28,
  21.            0x52,0x42,0x52,0x62,0x94,0x81,0x91,0x81,0x61,
  22.            0x1C,0x12,0x82,
  23.            //3
  24.            0x68,0x02,0x92,0x82,0x42,
  25.            0x5C,0x12,0x62,
  26.            0x58,0x02,0x42,0x51,0x41,0x22,
  27.            0x4C,0x62,0x52,
  28.            //4
  29.            0x66,0x82,0x92,0x82,0x61,0x51,0x41,0x51,
  30.            0x6C,0x52,0x62,
  31.            0x53,0x63,0x52,0x42,0x42,0x22,
  32.            0x1C,0x12,0x22,
  33.            //5
  34.            0x42,0x44,0x51,0x61,0x82,0x84,0x61,0x81,
  35.            0x96,0x82,0x66,0x51,0x61,
  36.            0x56,0x42,0x22,0x42,0x82,0x62,
  37.            0x5C,0x62,0x52,
  38.            //6
  39.            0x66,0x82,0x92,0x82,0x61,0x51,0x41,0x51,
  40.            0x6C,0x52,0x62,
  41.            0x56,0x62,0x52,0x42,0x42,0x22,
  42.            0x1C,0x12,0x22,
  43.            //7
  44.            0x42,0x44,0x51,0x61,0x82,0x84,0x61,0x81,
  45.            0x96,0x82,0x66,0x51,0x61,
  46.            0x56,0x62,0x92,0x82,0x62,0x52,
  47.            0x4C,0x62,0x61,0x81,
  48.            //8
  49.            0x9C,0x81,0x91,0x81,0x61,
  50.            0x6C,0x82,0x62,
  51.            0x56,0x42,0x24,0x42,0x52,
  52.            0x6C,0x62,0x61,0x81,
  53.            //9
  54.            0x9C,0xB2,0x92,
  55.            0x8C,0x82,0x92,
  56.            0xB2,0xB2,0xB2,0x92,0xD4,0xC1,0xD1,0xC1,0xB1,
  57.            0xCC,0xB2,0xB1,0xC1,
  58.            //A
  59.            0xDC,0xD2,0xC1,0xB1,
  60.            0x9C,0x92,0x91,0xC1,
  61.            0x92,0x84,0x92,0x82,0x62,0x51,0x61,0x51,0x41,
  62.            0x48,0x48,
  63.            //B
  64.            0x42,0x41,0x51,0x66,0x82,0x91,0xB1,
  65.            0x92,0x86,0x88,
  66.            0x42,0x41,0x51,0x66,0x42,0x41,0x51,
  67.            0x22,0x16,0x18,
  68.            0x86,0x62,0x58,
  69.            //C
  70.            0x83,0x91,0x62,0x82,0x58,
  71.            0x52,0x62,0x52,0x42,0x22,0x12,0x62,0x52,
  72.            0x4C,0x62,0x52,
  73.            //6
  74.            0x66,0x82,0x92,0x82,0x61,0x51,0x41,0x51,
  75.            0x6C,0x52,0x62,
  76.            0x56,0x62,0x52,0x42,0x42,0x22,
  77.            0x1C,0x12,0x22,
  78.            //7
  79.            0x42,0x44,0x51,0x61,0x82,0x84,0x61,0x81,
  80.            0x96,0x82,0x66,0x51,0x61,
  81.            0x56,0x62,0x92,0x82,0x62,0x52,
  82.            0x4C,0x62,0x61,0x81,
  83.            //8
  84.            0x9C,0x81,0x91,0x81,0x61,
  85.            0x6C,0x82,0x62,
  86.            0x56,0x42,0x24,0x42,0x52,
  87.            0x6C,0x62,0x61,0x81,
  88.            //9
  89.            0x9C,0xB2,0x92,
  90.            0x8C,0x82,0x92,
  91.            0xB2,0xB2,0xB2,0x92,0xD4,0xC1,0xD1,0xC1,0xB1,
  92.            0xCC,0xB2,0xB1,0xC1,
  93.            //A
  94.            0xDC,0xD2,0xC1,0xB1,
  95.            0x9C,0x92,0x91,0xC1,
  96.            0x92,0x84,0x92,0x82,0x62,0x51,0x61,0x51,0x41,
  97.            0x4C,0x62,0x61,0x81,
  98.            //8
  99.            0x9C,0x81,0x91,0x81,0x61,
  100.            0x6C,0x82,0x62,
  101.            0x56,0x42,0x24,0x42,0x52,
  102.            0x6C,0x62,0x61,0x81,
  103.            //9
  104.            0x9C,0xB2,0x92,
  105.            0x8C,0x82,0x92,
  106.            0xB2,0xB2,0xB2,0x92,0xD4,0xC1,0xD1,0xC1,0xB1,
  107.            0xCC,0xB2,0xB1,0xC1,
  108.            //A
  109.            0xDC,0xD2,0xC1,0xB1,
  110.            0x9C,0x92,0x91,0xC1,
  111.            0x92,0x84,0x92,0x82,0x62,0x51,0x61,0x51,0x41,
  112.            0x4C,0x62,0x61,0x81,
  113.            //D
  114.            0x66,0x51,0x61,0x86,0x61,0x81,
  115.            0x52,0x62,0x52,0x42,0x28,
  116.            0x82,0x91,0x01,0x62,0x11,0x52,0x11,0x01,0x62,0x54,
  117.            0x48,0x48,0x00};
  118. code  uchar  SONG1  [  ]={
  119.           //2.两只蝴蝶
  120.           //0
  121.           0x08,0x08,
  122.           //1  [326]
  123.           0x51,0x61,0x81,0x61,
  124.           0x94,0x8C,
  125.           0x02,0x42,0x51,0x41,0x21,0x41,0x02,0x42,0x51,0x41,0x21,0x51,
  126.           0x04,0x03,0x11,0x21,0x41,0x52,0x51,0x41,0x21,0x41,
  127.           0x62,0x82,0x02,0x62,0x62,0x52,0x62,0x82,
  128.           //2   
  129.           0x94,0x93,0x81,0x86,0x81,0x91,
  130.           0xB2,0xB2,0xB2,0xC2,0xC2,0xB2,0xB4,
  131.           0x04,0x02,0x82,0x71,0x61,0x51,0x61,0x51,0x41,0x21,0x41,
  132.           0x42,0x52,0x62,0x82,0x84,0x62,0x52,
  133.           //3  
  134.           0x68,0x02,0x52,0x62,0x52,
  135.           0x48,0x04,0x22,0x42,
  136.           0x54,0x52,0x62,0x52,0x42,0x22,0x42,
  137.           0x18,0x04,0x62,0x52,
  138.           0x68,0x02,0x52,0x62,0x52,
  139.           //4  
  140.           0x48,0x04,0x22,0x42,
  141.           0x54,0x52,0x62,0x52,0x42,0x22,0x42,
  142.           0x58,0x04,0x62,0x52,
  143.           //3  
  144.           0x68,0x02,0x52,0x62,0x52,
  145.           0x48,0x04,0x22,0x42,
  146.           0x54,0x52,0x62,0x52,0x42,0x22,0x42,
  147.           0x18,0x04,0x62,0x82,
  148.           0x88,0x02,0x82,0x92,0x82,
  149.           //4  
  150.           0x68,0x04,0x52,0x52,
  151.           0x54,0x52,0x62,0x52,0x42,0x22,0x42,
  152.           0x42,0x42,0x4C,
  153.           //5  
  154.           0x04,0x04,0x02,0x82,0x82,0x92,
  155.           0xB2,0xA2,0x92,0x64,0x52,0x62,
  156.           0x68,0x02,0x62,0x62,0x82,
  157.           0x94,0x96,0x22,0x62,0x52,
  158.           0x58,0x04,0x62,0x82,
  159.           //6  
  160.           0x82,0x62,0x84,0x02,0xB2,0xB2,0xA2,
  161.           0x92,0xA2,0x66,0x92,0x92,0xA2,
  162.           0x92,0x82,0x62,0x52,0x52,0x62,0x52,0x62,
  163.           0x88,0x02,0x82,0x82,0x92,
  164.           0xB2,0xA2,0x92,0x64,0x52,0x62,
  165.           0x68,0x02,0x62,0x62,0x82,
  166.           0x94,0x96,0x22,0x62,0x52,
  167.           0x58,0x04,0x62,0x82,
  168.           //6
  169.           0x82,0x62,0x84,0x02,0xB2,0xB2,0xA2,
  170.           0x92,0xA2,0x66,0x92,0x92,0xA2,
  171.           0x92,0x82,0x62,0x52,0x52,0x12,0x12,0x22,
  172.           0x48,0x02,0x82,0x82,0x92,
  173.           0xB2,0xA2,0xA2,0x92,0x64,0x52,0x62,
  174.           //A   
  175.           0x68,0x02,0x62,0x62,0x82,
  176.           0x94,0x96,0x22,0x62,0x52,
  177.           0x58,0x04,0x62,0x82,
  178.           0x82,0x62,0x84,0x02,0xB2,0xB2,0xA2,
  179.           0x92,0xA2,0x66,0x92,0x92,0xA2,
  180.           //B  
  181.           0x92,0x82,0x62,0x52,0x52,0x12,0x12,0x22,
  182.           0x4C,0x62,0x82,
  183.           0x82,0x62,0x84,0x02,0xB2,0xB2,0xA2,
  184.           0x92,0xA2,0x66,0x92,0x92,0xA2,
  185.           //C
  186.           0x92,0x82,0x62,0x52,0x52,0x12,0x12,0x22,0x4C,
  187.           0x62,0x12,0x52,0x42,0x44,0x62,0x82,
  188.           0x84,0x92,0xB2,0xC2,0xB2,0xB2,0xBC,0x00};
  189. code  uchar  SONG2  [  ]={
  190.           //3.祝你平安
  191.           //0
  192.           0x08,0x08,
  193.           //1
  194.           0x62,0x82,0x81,0x62,0x81,0x88,
  195.           0x62,0x42,0x42,0x21,0x41,0x48,
  196.           0x62,0x82,0x81,0x93,0x88,0x51,0x61,
  197.           //2
  198.           0x52,0x62,0x82,0x51,0x61,0x58,
  199.           0x62,0x42,0x42,0x21,0x61,0x66,0x51,0x61,
  200.           0x62,0x42,0x42,0x21,0x61,0x68,
  201.           //3
  202.           0x51,0x61,0x51,0x51,0x52,0x41,0x21,0x51,0x62,0x51,0x54,
  203.           0x11,0x11,0x81,0x81,0x51,0x63,0x48,
  204.           //1
  205.           0x62,0x82,0x81,0x62,0x81,0x88,
  206.           0x62,0x42,0x42,0x21,0x41,0x48,
  207.           0x62,0x82,0x81,0x93,0x88,0x51,0x61,
  208.           //2
  209.           0x52,0x62,0x82,0x51,0x61,0x58,
  210.           0x62,0x42,0x42,0x21,0x61,0x66,0x51,0x61,
  211.           0x62,0x42,0x42,0x21,0x61,0x68,
  212.           //3
  213.           0x51,0x61,0x51,0x51,0x52,0x41,0x21,0x51,0x62,0x51,0x54,
  214.           0x11,0x11,0x81,0x81,0x51,0x63,0x48,
  215.           0x08,0x08,
  216.           //4
  217.           0xb2,0xb2,0x62,0x82,0x86,0x61,0x51,
  218.           0x42,0x42,0x92,0x82,0x88,
  219.           0x92,0x92,0x92,0x46,0x21,0x41,
  220.           //5
  221.           0x82,0x62,0x62,0x52,0x58,
  222.           0xb2,0xb2,0x62,0x82,0x86,0x61,0x51,
  223.           0x42,0x42,0x92,0x82,0x88,
  224.           //6
  225.           0x62,0x52,0x41,0x42,0x22,0x51,0x62,0x51,0x54,
  226.           0x11,0x11,0x81,0x81,0x51,0x51,0x62,0x48,0x00};
  227. code  uchar  SONG3  [  ]={
  228.           //4.一个师傅三个徒弟
  229.           //0
  230.           0x08,0x08,
  231.           //1
  232.           0xd2,0xe2,0xd2,0xe2,0xd2,0xe2,0xd2,0xb2,
  233.           0xa8,0x68,
  234.           0xd2,0xe2,0xd2,0xe2,0xd2,0xc2,0xb2,0xa2,
  235.           //2
  236.           0xd8,0xd8,
  237.           0xd8,0xd8,
  238.           0x64,0x64,0x28,
  239.           0x44,0x22,0x12,0x24,0x04,
  240.           //3
  241.           0x22,0x42,0x42,0x42,0x44,0x42,0x22,
  242.           0x44,0x52,0x62,0x68,
  243.           0x64,0x84,0x24,0x44,
  244.           0x24,0x22,0x12,0x68,
  245.           //4
  246.           0x52,0x52,0x52,0x62,0x14,0x34,
  247.           0x28,0x28,
  248.           0x92,0x92,0x92,0x92,0x64,0x81,0x83,
  249.           0x82,0x82,0x82,0x62,0x92,0x82,0x04,
  250.           //5
  251.           0x72,0x72,0x72,0x72,0x74,0x41,0x43,
  252.           0x42,0x42,0x52,0x42,0x52,0x62,0x64,
  253.           0x92,0x92,0x92,0x92,0x64,0x81,0x83,
  254.           //6
  255.           0x82,0x82,0x82,0x62,0x92,0x82,0x04,
  256.           0x92,0x92,0x92,0x92,0xb4,0x91,0x83,
  257.           0x82,0x82,0x82,0x82,0x62,0x82,0x84,
  258.           //7
  259.           0x52,0x52,0x42,0x52,0x62,0x52,0x42,0x51,0x51,
  260.           0x62,0x52,0x62,0x82,0x88,
  261.           0x44,0x54,0x64,0x84,0x84,0x34,
  262.           0x28,0x28,
  263.           0x64,0x64,0x28,
  264.           0x44,0x22,0x12,0x24,0x04,
  265.           //3
  266.           0x22,0x42,0x42,0x42,0x44,0x42,0x22,
  267.           0x44,0x52,0x62,0x68,
  268.           0x64,0x84,0x24,0x44,
  269.           0x24,0x22,0x12,0x68,
  270.           //4
  271.           0x52,0x52,0x52,0x62,0x14,0x34,
  272.           0x28,0x28,
  273.           0x92,0x92,0x92,0x92,0x64,0x81,0x83,
  274.           0x82,0x82,0x82,0x62,0x92,0x82,0x04,
  275.           //5
  276.           0x72,0x72,0x72,0x72,0x74,0x41,0x43,
  277.           0x42,0x42,0x52,0x42,0x52,0x62,0x64,
  278.           0x92,0x92,0x92,0x92,0x64,0x81,0x83,
  279.           //6
  280.           0x82,0x82,0x82,0x62,0x92,0x82,0x04,
  281.           0x92,0x92,0x92,0x92,0xb4,0x91,0x83,
  282.           0x82,0x82,0x82,0x82,0x62,0x82,0x84,
  283.           //7
  284.           0x52,0x52,0x42,0x52,0x62,0x52,0x42,0x51,0x51,
  285.           0x62,0x52,0x62,0x82,0x88,
  286.           //8
  287.           0x42,0x52,0x42,0x51,0x51,0x62,0x52,0x62,0x92,
  288.           0x98,0x98,0x00};
  289. code  uchar  SONG4  [  ]={
  290.           //5.梦醒时分
  291.           //0
  292.           0x08,0x08,
  293.           //1
  294.           0x21,0x41,0x81,0x61,0x62,0x21,0x41,0x81,0x62,0x81,0x81,0x91,0xa1,0xb1,
  295.           0x82,0x81,0x81,0x81,0x93,0x68,
  296.           //2
  297.           0x21,0x41,0x81,0x61,0x62,0x21,0x41,0x81,0x62,0x81,0x91,0xa1,0xa1,0x91,
  298.           0xc6,0x91,0x91,0x86,
  299.           //3
  300.           0x44,0x54,0x62,0x61,0x61,0x51,0x52,
  301.           0x62,0x81,0x61,0x62,0x61,0x81,0x92,0x92,0x92,0xa2,
  302.           //4
  303.           0x82,0x64,0x61,0x51,0x42,0x41,0x41,0x41,0x21,0x22,
  304.           0x62,0x81,0x41,0x44,0x51,0x53,0x52,0x42,0x62,
  305.           //5
  306.           0x62,0x54,0x41,0x51,0x62,0x61,0x61,0x62,0x52,
  307.           0x62,0x81,0x61,0x62,0x61,0x81,0x92,0x91,0x91,0x92,0xa2,
  308.           //6
  309.           0x84,0x64,0x61,0x81,0x81,0x81,0x92,0xb2,0xb1,0x91,0x92,
  310.           0x72,0x54,0x81,0x81,0x92,0xb2,0xb2,0x92,
  311.           //7
  312.           0xb2,0xc6,0xc6,0x01,0x81,0x81,0x81,
  313.           0xd2,0xd2,0xd2,0xd2,0xc2,0xc1,0xc1,0xc2,0xb1,0xa1,
  314.           //8
  315.           0xb2,0xb1,0xb1,0xb2,0xc2,0x62,0x84,0x81,0x81,
  316.           0x92,0xb2,0xb2,0xb2,0xb2,0xc3,0x91,0xb2,0xb1,0xb1,
  317.           //9
  318.           0xc2,0xc1,0xc1,0xb2,0xb2,0xd2,0xc1,0x81,0x01,0x81,0x81,0x81,
  319.           0xd2,0xd2,0xd2,0xf2,0xc2,0xc1,0xc2,0xb1,0xa1,
  320.           //a
  321.           0xb2,0xb1,0xb1,0xb2,0xc2,0x62,0x84,0x81,0x81,
  322.           0x92,0xb1,0xb1,0xb2,0xb2,0xc2,0x91,0xb1,0x02,0xb1,0xb1,
  323.           //b
  324.           0xc2,0xc1,0xb1,0xc1,0xb1,0xb2,0xd4,0xc3,0xb1,
  325.           0xb8,0xb8,0x00};
  326. code  uchar  SONG5  [  ]={
  327.            //6.祈祷
  328.            //0
  329.            0x08,0x08,
  330.            //1
  331.            0x84,0x92,0xf2,0xd8,
  332.            0xc4,0xb2,0xa2,0x98,
  333.            0xc4,0xb2,0xf2,0xd2,0xc4,
  334.            0xd8,0xd8,
  335.            0x14,0x22,0x82,0x68,
  336.            0x54,0x42,0x32,0x28,
  337.            //2
  338.            0x14,0x22,0x42,0x44,0x14,
  339.            0x28,0x28,
  340.            0x28,0x28,
  341.            0x14,0x22,0x42,0x54,0x52,0x62,
  342.            //3
  343.            0x58,0x42,0x22,0x24,
  344.            0x22,0x22,0x42,0x52,0x64,0x62,0x52,
  345.            0x58,0x58,
  346.            0x14,0x22,0x42,0x54,0x52,0x82,
  347.            //4
  348.            0x68,0x52,0x42,0x44,
  349.            0x24,0x22,0x42,0x44,0x42,0x22,
  350.            0x28,0x28,
  351.            0x14,0x22,0x42,0x54,0x52,0x62,
  352.            //3
  353.            0x58,0x42,0x22,0x24,
  354.            0x22,0x22,0x42,0x52,0x64,0x62,0x52,
  355.            0x58,0x58,
  356.            0x14,0x22,0x42,0x54,0x52,0x82,
  357.            //4
  358.            0x68,0x52,0x42,0x44,
  359.            0x24,0x22,0x42,0x44,0x42,0x22,
  360.            0x28,0x28,
  361.            //5
  362.            0x22,0x62,0x52,0x62,0x42,0x52,0x62,0x82,
  363.            0x94,0x92,0x82,0x94,0xb2,0xa2,
  364.            0x94,0x84,0x64,0x84,
  365.            //7
  366.            0x98,0x98,
  367.            0x92,0x82,0x92,0xb2,0xd8,
  368.            0xc8,0xc8,
  369.            0xa8,0xa8,
  370.            0x14,0x22,0x42,0x54,0x52,0x62,
  371.            //3
  372.            0x58,0x42,0x22,0x24,
  373.            0x22,0x22,0x42,0x52,0x64,0x62,0x52,
  374.            0x58,0x58,
  375.            0x14,0x22,0x42,0x54,0x52,0x82,
  376.            //4
  377.            0x68,0x52,0x42,0x44,
  378.            0x24,0x22,0x42,0x44,0x42,0x22,
  379.            0x28,0x28,
  380.            
  381.            0x14,0x22,0x42,0x54,0x52,0x62,
  382.            //3
  383.            0x58,0x42,0x22,0x24,
  384.            0x22,0x22,0x42,0x52,0x64,0x62,0x52,
  385.            0x58,0x58,
  386.            0x14,0x22,0x42,0x54,0x52,0x82,
  387.            //4
  388.            0x68,0x52,0x42,0x44,
  389.            0x24,0x22,0x42,0x44,0x42,0x22,
  390.            0x28,0x28,
  391.            //6
  392.            0x94,0x92,0x82,0x84,0x82,0x62,
  393.            0x88,0x88,
  394.            0x54,0x52,0x52,0x54,0x82,0x62,
  395.            0x54,0x64,0x54,0x64,
  396.            //8
  397.            0x94,0x92,0xa2,0xb2,0xa2,0x92,0x82,
  398.            0x94,0x94,0x94,0x74,
  399.            0x84,0x84,0x84,0x84,0x00};
  400.     code  uchar  SONG6  [  ]={
  401.            //7.春天的故事
  402.            //0
  403.            0x08,0x08,
  404.            //1
  405.            0x02,0x12,0x22,0x12,
  406.            0x68,
  407.            0x02,0x12,0x22,0x12,
  408.            0x58,
  409.            0x02,0x12,0x22,0x12,
  410.            0x58,0x52,0x52,0x62,0x92,
  411.            //2
  412.            0x88,
  413.            0x88,
  414.            0x82,0x81,0x81,0x91,0x81,0x91,0x81,
  415.            0x88,
  416.            0x88,
  417.            0x52,0x61,0x61,0x61,0x31,0x21,0x41,
  418.            //3
  419.            0x18,
  420.            0x18,
  421.            0x02,0x62,0x12,0x22,
  422.            0x43,0x51,0x61,0x81,0x52,
  423.            0x58,
  424.            0x58,
  425.            //4
  426.            0x12,0x81,0x81,0x81,0x61,0x51,0x61,
  427.            0x32,0x02,0x21,0x31,0x11,0x21,
  428.            0x18,
  429.            0x18,
  430.            0x12,0x82,0x81,0x61,0x52,
  431.            //5
  432.            0x46,0x21,0x41,
  433.            0x53,0x51,0x61,0x31,0x21,0x41,
  434.            0x18,
  435.            0x22,0x48,0x52,
  436.            0x62,0x84,0x62,
  437.            //6
  438.            0x91,0x92,0x91,0x81,0x91,0x61,0x61,
  439.            0x53,0x21,0x41,0x51,0x61,0x51,
  440.            0x58,
  441.            0x58,
  442.            0x63,0x51,0x82,0x32,
  443.            //7
  444.            0x24,0x12,0x62,
  445.            0x13,0x21,0x32,0x61,0x81,
  446.            0x58,
  447.            0x63,0x81,0x82,0x32,
  448.            0x24,0x12,0x62,
  449.            //8
  450.            0x33,0x31,0x21,0x31,0x12,
  451.            0x18,
  452.            0x86,0x81,0x91,
  453.            0x81,0x91,0x44,0x32,
  454.            0x22,0x72,0x81,0x91,0x51,
  455.            //9
  456.            0x58,
  457.            0x86,0x81,0x91,
  458.            0x81,0x91,0x44,0x32,
  459.            0x22,0x92,0x91,0x81,0x91,0x81,
  460.            0x88,
  461.            //a
  462.            0x02,0x81,0x91,0x11,0x91,0x81,0x91,
  463.            0x46,0x21,0x41,
  464.            0x53,0x61,0x31,0x51,0x22,
  465.            0x28,
  466.            0x22,0x62,0x12,0x21,0x21,
  467.            //b
  468.            0x43,0x51,0x62,0x81,0x81,
  469.            0x81,0x31,0x21,0x41,0x14,
  470.            0x18,
  471.            0x02,0x62,0x12,0x21,0x21,
  472.            //c
  473.            0x43,0x51,0x62,0xb1,0x21,
  474.            0x81,0x61,0x84,0x62,
  475.            0x53,0x61,0x81,0x31,0x21,0x41,
  476.            0x56,0x61,0x81,
  477.            //d
  478.            0x13,0x21,0x32,0x61,0x81,
  479.            0x52,0x32,0x21,0x31,0x12,
  480.            0x16,0x22,
  481.            0x18,
  482.            0x12,0x82,0x81,0x61,0x52,
  483.            //5
  484.            0x46,0x21,0x41,
  485.            0x53,0x51,0x61,0x31,0x21,0x41,
  486.            0x18,
  487.            0x22,0x48,0x52,
  488.            0x62,0x84,0x62,
  489.            //6
  490.            0x91,0x92,0x91,0x81,0x91,0x61,0x61,
  491.            0x53,0x21,0x41,0x51,0x61,0x51,
  492.            0x58,
  493.            0x58,
  494.            0x63,0x51,0x82,0x32,
  495.            //7
  496.            0x24,0x12,0x62,
  497.            0x13,0x21,0x32,0x61,0x81,
  498.            0x58,
  499.            0x63,0x81,0x82,0x32,
  500.            0x24,0x12,0x62,
  501.            //8
  502.            0x33,0x31,0x21,0x31,0x12,
  503.            0x18,
  504.            0x86,0x81,0x91,
  505.            0x81,0x91,0x44,0x32,
  506.            0x22,0x72,0x81,0x91,0x51,
  507.            //9
  508.            0x58,
  509.            0x86,0x81,0x91,
  510.            0x81,0x91,0x44,0x32,
  511.            0x22,0x92,0x91,0x81,0x91,0x81,
  512.            0x88,
  513.            //a
  514.            0x02,0x81,0x91,0x11,0x91,0x81,0x91,
  515.            0x46,0x21,0x41,
  516.            0x53,0x61,0x31,0x51,0x22,
  517.            0x28,
  518.            0x22,0x62,0x12,0x21,0x21,
  519.            //b
  520.            0x43,0x51,0x62,0x81,0x81,
  521.            0x81,0x31,0x21,0x41,0x14,
  522.            0x18,
  523.            0x02,0x62,0x12,0x21,0x21,
  524.            //c
  525.            0x43,0x51,0x62,0xb1,0x21,
  526.            0x81,0x61,0x84,0x62,
  527.            0x53,0x61,0x81,0x31,0x21,0x41,
  528.            0x56,0x61,0x81,
  529.            //d
  530.            0x13,0x21,0x32,0x61,0x81,
  531.            0x52,0x32,0x21,0x31,0x12,
  532.            0x16,0x22,
  533.            0x18,
  534.            0x82,0x81,0x81,0x91,0x81,0x91,0x81,
  535.            //e
  536.            0x88,
  537.            0x88,
  538.            0x82,0x81,0x81,0x91,0x81,0x91,0x81,
  539.            0x88,
  540.            0x88,
  541.            0x12,0x81,0x81,0x81,0x61,0x51,0x61,
  542.            //f
  543.            0xa2,0x02,0x21,0x31,0x11,0x21,
  544.            0x18,
  545.            0x18,
  546.            0xa4,0x92,0xa2,
  547.            0x64,0x84,
  548.            0x88,
  549.            0x88,
  550.            0x88,
  551.            0x00};
  552.     code  uchar  SONG7  [  ]={
  553.            //8.好大一棵树
  554.            //0
  555.            0x08,0x08,
  556.            //1
  557.            0xdc,0xc2,0xd2,
  558.            0xc2,0x92,0xb2,0xa2,0xa2,0x82,
  559.            0x22,0x92,0xb2,0xd2,0xd2,0xc4,0x92,
  560.            0x94,0xd2,0xc2,0xb2,0xc2,0xc4,
  561.            //2
  562.            0xe2,0xf2,0xfc,
  563.            0x62,0x82,0x83,0x61,0x86,0x02,
  564.            0x92,0xb2,0xb3,0x91,0x86,0x02,
  565.            //3
  566.            0x92,0xb1,0xb1,0x02,0x92,0x82,0xb1,0x61,0x62,0x02,
  567.            0x52,0x62,0x52,0x41,0x51,0x54,0x04,
  568.            0x62,0x82,0x83,0x61,0x86,0x02,
  569.            //4
  570.            0x92,0xb2,0xb3,0x91,0x86,0x02,
  571.            0x92,0xb1,0xb1,0x02,0xb1,0x91,0x81,0x81,0xb1,0x61,0x04,
  572.            0x52,0x62,0x61,0x52,0x41,0x46,0x02,
  573.            0x62,0x82,0x83,0x61,0x86,0x02,
  574.            0x92,0xb2,0xb3,0x91,0x86,0x02,
  575.            //3
  576.            0x92,0xb2,0xb2,0x92,0x81,0x81,0xb1,0x61,0x62,0x61,0x61,
  577.            0x52,0x64,0x51,0x41,0x54,0x04,
  578.            0x62,0x82,0x83,0x61,0x86,0x02,
  579.            //4
  580.            0x92,0xb2,0xb3,0x91,0x86,0x02,
  581.            0x92,0xb2,0xb2,0x92,0x82,0xb1,0x61,0x04,
  582.            0x52,0x62,0x61,0x51,0x51,0x41,0x46,0x02,           
  583.            //5
  584.            0x92,0xb2,0xb3,0x91,0xa8,
  585.            0x82,0xb2,0xb3,0x91,0x88,
  586.            0x42,0x42,0x42,0x52,0x62,0x51,0x61,0x64,
  587.            //6
  588.            0x52,0x52,0x51,0x92,0x81,0x88,
  589.            0x92,0xb2,0xb3,0x91,0xb8,
  590.            0x82,0xb2,0xb3,0x91,0x88,
  591.            //7
  592.            0x42,0x52,0x62,0x82,0x92,0x81,0x91,0x94,
  593.            0x82,0x62,0x51,0x63,0x48,
  594.            0x42,0x52,0x62,0x82,0x92,0xa1,0xb1,0x04,
  595.            //8
  596.            0x84,0xb4,0xb2,0xc6,
  597.            0xcc,0xb4,
  598.            0xb8,0xb8,
  599.            0xb8,0xb8,
  600.            0xb4,0x04,0x04,0x04,
  601.            0x00};
  602.     code  uchar  SONG8  [  ]={
  603.            //9.爱就一个字
  604.            //0
  605.            0x08,0x08,
  606.            //1
  607.            0x82,0x81,0x81,0x82,0xb1,0xb1,0xb2,0x92,0x93,0x91,
  608.            0x82,0x91,0x81,0x82,0x71,0x61,0x72,0x82,0x84,
  609.            //2
  610.            0x82,0x81,0x81,0x82,0xb2,0xb2,0x92,0x03,0x91,
  611.            0x82,0xc2,0xc2,0xa1,0xb1,0xb4,0xd2,0xc2,
  612.            //3
  613.            0xb4,0xb1,0xc1,0xd1,0xa1,0xa4,0x03,0x81,
  614.            0x91,0x81,0x91,0x81,0x92,0xb2,0xf2,0xd1,0xc1,0xd4,0xc4,
  615.            //4
  616.            0xa4,0xd2,0xf1,0xb1,0xb4,0x01,0xb1,0xc1,0xd1,
  617.            0xe2,0xd1,0xb1,0xb3,0xd1,0xe2,0xd1,0xb1,0xe2,0xd1,0xb1,
  618.            //5
  619.            0xd3,0xe1,0xd1,0xc4,0xb4,0x94,
  620.            0x82,0x81,0x81,0x82,0xb2,0xb2,0x92,0x03,0x91,
  621.            0x82,0x91,0x81,0x82,0x71,0x61,0x72,0x86,
  622.            //6
  623.            0x82,0x81,0x81,0x82,0xb2,0xb2,0x92,0x02,0x92,
  624.            0x82,0xc2,0xc2,0xb1,0xd1,0xd4,0xd2,0xc2,
  625.            0xb4,0xb1,0xc1,0xd1,0xa1,0xa4,0x03,0x81,
  626.            //7
  627.            0x91,0x81,0x91,0x81,0x92,0xb2,0xf2,0xd1,0xc1,0xd2,0xc2,
  628.            0xa4,0xd2,0xf1,0xb1,0xb4,0x01,0xb1,0xc1,0xd1,
  629.            //8
  630.            0xe2,0xd1,0xb1,0xb3,0xd1,0xe2,0xd1,0xb1,0xe2,0xd1,0xb1,
  631.            0xf6,0xf2,0xf2,0x81,0x91,0x81,0x91,0xd1,
  632.            //9
  633.            0x03,0x81,0x91,0x81,0x91,0xc1,0x03,0x81,0x91,0x81,0x91,0xb1,
  634.            0xb2,0xb1,0xb1,0xc2,0xd1,0xa1,0xa4,0x03,0xa1,
  635.            //a
  636.            0x03,0x81,0x91,0x81,0x91,0xd1,
  637.            0x03,0x81,0x91,0x81,0x91,0xb1,0x03,0x81,0x91,0x81,0x91,0xb1,
  638.            0xb2,0xb1,0xb1,0xc2,0xd1,0xf1,0xf4,0x03,0xd1,
  639.            //b
  640.            0xd2,0xe1,0xf1,0xc1,0xb2,0x81,0xd2,0xe1,0xf1,0xc2,0xb2,
  641.            0x03,0x91,0xf1,0xf1,0xf1,0xf1,0xf2,0xd2,0xf4,0xf8,0x04,0x04,
  642.            //1
  643.            0x82,0x81,0x81,0x82,0xb1,0xb1,0xb2,0x92,0x93,0x91,
  644.            0x82,0x91,0x81,0x82,0x71,0x61,0x72,0x82,0x84,
  645.            //2
  646.            0x82,0x81,0x81,0x82,0xb2,0xb2,0x92,0x03,0x91,
  647.            0x82,0xc2,0xc2,0xa1,0xb1,0xb4,0xd2,0xc2,
  648.            //3
  649.            0xb4,0xb1,0xc1,0xd1,0xa1,0xa4,0x03,0x81,
  650.            0x91,0x81,0x91,0x81,0x92,0xb2,0xf2,0xd1,0xc1,0xd4,0xc4,
  651.            //4
  652.            0xa4,0xd2,0xf1,0xb1,0xb4,0x01,0xb1,0xc1,0xd1,
  653.            0xe2,0xd1,0xb1,0xb3,0xd1,0xe2,0xd1,0xb1,0xe2,0xd1,0xb1,
  654.            //5
  655.            0xd3,0xe1,0xd1,0xc4,0xb4,0x94,
  656.            0x82,0x81,0x81,0x82,0xb2,0xb2,0x92,0x03,0x91,
  657.            0x82,0x91,0x81,0x82,0x71,0x61,0x72,0x86,
  658.            //6
  659.            0x82,0x81,0x81,0x82,0xb2,0xb2,0x92,0x02,0x92,
  660.            0x82,0xc2,0xc2,0xb1,0xd1,0xd4,0xd2,0xc2,
  661.            0xb4,0xb1,0xc1,0xd1,0xa1,0xa4,0x03,0x81,
  662.            //7
  663.            0x91,0x81,0x91,0x81,0x92,0xb2,0xf2,0xd1,0xc1,0xd2,0xc2,
  664.            0xa4,0xd2,0xf1,0xb1,0xb4,0x01,0xb1,0xc1,0xd1,
  665.            //8
  666.            0xe2,0xd1,0xb1,0xb3,0xd1,0xe2,0xd1,0xb1,0xe2,0xd1,0xb1,
  667.            0xf6,0xf2,0xf2,0x81,0x91,0x81,0x91,0xd1,
  668.            //9
  669.            0x03,0x81,0x91,0x81,0x91,0xc1,0x03,0x81,0x91,0x81,0x91,0xb1,
  670.            0xb2,0xb1,0xb1,0xc2,0xd1,0xa1,0xa4,0x03,0xa1,
  671.            //a
  672.            0x03,0x81,0x91,0x81,0x91,0xd1,
  673.            0x03,0x81,0x91,0x81,0x91,0xb1,0x03,0x81,0x91,0x81,0x91,0xb1,
  674.            0xb2,0xb1,0xb1,0xc2,0xd1,0xf1,0xf4,0x03,0xd1,
  675.            //b
  676.            0xd2,0xe1,0xf1,0xc1,0xb2,0x81,0xd2,0xe1,0xf1,0xc2,0xb2,
  677.            //c
  678.            0x03,0x91,0xf1,0xf1,0xf1,0xf1,0xf2,0xd2,0xf4,
  679.            0xd2,0xc1,0xb1,0xc2,0xb5,0xb4,
  680.            0xbc,0x04,  
  681.            0x00};
  682.     code  uchar  SONG9  [  ]={
  683.            //大约在冬季
  684.            //0
  685.            0x08,0x08,
  686.            //1
  687.            0xb6,0xa1,0x91,0xa8,
  688.            0x96,0x82,0x66,0x61,0x81,
  689.            0x94,0xa4,0xb4,0xc4,
  690.            0xf8,0xf8,
  691.            //2
  692.            0x41,0x42,0x41,0x02,0x41,0x51,0x62,0x81,0x81,0x02,0x61,0x81,
  693.            0x92,0x61,0x61,0x52,0x51,0x61,0x64,0x02,0x61,0x51,
  694.            //3
  695.            0x42,0x21,0x21,0x04,0x61,0x51,0x42,0x21,0x21,0x02,0x21,0x41,
  696.            0x52,0x51,0x51,0x51,0x61,0x51,0x81,0x84,0x04,
  697.            //4
  698.            0x41,0x42,0x41,0x42,0x41,0x51,0x62,0x81,0x81,0x02,0x61,0x81,
  699.            0x91,0x61,0x61,0x61,0x61,0x52,0x52,0x61,0x62,0x02,0x02,0x61,0x51,
  700.            //5
  701.            0x42,0x21,0x21,0x02,0x61,0x51,0x42,0x21,0x21,0x02,0x21,0x41,
  702.            0x51,0x51,0x51,0x51,0x52,0x11,0x21,0x24,0x04,
  703.            //6
  704.            0x91,0x92,0x91,0x92,0x62,0x81,0x82,0x81,0x82,0x61,0x51,
  705.            0x42,0x42,0x41,0x52,0x41,0x64,0x04,
  706.            //7
  707.            0x91,0x92,0x91,0x92,0x91,0xa1,0x91,0x82,0x81,0x02,0x61,0x81,
  708.            0x92,0x62,0x51,0x42,0x81,0x84,0x04,
  709.            //8
  710.            0x41,0x42,0x41,0x02,0x41,0x51,0x62,0x81,0x81,0x02,0x61,0x81,
  711.            0x92,0x62,0x61,0x51,0x51,0x61,0x64,0x02,0x61,0x51,
  712.            //9
  713.            0x42,0x21,0x21,0x02,0x61,0x51,0x42,0x21,0x21,0x02,0x21,0x41,
  714.            0x51,0x51,0x51,0x51,0x52,0x11,0x21,021,0x02,0x02,0x61,0x51,
  715.            //a
  716.            0x42,0x21,0x21,0x02,0x61,0x51,0x42,0x21,0x21,0x02,0x21,0x41,
  717.            0x51,0x51,0x51,0x51,0x52,0x12,0x24,0x04,
  718.            //b
  719.            0x24,0x14,0x74,0x64,
  720.            0x54,0x84,0x44,0x41,0x51,0x61,0x81,
  721.            0x94,0xa4,0xb4,0xc4,
  722.            0xf8,0xf8,
  723.            //2
  724.            0x41,0x42,0x41,0x02,0x41,0x51,0x62,0x81,0x81,0x02,0x61,0x81,
  725.            0x92,0x61,0x61,0x52,0x51,0x61,0x64,0x02,0x61,0x51,
  726.            //3
  727.            0x42,0x21,0x21,0x04,0x61,0x51,0x42,0x21,0x21,0x02,0x21,0x41,
  728.            0x52,0x51,0x51,0x51,0x61,0x51,0x81,0x84,0x04,
  729.            //4
  730.            0x41,0x42,0x41,0x42,0x41,0x51,0x62,0x81,0x81,0x02,0x61,0x81,
  731.            0x91,0x61,0x61,0x61,0x61,0x52,0x52,0x61,0x62,0x02,0x02,0x61,0x51,
  732.            //5
  733.            0x42,0x21,0x21,0x02,0x61,0x51,0x42,0x21,0x21,0x02,0x21,0x41,
  734.            0x51,0x51,0x51,0x51,0x52,0x11,0x21,0x24,0x04,
  735.            //6
  736.            0x91,0x92,0x91,0x92,0x62,0x81,0x82,0x81,0x82,0x61,0x51,
  737.            0x42,0x42,0x41,0x52,0x41,0x64,0x04,
  738.            //7
  739.            0x91,0x92,0x91,0x92,0x91,0xa1,0x91,0x82,0x81,0x02,0x61,0x81,
  740.            0x92,0x62,0x51,0x42,0x81,0x84,0x04,
  741.            //8
  742.            0x41,0x42,0x41,0x02,0x41,0x51,0x62,0x81,0x81,0x02,0x61,0x81,
  743.            0x92,0x62,0x61,0x51,0x51,0x61,0x64,0x02,0x61,0x51,
  744.            //9
  745.            0x42,0x21,0x21,0x02,0x61,0x51,0x42,0x21,0x21,0x02,0x21,0x41,
  746.            0x51,0x51,0x51,0x51,0x52,0x11,0x21,021,0x02,0x02,0x61,0x51,
  747.            //a
  748.            0x42,0x21,0x21,0x02,0x61,0x51,0x42,0x21,0x21,0x02,0x21,0x41,
  749.            //c
  750.            0x51,0x51,0x51,0x51,0x52,0x12,0x24,0x02,0x61,0x51,
  751.            0x42,0x21,0x21,0x02,0x61,0x51,0x42,0x21,0x21,0x02,0x21,0x41,
  752.            //d
  753.            0x51,0x51,0x51,0x51,0x54,0x04,0x84,
  754.            0x91,0x81,0x96,0x98,
  755.            0x9c,0x04,
  756.            0x00};
  757. code  uchar  SONG0  [  ]={
  758.            //10.生日快乐
  759.            //0
  760.            0x08,0x08,
  761.            //1
  762.            0x83,0x81,0x94,0x84,
  763.            0xb4,0xa8,
  764.            0x83,0x81,0x94,0x84,
  765.            0xc4,0xb8,
  766.            //2
  767.            0x83,0x81,0xf4,0xd4,
  768.            0xb4,0xa4,0x94,
  769.            0xe3,0xe1,0xd4,0xb4,
  770.            0xc4,0xb8,
  771.            //3
  772.            0x83,0x81,0x94,0x84,
  773.            0xb4,0xa8,
  774.            0x83,0x81,0x94,0x84,
  775.            0xc4,0xb8,
  776.            //4
  777.            0x83,0x81,0xf4,0xd4,
  778.            0xb4,0xa4,0x94,
  779.            0xe3,0xe1,0xd4,0xb4,
  780.            0xc4,0xb8,
  781.            0x00};
  782.     uchar hjsz;
  783.     uchar ljsz;
  784.     uchar jpm;
  785.         uchar yfm;
  786.         uchar t0 =0;
  787.         uint  i=0;
  788.         sbit Speaker =P1^0;
  789.         uint k;
  790.     void Delay1()
  791.     {  
  792.       for ( k=0;k<20000;k++);  
  793.     }

  794.         void Lignt( )
  795.     { uchar t;
  796.       for(t=0;t<10;t++)
  797.       {
  798.                   P2=0xff;
  799.                   Delay1();
  800.                   P2=0x00;
  801.                   Delay1();
  802.       }
  803.      }
  804.      void Lignt1( )
  805.     {
  806.               P2=0xaa;
  807.               Delay1();
  808.               P2=0x55;
  809.               Delay1();
  810.      }
  811.         void Delay(uchar t0)//延时
  812.         {   
  813.             while(t0--)     //决定节拍
  814.               Lignt1();
  815.         }
  816.         void Delay2(uchar w0)//延时
  817.         {   
  818.             while(w0--)     //决定节拍
  819.               Lignt();
  820.         }
  821.         void T0Int() interrupt 1//TIMER0
  822.     {
  823.         TL0 = ljsz;
  824.         TH0 = hjsz;
  825.         Speaker=!Speaker;
  826.     }
  827.     void ExtInt0() interrupt 0//INT0
  828.     {
  829.         if(t0>10)
  830.         t0=0;
  831.         i=0;                               // 全局变量,指向歌谱的第1个
  832.             switch(t0++)
  833.             {
  834.                 case 0 : TABLE=SONG;break; //选择第1首
  835.                 case 1 : TABLE=SONG1;break;//选择第2首
  836.                 case 2 : TABLE=SONG2;break;//选择第3首
  837.                 case 3 : TABLE=SONG3;break;//选择第4首
  838.                 case 4 : TABLE=SONG4;break;//选择第5首
  839.                 case 5 : TABLE=SONG5;break;//选择第6首
  840.                 case 6 : TABLE=SONG6;break;//选择第7首
  841.                 case 7 : TABLE=SONG7;break;//选择第8首
  842.                 case 8 : TABLE=SONG8;break;//选择第9首
  843.                 case 9 : TABLE=SONG9;break;//选择第10首
  844.             }
  845.     }
  846.         void songsing()//发音程序
  847.     {
  848.         i=0;
  849.             while(TABLE[i])
  850.         {
  851.            jpm=TABLE[i]&0x0f;        //节拍值
  852.            yfm=(TABLE[i]>>0x04)&0x0f;//简谱值
  853.          if(yfm)                     //简谱为1,取计数值
  854.            {
  855.             yfm=yfm-1;
  856.             hjsz=(uchar)(TABLE1[yfm]>>0x08);//取计数值高字节
  857.             TH0 = hjsz;
  858.             ljsz=(uchar)(TABLE1[yfm]);     //取计数值低字节
  859.             TL0 = ljsz;
  860.             TR0 = 1;                       //启动TIMER0
  861.            }
  862.          else TR0 = 0;                     //简谱为0,不发音
  863.            Delay(jpm); //节拍延时
  864.            i++;
  865.         }
  866.     }
  867.         void main(void)
  868.         {        
  869.             TMOD =0X01;//设TIMER0在MODE1
  870.             TCON =0X01;//外部中断INT0,下降沿触发
  871.             IE   =0x83;//开中断(INT0,TIMER0)
  872.             IP   =0x00;//设置中断优先级
  873.         TABLE=SONG0;
  874.         while(1)
  875.         {   
  876.             Lignt( );
  877.                     songsing();//调用发音程序
  878.                     TR0 = 0;//停止TIMER0
  879.                     Delay2(1);
  880.                     TABLE=SONG0;// 更改歌曲0
  881.                     songsing();
  882.         }   
  883.         }

[ 本帖最后由 zhaojun_xf 于 2013-7-14 09:46 编辑 ]
我的博客
点赞  2013-7-14 09:43
原理图:
1.pdf (22.07 KB)
(下载次数: 41, 2013-7-14 09:53 上传)


1.png


[ 本帖最后由 zhaojun_xf 于 2013-7-14 09:53 编辑 ]
我的博客
点赞  2013-7-14 09:51
功能说明:
    此电子琴小巧、声音悦耳、便于携带、成本低、美观大方,能演奏绝大部分音乐。本作品采用的16键设计方法,也可以扩展成21键的。另外还能在这个基础上附加一些功能。
1. 由4×4组成的16个按钮矩阵,设计成16个音。

电子琴.pdf (173.65 KB)
(下载次数: 71, 2013-7-14 09:55 上传)


代码
程序代码.rar (8.33 KB)
(下载次数: 67, 2013-7-14 09:55 上传)


[ 本帖最后由 zhaojun_xf 于 2013-7-14 09:55 编辑 ]
我的博客
点赞  2013-7-14 09:53
3. DS18B20温度计

IMG_5304.JPG


IMG_5305.JPG


IMG_5306.JPG


IMG_5308.JPG
  • IMG_5307.JPG
我的博客
点赞  2013-7-14 09:57
原理图:
ds18b20.pdf (242.75 KB)
(下载次数: 70, 2013-7-14 09:59 上传)


1.png
我的博客
点赞  2013-7-14 09:59
代码:
DS18B20数字温度计C程序A.c (5.76 KB)
(下载次数: 71, 2013-7-14 10:00 上传)
  1. //***********DS18B20数字温度计C程序****************//
  2. //*MCU:          AT892051                          //
  3. //*MCU-crystal:  12M                               //
  4. //*Version:      01                                //
  5. //*Last Updata:  2007-6-10                         //
  6. //*Author:       zhaojun                           //
  7. //*Description:                                    //
  8. //DS18B20的读写程序,数据脚P3.4                     //
  9. //温度传感器18B20汇编程序,采用器件默认的12位转化   //
  10. //最大转化时间750微秒,显示温度-55到+125度,显示精度 //
  11. //为0.1度,显示采用4位LED共阳显示测温值            //
  12. //P1口为段码输入,P0~P3为位选                       //
  13. /***************************************************/

  14. #include "reg51.h"
  15. #include "intrins.h"                            //_nop_();延时函数用
  16. #define  Disdata P1                             //段码输出口
  17. #define  discan  P3                             //扫描口
  18. #define  uchar unsigned char
  19. #define  uint  unsigned int
  20. sbit     DQ=P3^4;                               //温度输入口
  21. sbit     DIN=P1^7;                              //LED小数点控制
  22. uint     h;
  23. uint     temp;
  24. //
  25. //
  26. //**************温度小数部分用查表法***********//
  27. uchar code ditab[16]=
  28. {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
  29. //
  30. uchar code dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
  31. //共阳LED段码表        "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9" "不亮" "-"              
  32. uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7};    //列扫描控制字
  33. uchar data temp_data[2]={0x00,0x00};             //读出温度暂放
  34. uchar data display[5]={0x00,0x00,0x00,0x00,0x00};     //显示单元数据,共4个数据和一个运算暂用

  35. //
  36. //
  37. //
  38. /*****************11us延时函数*************************/
  39. //
  40. void delay(uint t)
  41. {
  42.   for (;t>0;t--);
  43. }
  44. //

  45. /****************显示扫描函数***************************/
  46. scan()
  47. {
  48.   char k;
  49.      for(k=0;k<4;k++)                     //4位LED扫描控制
  50.          {
  51.           Disdata=dis_7[display[k]];          //数据显示
  52.           if (k==1){DIN=0;}                   //小数点显示
  53.           discan=scan_con[k];                 //位选
  54.           delay(200);
  55.          }
  56. }
  57. //
  58. //
  59. /****************DS18B20复位函数************************/
  60. ow_reset(void)
  61. {
  62. char presence=1;
  63. while(presence)
  64. {
  65.   while(presence)
  66.    {
  67.     DQ=1;_nop_();_nop_();//从高拉倒低
  68.         DQ=0;                                       
  69.         delay(50);           //550 us
  70.         DQ=1;                                       
  71.         delay(6);            //66 us
  72.         presence=DQ;         //presence=0 复位成功,继续下一步
  73.    }
  74.    delay(45);            //延时500 us
  75.    presence=~DQ;         
  76. }
  77. DQ=1;                   //拉高电平
  78. }
  79. //
  80. //
  81. /****************DS18B20写命令函数************************/
  82. //向1-WIRE 总线上写1个字节
  83. void write_byte(uchar val)
  84. {
  85.   uchar i;
  86.   for(i=8;i>0;i--)
  87.   {
  88.    DQ=1;_nop_();_nop_();                  //从高拉倒低
  89.    DQ=0;_nop_();_nop_();_nop_();_nop_();  //5 us
  90.    DQ=val&0x01;                           //最低位移出
  91.    delay(6);                              //66 us
  92.    val=val/2;                             //右移1位
  93.    }
  94.    DQ=1;
  95.    delay(1);
  96. }
  97. //
  98. /****************DS18B20读1字节函数************************/
  99. //从总线上取1个字节
  100. uchar read_byte(void)
  101. {
  102. uchar i;
  103. uchar value=0;
  104. for(i=8;i>0;i--)
  105. {
  106.   DQ=1;_nop_();_nop_();
  107.   value>>=1;
  108.   DQ=0;_nop_();_nop_();_nop_();_nop_();         //4 us
  109.   DQ=1;_nop_();_nop_();_nop_();_nop_();         //4 us
  110.   if(DQ)value|=0x80;
  111.   delay(6);                                     //66 us
  112. }
  113. DQ=1;
  114. return(value);
  115. }
  116. //
  117. /****************读出温度函数************************/
  118. //
  119. read_temp()
  120. {
  121.   ow_reset();                  //总线复位
  122.   delay(200);
  123.   write_byte(0xcc);            //发命令
  124.   write_byte(0x44);            //发转换命令
  125.   ow_reset();
  126.   delay(1);
  127.   write_byte(0xcc);            //发命令
  128.   write_byte(0xbe);
  129.   temp_data[0]=read_byte();    //读温度值的第字节
  130.   temp_data[1]=read_byte();    //读温度值的高字节
  131.   temp=temp_data[1];
  132.   temp<<=8;                                               
  133.   temp=temp|temp_data[0];      // 两字节合成一个整型变量。
  134.   return temp;                 //返回温度值
  135. }
  136. //
  137. /****************温度数据处理函数************************/

  138. //二进制高字节的低半字节和低字节的高半字节组成一字节,这个
  139. //字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩
  140. //下的低字节的低半字节转化成十进制后,就是温度值的小数部分

  141. /********************************************************/
  142. work_temp(uint tem)
  143. {
  144. uchar n=0;
  145. if(tem>6348)                        // 温度值正负判断
  146.      {tem=65536-tem;n=1;}            // 负温度求补码,标志位置1
  147.       display[4]=tem&0x0f;           // 取小数部分的值
  148.           display[0]=ditab[display[4]];  // 存入小数部分显示值
  149.       display[4]=tem>>4;             // 取中间八位,即整数部分的值
  150.           display[3]=display[4]/100;     // 取百位数据暂存
  151.           display[1]=display[4]%100;     // 取后两位数据暂存
  152.           display[2]=display[1]/10;      // 取十位数据暂存
  153.           display[1]=display[1]%10;  
  154. /******************符号位显示判断**************************/
  155.   if(!display[3])
  156.   {
  157.     display[3]=0x0a;           //最高位为0时不显示
  158.     if(!display[2])
  159.          {
  160.            display[2]=0x0a;        //次高位为0时不显示
  161.          }
  162.   }
  163.   if(n){display[3]=0x0b;}      //负温度时最高位显示"-"
  164. }
  165. //
  166. //
  167. /****************主函数************************/
  168. main()
  169. {
  170.   Disdata=0xff;                 //初始化端口
  171.   discan=0xff;
  172.   for(h=0;h<4;h++)              //开机显示"8888"
  173.       {display[h]=8;}
  174.   ow_reset();                   //开机先转换一次
  175.   write_byte(0xcc);             //Skip ROM
  176.   write_byte(0x44);             //发转换命令
  177.   for(h=0;h<100;h++)            //开机显示"8888"
  178.       {scan();}
  179.   while(1)
  180.   {
  181.         work_temp(read_temp());     //处理温度数据
  182.         scan();                     //显示温度值
  183.   }
  184. }
  185. //
  186. //***********************结束**************************//
我的博客
点赞  2013-7-14 10:00
4. 数字时钟

IMG_5298.JPG



IMG_5299.JPG



IMG_5300.JPG



IMG_5301.JPG



IMG_5302.JPG



IMG_5303.JPG
我的博客
点赞  2013-7-14 10:05
原理图:
1.pdf (14.27 KB)
(下载次数: 44, 2013-7-14 10:06 上传)


1.png
我的博客
点赞  2013-7-14 10:06
代码:
clock.c (9.09 KB)
(下载次数: 49, 2013-7-14 10:07 上传)
  1. /************** 数码管时钟的设计  *******************
  2. /* MCU:          AT89C51                          
  3. /* MCU-crystal:  12M                          
  4. /* Version:      01                           
  5. /* Last Updata:  2007-9-15                    
  6. /* Author:       zhaojun                          
  7. /* Description:                                    
  8. /* 定时器T0、T1溢出周期为50MS,T0为秒计数用,           
  9. /* T1为调整时闪烁用,P1.7为调整按钮,P0口为字符输出口,  
  10. /* P2口为位选,采用共阳显示管.                        
  11. /****************************************************/
  12. #include"reg51.h"
  13. #define uchar unsigned char
  14. #define uint  unsigned int
  15. #define scan_data P0   //显示数据输出端口
  16. #define bit_select P2  //位选端口
  17. char code dis_7[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF};
  18. /* 共阳LED段码表   "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "灭" "-" */
  19. char code scan_con[8]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE};
  20. // 列扫描控制字
  21. char data time_data[8]={0x00,0x00,0x0B,0x00,0x00,0x0B,0x00,0x00};
  22. // 计时单元数据初值     秒个 秒十   -  分个 分十   -  时个 时十
  23. char data dis[12]={0x00,0x00,0x0B,0x00,0x00,0x0B,0x00,0x00,0x0a,0x0a,0x00,0x00};
  24. // 显示单元数据     X    X    -    X    X    -    X    X   "灭" "灭"   x   x
  25. char data con_04s=0x00,con_1s=0x00,con=0x00;
  26. sbit set=P1^4;
  27. bit flag,sign;
  28. void scan();
  29. /***************************************************
  30. * 函 数 名:delay_1ms(),delay_500ms(),delay_1s()
  31. * 功能描述:用以判断按键的长短,从而进入不同的设置
  32. * 函数说明:500ms,1s程序变不精确,因嵌入了显示程序
  33. * 调用函数:scan()显示程序
  34. * 全局变量:无
  35. * 输 入 值:无
  36. * 输 出 值:无
  37. * 返 回 值:无
  38. * 设 计 者:zhaojun      日期:2007-9-15
  39. * 修 改 者:zhaojun      日期:2007-9-19
  40. * 版    本:1.0
  41. *****************************************************/
  42. //   1ms 延时程序      
  43. void delay_1ms(uchar t)
  44. {
  45.   uchar i,j;
  46.   for(i=0;i
  47.      for(j=0;j<120;j++)
  48.      ;
  49. }
  50. //   500ms延时子程序
  51. void delay_500ms(void)
  52. {
  53.   uchar i;
  54.   for(i=150;i>0;i--)
  55.                 scan();
  56. }
  57. //   1s延时子程序
  58. void delay_1s(void)  
  59. {
  60.   uchar h,i;
  61.   for(h=5;h>0;h--)
  62.      for(i=40;i>0;i--)
  63.                      scan();
  64. }
  65. /***************************************************
  66. * 函 数 名:scan()
  67. * 功能描述:显示时钟数据
  68. * 函数说明:时钟显示格式为:xx-xx-xx
  69. * 调用函数:delay_1ms()
  70. * 全局变量:无
  71. * 输 入 值:无
  72. * 输 出 值:无
  73. * 返 回 值:无
  74. * 设 计 者:zhaojun      日期:2007-9-15
  75. * 修 改 者:zhaojun      日期:2007-9-19
  76. * 版    本:1.0
  77. *****************************************************/
  78. // 显示子程序
  79. void scan(void)
  80. {
  81.   uchar k;
  82.   for(k=0;k<8;k++)
  83.   {
  84.     scan_data=dis_7[dis[k]];
  85.         bit_select=scan_con[k];
  86.         delay_1ms(1);
  87.         bit_select=0xFF;
  88.   }
  89. }
  90. /***************************************************
  91. * 函 数 名:add_data()
  92. * 功能描述:对时、分数据进行加
  93. * 函数说明:flag=0时判断分钟,flag=1时判断小时
  94. * 调用函数:无
  95. * 全局变量:无
  96. * 输 入 值:无
  97. * 输 出 值:无
  98. * 返 回 值:无
  99. * 设 计 者:zhaojun      日期:2007-9-15
  100. * 修 改 者:zhaojun      日期:2007-9-19
  101. * 版    本:1.0
  102. *****************************************************/
  103. void add_data(void)
  104. {
  105.   uchar i;
  106.   time_data[con]++;               //时间数据加1
  107.     if(time_data[con]>=10) //个位数据等于10,则个位清零,十位加1
  108.           {
  109.              time_data[con]=0;time_data[con+1]++;
  110.           }
  111.         if(flag==0)   //如果是分钟数据,判断十位是否到6时,清零
  112.           {
  113.                  if(time_data[con+1]>=6)
  114.                    {
  115.                      time_data[con]=0;time_data[con+1]=0;
  116.                    }
  117.           }
  118.     if(flag==1)   //如果是小时数据,判断是否为24时,清零
  119.           {
  120.                   if(time_data[con+1]==2)
  121.                 {
  122.                       if(time_data[con]>=4)
  123.                         {
  124.                           time_data[con]=0;time_data[con+1]=0;
  125.                         }
  126.                     }
  127.       }
  128.           
  129.         for(i=0;i<8;i++)          //把调节数据放入显示区
  130.            {
  131.                     dis[i]=time_data[i];
  132.            }
  133.     dis[8]=0x0a;dis[9]=0x0a;   //寄存器中存入熄灭符
  134. }
  135. /***************************************************
  136. * 函 数 名:keyscan()
  137. * 功能描述:对一个按键进行时间扫描
  138. * 函数说明:对按键长短进行比较,从而进行不同的设置
  139. * 调用函数:delay_1s(),scan(),delay_500ms()
  140. * 全局变量:sign,flag
  141. * 输 入 值:无
  142. * 输 出 值:无
  143. * 返 回 值:无
  144. * 设 计 者:zhaojun      日期:2007-9-15
  145. * 修 改 者:zhaojun      日期:2007-9-19
  146. * 版    本:1.0
  147. *****************************************************/
  148. void keyscan(void)
  149. {
  150. if(set==0)   //有键按下,判断按键时间
  151.   {
  152.     delay_1s();   //1s延时程序
  153.         if(set==0)    //大于1s,进入时间设置
  154.           {
  155.            ET0=0; TR0=0;    //关定时器0
  156.            while(set==0) scan();   //等键释放
  157.            ET1=1;TR1=1;        con=3;     //开定时器1,让调整位闪烁
  158.                  do
  159.                  {
  160.             while(set!=0) scan(); //等待按键
  161.             delay_500ms();
  162.                 if(set!=0)       //小于0.5s,进入分钟设置
  163.                       {
  164.                          while(set==0) scan();         //等待按键释放
  165.                                  sign=1;
  166.                          flag=0;
  167.                          add_data();                        //分钟加1
  168.                                  scan();                          
  169.                       }
  170.                          else sign=0;   //大于0.5s,进入小时设置
  171.                   }while(sign);
  172.                   while(set==0)scan();  //等待按键释放
  173.                   con=6;
  174.                   do
  175.                   {
  176.             while(set!=0) scan(); //等待按键
  177.             delay_500ms();
  178.                 if(set!=0)            //小于0.5s,进入小时设置
  179.                       {
  180.                          while(set==0) scan();         //等待按键释放
  181.                                  sign=1;
  182.                          flag=1;
  183.                          add_data();                        //小时加1
  184.                                  scan();
  185.                       }
  186.                          else sign=0;  //大于0.5s,结束时间设置
  187.                    }while(sign);
  188.                 ET1=0;TR1=0;           //关定时器1
  189.                 ET0=1;TR0=1;           //开定时器0
  190.           }
  191.         else               //小于1s,进入省电模式
  192.           {
  193.             ET0=1; TR0=1;  //开定时器0
  194.         while(set!=0); //等待按键
  195.             do
  196.             {
  197.               scan();         //有键按下,调显示程序消抖
  198.         }while(set!=0);   //是干扰则继续循环
  199.           }
  200.     while(set==0) scan(); //等待按键释放
  201.   }
  202. else ;  //无键按下,跳出按键扫描程序
  203. }
  204. /***************************************************
  205. * 函 数 名:clearmen()
  206. * 功能描述:对主程序进行初始化设置
  207. * 函数说明:对显示单元,定时器0、1进行赋初值
  208. * 调用函数:无
  209. * 全局变量:无
  210. * 输 入 值:无
  211. * 输 出 值:无
  212. * 返 回 值:无
  213. * 设 计 者:zhaojun      日期:2007-9-15
  214. * 修 改 者:zhaojun      日期:2007-9-19
  215. * 版    本:1.0
  216. *****************************************************/
  217. void clearmen(void)
  218. {
  219.   uchar i;
  220.   for(i=0;i<8;i++)
  221.      {
  222.        dis[i]=time_data[i];
  223.      }
  224.    TH0=0x3C; TL0=0xB0;  //定时器0赋初值
  225.    TH1=0x3C; TL1=0xB0;  //定时器1赋初值
  226.    TMOD=0x11;ET0=1;ET1=1;TR0=1;TR1=0;EA=1;//设置定时器工作方式,开定时器
  227. }
  228. /***************************************************
  229. * 函 数 名:main()
  230. * 功能描述:主程序
  231. * 函数说明:不断进行时间显示和按键扫描
  232. * 调用函数:clearmen(),scan(),keyscan()
  233. * 全局变量:无
  234. * 输 入 值:无
  235. * 输 出 值:无
  236. * 返 回 值:无
  237. * 设 计 者:zhaojun      日期:2007-9-15
  238. * 修 改 者:zhaojun      日期:2007-9-19
  239. * 版    本:1.0
  240. *****************************************************/
  241. void main( )
  242. {
  243.   clearmen();  //初始化
  244.   while(1)
  245.   {
  246.     scan();    //时间显示
  247.         keyscan(); //按键扫描
  248.   }
  249. }
  250. /***************************************************
  251. * 函 数 名:time_intt0()
  252. * 功能描述:T0中断服务程序
  253. * 函数说明:1s计数,并对时间值进行判断
  254. * 调用函数:无
  255. * 全局变量:无
  256. * 输 入 值:无
  257. * 输 出 值:无
  258. * 返 回 值:无
  259. * 设 计 者:zhaojun      日期:2007-9-15
  260. * 修 改 者:zhaojun      日期:2007-9-19
  261. * 版    本:1.0
  262. *****************************************************/
  263. void time_intt0(void) interrupt 1
  264. {
  265.   uchar i;
  266.   ET0=0;TR0=0;      //关T0定时器
  267.   TH0=0x3C;TL0=0xB7;//赋初值
  268.   TR0=1;            //开T0定时器
  269.   con_1s++;         //1s计数器计数
  270.   if(con_1s==20)    //1s到,时间加1
  271.     {
  272.          con_1s=0;      //1s计数器值0
  273.          time_data[0]++;//秒加1
  274.          if(time_data[0]>=10) //秒个位
  275.            {
  276.              time_data[0]=0;time_data[1]++;
  277.                  if(time_data[1]>=6) //秒十位
  278.                    {
  279.                      time_data[1]=0;time_data[3]++;
  280.                          if(time_data[3]>=10) //分个位
  281.                            {
  282.                              time_data[3]=0;time_data[4]++;
  283.                              if(time_data[4]>=6) //分十位
  284.                                {
  285.                                      time_data[4]=0;time_data[6]++;
  286.                                      if(time_data[6]>=10) //时个位
  287.                                        {
  288.                                              time_data[6]=0;time_data[7]++;
  289.                                            }
  290.                                             if(time_data[7]==2)   //时十位
  291.                                               {
  292.                                                    if(time_data[6]==4) //时个位
  293.                                                      {
  294.                                                            time_data[6]=0;time_data[7]=0;
  295.                                                          }
  296.                                                   }
  297.                                      }
  298.                              }
  299.                       }
  300.              }
  301.        for(i=0;i<8;i++)         //计时数据放入显示单元
  302.               {
  303.                     dis[i]=time_data[i];
  304.                   }
  305.            dis[8]=0x0a;dis[9]=0x0a;         //放入熄灭符
  306.         }
  307.   ET0=1;  //开总中断
  308. }
  309. /***************************************************
  310. * 函 数 名:time_intt1()
  311. * 功能描述:T1中断服务程序
  312. * 函数说明:用以调节时间是的闪烁
  313. * 调用函数:无
  314. * 全局变量:无
  315. * 输 入 值:无
  316. * 输 出 值:无
  317. * 返 回 值:无
  318. * 设 计 者:zhaojun      日期:2007-9-15
  319. * 修 改 者:zhaojun      日期:2007-9-19
  320. * 版    本:1.0
  321. *****************************************************/
  322. void time_intt1(void) interrupt 3
  323. {
  324.   EA=0; TR1=0;         //关闭定时器
  325.   TH1=0x3C;  TL1=0xB0; //定时器1赋初值
  326.   TR1=1;               //开定时器1
  327.   con_04s++;           //0.4s计数器计数
  328.   if(con_04s==8)       //到0.4s,赋闪烁值
  329.   {
  330.    con_04s=0;          //0.4s计数器值0
  331.    dis[10]=dis[con];dis[con]=dis[8];dis[8]=dis[10];
  332.    dis[11]=dis[con+1];dis[con+1]=dis[9];dis[9]=dis[11];
  333.   }
  334.   EA = 1; //开总中断
  335. }


  336. //********************** 程序结束 ***********************
我的博客
点赞  2013-7-14 10:07
5. 定时器

IMG_5294.JPG



IMG_5295.JPG



IMG_5296.JPG



IMG_5297.JPG
我的博客
点赞  2013-7-14 10:09
原理图:
1.pdf (16.12 KB)
(下载次数: 33, 2013-7-14 10:11 上传)


1.png
我的博客
点赞  2013-7-14 10:11
电子定时器
    本电子定时器能定时给电器供电或断电,最大时间可以长达30h,操作使用方便,采用AT89C2051单片机控制,4位共阳数码管显示时间,继电器作电器电源输出控制,其电路简单。
    1.系统硬件电路的设计
   (1)芯片的选择
    硬件电路要求实现对交流大电流电源的控制、定时时间的设定显示和到点提醒等功能。若采用40脚单片机有利于设计,但会增大电路板的体积。本设计采用ATMEL公司的AT89C2051单片机,芯片为20脚,体积小,工作电压范围宽(2.7V~6V)。
   (2)交流控制接口电路
    本设计采用继电器控制。也可用可控硅控制等。
   (3)显示电路
    显示电路采用4LED数码管。为了在定时精度达到分的时候能显示出时钟在计时,两个数码管之间增加了两个发光二极管,以其闪烁来代表秒走动;为了使硬件显示电路简单,采用单片机直接驱动LED数码管(AT89C2051输出口能吸收20mA电流),用动态扫描法实现LED显示。
   (4)电源电路
    电源电路采用普通三端集成稳压电路。
   (5)报警电路
    报警电路采用普通5V成品小蜂鸣器。
    2.系统软件主程序的设计
    程序采用模块化、结构化设计,并采用了软件抗干扰技术,其软件的可靠性较好,可维护性强。其主要程序模块有:   
   (1)主程序
    主程序有3个状态:待命状态、计时工作状态和到点工作状态。
   (2)菜单(设置)程序
    菜单程序完成定时方式和定时时间的设定。
   (3)到点工作程序
    到点工作程序根据所选定的不同定时方式,作不同的处理。
   (4)抗干扰(出错)程序
    程序跑飞时能被软件陷阱捕获,被抗干扰程序处理,返回复位状态,重新启动系统。
    3.操作说明:
   (1)通电以后,显示窗显示“----”,表示机器处于待命状态。
   (2)按功能键(S2),显示窗显示“F-01”,进入功能设置,此时按修改键(S3)选择不同定时方式:
    方式1:定时关电源,定时范围为1s ~ 30 min 59 s ;
    方式2:定时关电源,定时范围为1s ~ 30 h 59 min;
    方式3:定时开电源,定时范围为1s ~ 30 min 59 s ;
    方式4:定时开电源,定时范围为1s ~ 30 h 59 min.
   (3) 选定定时方式后,再按功能键,进入时间设定。先设定秒(方式1、方式3)或分(方式2、方式4),再设定分(方式1、方式3)或小时(方式2、方式4)。按修改键增加数字,按功能键确定,按住修改键不放可快进。
   (4)设定时间完毕,按下功能键,定时器长鸣一声,开始工作。
   (5)定时时间到了在定时方式1和方式2,定时器会鸣叫,此时按任意键可停止鸣叫。
   (6)在任何情况下,按下复位键(S2键),定时器重新回到待命状态。
我的博客
点赞  2013-7-14 10:12
代码:
程序代码.rar (32.33 KB)
(下载次数: 46, 2013-7-14 10:13 上传)
  1. ;************* 电子定时器的设计******************;
  2. ;*MCU:          AT892051                         ;
  3. ;*MCU-crystal:  12M                              ;
  4. ;*Version:      01                               ;
  5. ;*Last Updata:  2007-6-14                        ;
  6. ;*Author:       zhaojun                          ;
  7. ;*Description:                                   ;
  8. ;定时器T0、T1溢出周期为50MS,T0为秒计数用        ;
  9. ;S2为功能键、S3为方式选择键                      ;
  10. ;P1口为字符输出口,采用共阳显示管                 ;
  11. ;P3.2~P3.5为位选,P1.7为报警发音,P3.7为被控继电器 ;
  12. ;************************************************;

  13. ;******************
  14. ;      伪定义     ;
  15. ;******************
  16. SL      EQU   30H              ; SL存放秒的个位数
  17. SH        EQU   31H              ; SH存放秒的十位数
  18. ML      EQU   32H              ; ML存放分的个位数
  19. MH      EQU   33H              ; MH存放分的十位数
  20. HL      EQU   34H              ; HL存放时的个位数
  21. HH        EQU   35H                   ; HH存放时的十位数
  22. ;
  23. L0      EQU   36H              ; L0~L3:显示数据存储器
  24. L1        EQU   37H
  25. L2      EQU   38H
  26. L3        EQU   39H
  27. DSPLYP  EQU   3AH              ; 显示数据指针(DISPLAY-POINT)
  28. PLYTS   EQU   3BH              ; 显示次数计数器(DISPLAY-TIMES)
  29. ;
  30. LPLMOD  BIT   39H              ; 低两位显示方式(LOW-PLAY-MOD)
  31. HPLMOD  BIT   3AH              ; 高两位显示方式(HIGH-PLAY-MOD)
  32. BRIGHT  BIT   3BH              ; DISPLAY子程序参数:亮灭指示位
  33. ;
  34. TCOUNT  EQU   3CH              ; 时间计数器(TIME-COUNT)
  35. ;
  36. ADDRES  EQU   3DH              ; 加1子程序参数
  37. MAX     EQU   3EH              ; 加1子程序参数
  38. IFDEC   BIT   20H              ; BCD加法子程序参数
  39. ;
  40. R_MOD   EQU   3FH              ; 响铃方式参数
  41. ;
  42. LED4    BIT   30H              ; 发光管状态位
  43. BELL    BIT   P1.7             ; 蜂鸣器
  44. SWITCH  BIT   P3.7             ; 继电器
  45. FKEY    BIT   P3.0             ; 功能键 (S1)
  46. MKEY    BIT   P3.1             ; 修改键 (S2)
  47. ;
  48. WORKIN  BIT   38H              ; 工作状态指示位
  49. ;

  50. ;******************
  51. ;     中断入口    ;
  52. ;******************
  53.         ORG   0000H
  54. START:  LJMP  MAIN             ; 0000H  引向主程序
  55.         LJMP  ERR              ; 0003H
  56.         NOP
  57.         NOP
  58.         LJMP  ERR              ; 引向出错处理程序
  59.         LJMP  PGT0             ; 000BH  引向中断处理程序PGT0
  60.         NOP
  61.         NOP
  62.         LJMP  ERR              ; 引向出错处理程序
  63.         LJMP  ERR              ; 0013H  INT1
  64.         NOP
  65.         NOP
  66.         LJMP  ERR
  67.         LJMP  ERR              ; 001BH  T1
  68.         NOP
  69.         NOP
  70.         LJMP  ERR
  71.         LJMP  ERR              ; 0023H
  72.         NOP
  73.         NOP
  74.         LJMP  ERR
  75.         LJMP  ERR              ; 002BH
  76.         NOP
  77.         NOP
  78. ;
  79. ;************
  80. ;   主程序  ;
  81. ;************
  82. MAIN:   MOV   IE,#00H          ; 关中断
  83.         MOV   SP,#57H          ; 设置堆栈指针
  84.         MOV   PSW,#00H         ; 选用寄存器组0
  85.         MOV   TMOD,#11H        ; 设定中断工作方式为T0和T1
  86.         ;
  87.         MOV   A,56H
  88.         CJNE  A,#0AAH,CSTART   ; 判上电复位标志,无标志转冷启动
  89.         MOV   A,57H
  90.         CJNE  A,#55H,CSTART    ; 无标志转冷启动
  91.         AJMP  HSTART           ; 有上电复位标志转热启动
  92.         NOP
  93.         NOP
  94.         LJMP  ERR              ; 软件陷阱,引向出错处理程序
  95. CSTART: MOV   P1,#0FFH         ; 冷启动,全面初始化
  96.         MOV   P3,#0FFH
  97.         MOV   TCON,#00H        ; 计时停止
  98.         MOV   TL0,#0B0H        ; 赋中断T0初值
  99.         MOV   TH0,#3CH
  100.         MOV   TCOUNT,#0AH      ; 赋定时器初值
  101.         MOV   R5,#00H          ; R5为一空单元(备用)
  102.         MOV   R4,#00H          ; R4 为工作模式选择寄存器
  103.         MOV   SL,#00H          ; 定时单元清零
  104.         MOV   SH,#00H          ; 秒
  105.         MOV   ML,#00H          ;
  106.         MOV   MH,#00H          ; 分
  107.         MOV   HL,#00H          ;
  108.         MOV   HH,#00H          ; 时
  109.         MOV   PLYTS,#64H       ; 赋显示次数初值为100次
  110.         MOV   DSPLYP,#L0       ; 显示指针指向显存单元
  111.         MOV   L0,#0AH          ; 送显示数据"-----"
  112.         MOV   L1,#0AH
  113.         MOV   L2,#0AH
  114.         MOV   L3,#04H
  115.         SETB  LED4             ; LED4为数码管之间的发光二极管
  116.         SETB  LPLMOD           ; 设定显示方式为闪烁
  117.         SETB  HPLMOD           ;
  118.         SETB  BRIGHT           ; 允许显示
  119.         CLR   WORKIN               ; 清工作标志 , 待命
  120.         AJMP  SETUP            ; 转开始工作
  121.         NOP
  122.         NOP
  123.         LJMP  ERR              ; 软件陷阱
  124. HSTART: MOV   SCON,#00H        ; 有上电标志,热启动,清串行口控制寄存器
  125.         MOV   IP,#00H          ; 清中断优先控制寄存器
  126.         SETB  FKEY             ; 重设按键
  127.         SETB  MKEY
  128.         SETB  EA               ; 开中断
  129.         AJMP  BEGIN            ; 转向继续工作
  130.         NOP
  131.         NOP
  132.         LJMP  ERR              ; 软件陷阱
  133. SETUP:  SETB  EA               ; 开中断
  134. ;
  135. MAIN1:  ACALL DISPLY           ; 调用显示
  136.         JB    FKEY,JUDGE       ; 按键扫描
  137.         ACALL KEYDLY           ; 延时消抖动
  138.         JB    FKEY,JUDGE       ; 无键按下转向判断是否到点
  139.         CLR   ET0              ; 功能键被按下,则
  140.         CLR   TR0               ; 暂停计时
  141.         ACALL MENU             ; 调用菜单设置程序
  142. BEGIN:  SETB  WORKIN           ; 置工作标志位,开始工作
  143.         SETB  ET0              ; 开中断
  144.         SETB  TR0              ; 开始计时
  145.         MOV   A,R4             ; 移入工作模式选择
  146.         RL    A                ; 指针放大
  147.         MOV   DPTR,#M_TAB
  148.         JMP   @A+DPTR          ; 根据工作模式跳转到相应程序段
  149. M_TAB:  AJMP  WORK1
  150.         AJMP  WORK2
  151.         AJMP  WORK3
  152.         AJMP  WORK4
  153.         NOP
  154.         NOP
  155.         LJMP  ERR              ; 软件陷阱
  156. WORK1:  ;
  157. WORK2:  CLR   SWITCH           ; 工作方式1和2:开继电器
  158.         AJMP  MAIN2
  159.         NOP
  160.         NOP
  161.         LJMP  ERR              ; 软件陷阱
  162. WORK3:  ;
  163. WORK4:  SETB  SWITCH           ; 工作方式3和4:不开继电器
  164. MAIN2:  CLR   BELL             ; 蜂鸣器短鸣一声,以示开始工作
  165.         ACALL DL05S
  166.         SETB  BELL
  167. JUDGE:  JNB   WORKIN,MAIN1     ; 判断是否在定时之中
  168.         MOV   A,SL             ; 判断秒是否为零
  169.         JNZ   MAIN1
  170.         MOV   A,SH             ; 判断秒是否为零
  171.         JNZ   MAIN1
  172.         MOV   A,ML             ; 判断分是否为零
  173.         JNZ   MAIN1
  174.         MOV   A,MH             ; 判断分是否为零
  175.         JNZ   MAIN1
  176.         MOV   A,HL             ; 判断时是否为零
  177.         JNZ   MAIN1
  178.         MOV   A,HH             ; 判断时是否为零
  179.         JNZ   MAIN1            ; 若时分秒全为零则
  180.         CLR   ET0              ; 停止计时
  181.         CLR   TR0              ;
  182.         ACALL ACTION           ; 调用到点工作子程序
  183.         AJMP  MAIN             ; 返回
  184.         NOP
  185.         NOP
  186.         LJMP  ERR              ; 软件陷阱
  187.         ;
  188. ;******************
  189. ;    倒计时程序   ;
  190. ;******************
  191. PGT0:   CLR   EA               ; 关中断
  192.         PUSH  ACC               ; 保护现场
  193.         PUSH  PSW
  194.         PUSH  DPL
  195.         PUSH  DPH
  196.         MOV   PSW,#08H               ; 选用寄存器组1
  197.         CLR   TR0              ; 暂停计时
  198.         MOV   A,#0B7H          ; 中断同步修正
  199.         ADD   A,TL0
  200.         MOV   TL0,A
  201.         MOV   A,#3CH
  202.         ADD   A,TH0
  203.         MOV   TH0,A
  204.         SETB  TR0              ; 恢复计时
  205.         DEC   TCOUNT           ; 定时器T0每50 000毫秒溢出一次,则
  206.         MOV   A,TCOUNT         ; 溢出10次为0.5秒
  207.         JNZ   OUTT0               ; 判断是否到半秒
  208.         MOV   TCOUNT,#0AH      ;
  209.         CPL   LED4               ; 若到半秒LED取反
  210.         JNB   LED4,OUTT0       ; LED每闪烁一次是一秒
  211.         MOV   R0,#SH           ; 移入秒位的地址
  212.         SETB  IFDEC            ; BCD子程序参数,使其做减法
  213.         ACALL ADDBCD           ; 调用BCD子程序, 秒减1
  214.         CJNE  R3,#99H,OUTT0    ; 判断秒要否借位
  215.         MOV   SH,#05H          ; 要借位则
  216.         MOV   SL,#09H          ; 送数据59(否则显示99)
  217.         MOV   R0,#MH           ; 移入分位的地址
  218.         ACALL ADDBCD               ; 分减1
  219.         CJNE  R3,#99H,OUTT0    ; 判断分要否借位
  220.         MOV   MH,#05H
  221.         MOV   ML,#09H
  222.         MOV   R0,#HH
  223.         ACALL ADDBCD
  224. OUTT0:  POP   DPH               ; 恢复现场
  225.         POP   DPL
  226.         POP   PSW
  227.         POP   ACC
  228.         SETB  EA
  229.         RETI                   ; 中断返回
  230.         NOP
  231.         NOP
  232.         LJMP ERR               ; 软件陷阱
  233.         ;
  234. ;
  235. ;**************************
  236. ;   BCD子程序(加1或减1 )  ;
  237. ;**************************
  238. ADDBCD: MOV   A,@R0            ; 移入被操作数的高位
  239.         DEC   R0               ; 指针减一
  240.         SWAP  A
  241.         ORL   A,@R0            ; 移入被操作数的低位
  242.         MOV   B,#01H           ; B寄存器送立即数#01H
  243.         MOV   C,IFDEC          ; 若减法标志位为1,则
  244.         MOV   B.3,C            ;
  245.         MOV   B.4,C            ; B寄存器的值被改为#99H
  246.         MOV   B.7,C            ;
  247.         ADD   A,B              ; 对一个压缩的BCD码加#99H等于对其减一
  248.         DA    A                ; BCD码调整
  249.         MOV   R3,A             ; 暂存结果
  250.         ANL   A,#0FH           ; 取低位码
  251.         MOV   @R0,A            ; 存数
  252.         MOV   A,R3             ; 取回结果
  253.         INC   R0               ; 指针加一
  254.         SWAP  A                ; 交换
  255.         ANL   A,#0FH           ; 取结果数的高位
  256.         MOV   @R0,A            ; 存数
  257.         RET
  258.         NOP
  259.         NOP
  260.         LJMP  ERR              ; 软件陷阱
  261. ;
  262. ;**************
  263. ;   加1程序   ;
  264. ;**************
  265. ADDONE: MOV   R0,ADDRES        ; 移入被加数单元的地址
  266.         CLR   IFDEC            ; 设定BCD子程序做加法
  267.         ACALL ADDBCD           ; 调用BCD子程序
  268.         CLR   C                ; 判断被加数是否大于
  269.         MOV   A,R3             ; 最大值"MAX"
  270.         CJNE  A,MAX,JGOVER
  271. JGOVER: JC    ENDADO
  272.         CLR   A                ; 若大于"MAX",则清零
  273.         MOV   @R0,A
  274.         DEC   R0
  275.         MOV   @R0,A
  276. ENDADO: RET
  277.         NOP
  278.         NOP
  279.         LJMP  ERR              ; 软件陷阱
  280. ;
  281. ;******************
  282. ;   调时快进程序  ;
  283. ;******************
  284. QUICK:  CLR   LPLMOD               ; 设定显示方式不闪烁
  285.         CLR   HPLMOD
  286.         ACALL ADDONE           ; 调用加1子程序
  287.         MOV   L0,R4            ; 将工作模式选择数移入显存
  288.         INC   L0               ; 加1转化成显示值
  289.         ACALL KEYDLY           ; 延时
  290.         ACALL DL100
  291.         JNB   MKEY,QUICK       ; 判断键是否松开
  292.         SETB  LPLMOD           ; 若松开则恢复闪烁显示方式
  293.         CJNE  R6,#02H,ENDQUK
  294.         SETB  HPLMOD
  295.         CLR   LPLMOD
  296. ENDQUK: RET
  297.         NOP
  298.         NOP
  299.         LJMP  ERR              ; 软件陷阱
  300. ;
  301. ;
  302. ;******************
  303. ;   功能菜单程序  ;
  304. ;******************
  305. MENU:   MOV   R6,#00H               ; 初始化;  R6 计功能键按键次数
  306.         MOV   ADDRES,#05H      ; 将 R5 的地址送入,以便于改变 R4 的值
  307.         MOV   MAX, #04H        ; 定义工作模式选择寄存器R4 的最大值
  308.         MOV   DSPLYP,#L0       ; 定义显示指针指向显存
  309.         SETB  LPLMOD               ; 设定低两位数闪烁
  310.         CLR   HPLMOD
  311.         MOV   L0,R4            ; 送显示数据"F-0X"
  312.         INC   L0
  313.         MOV   L1,#00H
  314.         MOV   L2,#0BH
  315.         MOV   L3,#00H
  316.         SETB  LED4
  317. ;
  318. WAITFK: ACALL DISPLY           ; 等待F键释放
  319.         JNB   FKEY,WAITFK
  320. MENU1:  ACALL DISPLY
  321.         JB    MKEY,JGFKEY      ; M键扫描
  322.         ACALL KEYDLY           ; 延时消抖动
  323.         JB    MKEY,JGFKEY      ; 未按下则转F键扫描
  324.         CJNE  R6,#00H,NEXT1    ;
  325.         MOV   SL,#00H          ; 若中途改变定时方式,则清除原计时数据
  326.         MOV   SH,#00H
  327.         MOV   ML,#00H
  328.         MOV   MH,#00H
  329.         MOV   HL,#00H
  330.         MOV   HH,#00H
  331. NEXT1:  MOV   R2,#00H          ; R2用于判断按键时间是否超过0.5秒
  332. NEXT2:  ACALL ADDONE           ; 调用加1程序
  333.         MOV   L0,R4            ; 移入工作方式选择数
  334.         INC    L0
  335.         ;
  336. WAITMK: ACALL DISPLY               ; 等待M键释放
  337.         INC   R2               ; R2自增一
  338.         CLR   C
  339.         CJNE  R2,#0C8H,JGQUIC  ; 若R2大于等于200则调用快进子程序
  340. JGQUIC: JC    WATMK1
  341.         ACALL QUICK
  342. WATMK1: JNB   MKEY,WAITMK      ; R2小于200则等待M键释放
  343. ;
  344. JGFKEY: JB    FKEY,MENU1       ; 功能(F)键扫描
  345.         ACALL KEYDLY           ; 延时消抖动
  346.         JB    FKEY,MENU1       ; 键未按下则转修改(M)键扫描
  347.         INC   R6               ; F键按键次数加1
  348.         MOV   A,R6             ; 移入按键次数
  349.         RL    A                       ; 指针放大
  350.         MOV   DPTR,#FUNTAB
  351.         JMP   @A+DPTR          ; 根据按键次数跳转到相应的程序段
  352. FUNTAB: AJMP  WAITFK
  353.         AJMP  SETLOW
  354.         AJMP  SETHI
  355.         AJMP  ENDMEN
  356.         NOP
  357.         NOP
  358.         AJMP  ENDMEN
  359. ;STWKMD:                       ; 工作模式设定,不需另外改变菜单
  360. ;
  361. SETLOW: MOV   MAX,#60H         ; 设置低位(秒位或分位)
  362.         MOV   A,R4             ; 移入工作模式选择数
  363.         RL    A                       ; 指针放大
  364.         MOV   DPTR,#FTAB1
  365.         JMP   @A+DPTR          ; 根据工作模式选择数跳转到相应的程序段
  366. FTAB1:  AJMP  SETSS
  367.         AJMP  SETM60
  368.         AJMP  SETSS
  369.         AJMP  SETM60
  370.         NOP
  371.         NOP
  372.         AJMP  WAITFK
  373. SETSS:         MOV   DSPLYP,#SL       ; 设定显示区域为MM:SS
  374.         MOV   ADDRES,#SH
  375.         AJMP  WAITFK
  376. SETM60:        MOV   DSPLYP,#ML       ; 设定显示区域为HH:MM
  377.         MOV   ADDRES,#MH
  378.         AJMP  WAITFK
  379. ;
  380. SETHI:         CLR   LPLMOD           ; 设置高位(分位或时位)
  381.         SETB  HPLMOD           ; 高两位数码管闪烁
  382.         MOV   MAX,#31H         ; 最大数为30
  383.         MOV   A,R4             ; 移入工作模式选择数
  384.         RL    A                ; 指针放大
  385.         MOV   DPTR,#FTAB2      ; 移入表首地址
  386.         JMP   @A+DPTR          ; 根据工作模式选择数跳转到相应的程序段
  387. FTAB2:  AJMP  SETM30
  388.         AJMP  SETHH
  389.         AJMP  SETM30
  390.         AJMP  SETHH
  391.         NOP
  392.         NOP
  393.         AJMP  WAITFK           ; 返回等待键释放
  394. SETM30: MOV   ADDRES,#MH       ; 移入分位的地址
  395.         AJMP  WAITFK           ; 转向等待键释放
  396. SETHH:  MOV   ADDRES,#HH       ; 移入时位的地址
  397.         AJMP  WAITFK           ; 转向等待键释放
  398. ;
  399. ENDMEN: CLR   HPLMOD           ; 恢复不闪烁显示方式
  400.         RET
  401.         NOP
  402.         NOP
  403.         LJMP  ERR              ; 软件陷阱
  404. ;
  405. ;****************
  406. ;  到点工作程序 ;
  407. ;****************
  408. ACTION: MOV   L0,R4            ; 移入工作模式选择数
  409.         INC   L0               ; 送显示数"F-0X"
  410.         MOV   L1,#00H
  411.         MOV   L2,#0BH
  412.         MOV   L3,#00H
  413.         SETB  LED4
  414.         MOV   DSPLYP,#L0       ; 指针指向显存
  415.         SETB  LPLMOD           ; 设定显示方式不闪烁
  416.         SETB  HPLMOD
  417.         MOV   A,R4             ; 移入工作模式选择数
  418.         RL    A                ;
  419.         MOV   DPTR,#A_TAB
  420.         JMP   @A+DPTR          ; 根据工作模式选择数跳转
  421. A_TAB:  AJMP  ACTF1            ; 工作模式一
  422.         AJMP  ACTF1            ; 工作模式二
  423.         AJMP  ACTF3            ; 工作模式三
  424.         AJMP  ACTF3            ; 工作模式四
  425.         NOP
  426.         NOP
  427.         LJMP  ERR              ; 软件陷阱
  428. ACTF1:  SETB  SWITCH           ; 工作模式一(或二): 关继电器
  429.         MOV   R_MOD,#82H       ; 响铃模式参数#82H
  430.         MOV   R2,#96H          ; 响铃次数参数#96H
  431. ACTF11: ACALL RING                  ; 调用响铃子程序
  432.         JNB   MKEY,ENDACT      ; 等待键按下
  433.         JNB   FKEY,ENDACT      ; 有键按下则结束响铃
  434.         DJNZ  R2, ACTF11       ; 次数未满继续响铃
  435.         MOV   R_MOD,#0FFH      ; 参数#0FF使响铃无效
  436.         AJMP  ACTF11           ; 无键按下返回
  437.         NOP
  438.         NOP
  439.         LJMP  ERR              ; 软件陷阱
  440. ACTF3:  CLR   SWITCH           ; 工作模式三(或四): 开继电器
  441.         CLR   BELL             ; 蜂鸣器短鸣一声
  442.         ACALL DL1S
  443.         SETB  BELL
  444.         MOV   R_MOD,#0FFH      ; 响铃模式参数#0FFH
  445.         MOV   R2,#96H          ; 响铃时间参数#96H
  446. ACTF31: ACALL RING               ; 调用响铃子程序
  447.         JNB   MKEY,ENDACT      ; 等待键按下
  448.         JNB   FKEY,ENDACT      ; 有键按下则结束
  449.         DJNZ  R2,ACTF31        ; 次数未满继续
  450.         MOV   R2,#96H          ; 重新赋值
  451.         CLR   BELL             ; 短鸣一声(说明: 响铃模式参数#0FFH使
  452.         ACALL DL100            ; 响铃程序无效,仅起延时作用,
  453.         SETB  BELL             ; 每延时一段时间短鸣一声,以
  454.         AJMP  ACTF31           ; 提醒使用者继电器仍在工作)
  455.         NOP
  456.         NOP
  457.         LJMP  ERR              ; 软件陷阱
  458. ENDACT: SETB  SWITCH           ; 关继电器
  459. AWAITF: ACALL DISPLY           ; 调用显示
  460.         JNB   FKEY,AWAITF      ; 等待键释放
  461. AWAITM: ACALL DISPLY           ; 调用显示
  462.         JNB   MKEY,AWAITM      ; 等待键释放
  463.         RET
  464.         NOP
  465.         NOP
  466.         LJMP  ERR              ; 软件陷阱
  467.         ;
  468. ;**************
  469. ;   响铃程序  ;
  470. ;**************
  471. RING:   MOV   R5,#18H          ; R5为循环控制变量
  472. RING1:  JNB   MKEY,R_EXIT      ; 键扫描
  473.         JNB   FKEY,R_EXIT      ; 有键按下则退出
  474.         MOV   A,R_MOD          ; 移入响铃模式参数
  475.         MOV   C,ACC.7          ; 根据响铃模式参数改变响铃
  476.         MOV   BELL,C
  477.         RL    A
  478.         MOV   R_MOD,A
  479.         ACALL DL100            ; 延时
  480.         DJNZ  R5,RING1         ; 循环次数控制
  481. R_EXIT: SETB  BELL             ; 关闭响铃
  482.         RET
  483.         NOP
  484.         NOP
  485.         LJMP ERR               ; 软件陷阱
  486. ;
  487. ;**************
  488. ;   显示程序  ;
  489. ;**************
  490. DISPLY: PUSH  ACC              ; 数据压栈保护
  491.         PUSH  PSW
  492.         MOV   PSW,#10H         ; 选用寄存器组2
  493.         MOV   R0,DSPLYP        ; 移入显示指针
  494.         MOV   R2,#0FDH         ; R2寄存的是数码管选通数
  495.         MOV   A,PLYTS          ; 移入显示循环控制量
  496.         JNZ   PLAY             ; 不为0则转PLAY
  497.         MOV   PLYTS,#64H       ; 否则从新赋值
  498.         CPL   BRIGHT           ; 亮灭指示位取反
  499. PLAY:   DEC   PLYTS            ; 显示循环控制量减1
  500.         JNB   LPLMOD,PLAYL     ; 低两位数码管不闪则"PLAYL"
  501.         JB    BRIGHT,PLAYL     ; 亮灭指示为1也"PLAYL"
  502.         ACALL NOPLAY           ; 否则灭灯延时
  503.         AJMP  PLAY1            ; 转显示高位数码管
  504.         NOP
  505.         NOP
  506.         LJMP ERR               ; 软件陷阱
  507. ;用来显示低位
  508. PLAYL:  ORL   P1,#7FH          ; 清原显示数据
  509.         ORL   P3,#3CH          ; 清原选通数据
  510.         MOV   A,R2             ; 移入数码管位选数
  511.         RL    A                ; 换一位
  512.         ANL   P3,A             ; 选通低位的个位数码管
  513.         MOV   R2,A             ; 暂存位选数
  514.         MOV   A,@R0            ; 移入显示数值
  515.         MOV   DPTR,#TABLE1     ; 移入表首地址
  516.         MOVC  A,@A+DPTR        ; 查表
  517.         ANL   P1,A             ; 送显示数据
  518.         ACALL DL1MS            ; 延时
  519.         INC   R0               ; 指向低位的十位数
  520.         JB    P3.3,PLAYL       ; 显示低位的十位数
  521. ;
  522. PLAY1:  JNB   HPLMOD,PLAYH     ; 高两位数码管不闪则"PLAYH"
  523.         JB    BRIGHT,PLAYH     ; 亮灭指示为1也"PLAYH"
  524.         ACALL NOPLAY           ; 否则灭灯延时
  525.         AJMP  OUTPLY           ; 转结束
  526.         NOP
  527.         NOP
  528.         LJMP ERR               ; 软件陷阱
  529. ;
  530. ;用来显示高位
  531. PLAYH:  ORL   P1,#7FH          ; 清原显示数据
  532.         ORL   P3,#3CH          ; 清原选通数据
  533.         ANL   P3,#0EFH         ; 选通高位的个位数数码管
  534.         MOV   A,@R0            ; 移入显示数值
  535.         MOV   DPTR,#TABLE1     ; 移入表首地址
  536.         MOVC  A,@A+DPTR        ; 查表
  537.         ANL   P1,A             ; 送显示数据
  538.         ACALL DL1MS            ; 延时
  539.         INC   R0               ; 指向高位的十位数
  540.         ;                      ; 显示高位的十位数
  541.         ORL   P1,#7FH          ; 清原显示数据
  542.         ORL   P3,#3CH          ; 清原选通数据
  543.         ANL   P3,#0DFH         ; 选通高位的十位数
  544.         MOV   A,@R0            ; 移入显示数值
  545.         MOV   C,LED4               ; 指针放大+小灯状态
  546.         RLC   A                ;
  547.         MOV   DPTR,#TABLE2     ; 移入表首地址
  548.         MOVC  A,@A+DPTR        ; 查表
  549.         ANL   P1,A             ; 送显示数据
  550.         ACALL DL1MS            ; 延时
  551. ;
  552. OUTPLY: POP   PSW              ; 恢复数据
  553.         POP   ACC
  554.         RET
  555.         NOP
  556.         NOP
  557.         LJMP ERR               ; 软件陷阱
  558. ;
  559. TABLE1: DB  0C0H,0F9H,0A4H,0B0H, 99H, 92H, 82H,0F8H, 80H, 90H,0BFH, 8EH,0FFH
  560. ;                "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "-", "F", " "
  561. ;
  562. TABLE2: DB  0FFH, 0DFH, 0F9H, 0D9H, 0A4H,  84H, 0B0H,  90H, 0BFH, 09FH
  563. ;         "  ",  " :",   "1 ",  "1:",  "2 ",    "2:",  "3 ",  "3:",  "- ",  "-:"
  564. ;
  565. ;
  566. ;
  567. ;**********************
  568. ;    无显示(灭灯)程序   ;
  569. ;**********************
  570. NOPLAY: ORL   P1,#7FH          ; 清显示数据
  571.         ORL   P3,#3CH          ; 清选通数据
  572.         INC   R0               ; 指针自增2
  573.         INC   R0
  574.         ACALL DL1MS            ; 延时
  575.         RET
  576.         NOP
  577.         NOP
  578.         LJMP  ERR              ; 软件陷阱
  579.         ;
  580. ;******************
  581. ;     延时程序    ;
  582. ;******************
  583. DL1MS:  MOV   R3,#0F9H         ; 延时 1250US  只为DISPLY所调用
  584. DL1MS1: NOP
  585.         NOP
  586.         NOP
  587.         DJNZ  R3,DL1MS1
  588.         RET
  589.         NOP
  590.         NOP
  591.         LJMP  ERR              ; 软件陷阱
  592.         ;
  593. KEYDLY: CLR   BELL               ; 按键消抖动专用延时程序,
  594.         ACALL DISPLY           ; 在消除抖动的同时发出按键提示音
  595.         SETB  BELL
  596.         RET
  597.         NOP
  598.         NOP
  599.         LJMP ERR               ; 软件陷阱
  600. ;
  601. DL50MS: MOV   R7,#0AH          ; 50毫秒延时程序
  602. DL50M1: ACALL DISPLY               ; 每调用一次显示程序5MS
  603.         DJNZ  R7,DL50M1        ; 调用10次
  604.         RET
  605.         NOP
  606.         NOP
  607.         LJMP  ERR              ; 软件陷阱
  608. ;
  609. DL100:  ACALL DL50MS           ; 延时100毫秒
  610.         ACALL DL50MS
  611.         RET
  612.         NOP
  613.         NOP
  614.         LJMP  ERR              ; 软件陷阱
  615. ;
  616. DL05S:  ACALL DL100            ; 延时0.5秒
  617.         ACALL DL100
  618.         ACALL DL100
  619.         ACALL DL100
  620.         ACALL DL100
  621.         RET
  622.         NOP
  623.         NOP
  624.         LJMP  ERR              ; 软件陷阱
  625.         ;
  626. DL1S:   ACALL DL05S            ; 延时1秒
  627.         ACALL DL05S
  628.         RET
  629.         NOP
  630.         NOP
  631.         LJMP  ERR              ; 软件陷阱
  632.         ;
  633. ;****************************
  634. ;     ERR(出错处理) 程序    ;
  635. ;****************************
  636. ERR:    CLR   EA               ; 关中断
  637.         MOV   DPTR,#ERR1       ; 准备返回地址
  638.         PUSH  DPL              ; 压栈
  639.         PUSH  DPH              ;
  640.         RETI                   ; 中断返回
  641. ERR1:   MOV   56H,#0AAH        ; 建立上电标志(出错标志)
  642.         MOV   57H,#55H
  643.         MOV   A,#00H           ; 准备返回地址
  644.         PUSH  ACC              ; 压栈
  645.         PUSH  ACC                
  646.         RETI                   ; 中断返回
  647.         NOP
  648.         NOP
  649.         LJMP  ERR              ; 软件陷阱
  650. ;
  651.         ORG   07FAH
  652.         NOP
  653.         NOP
  654.         NOP
  655.         LJMP  ERR              ; 软件陷阱
  656.        
  657.         END                    ; 程序结束
我的博客
点赞  2013-7-14 10:13
给力!
点赞  2013-7-14 10:51
真心不错,楼主动手能力不是一般的强。佩服佩服。
点赞  2013-7-14 11:15
给力啊!

顶起来。
点赞  2013-7-14 13:40
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复