亲们~~~紧急求解答~~~~51单片机跑表设计之程序翻译,有能解释的亲加我扣扣1058038072吧。

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-07-01
怎么用C语言编写51单片机测脉宽的程序~ 跪求完整程序!

#include

#define uint unsigned int
uint width;
sbit pulse=P3^2;
main()
{
TMOD=0x09; //定时器0模式1,GATE=1
TH0=0;
TL0=0;
while(pulse); //等待P3.2变低
TR0=1; //启动定时器0
while(!pulse); //等待脉冲变高
while(pulse); //等待脉冲变低
TR0=0; //关闭定时器0
pulse=TH0*256+TL0; //取定时值。
while(1);
}

;将内部RAM中41H~43H单元中的数左移4位,移出部分送到40H单元。

;先准备数据:
MOV 40H, #0
MOV 41H, #34H
MOV 42H, #56H
MOV 43H, #78H

;40H 41H 42H 43H
; 00 34 56 78

MOV R1, #40H
MOV R0, #43H

MOV A, @R0 ;取数.
SWAP A ;高低四位交换.
XCHD A, @R1 ;暂存"高"四位.
MOV @R0, A ;存放.

DEC R0 ;42H

MOV A, @R0 ;取数.
SWAP A ;高低四位交换.
XCHD A, @R1 ;暂存"高"四位.
MOV @R0, A ;存放.

DEC R0 ;41H

MOV A, @R0 ;取数.
SWAP A ;高低四位交换.
XCHD A, @R1 ;暂存"高"四位.
MOV @R0, A ;存放.

;本程序也可编写成循环结构.

SJMP $

END

;程序执行完后,数字分布如下:

;40H 41H 42H 43H
; 03 45 67 80

