#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit clock=P1^0;
sbit d_in=P1^1;
sbit d_out=P1^2;
sbit _cs=P1^3;
uchar a1,b1,c1,d1;
float sum,sum1;
double sum_final1;
double sum_final;
uchar duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar wei[]={0xf7,0xfb,0xfd,0xfe};
void delay(unsigned char b) //50us
{
unsigned char a;
for(;b>0;b--)
for(a=22;a>0;a--);
}
void display(uchar a,uchar b,uchar c,uchard)
{
P0=duan[a]|0x80;
P2=wei[0];
delay(5);
P2=0xff;
P0=duan[b];
P2=wei[1];
delay(5);
P2=0xff;
P0=duan[c];
P2=wei[2];
delay(5);
P2=0xff;
P0=duan[d];
P2=wei[3];
delay(5);
P2=0xff;
}
uint read(uchar port)
{
uchar i,al=0,ah=0;
unsignedlong ad;
clock=0;
_cs=0;
port<<=4;
for(i=0;i<4;i++)
{
d_in=port&0x80;
clock=1;
clock=0;
port<<=1;
}
d_in=0;
for(i=0;i<8;i++)
{
clock=1;
clock=0;
}
_cs=1;
delay(5);
_cs=0;
for(i=0;i<4;i++)
{
clock=1;
ah<<=1;
if(d_out)ah|=0x01;
clock=0;
}
for(i=0;i<8;i++)
{
clock=1;
al<<=1;
if(d_out)al|=0x01;
clock=0;
}
_cs=1;
ad=(uint)ah;
ad<<=8;
ad|=al;
return(ad);
}
void main()
{
ucharj;
sum=0;sum1=0;
sum_final=0;
sum_final1=0;
while(1)
{
for(j=0;j<128;j++)
{
sum1+=read(1);
display(a1,b1,c1,d1);
}
sum=sum1/128;
sum1=0;
sum_final1=(sum/4095)*5;
sum_final=sum_final1*1000;
a1=(int)sum_final/1000;
b1=(int)sum_final%1000/100;
c1=(int)sum_final%1000%100/10;
d1=(int)sum_final%10;
display(a1,b1,c1,d1);
}
各位单片机高手,哪位帮我分析一下下面这个程序,问题出在哪儿?谢谢
回答:首先给你解释一下“<<”位移符的作用: 因为你的P1=0xfe,二进制数据就是11111110,左移一位之后为11111100,0往左移了一位,但是最低位系统自动以0补齐,而0x7f的二进制数据位01111111,所以if语句是永远进入不了的。 当然,针对此问题,C51给出了一个解决方案: 使用_crol_()函数可解决此问题...
求单片机高手帮忙详细解释下程序 特别是中断那
这应该是一个闪烁灯的程序,定时器以方式2自动重装的方式工作,定时器到时产生一次中断就将记数字段减一,等到计数字段减到0就改变一次LED灯的状态,这基实就是一个延时的过程。总的来讲就是定时器每100us就产生一次中断,而每次中断就将计数字段减一,因此计数字段应该设为10000,这样就是产生10000次...
求单片机高手解释这段记分牌编程的意思
这跟后面的运算有关系 SUBB A,#01H ADD A,COUNT DA A MOV COUNT,A SHYING1: CPL P3.7 同上 NOP NOP NOP JNB P3.3,SHYING1 RETI END QQ896949676 这程序设计的计算方式有点繁琐,不怎么好
单片机高手帮我看看这个世上只有妈妈好的音乐程序,解释两句话。
\/\/每一组,第一个是音阶,就是 do ri mi fa ..., 第二个数字,1:低音,2中音,3高音,第三个,表示拍数,3即3拍,等等 code unsigned char sszymmh[]={ 6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1,6,2,4, 3,2,2, 5,2,1, 6,2,...
请各位高手回答一下下面的单片机程序问题!谢谢!
即2μs 该段程序执行该类指令总次数=250x200x10=500000 耗用时间 = 500000x2μs = 10^6μs =1s 若改为延时0.1 第三行指令改为 LOOP1: MOV R1, #01 若改为延时0.5s, 第三行指令改为 LOOP1: MOV R3, #05 若改为延时2s, 第三行指令改为 LOOP1: MOV R1, #20 ...
请高手帮逐行解释下这段程序意思和最后实现功能
这是单片机程序 新定义数据类型uint8,该数据类型等同于unsinged char typedef unsigned char uint8;定义功能位s1,该位指向P1口的0位,即P1.0 sbit s1 =P1^0;利用定时器驱动蜂鸣器声响 baojing()根据s3,s1输入的状态,输出到P1^2 zs()
跪求,单片机程序注释
AJMP READ 跳转到READ段 END 程序结束 这个程序是一个读取UART接收的程序,接收到的数据能过P1端口输出。这两个程序一个是通过UART发送按键键值,一个是接收UART数据,并通过P1端口输出。建议直接学习C语言,没有这些跳转指令学习起来会十分轻松!
请高手帮我解读一下单片机程序段(1),搞了一天没搞明白,急!
flag1; \/\/定义了一个结构体变量flag1。void out_time(void){ if(flag1.time_1s==1)\/\/如果结构体变量的成员变量time_1s为1则执行 { flag1.time_1s=0; \/\/就是清除一个标志 if(flag1.run_flag==1) \/\/后面的都是变量标志的处理。{ if(step_cont>=8){ step_cont=0;} if(step_...
下述单片机程序有个警告,该如何去掉,请教高手解释一下。
在编写单片机程序时,如果遇到警告提示函数没有返回值,这通常意味着所调用的函数在定义时并未指定返回类型。对于这个问题,解决方法较为直接,即在函数定义中添加返回类型。针对您提到的函数 changedata(uchar *song,uchar *diao,uchar *jie),只需修改为 void changedata(uchar *song,uchar *diao,uchar...
最近刚学PIC单片机,有个程序看不懂,请高手帮下,越详细越好:
4:重点来了 INCF INDF,让INDF自加1。前面说了对INDF操作其实就是对FSR所指向的单元操作,也就等同于 INCF <20h>(真正程序里不能这么写的,因为<20h>这杨写法是错误的) 类似C与语言中的<20h>++ 5:FSR自加1,FSR内部的值等于21h所以FSR指向了<21h>这个内存单元。6:<20h>单元的数值高4...