(七)单片机控制两路数据采集系统 这里要学习中断

自己修改电路图和代码,结果调试不成功?不知道为什么????

电路图如下:  127   247  移动滑动变阻器没有软用???

错误代码:

  1 #include<reg52.h>
  2 #define uchar8 unsigned char
  3 #define uint16 unsigned int
  4 sbit CLOCK = P2^0;
  5 sbit START = P2^1;
  6 sbit EOC   = P2^3;   // A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)
  7 sbit OE    = P2^2;   // 数据输出允许信号,输入,高电平有效。 当A/D转换结束时,此端输入一个高电平,输出数字量
  8
  9 sbit wei1  = P3^1;
 10 sbit wei2  = P3^2;
 11 sbit wei3  = P3^3;
 12
 13 sbit wei4  = P3^5;
 14 sbit wei5  = P3^6;
 15 sbit wei6  = P3^7;
 16
 17
 18 uchar8 code dulatab[]={  0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F }   ; // 0----9
 19 uchar8 code welatab[]={  0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf,0x7f };  // 数码管位控码
 20
 21
 22 /*****************************/
 23 // 函数名称: DelayMS( )
 24 // 函数功能: 延时
 25 // 入口函数: 延时毫秒
 26 // 出口函数: 无
 27 /*************************                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              *******************/
 28 void delay(uint16 val)
 29 {
 30        uint16  i,j;
 31        for( i=0;i<val;i++)
 32            for(j=0;j<113;j++);
 33
 34 }
 35
 36
 37 void init( )   // 初始化
 38 {
 39      P2=0xff;
 40      EA = 1;
 41      TMOD = 0x02 ;
 42      TH0=216;
 43      TL0=216;
 44      TR0=1;
 45      ET0=1;
 46
 47      START=0;
 48      OE=0;
 49      P2=0x30;        // 这里仿真 EOC 出现短路
 50 }
 51
 52
 53 void write1(uchar8 num)
 54 {
 55
 56    uchar8  i,j,k;
 57    k=num/100;
 58    j=num%100/10;
 59    i=num%10;
 60
 61    P3=0xff;
 62    P0=dulatab[k];
 63    wei4=0;
 64    delay(4);
 65
 66    P3=0xff;
 67    P0=dulatab[j];
 68    wei5=0;
 69    delay(4);
 70
 71    P3=0xff;
 72    P0=dulatab[i];
 73    wei6=0;
 74    delay(4);
 75
 76 }
 77
 78 void write0(uchar8 num)
 79 {
 80
 81    uchar8  i,j,k;
 82    k=num/100;
 83    j=num%100/10;
 84    i=num%10;
 85
 86    P3=0xff;
 87    P0=dulatab[k];
 88    wei1=0;
 89    delay(4);
 90
 91    P3=0xff;
 92    P0=dulatab[j];
 93    wei2=0;
 94    delay(4);
 95
 96    P3=0xff;
 97    P0=dulatab[i];
 98    wei3=0;
 99    delay(4);
100
101 }
102
103
104 uchar8 adin0()
105 {
106     uchar8 value;
107     OE = 0;        // 数据先不允许输出
108     EOC = 1;    //
109     START = 0;
110     P2&=0x8f;    // 1000 1111 位与 保持 低四位不变(即 OE EOC START CLOCK )
111
112     P2|=0x30;   //   使得 C B A     为 1 1 0 ,那么 也就是 选择 IN3通道
113     delay(10);
114
115     START=1;   // 上升沿 使得 0809 复位
116     delay(10);
117     START=0;   //  下降沿 ,启动 AD 转换
118
119     while(!EOC); // EOC = =0 ,为什么省去了 CLOCK; WHY ?????
120     //   while(1)
121     //  {
122     //            CLOCK = ! CLOCK ; if( EOC == 1)  break ;   // 等待转换结束,跳出循环
123     //  }
124
125     delay(10);
126     OE = 1;           //   当A/D转换结束时,此端输入一个高电平,输出数字量。OE=0,关闭输出,不准输出到单片机
127     delay(1);
128
129     value=P3;
130     OE=0;           // OE=0,关闭输出,不准输出到单片机
131     return value;
132
133 }
134
135 uchar8 adin1()
136 {
137     uchar8 value;
138     OE = 0;        // 数据先不允许输出
139     EOC = 1;    //
140     START = 0;
141     P2&=0x8f;    // 1000 1111 位与 保持 低四位不变(即 OE EOC START CLOCK )
142
143     P2|=0x00;   //   使得 C B A     为 1 1 0 ,那么 也就是 选择 IN3通道
144     delay(10);
145
146     START=1;   // 上升沿 使得 0809 复位
147     delay(10);
148     START=0;   //  下降沿 ,启动 AD 转换
149
150     while(!EOC); // EOC = =0 ,为什么省去了 CLOCK; WHY ?????
151     //   while(1)
152     //  {
153     //            CLOCK = ! CLOCK ; if( EOC == 1)  break ;   // 等待转换结束,跳出循环
154     //  }
155
156     delay(10);
157     OE = 1;           //   当A/D转换结束时,此端输入一个高电平,输出数字量。OE=0,关闭输出,不准输出到单片机
158     delay(1);
159
160     value=P3;
161     OE=0;           // OE=0,关闭输出,不准输出到单片机
162     return value;
163
164 }
165
166
167 void main()
168 {
169    uchar8 in0,in1;
170    init();
171    while(1)
172    {
173      in0 = adin0();
174      write0(in0);
175
176      in1 = adin1();
177      write1(in1);
178
179    }
180 }
181
182 void timer0 ( void )  interrupt 1
183 {
184      CLOCK = ~ CLOCK ;
185
186 }

