找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1476|回复: 4
打印 上一主题 下一主题
收起左侧

单片机超声波做的存包柜,定时器0中断和外部0中断,应该是随机密码,但是显示固定密码

[复制链接]
回帖奖励 10 黑币 回复本帖可获得 10 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
ID:985137 发表于 2022-4-5 20:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机源程序如下:
  1. /***********************************
  2. 定时器0初始化
  3. ***********************************/
  4. void Timer0_init()
  5. {
  6.         TMOD = 0x01;
  7.         TH0 = (65536-50000)/256;
  8.         TL0 = (65536-50000)&256;
  9.         ET0 = 1;                         /*开定时器0中断*/         
  10.         EA = 1;                    /*开总中断*/
  11.         TR0 = 1;                   /*启动定时器0*/                  
  12. }

  13. void T0_interrupt(void) interrupt 1         /*0表示外断0,1表示定时0,2表示外断1,3表示定时1*/
  14. {
  15.         TH0 = (65536-10000)/256;
  16.         TL0 = (65536-10000)&256;
  17. }

  18. //------超声波引脚-------
  19. sbit TR=P3^3;              //触发控制信号输入
  20. sbit ECHO=P3^2;            //回响信号输出
  21. long int t,distance;
  22. uchar a;
  23. //************超声波指令函数************************
  24. void HC05_Init()                          //超声波模块初始化函数
  25. {
  26.         TR=1;                                 //触发脉冲
  27.         NOP();NOP();NOP();NOP();
  28.         TR=0;
  29.         distance=0.1725*t;                       //距离计算
  30. }
  31. //外部中断0
  32. void initex()
  33. {
  34.   TMOD=0x09;                    //定时器T0工作方式1  GATE0=1
  35.   IT0=1;                        //设置为下降沿中断方式
  36.   EX0=1;                        //开外部中断                     
  37. }
  38. void int0() interrupt 0
  39. {
  40. t=(TH0*256+TL0);//计算高电平持续的时间,上升沿到来时候开始计时,下降沿到来进入外部中断,关闭计时器,停止计时
  41. TH0=0;
  42. TL0=0;
  43. }

  44. /*主函数*/
  45. uchar global_state = 0;
  46. uchar count_num = 0;  //输入的数字个数
  47. void main()
  48. {  
  49.     uchar i;
  50.     uchar passwd;  
  51.            uchar key_value = 0;
  52.         uchar temp_key_value = 0xff;
  53.         Lock = 1;  //刚上电 锁是需要保持闭合
  54.         Timer0_init();        //定时器初始化
  55.         initex();
  56.          lcd_init();        //LCD1602初始化  
  57.         while(1)        //进入不断循环
  58.           {
  59.                    temp_key_value = Calkey_scan();          //读取矩阵按键的键值
  60.                 if(temp_key_value != 0xff)
  61.                 {
  62.                         key_value = temp_key_value;
  63.                 }
  64.                 switch(global_state)
  65.                 {
  66.                         case 0:         //初始化状态
  67.                                 display1();         //显示欢迎语句        -- "welcome"
  68.                                 deng = 1;         //紫外线
  69.                                 display5();  //显示Current T=
  70.                                 Read_Temperature(); //读取温度值
  71.                                 display7();  //显示温度
  72.                                 Alarm();         //报警
  73.                                 wenk();                 //温控
  74.                                 HC05_Init();
  75.                                 
  76.                                 if(SetKey==0)        //设置键                          
  77.                   {         
  78.                                            clear();         //清屏
  79.                                          global_state = 3;   //切换运行状态                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
  80.                                   }
  81.                                                                                                                                                                                                                                                                                                                                                                                                                               
  82.                                 if(key_value == 13)  //存餐按键被按下
  83.                                 {
  84.                                 key_value = 0xff;  //将按键值清除                                
  85.                                 if(distance>300)
  86.                                 {
  87.                                 TMOD=0x01;                                         
  88.                               global_state = 4;                  
  89.                                 }
  90.                                 else
  91.                                 {
  92.                                   clear();        //清屏,准备下一屏的显示
  93.                                   display10();        
  94.                                   delay(1000);
  95.                                   clear();        //清屏,准备下一屏的显示
  96.                                   global_state = 0;  //返回到初始界面
  97.                                 }
  98.                         }
  99.                                  
  100.                                 if(key_value == 14)  //取餐按键被按下
  101.                                 {
  102.                                     key_value = 0xff;  //将按键值清除
  103.                                         clear();    //清屏,准备下一屏的显示
  104.                                         global_state = 2;  //切换运行状态
  105.                                         count_num = 0;   //清除数字按键变量
  106.                                         for(i = 0;i < 4;i++)  //清空输入的密码数组
  107.                                         inpPasswd[i] = ' '-0x30;
  108.                                 }
  109.                             break;

  110.                         case 1:                //密码生成状态                                                

  111.                                    display2();         //显示密码生成界面
  112.                                 delay(1900);    //等待大约3秒
  113.                                 global_state = 0;  //返回到初始界面
  114.                                 clear();        //清屏,准备下一屏的显示                                
  115.                             break;

  116.                         case 2:          //输入密码状态
  117.                            display4();           //显示输入密码界面
  118.                            if((key_value >= 0) && (key_value <= 9))          //如果按下的为0-9的数字按键
  119.                            {                              
  120.                                 if(count_num <= 3)         //如果按键次数小于4次
  121.                                         {
  122.                                         inpPasswd[count_num] = key_value; //将按键值存入数组,并显示
  123.                                                    count_num++;
  124.                                     }
  125.                                          key_value = 0xff;  //将按键值清除
  126.                            }
  127.                                                                                                          
  128.                            if(key_value == 15) //清除按键被按下
  129.                            {
  130.                                 key_value = 0xff;  //将按键值清除
  131.                                            for(i = 0;i < 4;i++)
  132.                                         inpPasswd[i] = ' '-0x30;  //清除刚刚输入的密码
  133.                                         count_num=0;
  134.                            }
  135.                            if(key_value == 16) //确认按键被按下
  136.                            {
  137.                                 key_value = 0xff;  //将按键值清除
  138.                                            for(i = 0;i < 4;i++)
  139.                                         {
  140.                                                 if(inpPasswd[i] != genPasswd[i])
  141.                                                 break;
  142.                                         }
  143.                                         if(i == 4)          //密码输入正确
  144.                                         {                                                
  145.                                         Lock = 0;    //开锁
  146.                                         deng = 0;         //照明
  147.                                         clear();                 //清屏,准备下一屏的显示
  148.                                         display3();    //显示关门提示语        -- "close door!"
  149.                                     delay(1900);    //等待关门 大约3秒
  150.                                         clear();                 //清屏,准备下一屏的显示
  151.                                         Lock = 1;   //关锁
  152.                                         deng = 1;         //紫外线                                       
  153.                                         }
  154.                                         else   //密码输入错误  报警
  155.                                         {        
  156.                                                 clear();           //清屏,准备下一屏的显示                                
  157.                                                 Lock = 1;  //关锁
  158.                                                 BEEP=0;
  159.                                                 display9();        
  160.                                                 delay(1000);
  161.                                                 BEEP=1;
  162.                                                 display9();                                                                                                
  163.                                         }
  164.                                         clear();           //清屏,准备下一屏的显示
  165.                                         global_state = 0;  //返回到初始界面
  166.                            }
  167.                            break;

  168.                            case 3:
  169.                                     display5();         //显示Current T=
  170.                         display6();         //显示上下限
  171.                         Read_Temperature(); //读取温度值
  172.                         display7();         //显示温度
  173.                         display8();         //显示上下限温度
  174.                                                 SetFun();           //指针>  
  175.                                             Alarm();
  176.                                                 wenk();
  177.                                                 if(key_value == 16) //确认按键被按下
  178.                                                 {
  179.                                                         key_value = 0xff;  //将按键值清除
  180.                                                         clear();           //清屏,准备下一屏的显示
  181.                                                 global_state = 0;  //返回到初始界面
  182.                                                 }
  183.                                 break;

  184.                                 case 4:                           
  185.                                         Lock = 0;    //开锁
  186.                                         deng = 0;         //照明
  187.                                         clear();                 //清屏,准备下一屏的显示
  188.                                         display3();    //显示关门提示语        -- "close door!"
  189.                                     delay(1900);    //等待关门 大约3秒
  190.                                         clear();                 //清屏,准备下一屏的显示
  191.                                         Lock = 1;    //关锁
  192.                                         deng = 1;         //紫外线                                                                                                               
  193.                                         clear();                 //清屏,准备下一屏的显示
  194.                                         global_state = 1;   //切换运行状态
  195.                                         passwd = TL0;  //采用定时器寄存器的值作为密码
  196.                                         genPasswd[0] = passwd/100;                  //存储密码
  197.                                         genPasswd[1] = passwd%100/10;
  198.                                         genPasswd[2] = passwd%10;
  199.                                         genPasswd[3] = (genPasswd[1]+genPasswd[2])%10;                                                                                                                                       
  200.                                         break;                                                                                                                                                                 
  201.                 }               
  202.         }
  203. }
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:161164 发表于 2022-4-6 11:49 来自触屏版 | 只看该作者
global_state
回复

使用道具 举报

板凳
ID:985137 发表于 2022-4-6 13:39 | 只看该作者

理解不懂,怎么改呢
回复

使用道具 举报

地板
ID:161164 发表于 2022-4-6 18:44 | 只看该作者
2248373991 发表于 2022-4-6 13:39
理解不懂,怎么改呢

在手机看,按错了

TL0在第44行被清零了
试试改变超声波的距离看看密码会不会有改变
回复

使用道具 举报

5#
ID:985137 发表于 2022-4-16 18:24 来自触屏版 | 只看该作者
lkc8210 发表于 2022-4-6 18:44
在手机看,按错了

TL0在第44行被清零了

对,怎么改呀
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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