- 255倒计时器的需求是,有s28(单刀开关),s29(按钮)两个控制构件,要求是s28低电位时,进入预设模式,有滑动电阻器输入电压,利用adc0808模数转换,得到数字量,然后在8位数码管最左3位动态显示出来,s28高电位时,8位数码管上最左边3位显示预设值,最右边3位显示实时倒计时值,按下s29(1下开始,2下暂停)开始倒计时,每一秒-1,减到0,则使蜂鸣器响30秒,然后8位数码管最右边重新显示预设值,等待下一次倒计时。
- 自己写的时候遇到的问题是,adc0809无法读取到数据,始终显示为0。
- 我想知道如何使用地址读取adc0809,就像汇编里面的 mov dptr,#XXXX movx @dptr,a 两条指令利用地址实现读取adc0809。
- 因为实验箱硬件限制问题,只能按照如下接线图写程序,如果按照一般的分别设置eoc st oe这样使用adc0809比较麻烦,由下图可知,而且这样尝试的时候遇到了奇怪的bug,数码管异常,只显示最后一位。
- 下面是接线图以及c语言程序。(不知道为什么文字编写框,背景色变成墨绿的加上黑字很难看,虽然不规范,为了清晰就用代码框了)
复制代码
- #include <REGX51.H>
- #include <absacc.h>
- #define uchar unsigned char
- #define unit unsigned int
- #define iocon XBYTE[0x8003]
- #define PA XBYTE[0x8000]
- #define PB XBYTE[0x8001]
- #define AD XBYTE[0x9000]
- sbit eoc=P1^0;
- sbit biz=P1^1;
- sbit s28=P1^2;
- sbit s29=P3^2;
- sbit wr=P3^6;
- sbit rd=P3^7;
- uchar code wei[]={0x7f,0xbf,0xdf,0xfb,0xfd,0xfe};
- uchar code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- uchar zhi[6];
- uchar x;
- void delay(uchar x)
- {
- uchar a,b ;
- for (a=x;a>0;a--)
- for (b=1000000;b>0;b--);
- }
- void show(uchar x)
- {
- uchar i,j;
- for(i=0;i<x;i++)
- { PB=wei[i];
- j=zhi[i];
- PA=duan[j];
- }
- }
- void ext0() interrupt 0
- {
- static int u=1;
- u=~u;
- if (u==0)
- {
- while(x)
- {
- x--;
- zhi[3]=x/100;
- zhi[4]=(x%100)/10;
- zhi[5]=x%10;
- show(6);
- delay(1);
- }
- biz=0;
- delay(30);
- biz=1;
- zhi[3]=zhi[0];
- zhi[4]=zhi[1];
- zhi[5]=zhi[2];
- }
- }
- void main()
- {
- iocon=0x80;
- EA=1;
- EX0=1;
- IT0=1;
- P0=0xff;
- while(1)
- {
- if (s28==0)
- {
- x=AD; //就是这里有问题
- zhi[0]=zhi[3]=x/100;
- zhi[1]=zhi[4]=(x%100)/10;
- zhi[2]=zhi[5]=x%10;
- show(3);
- }
- else
- {
- show(6);
- }
- }
-
- }
复制代码
end.zip
(58.66 KB, 下载次数: 1)
|