单片机论坛

标题: 摇摇棒的详细制作资料 含状态迁移图 原理图 程序 [打印本页]

作者: 51黑电子迷    时间: 2017-6-28 01:48
标题: 摇摇棒的详细制作资料 含状态迁移图 原理图 程序


基于单片机的摇摇棒 状态迁移图



原理图:



单片机源程序如下:
  1. //--------------------------------------------------------
  2. // 项目:摇摇棒
  3. // 模块:主程序
  4. // 说明:
  5. // 设计:张俊(版权所有,引用者请保留原作者姓名)
  6. //--------------------------------------------------------
  7. /*
  8. 版本说明:
  9. 2006-08-07        v01.01
  10.         测试版本
  11.         ACLK = TACLK = 32768Hz, MCLK = SMCLK = default DCO
  12.         每2S中断一次,对P1.0~P1.6口输出取反

  13. 2006-08-07        v01.02
  14.         测试版本
  15.         改变计时器计数模式

  16. 2006-08-08        v01.03
  17.         测试版本

  18. 2006-08-11        v01.04
  19.         测试版本
  20.         已经可以显示时间了,并且时间也可以运行了
  21.         但是时间还不可调节

  22. 2006-08-12        v01.05
  23.         增加按键和蜂鸣器功能(按键与LED口复用IO口)

  24. 2006-08-14        v01.06
  25.         增加工作模式,不同模式下显示和按键内容不同
  26.         
  27. 2006-08-16        v01.07
  28.         修改部分BUG

  29. 2006-08-20        v01.08
  30.         1.完成整点报时功能,每次整点鸣叫2声
  31.         2.取消分钟提示功能(因为程序空间不够了)
  32.         3.完善秒表功能
  33.         4.增加一个延时自动退出功能,60秒内未按键,也未触发惯性开关,则返回模式0
  34.         5.当无键计时>60秒,则禁止按键唤醒,必须通过惯性开关唤醒
  35.                 经过这样改动后,待机电流由16UA下降到了6UA.
  36. */


  37. //--------------------------------------------------------
  38. //插入文件包
  39. //--------------------------------------------------------
  40. #include  
  41. //--------------------------------------------------------
  42. //--------------------------------------------------------
  43. //重新命名数据类型
  44. //--------------------------------------------------------

  45. typedef unsigned char        tU08;                        //unsigned 8 bit definition
  46. typedef unsigned char        tU8;                        //unsigned 8 bit definition
  47. typedef unsigned int        tU16;                        //unsigned 16 bit definition
  48. typedef unsigned long        tU32;                        //unsigned 32 bit definition

  49. typedef signed char        tS08;                        //signed 8 bit definition
  50. typedef signed char        tS8;                        //signed 8 bit definition
  51. typedef signed int        tS16;                        //signed 16 bit definition
  52. typedef signed long        tS32;                        //signed 32 bit definition

  53. typedef float                tF32;
  54. typedef double                tF64;

  55. //--------------------------------------------------------
  56. //显示段码表(A类代码)
  57. //--------------------------------------------------------
  58. const tU08 LCD_TAB_A[]=
  59. {                                                        //编号                字符
  60.         0x3E,        0x41,        0x41,        0x41,        0x3E,                //0                0
  61.         0x00,        0x42,        0x7F,        0x40,        0x00,                //1                1
  62.         0x42,        0x61,        0x51,        0x49,        0x46,                //2                2
  63.         0x21,        0x41,        0x45,        0x4B,        0x31,                //3                3
  64.         0x18,        0x14,        0x12,        0x7F,        0x10,                //4                4
  65.         0x27,        0x45,        0x45,        0x45,        0x39,                //5                5
  66.         0x3C,        0x4A,        0x49,        0x49,        0x30,                //6                6
  67.         0x01,        0x01,        0x71,        0x0D,        0x03,                //7                7
  68.         0x36,        0x49,        0x49,        0x49,        0x36,                //8                8
  69.         0x06,        0x49,        0x49,        0x29,        0x1E,                //9                9

  70.         0x7C,        0x12,        0x11,        0x12,        0x7C,                //10                A                 
  71.         0x7F,        0x49,        0x49,        0x49,        0x36,                //11                B               
  72.         0x3E,        0x41,        0x41,        0x41,        0x22,                //12                C                 
  73.         0x7F,        0x41,        0x41,        0x22,        0x1C,                //13                D               
  74.         0x7F,        0x49,        0x49,        0x49,        0x41,                //14                E                 
  75.         0x7F,        0x09,        0x09,        0x09,        0x01,                //15                F                 
  76.         0x3E,        0x41,        0x49,        0x49,        0x3A,                //16                G
  77.         0x7F,        0x08,        0x08,        0x08,        0x7F,                //17                H
  78.         0x00,        0x41,        0x7F,        0x41,        0x00,                //18                I
  79.         0x00,        0x21,        0x41,        0x3F,        0x01,                //19                J
  80.         0x7F,        0x08,        0x14,        0x22,        0x41,                //20                K               
  81.         0x7F,        0x40,        0x40,        0x40,        0x40,                //21                L               
  82.         0x7F,        0x02,        0x0C,        0x02,        0x7F,                //22                M               
  83.         0x7F,        0x04,        0x08,        0x10,        0x7F,                //23                N
  84.         0x3E,        0x41,        0x41,        0x41,        0x3E,                //24                O               
  85.         0x7F,        0x09,        0x09,        0x09,        0x06,                //25                P               
  86.         0x3E,        0x41,        0x51,        0x21,        0x5E,                //26                Q               
  87.         0x7F,        0x09,        0x19,        0x29,        0x46,                //27                R               
  88.         0x26,        0x49,        0x49,        0x49,        0x32,                //28                S               
  89.         0x01,        0x01,        0x7F,        0x01,        0x01,                //29                T
  90.         0x3F,        0x40,        0x40,        0x40,        0x3F,                //30                U               
  91.         0x1F,        0x20,        0x40,        0x20,        0x1F,                //31                V               
  92.         0x3F,        0x40,        0x30,        0x40,        0x3F,                //32                W               
  93.         0x63,        0x14,        0x08,        0x14,        0x63,                //33                X               
  94.         0x03,        0x04,        0x78,        0x04,        0x03,                //34                Y               
  95.         0x61,        0x51,        0x49,        0x45,        0x43,                //35                Z

  96.         0x00,        0x00,        0x00,        0x00,        0x00,                //36                空格
  97.         0x7F,        0x7F,        0x7F,        0x7F,        0x7F,                //37                全亮▉
  98.         0x00,        0x00,        0x36,        0x00,        0x00,                //38                冒号:
  99.         0x00,        0x08,        0x1C,        0x08,        0x00,                //39                点.
  100.         0x08,        0x08,        0x08,        0x08,        0x08                //40                中划线-

  101.         //0x01,        0x3C,        0x42,        0x42,        0x24,                //39                摄氏度符号C
  102.         //0x40,        0x40,        0x40,        0x40,        0x40,                //40                下划线_
  103.         //0x08,        0x08,        0x3E,        0x08,        0x08,                //41                加号+
  104.         //0x22,        0x14,        0x08,        0x14,        0x22,                //43                乘号*
  105.         //0x08,        0x08,        0x2A,        0x08,        0x08,                //44                除号/
  106.         //0x14,        0x14,        0x14,        0x14,        0x14,                //45                等号=

  107. };

  108. //显缓区
  109. #define        disp_queue_sum        8                                //待显示字符串队列长度
  110. tU08        disp_queue[disp_queue_sum];                        //待显示字符串队列

  111. //时间系统
  112. //tU08 TIME_Y;                                          //当前时间"年"(00~99)
  113. //tU08 TIME_MO;                                          //当前时间"月"(1~12)
  114. //tU08 TIME_D;                                          //当前时间"日"(1~31)
  115. //tU08 TIME_W;                                          //当前时间"星期几"(1~7)

  116. tU08 TIME_H;                                                  //当前时间"时"(0~23)
  117. tU08 TIME_M;                                                  //当前时间"分"(0~59)
  118. tU08 TIME_S;                                                  //当前时间"秒"(0~59)

  119. //无键计时器
  120. tU08 NOKEY_JSQ;                                          //无键计时器(每秒+1)

  121. //秒表系统
  122. tU08 RUN_H;                                                  //秒表时间"时"(0~99)
  123. tU08 RUN_M;                                                  //秒表时间"分"(0~59)
  124. tU08 RUN_S;                                                  //秒表时间"秒"(0~59)
  125. tU08 RUN_MD;                                                  //秒表状态(0=停止,1=运行)

  126. //定时系统
  127. tU08 TIMER_H;                                                  //定时时间"时"(0~23)
  128. tU08 TIMER_M;                                                  //定时时间"分"(0~59)
  129. tU08 SP_M;                                                  //蜂鸣器鸣叫时间设置值(0~99分)(说明:0=定时关闭)
  130. tU08 SP_RUN;                                                  //蜂鸣器鸣叫时间运行值(0~99分)(说明:0=定时关闭)

  131. //工作模式
  132. tU08 WK_MODE;                                                  //工作模式

  133. //温度系统
  134. //tU08 TEMP;                                                  //当前温度

  135. //附加功能
  136. tU08 FUN_ZDBS;                                          //整点报时(0=禁止,1=使能)
  137. //tU08 FUN_FZTS;                                                //分钟提示(0=禁止,1=使能)



  138. /*
  139. //--------------------------------------------------------
  140. //延时程序
  141. //--------------------------------------------------------
  142. void delay()
  143. {
  144.         unsigned short i;
  145.         for(i=500; i>0; i--)
  146.         {
  147.                 asm ("nop");
  148.         }
  149. }
  150. */

  151. //--------------------------------------------------------
  152. //延时若干时间
  153. //入口: 延时时间=i*基本时间
  154. //--------------------------------------------------------
  155. void delay_n(tU16 i)
  156. {
  157.         for ( ; i!=0 ; i-- )
  158.         {
  159.                 asm ("nop");
  160.         }
  161. }
  162. /*
  163. //--------------------------------------------------------
  164. //显示当前时间年
  165. //--------------------------------------------------------
  166. void display_TIME_Y()
  167. {
  168.         disp_queue[0] = TIME_Y / 10;                 //年
  169.         disp_queue[1] = TIME_Y % 10;
  170. }
  171. //--------------------------------------------------------
  172. //显示当前时间月
  173. //--------------------------------------------------------
  174. void display_TIME_MO()
  175. {
  176.         disp_queue[3] = TIME_MO / 10;                 //月
  177.         disp_queue[4] = TIME_MO % 10;
  178. }
  179. //--------------------------------------------------------
  180. //显示当前时间日
  181. //--------------------------------------------------------
  182. void display_TIME_D()
  183. {
  184.         disp_queue[6] = TIME_D / 10;                 //日
  185.         disp_queue[7] = TIME_D % 10;
  186. }
  187. */
  188.         
  189. //--------------------------------------------------------
  190. //显示当前时间时
  191. //--------------------------------------------------------
  192. void display_TIME_H()
  193. {
  194.         disp_queue[0] = TIME_H / 10;                 //时
  195.         disp_queue[1] = TIME_H % 10;
  196. }
  197. //--------------------------------------------------------
  198. //显示当前时间分
  199. //--------------------------------------------------------
  200. void display_TIME_M()
  201. {
  202.         disp_queue[3] = TIME_M / 10;                 //分
  203.         disp_queue[4] = TIME_M % 10;
  204. }
  205. //--------------------------------------------------------
  206. //显示当前时间秒
  207. //--------------------------------------------------------
  208. void display_TIME_S()
  209. {
  210.         disp_queue[6] = TIME_S / 10;                 //秒
  211.         disp_queue[7] = TIME_S % 10;
  212. }

  213. //--------------------------------------------------------
  214. //显示闹钟TM
  215. //--------------------------------------------------------
  216. void display_TM()
  217. {
  218.         disp_queue[0] = 29;                         //"T"
  219.         disp_queue[1] = 22;                         //"M"
  220. }
  221. //--------------------------------------------------------
  222. //显示闹钟时
  223. //--------------------------------------------------------
  224. void display_TIMER_H()
  225. {
  226.         disp_queue[3] = TIMER_H / 10;                 //时
  227.         disp_queue[4] = TIMER_H % 10;
  228. }
  229. //--------------------------------------------------------
  230. //显示闹钟分
  231. //--------------------------------------------------------
  232. void display_TIMER_M()
  233. {
  234.         disp_queue[6] = TIMER_M / 10;                 //分
  235.         disp_queue[7] = TIMER_M % 10;
  236. }

  237. //--------------------------------------------------------
  238. //显示闹钟"▉▉"
  239. //--------------------------------------------------------
  240. void display_ALL1()
  241. {
  242.         disp_queue[0] = 37;                         //"▉"
  243.         disp_queue[1] = 37;                         //"▉"
  244. }
  245. //--------------------------------------------------------
  246. //显示闹钟"▉▉"
  247. //--------------------------------------------------------
  248. void display_ALL2()
  249. {
  250.         disp_queue[3] = 37;                         //"▉"
  251.         disp_queue[4] = 37;                         //"▉"
  252. }
  253. //--------------------------------------------------------
  254. //显示闹钟"▉▉"
  255. //--------------------------------------------------------
  256. void display_ALL3()
  257. {
  258.         disp_queue[6] = 37;                         //"▉"
  259.         disp_queue[7] = 37;                         //"▉"
  260. }

  261. //--------------------------------------------------------
  262. //显示分隔符号":  :"
  263. //--------------------------------------------------------
  264. void display_COL()
  265. {
  266.         disp_queue[2] = 38;                          //":"
  267.         disp_queue[5] = 38;                          //":"
  268. }
  269. //--------------------------------------------------------
  270. //显示分隔符号"-  -"
  271. //--------------------------------------------------------
  272. void display_LINE()
  273. {
  274.         disp_queue[2] = 40;                         //"-"
  275.         disp_queue[5] = 40;                         //"-"
  276. }

  277. //--------------------------------------------------------
  278. //显示"SET -O"
  279. //--------------------------------------------------------
  280. void display_SET()
  281. {
  282.         disp_queue[0] = 28;                         //"S"
  283.         disp_queue[1] = 14;                         //"E"
  284.         disp_queue[2] = 29;                         //"T"
  285.         disp_queue[4] = 40;                         //"-"
  286.         disp_queue[5] = 24;                         //"O"
  287. }



  288. //--------------------------------------------------------
  289. //刷新待显示字符串
  290. //出口: disp_queue[]=待显示字符串队列
  291. //--------------------------------------------------------
  292. void new_display()
  293. {
  294.         //====根据工作模式判断
  295.         switch( WK_MODE )                                        //根据工作模式判断
  296.         {
  297.                 //case  0:                                //显示当前时间        
  298.                 //        display_TIME_H();                         //时
  299.                 //        display_TIME_M();                         //分
  300.                 //        display_TIME_S();                         //秒
  301.                 //        display_COL();                          //":  :"
  302.                 //        break;               
  303. /*        
  304.                 case  1:                                //显示当前日期        
  305.                         display_TIME_Y();                         //年
  306.                         display_TIME_MO();                         //月
  307.                         display_TIME_D();                         //日
  308.                         display_LINE();                          //"-  -"
  309.                         break;               

  310.                 case  2:                                //显示星期几        
  311.                         disp_queue[0] = 36;                         //" "
  312.                         disp_queue[1] = 32;                         //"W"
  313.                         disp_queue[2] = 14;                         //"E"
  314.                         disp_queue[3] = 14;                        //"E"
  315.                         disp_queue[4] = 20;                         //"K"
  316.                         disp_queue[5] = 36;                         //" "
  317.                         disp_queue[6] = TIME_W % 10;                 //星期几
  318.                         disp_queue[7] = 36;                         //" "
  319.                         break;               

  320.                 case  3:                                //显示温度        
  321.                         disp_queue[0] = 29;                         //"T"
  322.                         disp_queue[1] = 14;                         //"E"
  323.                         disp_queue[2] = 22;                         //"M"
  324.                         disp_queue[3] = 25;                         //"P"
  325.                         disp_queue[4] = 36;                         //" "
  326.                         disp_queue[5] = TEMP / 10;                 //当前温度
  327.                         disp_queue[6] = TEMP % 10;
  328.                         disp_queue[7] = 39;                         //"摄氏度符号C"
  329.                         break;               
  330. */
  331.                 case  4:                                //显示闹钟时间
  332.                         display_TM();                                //"TM"
  333.                         disp_queue[2] = 36;                         //" "
  334.                         display_TIMER_H();                         //"定时时间"时""
  335.                         disp_queue[5] = 38;                         //":"
  336.                         display_TIMER_M();                         //定时时间"分"
  337.                         break;               

  338.                 case  5:                                //显示秒表时间
  339.                         disp_queue[0] = RUN_H / 10;                 //时
  340.                         disp_queue[1] = RUN_H % 10;
  341.                         disp_queue[2] = 39;                          //"."
  342.                         disp_queue[3] = RUN_M / 10;                //分
  343.                         disp_queue[4] = RUN_M % 10;
  344.                         disp_queue[5] = 39;                          //"."
  345.                         disp_queue[6] = RUN_S / 10;                 //秒
  346.                         disp_queue[7] = RUN_S % 10;         
  347.                         break;               

  348.                 case  6:                                //显示作者信息"zhangjun"
  349.                         disp_queue[0] = 35;                         //"Z"
  350.                         disp_queue[1] = 17;                         //"H"
  351.                         disp_queue[2] = 10;                         //"A"
  352.                         disp_queue[3] = 23;                         //"N"
  353.                         disp_queue[4] = 16;                         //"G"
  354.                         disp_queue[5] = 19;                         //"J"
  355.                         disp_queue[6] = 30;                         //"U"
  356.                         disp_queue[7] = 23;                         //"N"
  357.                         break;               

  358.                 case  7:                                //显示当前时间"时"
  359.                         display_TIME_H();                         //时
  360.                         display_ALL2();                         //"▉▉"
  361.                         display_ALL3();                         //"▉▉"
  362.                         display_COL();                          //":  :"
  363.                         break;               

  364.                 case  8:                                //显示当前时间"分""秒"
  365.                         display_ALL1();                         //"▉▉"
  366.                         display_TIME_M();                         //分
  367.                         display_TIME_S();                         //秒
  368.                         display_COL();                          //":  :"
  369.                         break;               
  370. /*

  371.                 case  9:                                //显示当前时间"年"
  372.                         display_TIME_Y();                         //年
  373.                         display_ALL2();                         //"▉▉"
  374.                         display_ALL3();                         //"▉▉"
  375.                         display_LINE();                          //"-  -"
  376.                         break;               

  377.                 case  10:                                //显示当前时间"月"
  378.                         display_ALL1();                         //"▉▉"
  379.                         display_TIME_MO();                         //月
  380.                         display_ALL3();                         //"▉▉"
  381.                         display_LINE();                          //"-  -"
  382.                         break;               

  383.                 case  11:                                //显示当前时间"日"
  384.                         display_ALL1();                         //"▉▉"
  385.                         display_ALL2();                         //"▉▉"
  386.                         display_TIME_D();                         //日
  387.                         display_LINE();                          //"-  -"
  388.                         break;               
  389. */
  390.                 case  12:                                //显示定时时间"时"
  391.                         display_TM();                                //"TM"
  392.                         disp_queue[2] = 36;                         //" "
  393.                         display_TIMER_H();                         //"定时时间"时""
  394.                         disp_queue[5] = 38;                         //":"
  395.                         display_ALL3();                         //"▉▉"
  396.                         break;               

  397.                 case  13:                                //显示定时时间"分"
  398.                         display_TM();                                //"TM"
  399.                         disp_queue[2] = 36;                         //" "
  400.                         display_ALL2();                         //"▉▉"
  401.                         disp_queue[5] = 38;                         //":"
  402.                         display_TIMER_M();                         //定时时间"分"
  403.                         break;               

  404.                 case  14:                                //显示蜂鸣器鸣叫时间
  405.                         display_TM();                                //"TM"
  406.                         disp_queue[2] = 36;                         //" "
  407.                         disp_queue[3] = 28;                         //"S"
  408.                         disp_queue[4] = 25;                         //"P"
  409.                         disp_queue[5] = 38;                         //":"
  410.                         disp_queue[6] = SP_M / 10;                 //蜂鸣器鸣叫时间
  411.                         disp_queue[7] = SP_M % 10;
  412.                         break;               

  413.                 case  15:                                //显示整点报时功能
  414.                         display_SET();                                //"SET -O"
  415.                         disp_queue[3] = 1;                         //"1"
  416.                         if ( FUN_ZDBS != 0 )
  417.                         {
  418.                                 disp_queue[6] = 23;                         //"N"
  419.                                 disp_queue[7] = 36;                         //" "
  420.                         }
  421.                         else
  422.                         {
  423.                                 disp_queue[6] = 15;                         //"F"
  424.                                 disp_queue[7] = 15;                         //"F"
  425.                         }
  426.                         break;               
  427. /*
  428.                 case  16:                                //显示分钟提示功能
  429.                         display_SET();                                //"SET -O"
  430.                         disp_queue[3] = 2;                         //"2"
  431.                         if ( FUN_FZTS != 0 )
  432.                         {
  433.                                 disp_queue[6] = 23;                         //"N"
  434.                                 disp_queue[7] = 36;                         //" "
  435.                         }
  436.                         else
  437.                         {
  438.                                 disp_queue[6] = 15;                         //"F"
  439.                                 disp_queue[7] = 15;                         //"F"
  440.                         }
  441.                         break;               
  442. */
  443.                   default:                                //以上条件都不满足时,显示当前时间
  444.                         display_TIME_H();                         //时
  445.                         display_TIME_M();                         //分
  446.                         display_TIME_S();                         //秒
  447.                         display_COL();                          //":  :"
  448.                         break;               
  449.         }
  450.                               

  451. }

  452. //--------------------------------------------------------
  453. //显示扫描程序
  454. //入口: disp_queue[]=待显示字符串队列
  455. //--------------------------------------------------------
  456. void display_cnt()
  457. {
  458.         tU08 i;
  459.         tU08 j;

  460.         //====延时等待
  461.         P1OUT &= 0x80;                                                //清除显示
  462.         delay_n(15000);
  463.         
  464.         //====扫描显示队列中的字符
  465.         for (i=0; i        {
  466.                 //====显示当前字符
  467.                 for (j=0; j<5; j++)                                //j=列号(0~4)
  468.                 {
  469.                         P1OUT |= LCD_TAB_A[ disp_queue[i] * 5 + j ];        //送显当前字符的当前列
  470.                         delay_n(150);                                        //列显示延时
  471.                         P1OUT &= 0x80;                                        //清除显示
  472.                         delay_n(10);                                        //列间隔延时
  473.                 }

  474.                 //====字符间隔延时
  475.                 delay_n(250);
  476.         }
  477. }

  478. //--------------------------------------------------------
  479. //IO初始化程序(复用口配置给key)
  480. //--------------------------------------------------------
  481. void IO_init_key()
  482. {
  483.         if (NOKEY_JSQ >= 60)                                //当无键计时>60秒,则禁止按键唤醒,必须通过惯性开关唤醒
  484.         {
  485.                 P1OUT = 0x10;                                        //P1口输出状态
  486.                 P1DIR = 0xEF;                                        //P1口IO状态(0=输入,1=输出)
  487.                 //P1REN = 0x00;                                   //P1口上拉使能(0=禁止,1=使能)
  488.         
  489.                 P1IE |= 0x10;                                        // P14 中断使能
  490.                
  491.         }
  492.         else
  493.         {
  494.                 P1OUT = 0x70;                                        //P1口输出状态
  495.                 P1DIR = 0x8F;                                        //P1口IO状态(0=输入,1=输出)
  496.                 //P1REN = 0x00;                                   //P1口上拉使能(0=禁止,1=使能)
  497.         
  498.                 P1IE |= 0x70;                                        // P16~P14 中断使能
  499.         }

  500.         P1IES |= 0x00;                                         // P1口触发边沿选择 (0=上升沿有效,1=下降沿有效)
  501.         P1IFG = 0x00;                                        // IFG cleared

  502. }      

  503. //--------------------------------------------------------
  504. //IO初始化程序(复用口配置给led)
  505. //--------------------------------------------------------
  506. void IO_init_led()
  507. {
  508.         P1OUT = 0x00;                                        //P1口输出状态
  509.         P1DIR = 0xFF;                                        //P1口IO状态(0=输入,1=输出)
  510.         //P1REN = 0x00;                                   //P1口上拉使能(0=禁止,1=使能)

  511.         //P1IE |= 0x00;                                        // P16~P14 中断禁止
  512.         //P1IES |= 0x00;                                         // P1口触发边沿选择 (0=上升沿有效,1=下降沿有效)
  513.         //P1IFG = 0x00;                                        // IFG cleared
  514. }      

  515. //--------------------------------------------------------
  516. //参数初始化程序
  517. //--------------------------------------------------------
  518. void parameter_init()
  519. {
  520.         //TIME_Y = 6;                                          //当前时间"年"(00~99)
  521.         //TIME_MO =1;                                          //当前时间"月"(1~12)
  522.         //TIME_D =1;                                          //当前时间"日"(1~31)
  523.         TIME_H =12;                                          //当前时间"时"(0~23)
  524.         TIME_M = 0;                                          //当前时间"分"(0~59)
  525.         TIME_S = 0;                                          //当前时间"秒"(0~119)

  526.         RUN_H = 0;                                        //秒表时间"时"(0~23)
  527.         RUN_M = 0;                                        //秒表时间"分"(0~59)
  528.         RUN_S = 0;                                        //秒表时间"秒"(0~119)
  529.         RUN_MD = 0;                                        //秒表状态(0=停止,1=运行)
  530.         
  531.         TIMER_H = 7;                                        //定时时间"时"(0~23)
  532.         TIMER_M = 15;                                        //定时时间"分"(0~59)
  533.         SP_M = 10;                                        //蜂鸣器鸣叫时间设置值(0~99分)(说明:0=定时关闭)
  534.         //SP_RUN = 0;                                        //蜂鸣器鸣叫时间运行值
  535.         
  536.         WK_MODE = 0;                                        //工作模式

  537.         FUN_ZDBS = 1;                                          //整点报时(0=禁止,1=使能)
  538.         //FUN_FZTS = 0;                                          //分钟提示(0=禁止,1=使能)

  539. }      
  540. //--------------------------------------------------------
  541. //初始化程序
  542. //--------------------------------------------------------
  543. void init()
  544. {
  545.         WDTCTL = WDTPW + WDTHOLD;                        //停止WDT
  546.         
  547.         IO_init_key();                                        //IO初始化程序(复用口配置给key)
  548.         parameter_init();                                //参数初始化程序


  549.         //定时器中断设置
  550.         CCTL0 = CCIE;                                        //CCR0 中断使能
  551.         CCR0 = 32768-1;                                        //定时器计数上限
  552.         TACTL = TASSEL_1 + MC_1;                        //ACLK, contmode
  553.                                                         //定时器A时钟源选择: 1 - ACLK
  554.                                                         //定时器A计数模式: 1 - Up to CCR0


  555. }

  556. //--------------------------------------------------------
  557. //主程序
  558. //--------------------------------------------------------
  559. void main(void)
  560. {

  561.         init();                                                //====初始化

  562.         
  563.         _BIS_SR(LPM3_bits + GIE);                        //Enter LPM3 w/ interrupt

  564.         /*
  565.         //====循环主体
  566.         while (1)                                         // Loop
  567.         {
  568.                 //asm  ( "nop" ) ;

  569.                 if (0x80 & P1IN)                        //如果P1.7=1
  570.                 {
  571.                         P1OUT &= 0x80;                        //清除显示
  572.                 }  
  573.                 else                                        //否则
  574.                 {
  575.                         new_display();                        //刷新待显示字符串
  576.                         display_cnt();                        //显示扫描程序


  577.                                 
  578.                 }
  579.         }
  580.         */
  581.   
  582. }

  583. //--------------------------------------------------------
  584. //蜂鸣器控制程序
  585. //--------------------------------------------------------
  586. void SP_CNT()
  587. {
  588.                 P1OUT |= 0x80;                        //开蜂鸣器
  589.                 delay_n(20000);                        //鸣叫延时
  590.                 P1OUT &= 0x7F;                        //关蜂鸣器

  591. }
  592. //--------------------------------------------------------
  593. //Timer_A3 Interrupt Vector (TAIV) handler
  594. //Timer_A3 中断服务程序
  595. //说明:        根据TAIV寄存器判断,执行不同的中断响应
  596. //中断频率=32768/(32768) = 1Hz
  597. //--------------------------------------------------------
  598. // Timer A0 interrupt service routine
  599. #pragma vector=TIMERA0_VECTOR
  600. __interrupt void Timer_A (void)
  601. {

  602. //时钟系统计时
  603.         TIME_S ++;
  604.         if ( TIME_S > 59 )
  605.         {
  606.                 TIME_S = 0 ;

  607.                 //蜂鸣器鸣叫时间运行值!=0时,运行值-1
  608.                 if ( SP_RUN !=0 )
  609.                 {
  610.                         SP_RUN--;
  611.                 }

  612.                 TIME_M ++ ;

  613.                 if ( TIME_M > 59 )
  614.                 {
  615.                         TIME_M = 0 ;

  616.                         
  617.                         if ( FUN_ZDBS != 0 )        //整点报时功能        
  618.                         {
  619.                                 //SP_RUN = SP_RUN + 1;                //鸣叫一分钟
  620.                                 SP_CNT();                        //鸣叫一声
  621.                                 delay_n(60000);                        //鸣叫延时
  622.                                 SP_CNT();                        //鸣叫一声
  623.                         }

  624.                         TIME_H ++ ;
  625.                         if ( TIME_H > 23 )
  626.                         {
  627.                                 TIME_H = 0 ;
  628.                                 
  629.                                 /*
  630.                                 TIME_D ++ ;
  631.                                 if ( TIME_D > 31)
  632.                                 {
  633.                                         TIME_D = 1 ;
  634.                                         TIME_MO ++ ;
  635.                                         if ( TIME_MO > 12 )
  636.                                         {
  637.                                                 TIME_MO = 1 ;
  638.                                                 TIME_Y ++ ;
  639.                                                 if ( TIME_Y > 99 )
  640.                                                 {
  641.                                                         TIME_Y = 0 ;
  642.                                                 }
  643.                                         }
  644.                                 }
  645.                                 */
  646.                                 
  647.                         }
  648.                 }
  649.         }

  650. //当当前时间=定时时间时,开始鸣叫
  651.         if (( TIME_H == TIMER_H ) && (TIME_M == TIMER_M) && ( TIME_S < 10))
  652.         {
  653.                 SP_RUN = SP_M;
  654.         }

  655. //蜂鸣器鸣叫时间运行值!=0时,鸣叫
  656.         if ( SP_RUN != 0 )
  657.         {
  658.                 SP_CNT();                        //鸣叫一声
  659.                 //delay_n(40000);                        //鸣叫延时
  660.                 //SP_CNT();                        //鸣叫一声
  661.         }

  662. //秒表系统计时
  663.         if (RUN_MD != 0 )
  664.         {
  665.                 RUN_S ++;
  666.                 if ( RUN_S > 59 )
  667.                 {
  668.                         RUN_S = 0 ;
  669.                         RUN_M ++ ;
  670.                         if ( RUN_M > 59 )
  671.                         {
  672.                                 RUN_M = 0 ;
  673.                                 RUN_H ++ ;
  674.                                 if ( RUN_H > 99 )
  675.                                 {
  676.                                         RUN_H = 0 ;
  677.                                 }
  678.                         }
  679.                 }
  680.         }

  681. //无键计时
  682.         if (NOKEY_JSQ >= 60)                                //当无键计时>60秒,则执行
  683.         {
  684.                 WK_MODE = 0 ;                                //切换工作模式
  685.                
  686.         }
  687.         else
  688.         {
  689.                 NOKEY_JSQ ++ ;                          //无键计时器(每秒+1)
  690.         }
  691.         
  692.         

  693. //        
  694.         IO_init_key();                                        //IO初始化程序(复用口配置给key)

  695. }



  696. //--------------------------------------------------------
  697. //位置信号处理功能
  698. //--------------------------------------------------------
  699. void wz_fun()
  700. {
  701.         SP_RUN = 0;                                        //蜂鸣器鸣叫时间运行值=0,取消鸣叫               
  702.         NOKEY_JSQ = 0 ;                                  //无键计时器=0

  703.         IO_init_led();                                        //IO初始化程序(复用口配置给led)
  704.         new_display();                                        //刷新待显示字符串
  705.         display_cnt();                                        //显示扫描程序


  706. }
  707.       
  708. //--------------------------------------------------------
  709. //按键A信号处理功能
  710. //--------------------------------------------------------
  711. void key_a_fun()
  712. {
  713.         SP_CNT();                        //鸣叫一声
  714.         NOKEY_JSQ = 0 ;                                          //无键计时器=0

  715.         //====根据工作模式判断
  716.         switch( WK_MODE )                                        //根据工作模式判断
  717.         {
  718.                 case  0:                                //显示当前时间        
  719.                         WK_MODE = 4 ;                                //切换工作模式
  720.                         break;               
  721. /*        
  722.                 case  1:                                //显示当前日期        
  723.                         WK_MODE = 2 ;                                //切换工作模式
  724.                         break;               

  725.                 case  2:                                //显示星期几        
  726.                         WK_MODE = 3 ;                                //切换工作模式
  727.                         break;               

  728.                 case  3:                                //显示温度        
  729.                         WK_MODE = 4 ;                                //切换工作模式
  730.                         break;               

  731.                 case  4:                                //显示闹钟时间
  732.                         RUN_S = 0 ;                                  //秒表时间"秒"(0~59)
  733.                         RUN_M = 0 ;                                  //秒表时间"分"(0~59)
  734.                         RUN_H = 0 ;                                  //秒表时间"时"(0~23)
  735.                         WK_MODE = 5 ;                                //切换工作模式
  736.                         break;               

  737.                 case  5:                                //显示秒表时间
  738.                         WK_MODE = 6 ;                                //切换工作模式
  739.                         break;               
  740. */
  741.                 case  6:                                //显示作者信息

  742.                         WK_MODE = 0 ;                                //切换工作模式
  743.                         break;               

  744.                 case  7:                                //显示当前时间"时"
  745.                         if ( TIME_H < 23 )                        //时+1(0~23)        
  746.                         {
  747.                                 TIME_H ++ ;               
  748.                         }
  749.                         else
  750.                         {
  751.                                 TIME_H = 0 ;
  752.                         }
  753.                         break;               

  754.                 case  8:                                //显示当前时间"分""秒"
  755.                         TIME_S = 0;                                //秒=0
  756.                         if ( TIME_M < 59 )                        //分+1(0~59)
  757.                         {
  758.                                 TIME_M ++ ;                                
  759.                         }
  760.                         else
  761.                         {
  762.                                 TIME_M = 0 ;
  763.                         }
  764.                         break;               
  765. /*
  766.                 case  9:                                //显示当前时间"年"
  767.                         if ( TIME_Y < 99 )                        //年+1(0~99)
  768.                         {
  769.                                 TIME_Y ++ ;                                
  770.                         }
  771.                         else
  772.                         {
  773.                                 TIME_Y = 0 ;
  774.                         }
  775.                         break;               

  776.                 case  10:                                //显示当前时间"月"
  777.                         if ( TIME_MO < 12 )                        //月+1(1~12)
  778.                         {
  779.                                 TIME_MO ++ ;                                
  780.                         }
  781.                         else
  782.                         {
  783.                                 TIME_MO = 1 ;
  784.                         }
  785.                         break;               

  786.                 case  11:                                //显示当前时间"日"
  787.                         if ( TIME_D < 31 )                        //日+1(1~31)
  788.                         {
  789.                                 TIME_D ++ ;                                
  790.                         }
  791.                         else
  792.                         {
  793.                                 TIME_D = 1 ;
  794.                         }
  795.                         break;               
  796. */
  797.                 case  12:                                //显示定时时间"时"
  798.                         if ( TIMER_H < 23 )                        //时+1(0~23)        
  799.                         {
  800.                                 TIMER_H ++ ;               
  801.                         }
  802.                         else
  803.                         {
  804.                                 TIMER_H = 0 ;
  805.                         }
  806.                         break;               

  807.                 case  13:                                //显示定时时间"分"
  808.                         if ( TIMER_M < 59 )                        //分+1(0~59)        
  809.                         {
  810.                                 TIMER_M ++ ;               
  811.                         }
  812.                         else
  813.                         {
  814.                                 TIMER_M = 0 ;
  815.                         }
  816.                         break;               

  817.                 case  14:                                //显示蜂鸣器鸣叫时间
  818.                         if ( SP_M < 99 )                        //蜂鸣器鸣叫时间+1(0~59)        
  819.                         {
  820.                                 SP_M ++ ;               
  821.                         }
  822.                         else
  823.                         {
  824.                                 SP_M = 0 ;
  825.                         }
  826.                         break;               

  827.                 case  15:                                //显示整点报时功能
  828.                         FUN_ZDBS ^= 0x01;                //整点报时功能取反
  829.                         FUN_ZDBS &= 0X01;
  830.                         break;               

  831. /*
  832.                 case  16:                                //显示分钟提示功能
  833.                         FUN_FZTS ^= 0x01;                //分钟提示功能取反
  834.                         FUN_FZTS &= 0X01;
  835.                         break;               
  836. */
  837.                   default:                                //以上条件都不满足时,显示当前时间
  838.                         WK_MODE ++ ;                                //切换工作模式
  839.                         break;        
  840.         }


  841. }      




  842. //--------------------------------------------------------
  843. //按键B信号处理功能
  844. //--------------------------------------------------------
  845. void key_b_fun()
  846. {
  847.         SP_CNT();                        //鸣叫一声
  848.         NOKEY_JSQ = 0 ;                                          //无键计时器=0

  849.         //====根据工作模式判断
  850.         switch( WK_MODE )                                        //根据工作模式判断
  851.         {
  852.                 case  0:                                //显示当前时间        
  853.                         WK_MODE = 7 ;                                //切换工作模式
  854.                         break;               
  855. /*        
  856.                 case  1:                                //显示当前日期        
  857.                         WK_MODE = 9 ;                                //切换工作模式
  858.                         break;               

  859.                 case  2:                                //显示星期几        
  860.                         break;               

  861.                 case  3:                                //显示温度        
  862.                         TEMP ++ ;                                //当前温度+1
  863.                         break;               
  864. */
  865.                 case  4:                                //显示闹钟时间
  866.                         WK_MODE = 12 ;                                //切换工作模式
  867.                         break;               

  868. ……………………

  869. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
http://www.51hei.com/bbs/dpj-88797-1.html




惯性开关实物图.JPG (12.45 KB, 下载次数: 72)

惯性开关实物图.JPG

惯性开关示意图.GIF (4.09 KB, 下载次数: 77)

惯性开关示意图.GIF

挥动方法.jpg (13.24 KB, 下载次数: 76)

挥动方法.jpg

控制部分.jpg (31.82 KB, 下载次数: 61)

控制部分.jpg

模拟效果.gif (166.17 KB, 下载次数: 75)

模拟效果.gif

完整外形.jpg (17.53 KB, 下载次数: 68)

完整外形.jpg

显示部分.jpg (12.28 KB, 下载次数: 75)

显示部分.jpg

效果1.jpg (19.79 KB, 下载次数: 56)

效果1.jpg

效果2.jpg (14.83 KB, 下载次数: 82)

效果2.jpg

效果3.jpg (15.11 KB, 下载次数: 62)

效果3.jpg

作者: zheng995599    时间: 2017-8-2 11:43
不错,有详细点的组装图吗




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