找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于单片机AD转换 按一个按键,发送模拟量到pc机 求帮助

[复制链接]
跳转到指定楼层
楼主
按一个按键,发送模拟量到pc机
仿真,我做了好久也没做出来,程序有问题 求帮助
  1. /*  名称:单片机与PC通信
  2.     说明:单片机可接收PC发送的数字字符,
  3.     按下单片机的K1键后,单片机可向PC发送字符串。
  4.     在Proteus环境下完成本实验时,需要安装Virtual Serial Port Driver和串口调试助手。
  5.     本例缓冲100个数字字符,缓冲满后新数字从前面开始存放(环形缓冲)。
  6. */
  7. #include <stc15.h>
  8. #include <intrins.h>
  9. #define uint unsigned int
  10. #define uchar unsigned char
  11. uint adc_dat = 0;
  12. uchar code DSY_CODE[] =
  13. {
  14.     0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x00
  15. };

  16. //延时
  17. void Delay10MS(uchar n)     //@11.0592MHz
  18. {
  19.     uchar i, j;
  20.     while (n--)
  21.     {
  22.         i = 108;
  23.         j = 145;
  24.         do
  25.         {
  26.             while (--j);
  27.         }
  28.         while (--i);
  29.     }
  30. }

  31. void UartInit(void)     //9600bps@11.0592MHz
  32. {
  33.     SCON = 0x0;        //8位数据,可变波特率,允许接收
  34.     AUXR &= 0xBF;       //定时器1时钟为Fosc/12,即12T
  35.     AUXR &= 0xFE;       //串口1选择定时器1为波特率发生器
  36.     TMOD &= 0x0F;       //设定定时器1为16位自动重装方式
  37.     TL1 = 0xE8;     //设定定时初值
  38.     TH1 = 0xFF;     //设定定时初值
  39.     ET1 = 0;        //禁止定时器1中断
  40.     TI = RI = 0;
  41.           TR1  = 1;       //启动定时器1
  42. }

  43. void main()
  44. {
  45.     unsigned long  i;                 //i用于for循环
  46.     CLK_DIV &= 0xDF; //ADRJ=0
  47.     ADC_CONTR |= 0x80;     //开A/D转换电源
  48.     for (i = 0; i < 10000; i++); //适当延时
  49.     P1ASF = 0x01;                  //设置P1.1的模拟量功能
  50.     ADC_CONTR = 0xE1;    //选择P1.1作为A/D转换通道
  51.     for (i = 0; i < 10000; i++); //适当延时
  52.     ADC_CONTR |= 0x08;    //启动 A/D 转换
  53.     EADC = 1;                        //EADC=1, 开放ADC的中断控制位
  54.     UartInit();
  55.                 IE0 = 0;
  56.     EX0  = 1;
  57.                 IT0  = 1;
  58.     ES   = 1;
  59.     EA = 1;                  //开放CPU总中断
  60.     while (1)
  61.     {
  62.         //循环等待ADC中断
  63.     }
  64. }
  65. void Serial_INT() interrupt 4
  66. {
  67.           if(TI)
  68.     TI = 0;
  69.                 IE0 = 0;
  70.     EX0  = 1;
  71.     ES = 1;
  72. }
  73. void EX_INT0() interrupt 0
  74. {
  75.           SBUF = adc_dat ;
  76.                 IE0 = 0;
  77.     EX0  = 0;
  78. }
  79. void ADC_ISR(void) interrupt 5        // ADC中断函数
  80. {
  81.     ADC_CONTR &= 0xE7;        //将ADC_FLAG清0
  82.     adc_dat = ADC_RES * 4 + ADC_RESL;
  83.     ADC_CONTR = 0xE1;    //11100010B, P1.1为A/D通道
  84.     ADC_CONTR |= 0x08;           //重新启动A/D转换
  85. }
复制代码


code.zip

183.39 KB, 下载次数: 4

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

使用道具 举报

沙发
ID:768939 发表于 2020-6-8 17:10 | 只看该作者
#include<reg51.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit ST=P2^0;   sbit OE=P2^2;   sbit ALE=P2^3;   sbit EOC=P2^1;   sbit CLK=P2^4;   long int datas,bai,she,ge; uchar duan; uchar code num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};    uchar code num_dot[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed};      uchar code wei[]={0x0d,0x0b,0x07};       void delay(uint z) {  uchar i;  while(z--)  for(i=0;i<120;i++); } void display() {  uchar i=0;  bai=(datas*500/255)/100;  she=(datas*500/255)/10 % 10;  ge=(datas*500/255) % 10;  for(i=0;i<3;i++)      {   P3=wei[i];   if(i==0){duan=num_dot[bai];}      else if(i==1){duan=num[she];}   else if(i==2){duan=num[ge];}   P0=duan;   delay(2);  }  } void main() {  TMOD=0x02;        TH0=0x216;            TL0=0x216;     EA=1;       ET0=1;    TR0=1;       while(1)  {  ST=OE=0;      ALE=1;            ST=1;            ALE=0;  ST=0;  while(!EOC);    OE=1;            datas=P1;         display();     } } void inter_1() interrupt 1 {  CLK=~CLK; }
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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