找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3180|回复: 0
收起左侧

新人求教 单片机测速仿真不行 显示000

[复制链接]
ID:198774 发表于 2017-5-17 21:26 | 显示全部楼层 |阅读模式

仿真不测速

仿真不测速

  1. #include <reg52.h>                 
  2. #define uchar unsigned char         
  3. #define uint  unsigned int        
  4. sbit clk = P1^3;          //ds1302
  5. sbit io =  P1^4;         
  6. sbit rst = P1^5;         
  7.                                                 //秒  分   时   日   月  年   星期         
  8. uchar code write_add[]={0x80,0x82,0x84,0x86,0x88,0x8c,0x8a};   //写地址
  9. uchar code read_add[] ={0x81,0x83,0x85,0x87,0x89,0x8d,0x8b};   //读地址
  10. uchar code init_ds[]  ={0x55,0x17,0x15,0x01,0x01,0x13,0x13};   
  11. uchar miao,fen,shi,ri,yue,week,nian;
  12. uchar i;

  13. uchar t1_num,t2_num;        //计时间中断的次数
  14. unsigned long speed1,juli,time2;
  15. float f_hz        ,speed_km,speed_m;

  16. uchar TH11,TL11;
  17. uchar flag_en;   //开始计算速度使能
  18. uchar flag_stop_en;   //要确定车子是否停下了

  19. uint juli_s;             //每秒走的距离
  20. uint juli_z;         //总路程
  21. float zhijing = 0.15;  //直径 0.55M
  22. uint s_zhijing = 15;

  23. bit flag_1s = 1;             //1s
  24. uchar menu_1;        //菜单设置变量
  25. uchar menu_2;        //菜单设置变量

  26. long zong_lc;        //总量程

  27. uchar flag_200ms;
  28. uint shudu;   //定义速度的变量
  29. uint bj_shudu = 40;         //报警速度


  30. //这三个引脚参考资料
  31. sbit rs=P1^0;         //LCD
  32. sbit rw=P1^1;
  33. sbit e =P1^2;         

  34. uchar code table_num[]="0123456789abcdefg";
  35. uchar i;

  36. sbit beep = P3^7;   //蜂鸣器IO口定义



  37. /******************1ms 延时函数*******************/
  38. void delay_1ms(uint q)
  39. {
  40.         uint i,j;
  41.         for(i=0;i<q;i++)
  42.                 for(j=0;j<120;j++);
  43. }


  44. /********************************************************************
  45. * 名称 : delay_uint()
  46. * 功能 : 小延时。
  47. * 输入 : 无
  48. * 输出 : 无
  49. ***********************************************************************/
  50. void delay_uint(uint q)
  51. {
  52.         while(q--);
  53. }

  54. /********************************************************************
  55. * 名称 : write_com(uchar com)
  56. * 功能 : 1602命令函数
  57. * 输入 : 输入的命令值
  58. * 输出 : 无
  59. ***********************************************************************/
  60. void write_com(uchar com)
  61. {
  62.         i =0;
  63.         e=0;
  64.         rs=0;
  65.         rw=0;
  66.         P0=com;
  67.         delay_uint(3);
  68.         e=1;
  69.         delay_uint(25);
  70.         e=0;
  71. }

  72. /********************************************************************
  73. * 名称 : write_data(uchar dat)
  74. * 功能 : 1602写数据函数
  75. * 输入 : 需要写入1602的数据
  76. * 输出 : 无
  77. ***********************************************************************/
  78. void write_data(uchar dat)
  79. {
  80.         i =0;
  81.         e=0;
  82.         rs=1;
  83.         rw=0;
  84.         P0=dat;
  85.         delay_uint(3);
  86.         e=1;
  87.         delay_uint(25);
  88.         e=0;        
  89. }

  90. /********************************************************************
  91. * 名称 : write_sfm2(uchar hang,uchar add,uchar date)
  92. * 功能 : 显示2位十进制数,如果要让第一行,第五个字符开始显示"23" ,调用该函数如下
  93.                   write_sfm1(1,5,23)
  94. * 输入 : 行,列,需要输入1602的数据
  95. * 输出 : 无
  96. ***********************************************************************/
  97. void write_sfm2(uchar hang,uchar add,uint date)
  98. {
  99.         if(hang==1)   
  100.                 write_com(0x80+add);
  101.         else
  102.                 write_com(0x80+0x40+add);
  103.         write_data(0x30+date/10%10);
  104.         write_data(0x30+date%10);        
  105. }

  106. /********************************************************************
  107. * 名称 : write_sfm4(uchar hang,uchar add,uchar date)
  108. * 功能 : 显示2位十进制数,如果要让第一行,第五个字符开始显示"23" ,调用该函数如下
  109.                   write_sfm1(1,5,23)
  110. * 输入 : 行,列,需要输入1602的数据
  111. * 输出 : 无
  112. ***********************************************************************/
  113. void write_sfm4(uchar hang,uchar add,uint date)
  114. {
  115.         if(hang==1)   
  116.                 write_com(0x80+add);
  117.         else
  118.                 write_com(0x80+0x40+add);
  119.         write_data(0x30+date/10000%10);
  120.         write_data(0x30+date/1000%10);
  121.         write_data(0x30+date/100%10);        
  122.         write_data(0x30+date/10%10);
  123.         write_data(0x30+date%10);        
  124.         write_data('k');        
  125.         write_data('m');        
  126. }

  127. void write_sfm7(uchar hang,uchar add,uint date)
  128. {
  129.         if(hang==1)   
  130.                 write_com(0x80+add);
  131.         else
  132.                 write_com(0x80+0x40+add);
  133.         write_data(0x30+date/100000%10);
  134.         write_data(0x30+date/100000%10);
  135.         write_data(0x30+date/10000%10);
  136.         write_data(0x30+date/1000%10);
  137.         write_data('.');        
  138.         write_data(0x30+date/100%10);        
  139.         write_data(0x30+date/10%10);
  140.         write_data('k');        
  141.         write_data('m');        
  142. }

  143. /***********************lcd1602上显示两位十进制数************************/
  144. void write_sfm1(uchar hang,uchar add,uchar date)
  145. {
  146.         if(hang==1)   
  147.                 write_com(0x80+add);
  148.         else
  149.                 write_com(0x80+0x40+add);
  150.         write_data(0x30+date % 10);        
  151. }


  152. /********************************************************************
  153. * 名称 : write_string(uchar hang,uchar add,uchar *p)
  154. * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
  155.                   write_string(1,5,"ab cd ef;")
  156. * 输入 : 行,列,需要输入1602的数据
  157. * 输出 : 无
  158. ***********************************************************************/
  159. void write_string(uchar hang,uchar add,uchar *p)
  160. {
  161.         if(hang==1)   
  162.                 write_com(0x80+add);
  163.         else
  164.                 write_com(0x80+0x40+add);
  165.                 while(1)
  166.                 {
  167.                         if(*p == '\0')  break;
  168.                         write_data(*p);
  169.                         p++;
  170.                 }        
  171. }


  172. /***********************lcd1602上显示两位十进制数************************/
  173. void write_sfm2_ds1302(uchar hang,uchar add,uchar date)
  174. {
  175.         if(hang==1)   
  176.                 write_com(0x80+add);
  177.         else
  178.                 write_com(0x80+0x40+add);
  179.         write_data(table_num[date / 16]);
  180.         write_data(table_num[date % 16]);        
  181. }

  182. /*****************控制光标函数********************/
  183. void write_guanbiao(uchar hang,uchar add,uchar date)
  184. {               
  185.         if(hang==1)   
  186.                 write_com(0x80+add);
  187.         else
  188.                 write_com(0x80+0x40+add);
  189.         if(date == 1)
  190.                 write_com(0x0f);     //显示光标并且闪烁        
  191.         else
  192.                 write_com(0x0c);   //关闭光标
  193. }         



  194. /********************************************************************
  195. * 名称 : init_1602()
  196. * 功能 : 初始化1602液晶
  197. * 输入 : 无
  198. * 输出 : 无
  199. ***********************************************************************/
  200. void init_1602()      //1602初始化
  201. {
  202.         write_com(0x38);
  203.         write_com(0x0c);
  204.         write_com(0x06);
  205.         delay_uint(1000);
  206.         write_string(1,0,"sd:00km/h  00:00");               
  207.         write_string(2,0,"lc:00.00km      ");        
  208. }

  209. /*************写一个数据到对应的地址里***************/
  210. void write_ds1302(uchar add,uchar dat)
  211. {               
  212.         rst = 1;                         //把复位线拿高
  213.         for(i=0;i<8;i++)
  214.         {                                     //低位在前
  215.                 clk = 0;                 //时钟线拿低开始写数据
  216.                 io = add & 0x01;            
  217.                 add >>= 1;                 //把地址右移一位
  218.                 clk = 1;                 //时钟线拿高
  219.         }        
  220.         for(i=0;i<8;i++)
  221.         {
  222.                 clk = 0;                 //时钟线拿低开始写数据
  223.                 io = dat & 0x01;
  224.                 dat >>= 1;                 //把数据右移一位
  225.                 clk = 1;                 //时钟线拿高
  226.         }
  227.         rst = 0;                         //复位线合低
  228.         clk = 0;
  229.         io = 0;
  230. }

  231. /*************从对应的地址读一个数据出来***************/
  232. uchar read_ds1302(uchar add)
  233. {
  234.         uchar value,i;
  235.         rst = 1;                         //把复位线拿高
  236.         for(i=0;i<8;i++)
  237.         {                                     //低位在前
  238.                 clk = 0;                 //时钟线拿低开始写数据
  239.                 io = add & 0x01;            
  240.                 add >>= 1;                 //把地址右移一位
  241.                 clk = 1;                 //时钟线拿高
  242.         }               
  243.         for(i=0;i<8;i++)
  244.         {
  245.                 clk = 0;                 //时钟线拿低开始读数据
  246.                 value >>= 1;
  247.                 if(io == 1)
  248.                         value |= 0x80;
  249.                 clk = 1;                 //时钟线拿高
  250.         }
  251.         rst = 0;                         //复位线合低
  252.         clk = 0;
  253.         io = 0;
  254.         return value;                 //返回读出来的数据
  255. }



  256. /*************把要的时间 年月日 都读出来***************/
  257. void read_time()
  258. {
  259.         miao = read_ds1302(read_add[0]);        //读秒
  260.         fen  = read_ds1302(read_add[1]);        //读分
  261.         shi  = read_ds1302(read_add[2]);        //读时
  262.         ri   = read_ds1302(read_add[3]);        //读日
  263.         yue  = read_ds1302(read_add[4]);        //读月
  264.         nian = read_ds1302(read_add[5]);        //读年
  265.         week = read_ds1302(read_add[6]);        //读星期
  266. }

  267. /*************把要写的时间 年月日 都写入ds1302里***************/
  268. void write_time()
  269. {
  270.         write_ds1302(0x8e,0x00);                        //打开写保护
  271.         write_ds1302(write_add[0],miao);        //写秒
  272.         write_ds1302(write_add[1],fen);                //写分
  273.         write_ds1302(write_add[2],shi);                //写时
  274.         write_ds1302(write_add[3],ri);                //写日
  275.         write_ds1302(write_add[4],yue);                //写月
  276.         write_ds1302(write_add[5],nian);        //写星期
  277.         write_ds1302(write_add[6],week);        //写年
  278.         write_ds1302(0x8e,0x80);                        //关闭写保护
  279. }

  280. /*************定时器0初始化程序***************/
  281. void init_1602_ds1302()
  282. {
  283.         write_sfm2_ds1302(1,11,shi);        
  284.         write_sfm2_ds1302(1,14,fen);        
  285. }

  286. /***********外部中断0初始化程序****************/
  287. void init_int0()
  288. {
  289.         EX0=1;                          //允许外部中断0中断
  290.         EA=1;                           //开总中断
  291.         IT0 = 1;                   //外部中断0负跳变中断
  292. }


  293. /*************定时器0初始化程序***************/
  294. void time_init()          //定时器0初始化程序
  295. {
  296.         EA   = 1;                   //开总中断
  297.         TMOD = 0X11;          //定时器0、工作方式1
  298.         ET0  = 1;                  //开定时器0中断
  299.         TR0  = 1;                  //允许定时器0定时
  300.         ET1  = 1;                  //开定时器1中断
  301.         TR1  = 1;                  //允许定时器1定时
  302. }


  303. /***********计算速度函数**************/
  304. void menu_dis()          //计算速度函数
  305. {
  306.         static uchar value;
  307.         if(menu_1 == 0)
  308.         {        
  309.                 if(flag_1s == 1)   
  310.                 {        
  311.                         flag_1s = 0;                 
  312.                         if(flag_en == 0)
  313.                         {
  314.                                 value ++;
  315.                                 if(value >= 3)        //2秒
  316.                                 {        
  317.                                         speed_km = 0;  //速度为0
  318.                                         shudu = (uint)speed_km;        
  319.                                         value = 0;                                
  320.                                 }
  321.                         }
  322.                         if((flag_en == 1))
  323.                         {        
  324.                                 value = 0;               
  325.                                 flag_en = 0;         
  326.                                  //1s = 1 / 1000000us;          // 1m/s=0.001km除以1/3600h=3.6km/h                        
  327.                                 f_hz = 1/(t2_num * 65536.0 + TH11 * 256 + TL11) / 1000000 ;  //算出来就是秒
  328.                                 t2_num = 0;        //把变量清零
  329.                                 TH11 = 0;
  330.                                 TL11 = 0;                                          
  331.                                 speed_m = f_hz * zhijing * 3.14/4  ;        //算出来的是m/s
  332.                                 juli_z = (juli_z + (uint)speed_m) ;        //总路程m        
  333.                                 speed_km = speed_m * 3.6 ;        //(带个小数点) km/s               
  334.                             shudu = (uint)speed_km;
  335.                                 zong_lc += speed_m;
  336.                         }               
  337.                         write_sfm2(1,3,shudu);               
  338.                         write_sfm4(2,3,juli_z);        

  339.                 }
  340.         }
  341. }

  342. /********************独立按键程序*****************/
  343. uchar key_can;         //按键值

  344. void key()         //独立按键程序
  345. {
  346.         static uchar key_new;
  347.         key_can = 20;                   //按键值还原
  348.         P3 |= 0x78;                     //对应的按键IO口输出为1
  349.         if((P3 & 0x78) != 0x78)                //按键按下
  350.         {
  351.                 delay_1ms(1);                     //按键消抖动
  352.                 if(((P3 & 0x78) != 0x78) && (key_new == 1))
  353.                 {                                                //确认是按键按下
  354.                         key_new = 0;
  355.                         switch(P3 & 0x78)
  356.                         {
  357.                                 case 0x70:  key_can = 4;  break;         //得到按键值
  358.                                 case 0x68:  key_can = 3;  break;         //得到按键值
  359.                                 case 0x58:  key_can = 2;  break;         //得到按键值
  360.                                 case 0x38:  key_can = 1;  break;         //得到按键值
  361.                         }
  362.                 }                        
  363.         }
  364.         else
  365.                 key_new = 1;        
  366. }


  367. /**********************设置函数************************/
  368. void key_with()
  369. {
  370.         if(key_can == 1)        //设置键
  371.         {
  372.                 menu_1++;
  373.                 if(menu_1 == 1)          //设置时间
  374.                 {
  375.                         menu_2 = 1;
  376.                         write_string(1,0,"    :  :    W:  ");                        
  377.                         write_string(2,0," 20  -  -       ");        
  378.                 }
  379.                 if(menu_1 == 2)          //设置报警速度
  380.                 {
  381.                         menu_2 = 1;
  382.                         write_string(1,0,"set-sd:00km/h   ");                        
  383.                         write_string(2,0,"zlc:             ");        
  384.                 }
  385.                 if(menu_1 == 3)          //设置直径
  386.                 {
  387.                         menu_2 = 1;
  388.                         write_string(1,0,"  Set Zhijing  ");                        
  389.                         write_string(2,0,"               ");        
  390.                 }
  391.                 menu_2 = 1;

  392.                 if(menu_1 > 2)    //回到正常显示
  393.                 {
  394.                         menu_1 = 0;
  395.                         write_guanbiao(1,2,0);          //关闭光标
  396.                         init_1602();      //1602初始化     //初始化液晶显示               
  397.                 }
  398.         }
  399.         if(key_can == 2)        //选择键
  400.         {
  401.                 if(menu_1 == 1)                  //设置时间
  402.                 {
  403.                         menu_2 ++;
  404.                         if(menu_2 > 7)
  405.                                 menu_2 = 1;
  406.                 }
  407.                 if(menu_1 == 2)                 //设置
  408.                 {
  409.                         menu_2 ++;
  410.                         if(menu_2 > 2)
  411.                                 menu_2 = 1;                                
  412.                 }

  413.         }
  414.         if(menu_1 == 1)
  415.         {
  416.                 if(menu_2 == 1)                  //设置时
  417.                 {
  418.                         if(key_can == 3)        //加
  419.                         {
  420.                                 shi+=0x01;
  421.                                 if((shi & 0x0f) >= 0x0a)
  422.                                         shi = (shi & 0xf0) + 0x10;
  423.                                 if(shi >= 0x24)
  424.                                         shi = 0;
  425.                         }               
  426.                         if(key_can == 4)        //减
  427.                         {
  428.                                 if(shi == 0x00)
  429.                                         shi = 0x24;
  430.                                 if((shi & 0x0f) == 0x00)
  431.                                         shi = (shi | 0x0a) - 0x10;
  432.                                 shi -- ;
  433.                         }                                          
  434.                 }
  435.                 if(menu_2 == 2)                  //设置分
  436.                 {
  437.                         if(key_can == 3)        //加
  438.                         {
  439.                                 fen+=0x01;
  440.                                 if((fen & 0x0f) >= 0x0a)
  441.                                         fen = (fen & 0xf0) + 0x10;
  442.                                 if(fen >= 0x60)
  443.                                         fen = 0;
  444.                         }               
  445.                         if(key_can == 4)        //减         
  446.                         {
  447.                                 if(fen == 0x00)
  448.                                         fen = 0x5a;
  449.                                 if((fen & 0x0f) == 0x00)
  450.                                         fen = (fen | 0x0a) - 0x10;
  451.                                 fen -- ;
  452.                         }        
  453.                 }
  454.                 if(menu_2 == 3)                  //设置秒
  455.                 {
  456.                         if(key_can == 3)        //加
  457.                         {
  458.                                 miao+=0x01;
  459.                                 if((miao & 0x0f) >= 0x0a)
  460.                                         miao = (miao & 0xf0) + 0x10;
  461.                                 if(miao >= 0x60)
  462.                                         miao = 0;
  463.                         }        
  464.                         if(key_can == 4)        //减         
  465.                         {
  466.                                 if(miao == 0x00)
  467.                                         miao = 0x5a;
  468.                                 if((miao & 0x0f) == 0x00)
  469.                                         miao = (miao | 0x0a) - 0x10;
  470.                                 miao -- ;                        
  471.                         }
  472.                 }
  473.                 if(menu_2 == 4)                  //设置星期
  474.                 {
  475.                         if(key_can == 3)        //加
  476.                         {
  477.                             week+=0x01;
  478.                                 if((week & 0x0f) >= 0x0a)
  479.                                         week = (week & 0xf0) + 0x10;
  480.                                 if(week >= 0x08)
  481.                                         week = 1;
  482.                         }               
  483.                         if(key_can == 4)        //减         
  484.                         {
  485.                                 if(week == 0x01)
  486.                                         week = 0x08;
  487.                                 if((week & 0x0f) == 0x00)
  488.                                         week = (week | 0x0a) - 0x10;
  489.                                 week -- ;
  490.                         }        
  491.                 }
  492.                 if(menu_2 == 5)                  //设置年
  493.                 {
  494.                         if(key_can == 3)        //加
  495.                         {
  496.                             nian+=0x01;
  497.                                 if((nian & 0x0f) >= 0x0a)
  498.                                         nian = (nian & 0xf0) + 0x10;
  499.                                 if(nian >= 0x9a)
  500.                                         nian = 1;
  501.                         }               
  502.                         if(key_can == 4)        //减         
  503.                         {
  504.                                 if(nian == 0x01)
  505.                                         nian = 0x9a;
  506.                                 if((nian & 0x0f) == 0x00)
  507.                                         nian = (nian | 0x0a) - 0x10;
  508.                                 nian -- ;               
  509.                         }        
  510.                 }
  511.                 if(menu_2 == 6)                  //设置月
  512.                 {
  513.                         if(key_can == 3)        //加
  514.                         {
  515.                             yue+=0x01;
  516.                                 if((yue & 0x0f) >= 0x0a)
  517.                                         yue = (yue & 0xf0) + 0x10;
  518.                                 if(yue >= 0x13)
  519.                                         yue = 1;
  520.                         }               
  521.                         if(key_can == 4)        //减         
  522.                         {
  523.                                 if(yue == 0x01)
  524.                                         yue = 0x13;
  525.                                 if((yue & 0x0f) == 0x00)
  526.                                         yue = (yue | 0x0a) - 0x10;
  527.                                 yue -- ;                                       
  528.                         }        
  529.                 }
  530.                 if(menu_2 == 7)                  //设置日
  531.                 {
  532.                         if(key_can == 3)        //加
  533.                         {
  534.                     ri+=0x01;
  535.                         if((ri & 0x0f) >= 0x0a)
  536.                                 ri = (ri & 0xf0) + 0x10;
  537.                         if(ri >= 0x32)
  538.                                 ri = 0;                        
  539.                         }               
  540.                         if(key_can == 4)        //减         
  541.                         {
  542.                                 if(ri == 0x01)
  543.                                         ri = 0x32;
  544.                                 if((ri & 0x0f) == 0x00)
  545.                                         ri = (ri | 0x0a) - 0x10;
  546.                                 ri -- ;                        
  547.                         }        
  548.                 }
  549.                 write_sfm2_ds1302(1,2,shi);           //显示时
  550.                 write_sfm2_ds1302(1,5,fen);           //显示分
  551.                 write_sfm2_ds1302(1,8,miao);           //显示秒
  552.                 write_sfm1(1,14,week);           //显示星期                                       
  553.                 write_sfm2_ds1302(2,3,nian);           //显示年
  554.                 write_sfm2_ds1302(2,6,yue);           //显示月
  555.                 write_sfm2_ds1302(2,9,ri);           //显示日
  556.                 switch(menu_2)           // 光标显示
  557.                 {
  558.                         case 1:  write_guanbiao(1,2,1);  break;
  559.                         case 2:  write_guanbiao(1,5,1);  break;
  560.                         case 3:  write_guanbiao(1,8,1);  break;
  561.                         case 4:  write_guanbiao(1,14,1); break;
  562.                         case 5:  write_guanbiao(2,3,1);  break;
  563.                         case 6:  write_guanbiao(2,6,1);  break;
  564.                         case 7:  write_guanbiao(2,9,1);  break;
  565.                 }
  566.                 write_time();           //把时间写进去
  567.         }        

  568.         if(menu_1 == 2)
  569.         {               
  570.                 if(menu_2 == 1)                  //设置速度
  571.                 {
  572.                         if(key_can == 3)        //加
  573.                         {
  574.                                 bj_shudu++;
  575.                                 if(bj_shudu >= 99)
  576.                                         bj_shudu = 99;
  577.                         }        
  578.                         if(key_can == 4)        //减         
  579.                         {
  580.                                 if(bj_shudu != 0)
  581.                                         bj_shudu -- ;                        
  582.                         }
  583.                 }        
  584.                 if(menu_2 == 2)                  //把总量程清零
  585.                 {
  586.                         if(key_can == 3)        
  587.                         {
  588.                                 zong_lc= 0;
  589.                         }        
  590.                         if(key_can == 4)                  
  591.                         {
  592.                                 zong_lc= 0;                        
  593.                         }
  594.                 }        


  595.                 write_sfm2(1,7,bj_shudu);   //显示报警速度
  596.                 write_sfm7(2,4,zong_lc);   //显示
  597.                
  598.                 switch(menu_2)           // 光标显示
  599.                 {
  600.                         case 1:  write_guanbiao(1,6,1);  break;
  601.                         case 2:  write_guanbiao(2,3,1);  break;
  602.                 }
  603.         }
  604.         if(menu_1 == 3)
  605.         {               
  606.                 if(key_can == 3)        //加
  607.                 {
  608.                         s_zhijing++;
  609.                         if(s_zhijing >= 999)
  610.                                 s_zhijing = 999;
  611.                 }        
  612.                 if(key_can == 4)        //减         
  613.                 {
  614.                         if(s_zhijing != 0)
  615.                                 s_zhijing -- ;                        
  616.                 }
  617.                 zhijing = s_zhijing ;
  618.                 write_sfm2(2,5,s_zhijing);                //显示
  619.         }
  620. }

  621. /****************报警函数***************/
  622. void clock_h_l()
  623. {
  624.         static uchar value;           
  625.         if((shudu >= bj_shudu))
  626.         {
  627.                 value ++;  //消除实际距离在设定距离左右变化时的干扰
  628.                 {
  629.                         beep = ~beep;           //蜂鸣器报警                        
  630.                 }        
  631.         }
  632.         else
  633.         {
  634.                 beep = 1;        
  635.         }                        
  636. }


  637. /******************主程序**********************/           
  638. void main()
  639. {
  640.         init_1602();      //1602初始化
  641.         init_int0();
  642.         time_init();          //定时器0初始化程序
  643.         while(1)
  644.         {         //  shudu = 11;
  645.                 key();                         //按键程序
  646.                 if(key_can < 10)
  647.                 {
  648.                         key_with();        

  649.                 }
  650.                 if(flag_200ms == 1)
  651.                 {
  652.                         flag_200ms = 0;
  653.                         read_time();                  //读时间
  654.                         init_1602_ds1302();   //显示时钟
  655.                         menu_dis();          //计算速度函数
  656.                         clock_h_l();        //报警函数
  657.                 }
  658.         }
  659. }


  660. /*********************外部中断0中断服务程序************************/
  661. void int0() interrupt 0
  662. {
  663.         static uchar value=1;
  664.         switch(value)
  665.         {
  666.                 case 0:
  667.                         t1_num = 0;                 //第一次就把变量清零
  668.                         TH1 = 0;
  669.                         TL1 = 0;
  670.                         break;
  671.                 case 1:
  672.                                 t2_num = t1_num;  //保存
  673.                                 TH11 = TH1;
  674.                                 TL11 = TL1;
  675.                                 flag_en = 1;
  676.                         break;
  677.         }               
  678. }

  679. /*************定时器0中断服务程序***************/
  680. void time0_int() interrupt 1
  681. {        
  682.         static uchar value=1;
  683.         TH0 = 0x3c;
  684.         TL0 = 0xb0;     // 50ms
  685.         value++;
  686.         if(value % 4 == 0)
  687.                 flag_200ms = 1;

  688.         if(value >= 20)  //1秒   才是一秒钟的速度
  689.         {
  690.                 value = 0;
  691.                 flag_1s = 1;
  692.         }
  693. }

  694. /*************定时器1中断服务程序***************/
  695. void time1_int() interrupt 3
  696. {
  697.         t1_num++;
  698. }

复制代码

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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