找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机公交车自动报站系统制作元件清单 程序+原理图资料

[复制链接]
跳转到指定楼层
楼主
制作一个基于单片机的公交车自动报站系统,制作元器件+程序+原理图资料
部分图如下,附件资料下载

元件清单        
元件标号    元件名称    数量
C1    10uf电解电容    1
C2, C3    30pf瓷片电容    2
D1, D2    IN4007二极管    2
J1    5V电源接口    1
K1, K2, K3    轻触按键    3
LCD1    12864液晶显示屏+20P插座    1
P1    103排阻    1
P2    4针排针    1
R2    10K电阻    1
SP1    喇叭    1
SW1    自锁开关    1
U1    STC89C52单片机+DIP40插座    1
U2    WT588D -16模块+ 2个8P圆排座    1
VR1    103滑动变阻器    1
Y1    12M晶振    1


单片机源程序如下:
  1. #include <reg52.h>                 //调用单片机头文件
  2. #include <intrins.h>
  3. #include"12864.h"
  4. #define uchar unsigned char  //无符路字符型 宏定义        变量范围0~255
  5. #define uint  unsigned int         //无符路整型 宏定义        变量范围0~65535
  6. uchar irtime;
  7. uchar startflag;
  8. uchar irdata[33];
  9. uchar bitnum;
  10. uchar irreceok;
  11. uchar ircode[4];
  12. uchar irprosok;
  13. uchar disp[8];
  14. uchar ir_num=0;
  15. uchar ir_flag=0;
  16. uchar k;
  17. sbit rs=P0^0;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
  18. sbit rw=P0^1;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
  19. sbit e =P0^2;         //片选信号   下降沿触发


  20. /***********************语音模块控制IO口的定义************************/
  21. sbit  VRST = P3^7;
  22. sbit  VBUSY= P3^6;        
  23. sbit  VSDA = P3^5;
  24. sbit  VCS  = P3^4;  
  25. sbit  VSCL = P3^3;


  26. uchar geshu=6;
  27.         
  28.                                 
  29. uchar code gj_ming[]= "   101路公交车  ";
  30. uchar code gj_ming1[]="             ";

  31. uchar code  table1[]= "    1 号站     ";
  32. uchar code  table2[]= "  2 号站  ";            
  33. uchar code  table3[]= "  3 号站     ";
  34. uchar code  table4[]= "   4 号站    ";
  35. uchar code  table5[]= "  5 号站   ";
  36. uchar code  table6[]= "   6 号站      ";
  37. uchar code  table7[]= "               ";
  38. uchar code  table8[]= "               ";
  39. uchar code  table9[]= "           ";


  40. void timer0init(void)
  41. {
  42. TMOD=0x02;
  43. TH0=0x00;
  44. TL0=0x00;
  45. ET0=1;
  46. EA=1;
  47. TR0=1;

  48. }

  49. void int0init(void)
  50. {
  51. IT0=1;
  52. EX0=1;
  53. EA=1;
  54. }
  55. void irpros(void)  //0x1c
  56. {
  57. uchar k,i,j;
  58. uchar value;
  59. k=1;
  60. for(j=0;j<4;j++)
  61. {
  62.   for(i=0;i<8;i++)
  63.   {
  64.    value=value>>1;   //7
  65.    if(irdata[k]>6)   //8
  66.    {
  67.     value=value | 0x80;
  68.    }
  69.    k++;
  70.   }
  71.   ircode[j]=value;
  72. }
  73. irprosok=1;
  74. }
  75. void irwork(void)
  76. {
  77. disp[0]=ircode[0]/16;
  78. disp[1]=ircode[0]%16;
  79. disp[2]=ircode[1]/16;
  80. disp[3]=ircode[1]%16;
  81. disp[4]=ircode[2]/16;
  82. disp[5]=ircode[2]%16;
  83. disp[6]=ircode[3]/16;
  84. disp[7]=ircode[3]%16;
  85. WriteCommand(0X98);
  86. WriteData(ircode[2]/100+0x30);
  87.         WriteData(ircode[2]%100/10+0x30);
  88.         WriteData(ircode[2]%10+0x30);
  89.   switch(ircode[2])
  90.                 {
  91.                         case (0x0c): k=1;ir_flag=1;break;
  92.                         case (0x18): k=2;ir_flag=1;break;
  93.                         case (0x5E): k=3;ir_flag=1;break;
  94.                         case (0x08): k=4;ir_flag=1;break;               
  95.                         case (0x1c): k=5;ir_flag=1;break;
  96.                         case (0x5A): k=6;ir_flag=1;break;
  97.                         case (0x42): k=7;ir_flag=1;break;
  98.                         case (0x55): k=8;ir_flag=1;break;
  99.                         case (0x4a): k=9;ir_flag=1;break;
  100. //                        case (0x84): k='C';break;        //
  101.                         case (0x43): k='*';break;          //撤销
  102.                         case (0x15): k='#';break;           //确认键
  103.                         case (0x0d): k='D';break;           //重设密码        
  104.                         case (0x45): k='B';break;         //
  105.                         case (0x41): k='C';break;         //
  106.                         case (0x44): k='A';break;         //
  107.                         case (0x40): k='A';break;         //
  108.                         case (0x07): k='A';break;         //        
  109.                         case (0x09): k='A';break;         //        
  110.                         case (0x19): k='A';break;         //        
  111. //                        default:;
  112.                 }
  113. }
  114. /********************************************************************
  115. * 名称 : delay_1ms()
  116. * 功能 : 延时1ms函数
  117. * 输入 : q
  118. * 输出 : 无
  119. ***********************************************************************/
  120. void delay_1ms(uint q)
  121. {
  122.         uint i,j;
  123.         for(i=0;i<q;i++)
  124.                 for(j=0;j<115;j++);
  125. }
  126.                                    

  127. /************初始化显示*****************/
  128. void init_12864_dis()
  129. { PutStr(0,0,"  欢迎乘坐  ");
  130.         PutStr(1,0,gj_ming);
  131.         PutStr(2,0,gj_ming1);
  132.         PutStr(3,0,"        ");
  133. }


  134. /***********************小延时函数**************************/
  135. void  delay_us (unsigned int us)
  136. {

  137.         while(us--)
  138.         {
  139.                 _nop_();
  140.         }
  141. }

  142. /***********************三线发码子程序************************/
  143. void Send_threelines(unsigned char addr,uchar dat)
  144. {
  145.    unsigned char i;

  146.         VCS=0;
  147.         delay_1ms(5);  /* 片选拉低5ms */
  148.     for(i=0;i<8;i++)
  149.         {
  150.                 VSCL=0;
  151.                 if(addr&0x01)
  152.                 {
  153.                         VSDA=1;
  154.                 }
  155.                 else
  156.                         VSDA=0;
  157.                 addr>>=1;
  158.                 delay_us(150); /* 150us */
  159.                 VSCL=1;
  160.                 delay_us(150); /* 150us */
  161.         }
  162.         VCS=1;
  163.         delay_1ms(30);
  164.         if(dat == 1)
  165.                 while(VBUSY == 0);          //忙等待
  166. }


  167. /********************独立按键程序*****************/
  168. uchar key_can;         //按键值

  169. void key()         //独立按键程序
  170. {
  171.         static uchar key_new;
  172.         key_can = 20;                   //按键值还原
  173.         P1 |= 0x0f;
  174.         if((P1 & 0x0f) != 0x0f)                //按键按下
  175.         {
  176.                 delay_1ms(1);                     //按键消抖动
  177.                 if(((P1 & 0x0f) != 0x0f) && (key_new == 1))
  178.                 {                                                //确认是按键按下
  179.                         key_new = 0;
  180.                         switch(P1 & 0x0f)
  181.                         {
  182.                                 case 0x0e: key_can = 2; break;          //得到按键值
  183.                                 case 0x0d: key_can = 1; break;          //得到按键值
  184.                         }
  185.                 }                        
  186.         }
  187.         else   //按键松开
  188.                 key_new = 1;        
  189. }

  190.         uchar flag_s = 0;
  191.     uchar        flag_z= 0;
  192. /***************主函数*****************/
  193. void main()
  194. {         

  195.         uchar num=0;                                 //定时器1,工作在定时方式2
  196.         timer0init();
  197.         int0init();
  198.         P0 = P1 = P2 = P3 = 0XFF;
  199.         LcmInit();//初始化12864                 
  200.         init_12864_dis();
  201.         Send_threelines(0,0);    //语音播报
  202.         while(1)
  203.         { if(irreceok)
  204.                         {
  205.                          irpros();
  206.                          irreceok=0;
  207.                         }
  208.                 if(irprosok)
  209.                         {
  210.                          irwork();
  211.                          irprosok=0;
  212.                         }
  213.                 key();         //独立按键程序        
  214.                 if((key_can < 20)||((ir_flag==1)&&(k<=geshu)))
  215.                 {
  216.                         if(key_can == 1)
  217.                         {
  218.                                 if(num < geshu)
  219.                                 {         
  220.                                         num++;        
  221.                                 }
  222.                                 flag_s = 1;

  223.                         }
  224.                         if(key_can == 2)
  225.                         {
  226.                                 
  227.                                         if(num != 0)
  228.                                                 num--;        
  229.                                 
  230.                         }
  231.                         if((ir_flag==1)&&(k<=geshu))
  232.                         {
  233.                                  ir_flag=0;
  234.                                  num=k;
  235.                         }
  236.                         if(num == 1)       //报第1个站
  237.                         {
  238.                                 PutStr(1,0,gj_ming);
  239.               PutStr(2,0,table1);
  240.               PutStr(3,0,gj_ming1);
  241.                                 PutStr(3,0,"        ");
  242.                                 Send_threelines(1,0);    //语音播报        
  243.                         
  244.                         }
  245.                         if(num == 2)       //报第2个站
  246.                         {
  247.                                 PutStr(1,0,gj_ming);
  248.               PutStr(2,0,table2);
  249.               PutStr(3,0,gj_ming1);
  250.                                 PutStr(3,0,"        ");
  251.                                 flag_z=1;
  252.                                 Send_threelines(2,0);    //语音播报                        
  253.                         }
  254.                         if(num == 3)       //报第3个站
  255.                         {                                                                    
  256.                                 PutStr(1,0,gj_ming);
  257.               PutStr(2,0,table3);
  258.               PutStr(3,0,gj_ming1);
  259.                           PutStr(3,0,"        ");
  260.                                 Send_threelines(3,0);    //语音播报                        
  261.                         }
  262.                         if(num == 4)       //报第4个站
  263.                         {
  264.                                 PutStr(1,0,gj_ming);
  265.               PutStr(2,0,table4);
  266.               PutStr(3,0,gj_ming1);
  267.                                 PutStr(3,0,"        ");
  268.                                 Send_threelines(4,0);    //语音播报                        
  269.                         }
  270.                         if(num == 5)       //报第5个站
  271.                         {
  272.                                 PutStr(1,0,gj_ming);
  273.               PutStr(2,0,table5);
  274.               PutStr(3,0,gj_ming1);
  275.                                 PutStr(3,0,"        ");
  276.                                 Send_threelines(5,0);    //语音播报                        
  277.                         }
  278.                         if(num == 6)       //报第5个站
  279.                         {
  280.                                 PutStr(1,0,gj_ming);
  281.               PutStr(2,0,table6);
  282.               PutStr(3,0,gj_ming1);
  283.                                 PutStr(3,0,"        ");
  284.                                 Send_threelines(6,0);    //语音播报                        
  285.                         }
  286.                         if(num == 7)       //报第5个站
  287.                         {
  288.                                 PutStr(1,0,gj_ming);
  289.               PutStr(2,0,table7);
  290.               PutStr(3,0,gj_ming1);
  291.                                 PutStr(3,0,"        ");
  292.                                 Send_threelines(7,0);    //语音播报                        
  293.                         }
  294.                         if(num == 8)       //报第5个站
  295.                         {
  296.                                 PutStr(1,0,gj_ming);
  297.               PutStr(2,0,table8);
  298.               PutStr(3,0,gj_ming1);
  299.                                 PutStr(3,0,"        ");
  300.                                 Send_threelines(8,0);    //语音播报                        
  301.                         }

  302.                         if(num == 9)       //报第9个站
  303.                         {
  304.                                 PutStr(1,0,gj_ming);
  305.               PutStr(2,0,table9);
  306.               PutStr(3,0,gj_ming1);
  307.                                 PutStr(3,0,"        ");
  308.                                 if(flag_s == 1)
  309.                                 {
  310.                                         Send_threelines(10,0);    //语音播报        
  311. ……………………

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

所有资料51hei提供下载:
公交报站资料-b.7z (1.2 MB, 下载次数: 95)

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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