找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机串口打印调试程序PROTEUS模拟

[复制链接]
跳转到指定楼层
楼主
我用PROTEUS模拟了郭天祥师傅书上的串口打印应用实例,涉及串口通讯,数码管实时显示。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #include<stdio.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. sbit dula=P2^6;
  7. sbit wela=P2^7;
  8. sbit adwr=P3^6;
  9. sbit adrd=P3^7;
  10. sbit CSAD=P2^5;
  11. uchar flag, a;
  12. uchar flag_uart, flag_time, flag_on, a, i, t0_num, ad_val;
  13. float ad_vo;
  14. uchar code table[]={0x3f, 0x06, 0x5b, 0x4f,
  15.                                                                                 0x66, 0x6d, 0x7d, 0x07,
  16.                                                                                 0x7f, 0x6f, 0x77, 0x7c,
  17.                                                                                 0x39, 0x5e, 0x79, 0x71};
  18. void delayms(uint xms)
  19. {
  20.         uint i, j;
  21.         for(i=xms; i>0; i--)
  22.                 for(j=110; j>0; j--);
  23. }

  24. void init()
  25. {
  26.         TMOD=0x21;
  27.         TH0=(65536-50000)/256;
  28.         TL0=(65536-50000)%256;
  29.         TH1=0xfd;
  30.         TL1=0xfd;
  31.         TR1=1;
  32.         ET0=1;
  33.         SM0=0;
  34.         SM1=1;
  35.         REN=1;
  36.         EA=1;
  37.         ES=1;
  38.         CSAD=0;
  39. }

  40. void display(uchar value)
  41. {
  42.         uchar bai, shi, ge;
  43.         bai=value/100;
  44.         shi=value%100/10;
  45.         ge=value%10;
  46.        
  47.         dula=1;
  48.         P0=table[bai];
  49.         dula=0;
  50.         P0=0xff;
  51.         wela=1;
  52.         P0=0x7e;
  53.         wela=0;
  54.         delayms(5);
  55.         P0=0xff;
  56.         wela=1;
  57.         wela=0;
  58.         dula=1;
  59.         P0=table[shi];
  60.         dula=0;
  61.         P0=0xff;
  62.         wela=1;
  63.         P0=0x7d;
  64.         wela=0;
  65.         delayms(5);
  66.         P0=0xff;
  67.         wela=1;
  68.         wela=0;
  69.         dula=1;
  70.         P0=table[ge];
  71.         dula=0;
  72.         P0=0xff;
  73.         wela=1;
  74.         P0=0x7b;
  75.         wela=0;
  76.         delayms(5);
  77.         P0=0xff;
  78.         wela=1;
  79.         wela=0;
  80. }

  81. uchar get_ad()
  82. {
  83.         uchar adval;
  84.         adwr=1;
  85.         _nop_();
  86.         adwr=0;
  87.         _nop_();
  88.         adwr=1;
  89.         P1=0xff;
  90.         adrd=1;
  91.         _nop_();
  92.         adrd=0;
  93.         _nop_();
  94.         adval=P1;
  95.         adrd=1;
  96.         return adval;
  97. }

  98. void main()
  99. {
  100.         init();
  101.         wela=1;
  102.         P0=0x7f;
  103.         wela=0;
  104.         while(1)
  105.         {
  106.                 if(flag_uart==1)
  107.                 {
  108.                         flag_uart=0;
  109.                         ES=0;
  110.                         TI=1;
  111.                         switch(flag_on)
  112.                         {
  113.                                 case 0: puts("Turn on ad!\n");
  114.                                                                 TR0=1;
  115.                                                                 break;
  116.                                 case 1: printf("Turn off ad!\n");
  117.                                                                 TR0=0;
  118.                                                                 break;
  119.                                 case 2: puts("Error!\n");
  120.                                                                 break;
  121.                         }
  122.                         while(!TI);
  123.                         TI=0;
  124.                         ES=1;
  125.                 }
  126.                 if(flag_time==1)
  127.                 {
  128.                         flag_time=0;
  129.                         ad_val=get_ad();
  130.                         ad_vo=(float)ad_val*5.0/256.0;
  131.                         ES=0;
  132.                         TI=1;
  133.                         printf("The voltage is %fv\n", ad_vo);
  134.                         while(!TI);
  135.                         TI=0;
  136.                         ES=1;
  137.                 }
  138.                 display(ad_val);
  139.         }
  140. }

  141. void timer0() interrupt 1
  142. {
  143.         TH0=(65536-50000)/256;
  144.         TL0=(65536-50000)%256;
  145. ……………………

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

所有资料51hei提供下载:
新建文件夹.rar (204.63 KB, 下载次数: 35)


评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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