找回密码
 立即注册

QQ登录

只需一步,快速开始

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

住宅小区汽车超速检测及报警系统设计(单片机源码+图+报告)

[复制链接]
跳转到指定楼层
楼主
“宏晶杯单片机大赛”设计报告—4、 住宅小区汽车超速检测及报警系统

一、参赛题目
住宅小区汽车超速检测及报警系统
(1)基本要求
速度检测与显示
速度报警值设定
环境气象参数的显示
(2)拓展功能自行考虑
二、方案比较及确定
依据题目基本要求:速度的检测与显示,速度报警值的设定以及环境气象参数的显示。团队以此作为基本要求展开设计,经过讨论以及程序的执行情况,确定以下功能,其中包括基本功能模块和拓展功能模块。

(1)基本功能
常用显示:温度、湿度以及通过薄膜键盘设定速度报警值。
测速及报警显示:测速时采用光电开关进行测量,通过测量汽车经过两个光电门之间的时间,运用基本的物理速度公式:V=s/t 进而获得汽车的速度。如果汽车超速则 12864 将显示时速并出现提醒超速标语,同时蜂鸣报警响起,LED灯亮起。
(2)拓展功能
初始化显示:在电源供电之后,12864 将出现第一个界面,界面上显示“欢迎使用小区车速检测系统,请输入限定时速:”的标语。
常用显示:在利用薄膜键盘输入限定时速按下确认键, 12864 将出现第二个界面,其中包括基本显示项目:万年历、日期、温度、湿度以及速度报警值。
测速及报警显示:在汽车超速之后不仅会显示超速和标语,同时报警蜂鸣响起,报警系统与小区监控摄像连接为一体,在显示超速的同时会利用
监控抓拍车牌号,并做及时的记录。

路灯控制:考虑到小区人们的出行, 在15 上增加了对路灯控制的模块,在每天的 19:30-00:30 路灯会自动亮起。同时兼顾每位居民的不同的作息时间,在路灯亮起的这段时间内如果检测到有超速的情况则蜂鸣警报声不会响起,
只会在显示屏上显示超速并且LED 灯闪烁来替代警报声,同时抓拍车牌号。深夜模式:在00:30 分之后,路灯熄灭,此时如果有人或者车经过时,声控开关会控制路灯再次点亮 10s,同时测速报警系统也会启动。在到达凌晨4 点 30 分之后,深夜模式关闭。既方便小区人们的出行又达到了节能减排的效果。
噪声检测:通过检测周围环境的噪声,如果检测到噪音,则通过点
亮LED 灯来显示噪声检测结果。

三、理论数据分析
此测速报警系统是通过测量汽车经过两个光电门之间的时间, 设定两个光电门之间的距离为  s 10cm .编写程序时将延时时间设定为1ms, 每经过 1ms则检测一次车头是否到达第二个光电门, 同时计时,如果到达则计时结束,得到车头经过两个光电门所用时间t ,之后运用基本的物理速度公式:
v=s/t 进而获得汽车的速度。

四、软件设计
根据STC15单片机的 O I / 端口的数目以及功能要求软件程
序如下:(具体程序详见附录)
1、薄膜键盘输入程序模块
2、12864程序模块
3、路灯控制程序模块
4、蜂鸣报警程序模块
5、深夜模式程序模块
6、噪音检测程序模块
五、流程图
1、测速功能流程图


2、路灯控制功能流程图


六、电路图及相关设计文件


所用软件:proteus 电路仿真软件
七、比赛器件
STC15 单片机、薄膜键盘、12864 液晶显示屏、温湿度传感器DHT11、时间显示 DS1302、噪音检测器、光电门等。

八、测试数据及结果分析
1、 此报警系统不仅能够测定速度,通过测定车头通过两个光电门所用时间 t,利用物理公式v=s/t 判断是否超速。
2、 通过温湿度传感器测量周围环境的环境参数, 并显示在12864显示屏的第三行。
3、通过噪音传感器测量噪音系数,根据系数大小判断是否点亮噪音显示灯。