#include<reg51.h> //1通用51单片机头文件
#define uchar unsigned char //2宏定义,意思是把系统的变量声明关键字换个名字
#define uint unsigned int //3同上
sbit key1=P1^0;
sbit key2=P1^1;
uint second=0; //4利用更名后的关键字来声明一个变量并赋值
uchar count=0,i=0; //5同上
uchar code tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //6一维数组,即数码管编码
uchar code tbb[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //7同上,编码是16进制数
void delay(uchar z) //自定义的延时函数
{
uchar x,y; //变量声明
for(x=z;x>0;x--) //for循环语句
for(y=110;y>0;y--); //嵌套for,目的是起到延时作用
}
void display(uint second) //自定义的数码管显示函数,接收一个数值类型的数值
{
uchar a,b,c; //变量声明
a=second%1000/100; //对接收到的数值数据进行分解?
b=second%100/10; //就是分解出个位,十位,百位和千位的数值
c=second%10; //
P3=0xfe; P2=tab[0]; //数码管端口赋值,用于点亮对应的数码管段位
delay(2); //延时点亮一会
P3=0xfd; P2=tab[a]; //改变点亮的数码管段位状态
delay(2); //下面类推
P3=0xfb; P2=tbb[b]; //
delay(2);
P3=0xf7; P2=tab[c]; //
delay(2);
}
void keyscan() //自定义的按键函数
{
if(!key1) //如果这个按键被按下
{
delay(10); //延时一会,消除按键的抖动
if(!key1) //再次判断按键状态
{
i++; //如果是有效的按键按下,则执行相关命令
if(i==2)
i=0;
}
while(!key1); //while死循环,直到按键被松开,起到一次只接收一次按键
}
if(i==0) //
EA=0; //如果i等于0,就打开总中断
if(i==1) //
EA=1; //如果i等于1,就关闭总中断
if(key2==0) //
{
delay(10); //
if(key2==0) //
second=0; //
EA=0; //
while(!key2); //
}
}
void main() //主函数
{
EA=1; //关闭总中断
ET0=1; //关闭定时器 0 的中断
TMOD=0x01; //定时器工作方式设定
TR0=1; //关闭定时器运行
TH0=(65536-50000)/256; //定时器0高四位赋值
TL0=(65536-50000)%256; //定时器低四位赋值
while(1) //主循环
{
keyscan(); //调用自定义的按键函数
display(second); //调用自定义的数码管显示函数
}
}
void timer0() interrupt 1 //定时器中断函数
{
TH0=(65536-50000)/256; //定时器0高四位赋值
TL0=(65536-50000)%256; //定时器低四位赋值
count++; //下面几句就不给你翻译了,很简单的
if(count==2) //
{ //这就是一个利用定时器改变数码管显示的程序
count=0; //
second++; //
if(second==10000) //
second=0; //
}
}

有原理图吗

我可以写的



需要解释的是有编号的那些吗? //2 //3?

#include<reg51.h> //1包含头文件reg51.h
#define uchar unsigned char //2 定义常量 uchar代表unsigned char
#define uint unsigned int //3 定义常量 uint代表unsigned int
sbit key1=P1^0;
sbit key2=P1^1;
uint second=0; //4 定义秒为0
uchar count=0,i=0; //5 定义中断次数变量count=0
uchar code tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //6 定义数码管显示0-9的代码
uchar code tbb[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //7定义位选
void delay(uchar z) //延时程序
{
uchar x,y; //
for(x=z;x>0;x--) //
for(y=110;y>0;y--); //
}
void display(uint second) //显示程序
{
uchar a,b,c; //
a=second%1000/100; /显示百位
b=second%100/10; //显示十位
c=second%10; //显示个位
P3=0xfe; P2=tab[0]; //
delay(2);
P3=0xfd; P2=tab[a]; //
delay(2);
P3=0xfb; P2=tbb[b]; //
delay(2);
P3=0xf7; P2=tab[c]; //
delay(2);
}
void keyscan() //按键扫描
{
if(!key1) //如果按键按下去
{
delay(10);
if(!key1)
{
i++;
if(i==2)
i=0;
}
while(!key1); //等待按键释放
}
if(i==0) // 如果i=0
EA=0; //禁止中断
if(i==1) //i=1
EA=1; //开中断
if(key2==0) //key2按键近下
{
delay(10); //消除抖动
if(key2==0) //如果key2按按下
second=0; //秒等于0
EA=0; //禁止中断
while(!key2); //等待key2释放
}
}
void main() //主函数
{
EA=1; //开中断
ET0=1; //开定时器T0中断
TMOD=0x01; //设定定时时器工作方式
TR0=1; //启动定时器
TH0=(65536-50000)/256; //定时器初始值 定时50000us
TL0=(65536-50000)%256; //
while(1) //
{
keyscan(); //调用按键扫描程序
display(second); //调用显示程序
}
}
void timer0() interrupt 1 //中断程序
{
TH0=(65536-50000)/256; //重新赋初始值
TL0=(65536-50000)%256; //
count++; //中断次数加1
if(count==2) //如果等于2
{
count=0; //重新赋值0
second++; //秒加1
if(second==10000) //如果等于1000秒
second=0; //秒再清0
}
}

已经加你 同意就可以 为你解答

  • 亲们~~~紧急求解答~~~51单片机跑表设计之程序翻译,有能解释的亲加我扣 ...
    答:include<reg51.h> //1通用51单片机头文件 define uchar unsigned char //2宏定义,意思是把系统的变量声明关键字换个名字 define uint unsigned int //3同上 sbit key1=P1^0;sbit key2=P1^1;uint second=0; //4利用更名后的关键字来声明一个变量并赋值 uchar count=0,i=0; ...
  • 亲们,求解答。要过程哦!
    答:解:(1)这个公式为(a+b)^2=a^2+2ab+b^2;证明:由图可知大正方形被分成了一个小正方形和两个长方形,大正方形的面积=(a+b)^2,两个长方形的面积=(a+b)b+ab,小正方形的面积=a^2,那么大正方形的面积=(a+b)b+ab+a^2=(a+b)^2=a^2+2ab+b^2.(2)
  • 亲们,求解答。谢谢!
    答:先把鸡带到河的对岸,然后再把米带到河的对岸再顺便把鸡带回来,然后最后把狗带到河的对岸回来的时候再把鸡带去。
  • 亲们,求解答,该填什么单词。谢谢啦!
    答:回答:As they
  • 亲们,急用啊!求详细解答过程!
    答:解:由于齿顶圆da = d + 2ha 分度圆 d = mz 齿顶高ha = ha*m 由于大齿轮为标准齿轮ha* = 1,z1 = 52,da = 135 所以 da = d + 2ha = mz1 + 2ha*m = 54m 即 m = 2.5 由于中心距a = ( z1 + z2 )m/2 即 112.5 = ( 52 + z2 ) × 2.5 / 2 得 z2 ...
  • 亲们,求解答?急急急!
    答:回答:(1)?=4 (2)?=8 (3)?=3 (4)?=9
  • 求解答 亲们,,, 解答
    答:(1)证明:①当k=0时,方程是一元一次方程,有实数根;②当k≠0时,方程是一元二次方程,∵△=(3k-1)2-4k×2(k-1)=(k+1)2≥0,∴无论k为何实数,方程总有实数根.(2)∵此方程有两个实数根x1,x2,∴x1+x2= (3k-1)k ,x1x2= 2(k-1)k ,∵|x1-x2|=2,∴(...
  • 亲们,求解答
    答:解;A、B两点的最短距离为河宽,即为480m,他实际游的距离为√(480×480)+(200×200)=520m,希望可以帮到你,请及时采纳
  • 求解答亲们~~
    答:求解答亲们~~ 1个回答 #话题# 打工人必看的职场『维权』指南!杰大的土拨鼠 2014-01-26 · TA获得超过347个赞 知道小有建树答主 回答量:659 采纳率:61% 帮助的人:165万 我也去答题访问个人页 关注 展开全部 追答 有个错了 第四个 useful 本回答由提问者推荐 已赞过 已踩过< 你对...
  • 亲们 求解答。定给好评。八年级的。求大神。
    答:1,设第一批每件进价x元,依题意得方程4500÷x=4950÷(x+9),解之得x=90,且经检验得x=90为方程的解,答:略