对于此程序,请哪位高手帮帮小弟注释一下,感激不尽!!(回答后另有加分)
#include<reg51.h>
#include<absacc.h>
#define dac0832 XBYTE[0x7fff]
unsigned char code shu[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
float s;
sbit ALE=P3^0;
sbit START=P3^1;
sbit EOC=P3^2;
sbit OE=P3^3;
sbit SHCP=P2^0;
sbit DS=P2^1;
sbit STCP=P2^2;
sbit P11=P3^5;
sbit P12=P3^7;
sbit clk=P2^6;
unsigned char j,k,m,n,i,a;
unsigned int b;
void delay(unsigned char t)
{ while(t--);
}
void display()
{
j=0x01;
for(i=0;i<8;i++)
{ if((shu[m]&j)==0)
{ DS=0;}
else {DS=1;}
SHCP=1;
SHCP=0;
j<<=1;
}
P12=0;
P11=1;
STCP=0;
STCP=1;
delay(200);
j=0x01;
for(i=0;i<8;i++)
{ if((shu[n]&j)==0)
{ DS=0;}
else {DS=1;}
SHCP=1;
SHCP=0;
j<<=1;
}
P11=0;
P12=1;
STCP=0;
STCP=1;
delay(200);
}
void main()
{
P2=0x87;
TMOD=0x20;
TH1=0x06;
TL1=0x06;
EA=1;
ET1=1;
TR1=1;
while(1)
{
ALE=1;
ALE=0;
START=1;
START=0;
while(EOC==0);
OE=1;
k=P1;
a=P1;
b=a*6;
m=b/1000;
n=b%1000/100;
dac0832=k;
display();
}
}
void time() interrupt 3
{
clk=!clk;
因为我是新手,希望高手可以多注释些,如果全部注释,答案正确,本人愿意再奉送50(我一共就一百多分,要是多的话, 愿送更多)!!!
求C51单片机程序的注释,(数控直流稳压电源的设计)
答案:4 悬赏:50 手机版
解决时间 2021-03-02 22:48
- 提问者网友:我是我
- 2021-03-01 21:54
最佳答案
- 五星知识达人网友:青尢
- 2021-03-01 23:18
本人估计,你是用proteus仿真做的吧,因为DAC0832的工作脉冲你是靠IO口取反来实现的,以下是我对程序的注释,由于你没给出原理图,有不合理之处在所难勉.
有些地方我认为没必要说的就不细说,不明再问
#include<reg51.h>
#include<absacc.h> //头文件,可使用其中定义的宏来访问绝对地址
#define dac0832 XBYTE[0x7fff] //DAC位置定义,跟据实际原理图而定
unsigned char code shu[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管码值表
float s;
sbit ALE=P3^0; //DAC0832 ALE脚工作脉冲位定义
sbit START=P3^1; //DAC0832 START位定义
sbit EOC=P3^2; //转换结束标志位
sbit OE=P3^3; //输出允许位
sbit SHCP=P2^0; //数码管驱动芯片(如595)位定义
sbit DS=P2^1; //同上
sbit STCP=P2^2; //同上
sbit P11=P3^5;
sbit P12=P3^7;
sbit clk=P2^6; //DAC0832 工作脉冲
unsigned char j,k,m,n,i,a;
unsigned int b;
void delay(unsigned char t)
{ while(t--);
}
void display() //静态数码管的显示
{
j=0x01;
for(i=0;i<8;i++)
{ if((shu[m]&j)==0)
{ DS=0;}
else {DS=1;}
SHCP=1;
SHCP=0;
j<<=1;
}
P12=0;
P11=1;
STCP=0;
STCP=1;
delay(200);
j=0x01;
for(i=0;i<8;i++)
{ if((shu[n]&j)==0)
{ DS=0;}
else {DS=1;}
SHCP=1;
SHCP=0;
j<<=1;
}
P11=0;
P12=1;
STCP=0;
STCP=1;
delay(200);
}
void main()
{
P2=0x87;
/////////定时器1初始化////////////////
TMOD=0x20;
TH1=0x06;
TL1=0x06;
EA=1;
ET1=1;
TR1=1;
while(1)
{
//DAC0832地址锁存脉冲
ALE=1;
ALE=0;
//DAC0832 开始转换脉冲
START=1;
START=0;
while(EOC==0); //等待转换完毕
OE=1; //开始读
k=P1; //读数据
a=P1; //读数据
b=a*6;
m=b/1000; //取千位数
n=b%1000/100; //取百位数
dac0832=k;
display(); //数码管显示
}
}
void time() interrupt 3 //DAC0932脉冲
{
clk=!clk; //位取反
有些地方我认为没必要说的就不细说,不明再问
#include<reg51.h>
#include<absacc.h> //头文件,可使用其中定义的宏来访问绝对地址
#define dac0832 XBYTE[0x7fff] //DAC位置定义,跟据实际原理图而定
unsigned char code shu[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管码值表
float s;
sbit ALE=P3^0; //DAC0832 ALE脚工作脉冲位定义
sbit START=P3^1; //DAC0832 START位定义
sbit EOC=P3^2; //转换结束标志位
sbit OE=P3^3; //输出允许位
sbit SHCP=P2^0; //数码管驱动芯片(如595)位定义
sbit DS=P2^1; //同上
sbit STCP=P2^2; //同上
sbit P11=P3^5;
sbit P12=P3^7;
sbit clk=P2^6; //DAC0832 工作脉冲
unsigned char j,k,m,n,i,a;
unsigned int b;
void delay(unsigned char t)
{ while(t--);
}
void display() //静态数码管的显示
{
j=0x01;
for(i=0;i<8;i++)
{ if((shu[m]&j)==0)
{ DS=0;}
else {DS=1;}
SHCP=1;
SHCP=0;
j<<=1;
}
P12=0;
P11=1;
STCP=0;
STCP=1;
delay(200);
j=0x01;
for(i=0;i<8;i++)
{ if((shu[n]&j)==0)
{ DS=0;}
else {DS=1;}
SHCP=1;
SHCP=0;
j<<=1;
}
P11=0;
P12=1;
STCP=0;
STCP=1;
delay(200);
}
void main()
{
P2=0x87;
/////////定时器1初始化////////////////
TMOD=0x20;
TH1=0x06;
TL1=0x06;
EA=1;
ET1=1;
TR1=1;
while(1)
{
//DAC0832地址锁存脉冲
ALE=1;
ALE=0;
//DAC0832 开始转换脉冲
START=1;
START=0;
while(EOC==0); //等待转换完毕
OE=1; //开始读
k=P1; //读数据
a=P1; //读数据
b=a*6;
m=b/1000; //取千位数
n=b%1000/100; //取百位数
dac0832=k;
display(); //数码管显示
}
}
void time() interrupt 3 //DAC0932脉冲
{
clk=!clk; //位取反
全部回答
- 1楼网友:平生事
- 2021-03-02 00:29
//程序和硬件是密切相关的,不同的硬件结构,其软件是完全不一样的,由于不了解该系统的硬件结构,只能从字面上猜测着解释了,希望对你有用。
#include<reg51.h>
#include<absacc.h>
#define dac0832 XBYTE[0x7fff]
unsigned char code shu[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管译码数组
float s;
sbit ALE=P3^0;//硬件接口定义,后面类同
sbit START=P3^1;
sbit EOC=P3^2;
sbit OE=P3^3;
sbit SHCP=P2^0;
sbit DS=P2^1;
sbit STCP=P2^2;
sbit P11=P3^5;
sbit P12=P3^7;
sbit clk=P2^6;
unsigned char j,k,m,n,i,a;
unsigned int b;
void delay(unsigned char t)
{ while(t--);
}
void display()//用串转接口芯片驱动数码管
{
j=0x01;//通过串行方式发送一个字节
for(i=0;i<8;i++)
{ if((shu[m]&j)==0)//发送数字m的段码,准备显示数字m
{ DS=0;}
else {DS=1;}
SHCP=1;
SHCP=0;
j<<=1;
}
P12=0;//接通对应数码管电源,显示数字m
P11=1;
STCP=0;
STCP=1;
delay(200);//延时显示
j=0x01;//和前面类似,显示数字n
for(i=0;i<8;i++)
{ if((shu[n]&j)==0)
{ DS=0;}
else {DS=1;}
SHCP=1;
SHCP=0;
j<<=1;
}
P11=0;
P12=1;
STCP=0;
STCP=1;
delay(200);
}
void main()
{
P2=0x87;
TMOD=0x20;//初始化定时器,以便产生时钟信号clk
TH1=0x06;
TL1=0x06;
EA=1;
ET1=1;
TR1=1;
while(1)
{
ALE=1;
ALE=0;
START=1;//启动AD转换
START=0;
while(EOC==0);//等待AD转换结束
OE=1;
k=P1;//读取转换结果
a=P1;
b=a*6;//标度变换
m=b/1000;//计算出千位m,百位n
n=b%1000/100;
dac0832=k;//向外部地址空间输出数据
display();
}
}
void time() interrupt 3
{
clk=!clk;
- 2楼网友:舍身薄凉客
- 2021-03-01 23:54
display()函数是串行口转并行口芯片驱动7段LED数码管显示
应该是74164或74595等芯片
DAC0832就不用解释了,只要硬件连接正常就行啦
输出就只要写 dac0832=k; k取值在0-255之间
- 3楼网友:一叶十三刺
- 2021-03-01 23:45
display()函数是串行口转并行口芯片驱动7段LED数码管显示
应该是74164或74595等芯片
DAC0832就不用解释了,只要硬件连接正常就行啦
输出就只要写 dac0832=k; k取值在0-255之间
再看看别人怎么说的。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