九、总结
此次大赛我们选中了“小区测速报警系统”的题目,这个命题十分贴近我们的日常生活, 真正的将平时在课本上所学习的有关单片机的知识运用到实践中,在技术设计中更多地要考虑的是实用性,合理性。而且,平时我们大多数用的单片机都是 51 系列,此次大赛要求我们应用 15 系列,这又是一次锻炼我们的机会,掌握了更多型号的单片机的使用方法。在设计中,向 15 单片机上转化是一项很大的考验,通过几天的努力我们终于让程序在 15 上正常运行,这次比赛让我们的专业知识储备更加丰富, 也在实践中应用了所学, 受益匪浅。


附录:
15单片机设计程序及注释

单片机源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. #define LCD_data  P0
  6. #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
  7. #define MAIN_Fosc                11059200UL        //
  8. #define DS1302_W_ADDR 0x80  //
  9. #define DS1302_R_ADDR 0x81        //

  10. sbit buzzer = P2^3;//蜂鸣器报警
  11. sbit voice = P3^0; //鸣笛检测输出
  12. sbit led6 = P1^5; //        灯光报警
  13. sbit led5 = P1^4;//鸣笛检测灯光示意

  14. sbit TSCLK = P1^0;
  15. sbit TIO = P1^1;   
  16. sbit TRST = P1^2;
  17. sbit streetlight = P1^7;//路灯
  18. sbit LCD_RS  =  P3^5;//
  19. sbit LCD_RW  =  P3^6;//
  20. sbit LCD_EN  =  P3^4; //
  21. sbit LCD_PSB =  P3^7;
  22. sbit wela = P2^7;
  23. sbit dula = P2^6;

  24. sbit DQ=P2^2;    //DTH11
  25. uint vtest= 0;
  26. uint t = 0;
  27. uchar vlim = 0;
  28. v_test[3] = {0,0,0};
  29. v_lim[3] = {0,0,0};
  30. uchar flag,flag0,flag1,flag2,flag4,flag5,flag6= 0;
  31. uchar flag3 = 1;
  32. uchar flag7 = 1;
  33. uchar weed,x;
  34. uchar tem = 0;
  35. uchar hum = 0;
  36. display0[2]={0,0};
  37. display1[2]={0,0};        
  38. uchar code init1[] = {"  欢迎使用小区  "};
  39. uchar code init2[] = {"  车速检测系统  "};
  40. uchar code init3[] = {"请输入小区限速: "};
  41. uchar code init4[] = {"    km/h        "};
  42. uchar code warning1[] = {"车速: 020km/h   "};
  43. uchar code warning2[] = {"您已超速, 为了  "};
  44. uchar code warning3[] = {"您和他人的安全  "};
  45. uchar code warning4[] = {"请减速慢行      "};
  46. uchar code slogan1[] = {"    文明礼让    "};
  47. uchar code slogan2[] = {"    有序通行    "};
  48. uchar code slogan3[] = {"    互相体谅    "};
  49. uchar code slogan4[] = {"    请勿鸣笛    "};
  50. uchar code dis1[]= {"20  年  月  日 "};
  51. uchar code dis2[]= {"星期    :   :   "};
  52. uchar code dis3[] = {"温度26℃湿度30%"};
  53. uchar code dis4[] = {"限速:     km/h  "};



  54. void delay(uint ms)
  55. {
  56.     while(ms--)
  57.         {
  58.       uchar i;
  59.           for(i=0;i<250;i++)  
  60.            {
  61.             _nop_();                           
  62.                 _nop_();
  63.                 _nop_();
  64.                 _nop_();
  65.            }
  66.         }
  67. }               

  68. /*******************************************************************/
  69. /*                                                                 */
  70. /*检查LCD忙状态                                                    */
  71. /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。      */
  72. /*                                                                 */
  73. /*******************************************************************/
  74. bit lcd_busy()
  75. {                          
  76.     bit result;
  77.     LCD_RS = 0;
  78.     LCD_RW = 1;
  79.     LCD_EN = 1;
  80.     delayNOP();
  81.     result = (bit)(P0&0x80);
  82.     LCD_EN = 0;
  83.     return(result);
  84. }
  85. /*******************************************************************/
  86. /*                                                                 */
  87. /*写指令数据到LCD                                                  */
  88. /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */
  89. /*                                                                 */
  90. /*******************************************************************/
  91. void lcd_wcmd(uchar cmd)
  92. {                          
  93.    while(lcd_busy());
  94.     LCD_RS = 0;
  95.     LCD_RW = 0;
  96.     LCD_EN = 0;
  97.     _nop_();
  98.     _nop_();
  99.     P0 = cmd;
  100.     delayNOP();
  101.     LCD_EN = 1;
  102.     delayNOP();
  103.     LCD_EN = 0;  
  104. }
  105. /*******************************************************************/
  106. /*                                                                 */
  107. /*写显示数据到LCD                                                  */
  108. /*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */
  109. /*                                                                 */
  110. /*******************************************************************/
  111. void lcd_wdat(uchar dat)
  112. {                          
  113.    while(lcd_busy());
  114.     LCD_RS = 1;
  115.     LCD_RW = 0;
  116.     LCD_EN = 0;
  117.     P0 = dat;
  118.     delayNOP();
  119.     LCD_EN = 1;
  120.     delayNOP();
  121.     LCD_EN = 0;
  122. }
  123. /*******************************************************************/
  124. /*                                                                 */
  125. /*  LCD初始化设定                                                  */
  126. /*                                                                 */
  127. /*******************************************************************/
  128. void lcd_init()
  129. {

  130.    
  131.      LCD_PSB = 1;
  132.     lcd_wcmd(0x34);      //扩充指令操作
  133.     delay(5);
  134.     lcd_wcmd(0x30);      //基本指令操作
  135.     delay(5);
  136.     lcd_wcmd(0x0C);      //显示开,关光标
  137.     delay(5);
  138.     lcd_wcmd(0x01);      //清除LCD的显示内容
  139.     delay(5);
  140. }


  141. #define MAIN_Fosc                11059200UL        //宏定义主时钟HZ
  142. #define DS1302_W_ADDR 0x80  //写时钟日历寄存器起始地址
  143. #define DS1302_R_ADDR 0x81        //读时钟日历寄存器起始地址

  144. //时钟日历暂存数组,秒、分、时、日、月、周、年 初值为= 16年6月4日 周六 19:29:50
  145. uchar TimeData[7]={0, 29, 19, 4, 6, 6, 16};

  146. /*=================================================
  147. *函数名称:Delay_Ms
  148. *函数功能:12T 51单片机自适应主时钟毫秒级延时函数
  149. *说明:需定义MAIN_Fosc(晶振主频单位HZ)
  150. *输入:ms:要延时的毫秒
  151. =================================================*/
  152. void Delay_Ms(uint ms)
  153. {
  154.      uint i;
  155.          do{
  156.               i = MAIN_Fosc / 96000;
  157.                   while(--i);   //96T per loop
  158.      }while(--ms);
  159. }
  160. /*=================================================
  161. *函数名称:DS1302_W_Byte
  162. *函数功能:DS1302写一字节数据
  163. *输入:dat:要写入的数据
  164. =================================================*/
  165. void DS1302_W_Byte(uchar dat)
  166. {
  167.         uchar i;
  168.         for(i = 0; i < 8; i++) //每次写1bit,写8次
  169.         {
  170.                 TSCLK = 0;                   //拉低时钟总线
  171.                 TIO = dat & 0x01;  //从一字节最低位开始写
  172.                 TSCLK = 1;                   //拉高时钟总线,DS1302把数据读走
  173.                 dat >>= 1;                   //数据右移一位
  174.         }        
  175. }
  176. /*=================================================
  177. *函数名称:DS1302_R_Byte
  178. *函数功能:DS1302读一字节
  179. *输出:dat:读取的数据
  180. =================================================*/
  181. uchar DS1302_R_Byte()
  182. {
  183.         uchar i, dat;
  184.         for(i = 0; i < 8; i++)  //每次写1bit,写8次
  185.         {
  186.                 TSCLK = 0;                        //拉低时钟总线,DS1302把数据放到数据总线上
  187.                 dat >>= 1;                         //数据右移一位,数据从最低位开始读
  188.                 if(TIO)        dat |= 0x80;//读取数据
  189.                 TSCLK = 1;                        //拉高时钟总线
  190.         }
  191.         return dat;                                //返回读取的数据
  192. }
  193. /*=================================================
  194. *函数名称:DS1302_W_DAT
  195. *函数功能:写DS1302数据一次写2个字节
  196. *说明:先写命令后写数据
  197. *调用:DS1302_W_Byte()
  198. *输入:cmd:需要写的命令 ,dat:需要些的数据
  199. =================================================*/
  200. void DS1302_W_DAT(uchar cmd, uchar dat)
  201. {
  202.         TRST = 0;                         //拉低使能端
  203.         TSCLK = 0;                         //拉低数据总线
  204.         TRST = 1;                         //拉高使能端,开始写数据
  205.         DS1302_W_Byte(cmd);         //写命令
  206.         DS1302_W_Byte(dat);         //写数据
  207. }
  208. /*=================================================
  209. *函数名称:DS1302_R_DAT
  210. *函数功能:读DS1302数据
  211. *说明:先写入命令字节后读出对应数据
  212. *调用:        DS1302_W_Byte();DS1302_R_Byte();
  213. *输入:        cmd:需要写的命令
  214. *输出:        dat:读出的数据
  215. =================================================*/
  216. uchar DS1302_R_DAT(uchar cmd)
  217. {
  218.         uchar dat;
  219.         TRST = 0;                                 //拉低使能端
  220.         TSCLK = 0;                                //拉低数据总线
  221.         TRST = 1;                                //拉高使能端,开始写数据
  222.         DS1302_W_Byte(cmd);                //写命令
  223.         dat = DS1302_R_Byte();        //读出数据
  224.         return dat;                                //返回读出数据
  225. }

  226. /*=================================================
  227. *函数名称:DS1302_Clear_WP
  228. *函数功能:清除DS1302写保护
  229. *说明:先写入命令0x8e(写控制寄存器)接着向该寄存器写0
  230. *调用:DS1302_W_DAT()
  231. =================================================*/
  232. void DS1302_Clear_WP()
  233. {
  234.         DS1302_W_DAT(0x8e,0x00);  //把控制寄存器WP位置0
  235. }
  236. /*=================================================
  237. *函数名称:DS1302_Clear_WP
  238. *函数功能:设置DS1302写保护
  239. *说明:先写入命令0x8e(写控制寄存器)接着向该寄存器写0x80
  240. *调用:DS1302_W_DAT()
  241. =================================================*/
  242. void DS1302_Set_WP()
  243. {        
  244.         DS1302_W_DAT(0x8e,0x80); //把控制寄存器WP位置1
  245.         TRST = 0;                                 //拉低使能端
  246.         TSCLK = 0;                                 //拉低数据总线
  247. }
  248. /*=================================================
  249. *函数名称:Set_DS1302_Time
  250. *函数功能:设置DS1302时钟日历数据
  251. *说明:把时钟日历暂存数组TimeData数据转换为BCD码并
  252.            写入到DS1302时钟日历寄存器中
  253. *调用:DS1302_Clear_WP();DS1302_W_DAT();DS1302_Set_WP();
  254. *输入:addr:需要写入寄存器的地址 ,TimeData数组:时钟日历初始值
  255. =================================================*/
  256. void Set_DS1302_Time(uchar addr)
  257. {
  258.         uchar i, j;
  259.         DS1302_Clear_WP();                //清除写保护
  260.         for(i = 0; i < 7; i++)        //写入7个字节的时钟初始值
  261.         {
  262.                 j = TimeData[i]/10;         //BCD码转换
  263.                 TimeData[i] %= 10;         //BCD码转换
  264.                 TimeData[i] += j*16; //BCD码转换
  265.                 DS1302_W_DAT(addr, TimeData[i]); //先写DS1302时钟日历起始地址,再写数据
  266.                 addr += 2;         //时钟日历寄存器地址+2转向下一个寄存器
  267.         }
  268.         DS1302_Set_WP(); //开起写保护               
  269. }
  270. /*=================================================
  271. *函数名称:Read_DS1302_Time
  272. *函数功能:读取DS1302时钟数据
  273. *说明:        读取DS1302时钟数据 返回数据存入时钟日历暂存
  274.                 数组TimeData(数据格式BCD码)
  275. *调用:DS1302_Clear_WP();DS1302_R_DAT();DS1302_Set_WP();
  276. *输入:        addr:需要读取时钟日历寄存器的起始地址
  277. =================================================*/
  278. void Read_DS1302_Time(uchar addr)
  279. {
  280.         uchar i;
  281.         DS1302_Clear_WP();            //清楚些保护
  282.         for(i = 0; i < 7; i++)        //从DS1302读取7个字节的时钟日历数据
  283.         {
  284.                 TimeData[i] = DS1302_R_DAT(addr);//先写入要读取数据的寄存器起始地址,再读出数据存入TimeData数组
  285.                 addr += 2;                                                 //时钟日历寄存器地址+2转向下一个寄存器
  286.         }
  287.         DS1302_Set_WP();   //开起写保护
  288. }



  289. void init()
  290. {
  291.         
  292.         TMOD = 0x01;  //定时器16位计数工作模式
  293.         TH0 =0xfc;
  294.         TL0 =0x66; //1ms定时
  295.         EX0 = 1; //开外部中断0
  296.     IT0 = 1; //负跳变触发
  297.         EX1 = 1; //开外部中断1
  298.     IT1 = 1; //负跳变触发
  299.     EA = 1; //开总中断

  300. }



  301. uchar KeyScan()        //带返回值的子函数
  302. {
  303.         uchar cord_l = 0,cord_h = 0;//声明列线和行线的值的储存变量
  304.         P0 = 0xf0;//1111 0000
  305.         if( (P0 & 0xf0) != 0xf0)//判断是否有按键按下
  306.         {
  307.                 delay(20);//软件消抖
  308.                 if( (P0 & 0xf0) != 0xf0)//判断是否有按键按下
  309.                 {     flag0 = 1;
  310.                           cord_l = P0 & 0xf0;// 储存列线值
  311.                           P0 = cord_l | 0x0f;
  312.                           cord_h = P0 & 0x0f;// 储存行线值
  313.                           while( (P0 & 0x0f) != 0x0f );//松手检测
  314.                           return (cord_l + cord_h);//返回键值码
  315.                 }        
  316.         }
  317.                
  318. }

  319. void input_bai()
  320. {
  321.         switch( KeyScan() )
  322.         {
  323.                  case 0xd7: v_lim[0] = 0;            break;
  324.                 case 0xee: v_lim[0] = 1;                break;
  325.                 case 0xde: v_lim[0] = 2;                break;
  326.                 case 0xbe: v_lim[0] = 3;                break;
  327.                 case 0xed: v_lim[0] = 4;                break;
  328.                 case 0xdd: v_lim[0] = 5;                break;
  329.                 case 0xbd: v_lim[0] = 6;                break;
  330.             case 0xeb: v_lim[0] = 7;                break;
  331.                 case 0xdb: v_lim[0] = 8;                break;
  332.                 case 0xbb: v_lim[0] = 9;            break;
  333.                
  334.                
  335.         }        
  336. }
  337. void input_shi()
  338. {
  339.         switch( KeyScan() )
  340.         {
  341.                  case 0xd7: v_lim[1] = 0;            break;
  342.                 case 0xee: v_lim[1] = 1;                break;
  343.                 case 0xde: v_lim[1] = 2;                break;
  344.                 case 0xbe: v_lim[1] = 3;                break;
  345.                 case 0xed: v_lim[1] = 4;                break;
  346.                 case 0xdd: v_lim[1] = 5;                break;
  347.                 case 0xbd: v_lim[1] = 6;                break;
  348.             case 0xeb: v_lim[1] = 7;                break;
  349.                 case 0xdb: v_lim[1] = 8;                break;
  350.                 case 0xbb: v_lim[1] = 9;            break;
  351.                
  352.                
  353.         }        
  354. }
  355. void input_ge()
  356. {
  357.         switch( KeyScan() )
  358.         {
  359.                  case 0xd7: v_lim[2] = 0;            break;
  360.                 case 0xee: v_lim[2] = 1;                break;
  361.                 case 0xde: v_lim[2] = 2;                break;
  362.                 case 0xbe: v_lim[2] = 3;                break;
  363.                 case 0xed: v_lim[2] = 4;                break;
  364.                 case 0xdd: v_lim[2] = 5;                break;
  365.                 case 0xbd: v_lim[2] = 6;                break;
  366.             case 0xeb: v_lim[2] = 7;                break;
  367.                 case 0xdb: v_lim[2] = 8;                break;
  368.                 case 0xbb: v_lim[2] = 9;            break;
  369.                
  370.                
  371.         }        
  372. }


  373. bit Init_DTH11()
  374. {
  375. bit flag;
  376. uchar num;
  377. DQ=0;
  378. delay(19);   // >18ms
  379. DQ=1;
  380. for(num=0;num<10;num++);   //
  381. for(num=0;num<12;num++);
  382. flag=DQ;
  383. for(num=0;num<11;num++);
  384. for(num=0;num<24;num++);   
  385. return flag;
  386. }

  387. uchar DTH11_RD_CHAR()
  388. {
  389. uchar byte=0;
  390. uchar num;
  391. uchar num1;
  392. while(DQ==1);
  393. for(num1=0;num1<8;num1++)
  394. {
  395.   while(DQ==0);
  396.   byte<<=1;     //
  397.   for(num=0;DQ==1;num++);
  398.   if(num<10)
  399.    byte|=0x00;
  400.   else
  401.    byte|=0x01;
  402. }
  403. return byte;
  404. }

  405. void  DTH11_DUSHU()
  406. {
  407. uchar num;
  408. if(Init_DTH11()==0)
  409. {
  410.   hum=DTH11_RD_CHAR();   //
  411.   DTH11_RD_CHAR();
  412.   tem=DTH11_RD_CHAR();
  413.   DTH11_RD_CHAR();
  414.   DTH11_RD_CHAR();
  415.   for(num=0;num<17;num++);  //
  416.   DQ=1;
  417. }
  418. }
  419. void Display_DTH11()  
  420. {
  421. display0[0]=hum/10%10;
  422. display0[1]=hum%10;
  423. lcd_wcmd(0x8e);
  424. for(x=0;x<2;x++)
  425. lcd_wdat(display0[0+x]);//显示湿度
  426. display1[0]=tem/10%10;
  427. display1[1]=tem%10;
  428. lcd_wcmd(0x8a);
  429. for(x=0;x<2;x++)
  430. lcd_wdat(display1[0+x]);//显示温度
  431. }
  432. void main()
  433. {         wela = 0;
  434.            dula = 0;
  435.           Init_DTH11();                 
  436.           lcd_init();//12864初始化               
  437.             init();//定时器初始化
  438.                 Set_DS1302_Time(DS1302_W_ADDR);
  439.                 lcd_wcmd(0x80);                        
  440.         for(x=0;x<16;x++)
  441.                 lcd_wdat(init1[x]);
  442.         lcd_wcmd(0x90);                        
  443.         for(x=0;x<16;x++)
  444.                 lcd_wdat(init2[x]);
  445.         
  446.         lcd_wcmd(0x88);
  447.         for(x=0;x<16;x++)
  448.                 lcd_wdat(init3[x]);
  449.         lcd_wcmd(0x98);
  450.         for(x=0;x<16;x++)
  451.                 lcd_wdat(init4[x]);  //显示初始界面  
  452.         

  453.                     
  454.                
  455.                         
  456.            
  457.      
  458.         while(1)
  459.         {
  460.                 input_bai();
  461.                 if(flag0)
  462.                 {
  463.                         flag0 = 0;
  464.                         lcd_wcmd(0x98);
  465.                         for(x=0;x<1;x++)
  466.                         lcd_wdat(v_lim[0+x]+ '0');
  467.                         break;
  468.                 }
  469.         }
  470.         
  471.         while(1)
  472.         {
  473.                 input_shi();
  474.                 if(flag0)
  475.                 {
  476.                         flag0 = 0;
  477.                         lcd_wcmd(0x98);
  478.                         for(x=0;x<2;x++)
  479.                         lcd_wdat(v_lim[0+x]+ '0');
  480.                         break;
  481.                 }
  482.         }
  483.         
  484.         while(1)
  485.         {
  486.                 input_ge();
  487.                 if(flag0)
  488.                 {
  489.                         flag0 = 0;
  490.                         lcd_wcmd(0x99);
  491.                         
  492.                         lcd_wdat(v_lim[2]+ '0');
  493.                
  494.                         }
  495.          if (KeyScan() == 0x7e)
  496.                 {         
  497.                 vlim = v_lim[0]*100+v_lim[1]*10+v_lim[2];
  498.                
  499.                 break;
  500.                   }         
  501.                
  502.                
  503.         }
  504.      

  505. while(1)  
  506. {        delay(5);
  507.          lcd_wcmd(0x01);
  508.                   delay(5);
  509.                    lcd_wcmd(0x80);                        
  510.                 for(x=0;x<16;x++)
  511.                         lcd_wdat(dis1[x]);
  512.                 lcd_wcmd(0x90);                        
  513.                 for(x=0;x<16;x++)
  514.                         lcd_wdat(dis2[x]);
  515.                
  516.                 lcd_wcmd(0x88);
  517.                 for(x=0;x<16;x++)
  518.                         lcd_wdat(dis3[x]);
  519.                 lcd_wcmd(0x98);
  520.                 for(x=0;x<16;x++)
  521.                           lcd_wdat(dis4[x]);
  522.          while(flag3)
  523.         {        
  524.                   Read_DS1302_Time(DS1302_R_ADDR);//
  525.                  delay(5);
  526.                 lcd_wcmd(0x81);
  527.                 lcd_wdat(TimeData[6]/16 + '0');
  528.                 lcd_wdat(TimeData[6]%16 + '0');//year
  529.                 delay(5);
  530.                 lcd_wcmd(0x83);
  531.                 lcd_wdat(TimeData[4]/16 + '0');
  532.                 lcd_wdat(TimeData[4]%16 + '0');//month
  533.                 delay(5);
  534.                 lcd_wcmd(0x85);
  535.                 lcd_wdat(TimeData[3]/16 + '0');
  536.                 lcd_wdat(TimeData[3]%16 + '0');//day
  537.                 delay(5);
  538.                   lcd_wcmd(0x92);
  539.                 lcd_wdat(TimeData[5]%16 + '0');//weed
  540.                   delay(20);
  541.                 lcd_wcmd(0x93);
  542.                 lcd_wdat(TimeData[2]/16 + '0');
  543.                 lcd_wdat(TimeData[2]%16 + '0');//hour
  544.                 delay(5);
  545.                 lcd_wcmd(0x95);
  546.                 lcd_wdat(TimeData[1]/16 + '0');
  547.                 lcd_wdat(TimeData[1]%16 + '0');//minute
  548.                 delay(5);
  549.                 lcd_wcmd(0x97);
  550.                 lcd_wdat(TimeData[0]/16 + '0');
  551.                 lcd_wdat(TimeData[0]%16 + '0');//second

  552.                 if((TimeData[2] == 0x19)&&(TimeData[1] == 0x30))streetlight = 0;
  553.                 if((TimeData[2] == 0x00)&&(TimeData[1] == 0x30))streetlight = 1;
  554.                 if((TimeData[2] == 0x40)&&(TimeData[1] == 0x00)) flag7 = 0;
  555.                 Delay_Ms(600);
  556.                 DTH11_DUSHU();
  557.                  display0[0]=hum/10%10;
  558.                  display0[1]=hum%10;
  559.                  lcd_wcmd(0x8e);
  560.                  for(x=0;x<2;x++)
  561.                  lcd_wdat(display0[0+x]+'0');//显示湿度
  562.                  display1[0]=tem/10%10;
  563.                  display1[1]=tem%10;
  564.                  lcd_wcmd(0x8a);
  565.                  for(x=0;x<2;x++)
  566.                  lcd_wdat(display1[0+x]+'0');//显示温度
  567.                  lcd_wcmd(0x9b);
  568.                  for(x=0;x<3;x++)
  569.                  lcd_wdat(v_lim[0+x]+'0');
  570.                  while(flag)
  571.                 {   
  572.                          TR0 = 1;
  573.                         if(TF0 == 1)
  574.                         {
  575.                                 TF0 = 0;
  576.                                 TH0 = 0xfc;
  577.                                 TL0 = 0x66; // 定时1ms
  578.                                 t++;
  579.                         }
  580.                 }        
  581.                 if(t > 0)
  582.                 {
  583.                   vtest = 10000/t;//
  584.                         if (vtest > vlim)
  585.                         {
  586.                         
  587.                         v_test[0] = vtest/100;
  588.                         v_test[1] = (vtest/10)-(vtest/100)*10;
  589.                         v_test[2] = vtest%10;
  590.                         flag3 = 0;
  591.                         flag4 = 1;
  592.                         
  593.                         t = 0;
  594.                         vtest = 0;
  595.                         flag = 0;
  596.                         
  597.                 }
  598.                 }
  599.          if(!voice)
  600.          {
  601.            delay(5);
  602.            if(!voice)
  603.            {flag3 = 0;
  604.            flag5 = 1;
  605.           }
  606. }
  607.    
  608.         }        
  609.              if(flag4)
  610.                  {lcd_wcmd(0x01);
  611.                   delay(5);
  612.              lcd_wcmd(0x80);                        
  613.                 for(x=0;x<16;x++)
  614.                         lcd_wdat(warning1[x]);
  615.                 lcd_wcmd(0x90);                        
  616.                 for(x=0;x<16;x++)
  617.                         lcd_wdat(warning2[x]);
  618.                
  619.                 lcd_wcmd(0x88);
  620.                 for(x=0;x<16;x++)
  621.                         lcd_wdat(warning3[x]);
  622.                 lcd_wcmd(0x98);
  623.                 for(x=0;x<16;x++)
  624.                           lcd_wdat(warning4[x]);
  625.                 lcd_wcmd(0x83);
  626.                 for(x=0;x<3;x++)
  627.                 lcd_wdat(v_test[0+x]+'0');                 
  628.                      
  629.                 //Delay_Ms(2000);
  630.                  if(streetlight == 1)
  631.                         { buzzer = 0;
  632.                           Delay_Ms(2000);
  633.                           buzzer = 1;}
  634.                         else
  635.                         {
  636.                           led6 = 0;
  637.                           Delay_Ms(2000);
  638.                           led6=  1;
  639.                          }
  640.                 flag3 = 1;
  641.                   flag4 = 0;
  642.                   
  643.                   }
  644.                   
  645. ……………………

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


所有资料51hei提供下载:
最终工程(51).zip (62.8 KB, 下载次数: 38)
2016年“宏晶杯单片机大赛”设计报告.pdf (460.53 KB, 下载次数: 20)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:489394 发表于 2023-4-7 10:19 | 只看该作者
附件没有仿真图和原理图呀
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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