不知道为什么,也不清楚究竟哪里出错了????

还是按照书上的过一遍看看???

实验图:

相关代码:

  1 #include<reg52.h>
  2 #define uchar8 unsigned char
  3 #define uint16 unsigned int
  4 sbit CLOCK = P1^3;
  5 sbit START = P1^2;
  6 sbit EOC   = P1^1;   // A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)
  7 sbit OE    = P1^0;   // 数据输出允许信号,输入,高电平有效。 当A/D转换结束时,此端输入一个高电平,输出数字量
  8
  9 sbit wei1  = P2^1;
 10 sbit wei2  = P2^2;
 11 sbit wei3  = P2^3;
 12
 13 sbit wei4  = P2^5;
 14 sbit wei5  = P2^6;
 15 sbit wei6  = P2^7;
 16
 17
 18 uchar8 code dulatab[]={  0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F }   ; // 0----9
 19 uchar8 code welatab[]={  0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf,0x7f };  // 数码管位控码
 20
 21
 22 /*****************************/
 23 // 函数名称: DelayMS( )
 24 // 函数功能: 延时
 25 // 入口函数: 延时毫秒
 26 // 出口函数: 无
 27 /*************************                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              *******************/
 28 void delay(uint16 val)
 29 {
 30        uint16  i,j;
 31        for( i=0;i<val;i++)
 32            for(j=0;j<113;j++);
 33
 34 }
 35
 36
 37 void init( )   // 初始化
 38 {
 39      P2=0xff;
 40      EA = 1;
 41      TMOD = 0x02 ;
 42      TH0=216;
 43      TL0=216;
 44      TR0=1;
 45      ET0=1;
 46
 47      START=0;
 48      OE=0;
 49      P1=0x30;        //
 50 }
 51
 52
 53 void write1(uchar8 num)
 54 {
 55
 56    uchar8  i,j,k;
 57    k=num/100;
 58    j=num%100/10;
 59    i=num%10;
 60
 61    P2=0xff;
 62    P0=dulatab[k];
 63    wei4=0;
 64    delay(4);
 65
 66    P2=0xff;
 67    P0=dulatab[j];
 68    wei5=0;
 69    delay(4);
 70
 71    P2=0xff;
 72    P0=dulatab[i];
 73    wei6=0;
 74    delay(4);
 75
 76 }
 77
 78 void write0(uchar8 num)
 79 {
 80
 81    uchar8  i,j,k;
 82    k=num/100;
 83    j=num%100/10;
 84    i=num%10;
 85
 86    P2=0xff;
 87    P0=dulatab[k];
 88    wei1=0;
 89    delay(4);
 90
 91    P2=0xff;
 92    P0=dulatab[j];
 93    wei2=0;
 94    delay(4);
 95
 96    P2=0xff;
 97    P0=dulatab[i];
 98    wei3=0;
 99    delay(4);
100
101 }
102
103
104 uchar8 adin0()
105 {
106     uchar8 value;
107     OE = 0;        // 数据先不允许输出
108     EOC = 1;    //
109     START = 0;
110     P1&=0x8f;    // 1000 1111 位与 保持 低四位不变(即 OE EOC START CLOCK )
111
112     P1|=0x30;   //   使得 C B A     为 1 1 0 ,那么 也就是 选择 IN3通道
113     delay(10);
114
115     START=1;   // 上升沿 使得 0809 复位
116     delay(10);
117     START=0;   //  下降沿 ,启动 AD 转换
118
119     while(!EOC); // EOC = =0 ,为什么省去了 CLOCK; WHY ?????
120     //   while(1)
121     //  {
122     //            CLOCK = ! CLOCK ; if( EOC == 1)  break ;   // 等待转换结束,跳出循环
123     //  }
124
125     delay(10);
126     OE = 1;           //   当A/D转换结束时,此端输入一个高电平,输出数字量。OE=0,关闭输出,不准输出到单片机
127     delay(1);
128
129     value=P3;
130     OE=0;           // OE=0,关闭输出,不准输出到单片机
131     return value;
132
133 }
134
135 uchar8 adin1()
136 {
137     uchar8 value;
138     OE = 0;        // 数据先不允许输出
139     EOC = 1;    //
140     START = 0;
141     P1&=0x8f;    // 1000 1111 位与 保持 低四位不变(即 OE EOC START CLOCK )
142
143     P1|=0x00;   //   使得 C B A     为 1 1 0 ,那么 也就是 选择 IN3通道
144     delay(10);
145
146     START=1;   // 上升沿 使得 0809 复位
147     delay(10);
148     START=0;   //  下降沿 ,启动 AD 转换
149
150     while(!EOC); // EOC = =0 ,为什么省去了 CLOCK; WHY ?????
151     //   while(1)
152     //  {
153     //            CLOCK = ! CLOCK ; if( EOC == 1)  break ;   // 等待转换结束,跳出循环
154     //  }
155
156     delay(10);
157     OE = 1;           //   当A/D转换结束时,此端输入一个高电平,输出数字量。OE=0,关闭输出,不准输出到单片机
158     delay(1);
159
160     value=P3;
161     OE=0;           // OE=0,关闭输出,不准输出到单片机
162     return value;
163
164 }
165
166
167 void main()
168 {
169    uchar8 in0,in1;
170    init();
171    while(1)
172    {
173      in0 = adin0();
174      write0(in0);
175
176      in1 = adin1();
177      write1(in1);
178
179    }
180 }
181
182 void timer0 ( void )  interrupt 1
183 {
184      CLOCK = ~ CLOCK ;
185
186 }

