‘壹’ 求深度解析单片机c语言中的下列程序(部分),我实在看不懂。能不能帮我一句句解释一下
P1=0xff;这个是让P1口的八个灯全灭。
for(j=0;j<3;j++)//灯一盏盏从上往下亮
{
for(x=0;x<8;x++)控制第几个灯亮的;
{
P1>>=1;右移一位第一灯亮了,依次亮
delayxms(500);每个灯亮的时间,延迟函数
if(P1==0x00)如果第八个灯亮了 后;就要重新赋予P1口的值;
{
P1=0xff;P1口从新赋值;
for(x=0;x<8;x++)这个语句和上面的类似,就是顺序反过来了,他是从第八个灯开始亮的;
{
P1<<=1;左移一位第一灯亮了,依次亮
delayxms(500);延迟函数
}
}
}
}大概就是这样了 不明白在问我
‘贰’ 51单片机的c语言程序每一条语句的具体意思,老师考察。
最简单的流水灯设计,这里得有个假设,P1.7是一个状态开关,接通时接地线低电平,断开时浮空
之P2的8个位接8个led灯,低电平时灯亮,高电平时灯熄灭,假设delay(1)是延时等待1毫秒,
程序依开关状态,向左流水或向右流水,节奏是400毫秒每次
对于开关的变化程序响应比较迟顿,每8*400毫秒检查一次开关状态,最长可能是8*400=3.2秒后才正确响应,
...哪句不懂问哪句,每句都解释那就是对牛弹琴了
‘叁’ 一个完整的单片机c语言程序包含哪几个部分
个人觉得,一个完整C程序至少应该包含头文件、初始化、主程序四个部分,头文件是程序编译预处理的重要组成部分,缺了它就无法生成目标代码;初始化部分包含变量初始化和端口初始化;主程序是一个C程序的核心代码,由此执行或调用一些具有特定功能的函数模块以完成程序的预设功能。
‘肆’ 请高手介绍单片机C语言的程序
#include<reg51.h>
unsigned char code
dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位码
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40}; //段码
unsigned char dispbuf[8]={0,0,0,0,0,0,10,10}; //显示缓冲区
unsigned char temp[8];
unsigned char dispcount;
unsigned char T0count;//计数器0的计数变量,每秒清零一次
unsigned char timecount;
bit flag;
unsigned long x;
void main(void)
{
unsigned char i;
TMOD=0X15; //定时器0工作在计数器状态,定时器1工作在16位定时状态
TH0=0; //设置初始值
TL0=0;
TH1=(65536-4000)/256; //计数周期为4000,如果晶振为12M,那么定时器1的中断周期为4ms,
TL1=(65536-4000)%256; //将初始值送入TH与TL
TR0=1; //打开计数使能
TR1=1;
ET0=1; //开计数器中断
ET1=1;
EA=1; //开总中断
while(1)
{
if(flag==1) //这个if语句中的标志变量在定时器1的ISR中改变,也就是说每4ms这个if语句的内容执行一次
{flag=0; //标志位清零
x=T0count*65536+TH0*256+TL0;//计算出总的计数周期,比较重要的一句
//以下的循环只干一件事,那就是将长整型变量转换为一个整型数组,每位用一个数字表示,至于算法很简单
//例如x为123456,那么temp[0]=6,temp[1]=5,……temp[5]=1;
for(i=0;i<8;i++)
{
temp[i]=0;}
i=0;
while(x/10)
{temp[i]=x%10; //x%10就是x的个位
x=x/10;
i++;
}
temp[i]=x;/此句有问题,将long类型变量传递给char型会溢出,只保留低8位??
for(i=0;i<6;i++)
{dispbuf[i]=temp[i];}
timecount=0;
T0count=0;
TH0=0;
TL0=0;
TR0=1;
}
}
}
void t0(void) interrupt 1 using 0 //计数器0的中断服务程序
{T0count++;} //计数值加一
void t1(void) interrupt 3 using 0 //定时器1的中断服务程序
{TH1=(65536-4000)/256; //计数周期为4000,如果晶振为12M,那么定时器1的中断周期为4ms,这行除256的意思就是取高8位
TL1=(65536-4000)%256; //取低8位
timecount++;
if(timecount==250)// 这个变量为一个计数变量,当其为250时,时间为250*4ms=1S(见上面的注释)
{TR0=0; //禁止计数器0计数
timecount=0; //清零
flag=1;
}
//以下为七段数码管的动态扫描程序,如果你熟悉数码管的动态扫描,应该会明白
//如果没接触过,那我也。。。主要该段与硬件比较密切
P0=dispcode[dispbuf[dispcount]];
P2=dispbit[dispcount];
dispcount++;
if(dispcount==8)//逐位扫描,当扫描到最后一位则从第一位开始
{dispcount=0;
}
}
由于嵌入式系统软硬件结合紧密,定时器0为什么工作在计数状态,谁给的计数信号,数码管共阴还是共阳等都需要硬件电路才能分析清楚,其实读单片机的程序最重要的是作者的思路,有时候单看其中每句都明白意思(本意),但就是看不出作者要干什么,这就是我给的注释不太详细但都给出了思路和作用的缘故。。。
不是高手,只是有一点研究,希望你能看明白
‘伍’ 请解释下单片机中的C语言程序
在你include的头文件里肯定有ADDO的定义,一定是个输入端口,dat|=ADDO代表
dat=dat|ADDO;之后dat<<=1就是dat=dat<<1,左移1位,i==7就是最后1位的时候又采样1次。
‘陆’ 单片机(c语言)程序解释
/********
//P1.0波形为:
//1、10ms为周期的方波或持续的高、低电平(与Flag、P1.0初始值有关),持续2秒。
//2、持续的高、低电平或10ms为周期的方波(与Flag、P1.0初始值有关),持续2秒。
//3、重复1、2步骤。
*********/
#include <AT89X51.H>
unsigned int t02s;
unsigned char t05ms;
bit flag;
void main(void)
{
TMOD=0x01; //初始化定时器。
//可以对照单片机PDF相应章节,按位对比。
//此处设置定时器0工作于“16 位定时器/ 计数器,TL0、TH0 全用”模式。
TH0=(65536-500)/256; //初始化定时/计数器高字节。
TL0=(65536-500)%256; //初始化。。。。。。低字节。
TR0=1; //启动定时器0。
//以下两句开启定时器中断,缺一不可。
ET0=1; //允许定时器0中断。
EA=1; //开启全局中断。
while(1); //循环,整个程序交由定时中断控制。
}
//此处为定时器中断子程序,每次定时器溢出,进入此段程序。
//根据参数定义,每5ms中断一次。
//定时器中断后,计数不停止,但是需要重新初始化定时/计数器。
void t0(void) interrupt 1 using 0
{
//重新“初始化定时/计数器”高、低字节。
TH0=(65536-500)/256;
TL0=(65536-500)%256;
//每次中断,t02s 加 1。
t02s++;
//增加400次后(5ms × 400 = 2s),flag标志取反。
if(t02s==400)
{
t02s=0;
flag=~flag;
}
//若中断时flag标志为0,P1.0口取反。
if(flag==0)
{
P1_0=~P1_0;
}
}
‘柒’ 求一段51单片机按键C语言程序详解
P1.0、P1.1都控制 LED
试试下面程序:
#include <reg51.h>
sbit led = P1^0;
sbit key = P1^7;
void main()
{
while(1) led = key;
}
P1.1知道用
‘捌’ 单片机c语言语程序解释
程序运行时应该会先执行这一句:在这里赋值。
else
{
val-=5;
P0=val; //通过P0口给DA数据口赋值
if(val==0)
{
flag=0;
beep=0;
delayms(100);
beep=1;
}
delayms(50);
}
‘玖’ 单片机C语言程序,看不懂,求讲解
“T0中断服务程序不是一个子程序吗?但没看见在主程序中调用这个子程序啊,求讲解这个程序命令的运行过程,定时器怎么中断的?”
该子程序是在硬件产生中断的时候,跳转到相应中断入口后,再跳转到这个中断服务程序的。请注意函数后面的“interrupt x”声明,这是C51的扩展内容。
“用示波器测波形是测p1.0引脚,为什么是这个引脚,怎么确定的?p1_0不是个变量名吗?”
P1_0这个符号在前面的头文件 t89c51cc02.h 中有定义。至于“为什么是这个引脚”,是由硬件设计及本程序共同确定的。P1_0(不是你写的p1_0,C语言要区分大小写哦)代表P1口的第0管脚,在头文件中通过sbit定义。
“为什么T0中断服务程序和主程序中都有T0的初值,设置还是一样,他们有什么关系?”
主程序前面的是对Timer0初始化,赋以初值。执行 TR0 = 1; 这一句以后,Timer0就开始运行了——TL0与TH0组成的13位计数器开始不断递增。当13位全部为1之后,再递增就全部为0,此时溢出事件会触发产生定时器0,同时计数器仍然在继续计数——为了让时间间隔保持一致,就需要再度将计数器赋以初值。
‘拾’ 单片机的C语言程序,就讲解,我没看懂这是个什么意思
uchar keyscan(void) //键盘扫描函数,使用行列反转扫描法
{
uchar cord_h,cord_l; //定义行、列值变量
P2=0x0f; //行输出全为0
cord_h=P2&0x0f; //读入列值
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(100); //去抖
if(cord_h!=0x0f)
{
cord_h=P2&0x0f; //读入列值
P2=cord_h|0xf0; //输出当前列值
cord_l=P2&0xf0; //读入行值
return(cord_h+cord_l);//键盘最后组合码值
}
}
}