找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机模拟手机拨号的proteus仿真图和源码

  [复制链接]
跳转到指定楼层
楼主
手机拨号仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define u8 unsigned char
  4. #define u16 unsigned int
  5. #define DelayNOP() {_nop_();_nop_();_nop_();_nop_();}
  6. sbit BEEP=P1^0;
  7. sbit LCD_RS=P2^0;
  8. sbit LCD_RW=P2^1;
  9. sbit LCD_EN=P2^2;
  10. void DelayMS(u16 ms);
  11. bit LCD_Busy_Check();
  12. void LCD_Set_Position(u8 Position);
  13. void Write_LCD_command(u8 cmd);
  14. void Write_LCD_data(u8 dat);
  15. //--标题字符串
  16. char code Title_Text[]={"intput number:  "};
  17. char code Wrong_Text[]={"wrong number!   "};
  18. char code Calling_Text[]={"phone calling!  "};
  19. //--键盘拔号与键盘符号映射表
  20. u8 code key_Table[]={'1','2','3','4','5','6','7','8','9','*','0','#'};
  21. //--键盘拔号数字缓冲
  22. u8 Dial_Code_Str[]={"                "};
  23. u8 keyNo=0xff;
  24. int tCount=0;
  25. //------------------------------------  //延时 //------------------------------------
  26. void DelayMS(u16 x)
  27. {
  28.         u8 i;
  29.         while(x--)
  30.         for(i=0;i<120;i++);
  31. }
  32. //-------------------------------- //在LCD指定的行上显示字符串 //--------------------------------
  33. void Display_String(u8 *str,u8 LineNo)
  34. {
  35.         u8 k;
  36.         LCD_Set_Position(LineNo);
  37.         for(k=0;k<16;k++)
  38.         Write_LCD_data(str[k]);
  39. }
  40. //---------------------------------------------- //忙检查 //---------------------------------------------
  41. bit LCD_Busy_Check()
  42. {
  43.         bit LCD_Status;
  44.         LCD_RS=0;//寄存器选择
  45.         LCD_RW=1;//读状态寄存器
  46.         LCD_EN=1;//开始读
  47.         DelayMS(1);
  48.         LCD_Status=(bit)(P0&0x80) ;
  49.         LCD_EN=0;
  50.         return LCD_Status;
  51. }
  52. //--------------------------------------------------- //写LCD命令 //----------------------------------------------------
  53. void Write_LCD_Command(u8 cmd)
  54. {
  55.         while((LCD_Busy_Check()&0x80)==0x80);//忙等待
  56.         LCD_RS=0;//选取择命令寄存器
  57.         LCD_RW=0;//写
  58.         LCD_EN=0;
  59.         _nop_();
  60.         _nop_();
  61.         P0=cmd;
  62.         DelayNOP();
  63.         LCD_EN=1;
  64.         DelayNOP();
  65.         LCD_EN=0;
  66. }
  67. //----------------------------------------- //发送数据 //----------------------------------------
  68. void Write_LCD_Data(u8 Str)
  69. {
  70.         while((LCD_Busy_Check()&0x80)==0x80);//忙等待
  71.         LCD_RS=1;
  72.         LCD_RW=0;
  73.         LCD_EN=0;
  74.         P0=Str;
  75.         DelayNOP();
  76.         LCD_EN=1;
  77.         DelayMS(1);
  78.         LCD_EN=0;
  79. }
  80. //------------------------------------------------- //LCD初始化 //-------------------------------------------------
  81. void Initialize_LCD()
  82. {
  83.         Write_LCD_Command(0x38);
  84.         DelayMS(5);
  85.         Write_LCD_Command(0x0C);//清屏
  86.         DelayMS(5);
  87.         Write_LCD_Command(0x06);//字符进入模式,屏幕不动,字符后移。
  88.         DelayMS(5);
  89.         Write_LCD_Command(0x01);//显示开,关光标。
  90.         DelayMS(5);
  91. }
  92. //-------------------------------------- //设置显示位置 //--------------------------------------
  93. void LCD_Set_Position(u8 Position)
  94. {
  95.         Write_LCD_Command(Position | 0x80);
  96. }
  97. //----------------------------------------------- //t0控制按键声音 //-----------------------------------------------
  98. void T0_INT() interrupt 1
  99. {
  100.         TH0=-400/256;
  101.         TL0=-400%256;
  102.         BEEP=~BEEP;
  103.         if(++tCount==200)
  104.         {
  105.         tCount=0;
  106.         TR0=0;
  107.         }
  108. }
  109. //------------------------- //键盘扫描 //------------------------  
  110. u8 Getkey()
  111. {
  112.         u8 i,j,k=0;
  113.         u8 keyScanCode[]={0xef,0xdf,0xbf,0x7f};//键盘扫描码
  114.         u8 keyCodeTable[]={0xee,0xed,0xeb,0xde,0xdd,0xdb,0xbe,0xbd,0xbb,0x7e,0x7d,0x7b};
  115.         P3=0x0f; //扫描键盘获取按键序号
  116.         if(P3!=0X0F)
  117.         {
  118.                 for(i=0;i<4;i++)
  119.                 { P3=keyScanCode[i];
  120.                          for(j=0;j<3;j++)
  121.                          { k=i*3+j;
  122.                                 if(P3==keyCodeTable[k])
  123.                                 return k;
  124.                         }
  125.                 }
  126.         }
  127.         else
  128.                 return 0xff;
  129. }
  130. //------------------------------- //main//--------------------------------
  131. void main()
  132. {
  133.         int i=0,j;
  134.         int c=0;
  135.         P0=P2=P1=0XFF;
  136.         IE=0X82;
  137.         TMOD=0X01;
  138.         Initialize_LCD(); //LCD初始化
  139.         Display_String(Title_Text,0x00);//在第一行显示标题
  140.         while(1)
  141.         {
  142.                 keyNo=Getkey();//获取按键值
  143.                 if(keyNo==0xff)
  144.                 continue;//无按键时继续扫描
  145.                 if(keyNo==0x09)
  146.                 {
  147.                         Dial_Code_Str[i]=0;
  148.                         Dial_Code_Str[i-1]=0;
  149.                         i=i-2;
  150.                         if(i<-1)
  151.                         {
  152.                                 i=-1;
  153.                         }
  154.                 }
  155.               //删除键
  156.        
  157.                 else if(keyNo==0x0b)
  158.                 {
  159.                         if(i==11&&c==0)
  160.                         {
  161.                                 Display_String(Calling_Text,0x00);
  162.                                 while(c==0)
  163.                                 {
  164.                                         TR0=1;
  165.                                         DelayMS(1500);
  166.                                         keyNo=Getkey();
  167.                                         if(keyNo==0x0b)
  168.                                         {
  169.                                                 break;
  170.                                         }
  171.                                 }
  172.                                 c=1;
  173.                                  
  174.                         }
  175.                         else if(i==11&&c==1)
  176.                         {
  177.                                   Display_String(Title_Text,0x00);
  178.                                   for(j=0;j<16;j++) Dial_Code_Str[j]=' '; i=0;
  179.                                   c=0;
  180.                         }
  181.                         else
  182.                         {
  183.                                 Display_String(Wrong_Text,0x00);
  184.                                 DelayMS(3000);
  185.                                 Display_String(Title_Text,0x00);
  186.                         }
  187.                         Dial_Code_Str[i]=0;
  188.                         i=i-1;
  189.                         if(i<-1)
  190.                         {
  191.                                 i=-1;
  192.                         }
  193.                 }
  194.                 else{
  195.                 Dial_Code_Str[i]=key_Table[keyNo];//将待显示字符放入待显示的拔号串中
  196.                 }
  197.                 Display_String(Dial_Code_Str,0x40);//在第二行显示号码
  198.                 if(++i==11)//超过11位时清空
  199.                 {
  200.                         for(j=0;j<16;j++) Dial_Code_Str[j]=' '; i=0;
  201.                 }
  202.                 TR0=1;//T0中断控制按键声音
  203.                 while(Getkey()!=0xff);//等待按键释放
  204.         }
  205. }
复制代码

所有资料51hei提供下载:
手机拨号.zip (71.02 KB, 下载次数: 93)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:422637 发表于 2018-11-8 18:10 | 只看该作者
你好,请问在吗?我想参考你这个作品设计一个结课作品,可以麻烦你给我讲解一下吗?
回复

使用道具 举报

板凳
ID:761557 发表于 2020-5-27 21:49 | 只看该作者
#号键没有用吗
回复

使用道具 举报

地板
ID:798289 发表于 2020-7-6 11:40 | 只看该作者
手机拨号器跟电话拨号器一样吗
回复

使用道具 举报

5#
ID:6813 发表于 2020-7-9 08:58 | 只看该作者

youyong
回复

使用道具 举报

6#
ID:823392 发表于 2021-1-3 15:47 | 只看该作者
里面的仿真文件如何打开?
回复

使用道具 举报

7#
ID:328014 发表于 2021-1-3 20:32 | 只看该作者
405072537 发表于 2021-1-3 15:47
里面的仿真文件如何打开?

dsn用Proteus7.8打开,其他版本都不行的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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