实验证明可以的,

总结: 数字不对的原因是   P0 八位端口 对应的  ADC0808 的 OUT1——OUT8接线不要搞反了就可以了??

至于程序还是要仔细,来回看看

时间: 2024-08-03 10:13:10

(七)单片机控制两路数据采集系统 这里要学习中断的相关文章

控制两个等交替慢慢变亮,慢慢变暗【占空比】

/* 工程创建MCU选取,Atmel 89C55 单片机:STC12C4052AD,STC12C5A60S2 都可以 晶振:12M 功能:控制两个等交替慢慢变亮,慢慢变暗[占空比] 连接说明:LED1正极串接1K 电阻接VCC,负极接到 MCU的P1.7        :LED2正极串接1K 电阻接VCC,负极接到 MCU的P1.6 */ #include <REG51.h> sbit LED1 = P1 ^ 6; sbit LED2 = P1 ^ 7; void DELAY_MS (unsi

[TM4C123单片机实战] 两路ADC检测,短路报警

如果最终得到的数据是两路数据的差值, 我们可以采用ADC的 Difference 工作模式 #include <stdbool.h> #include <stdint.h> #include "inc/hw_memmap.h" #include "driverlib/adc.h" #include "driverlib/gpio.h" #include "driverlib/pin_map.h" #in

单个滚动条控制两个CEDIT功能

有时候需要实现单个滚动条控制两个CEDIT功能,控制中间的滚动条左右能同时翻动, 如下图 实现方法大致如下 创建两个EDIT控件,都带滚动条,但是右侧的要隐藏 void CAlignSentenceView::OnInitialUpdate() { CView::OnInitialUpdate(); CRect rect; GetClientRect(&rect); // TODO: 在此添加专用代码和/或调用基类 m_etCH.Create(WS_CHILD | WS_VISIBLE | WS

怎么用一个显示器来显示和控制两台主机

要实现用一套键盘鼠标显示器来控制两台主机,方法很简单,只需要一个小型的设备来帮助——两个端口的KVM切换器.两个端口的KVM切换器.KA1302 是一个2口线控USB KVM切换器,使用者可将主装置放于桌面下,通过按键Scroll-Lock或通过其外接一个切换按键保留于桌面,即可简单且快速地切换电脑. 工具/原料 一个两口KVM切换器KA1302 一条按键线 在开始安装前,请确认你将连接的所有设备的电源已关闭为避免安装过程造成设备损坏,请先确认所要连接的设备均已适当接地. 将键盘.显示器和鼠标连

是否吞噬触摸点需要控制两个地方

转自:http://blog.csdn.net/wcjwdq/article/details/38901607 是否吞噬触摸点需要控制两个地方: 1)CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, kCCMenuHandlerPriority - 99, true); 当上面语句中的第三个参数为false时,该层不会吞噬触摸点,并且不受后面2)的影响: 当上面语句中的第三个参数为true

JQuery控制两个Div高度一致

<script type="text/javascript"> $(function(){ if($("#left").height() > $("#right").height()){ $("#right").css("height",$("#left").height()); }else{ $("#left").css("height&

Js:消息弹出框、获取时间区间、时间格式、easyui datebox 自定义校验、表单数据转化json、控制两个日期不能只填一个

(function ($) { $.messageBox = function (message) { $.messager.show({ title:'消息框提示', msg:message, showType:'show' }); }; /** * 获取时间区间 * @param type 1:当年的一月一日到现在:type 2:获取当月的第一天和最后一天 * return {startTime:xxxx,endTime:xxxx} */ $.getTimeInterval = functi

题目七:用两个栈实现队列

//////////////////////////////////////////////////////////////////////////////////// // 10.题目七:用两个栈实现队列 // 题目:用两个栈实现一个队列,队列的声明如下: template <typename TYPE> class CQueue { public: CQueue(){} ~CQueue(){} void AppendTail(const TYPE& node); TYPE Dele

51单片机控制的收音机(带串口,遥控,芯片89S52+LC72131+LA1845N)

本方案采用89S52做为主控芯片,LC72131+LA1845N做为收音模块,支持按键控制,红外线遥控控制,也可通过串口上位机控制,可以通过计算机并口更新单片机软件程序. 音量用两块DS1804控制,频率信息用一块1602液晶显示. 单面板,飞线很多,呵呵. 硬件方案.rar(Protel99) PC端控制软件.rar(VC++7.1,即Visual Stdio .Net 2003) 本方案的单片机软件使用C语言编写(Keil uVision3),LC72131芯片的驱动稍微麻烦,他使用SPI总