找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3480|回复: 13
打印 上一主题 下一主题
收起左侧

单片机汇编程序编写 求大神

[复制链接]
跳转到指定楼层
楼主
ID:188604 发表于 2017-4-11 20:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1)用P1.0控制发光二极管LED0,使其以0.5s的周期闪烁;
2)用P1.1控制发光二极管LED1,使其以1.5s的周期闪烁;
3)用P2口控制发光二极管LED2——LED7,每个LED亮 1s,做跑马灯。
要求程序中使用定时计数器和中断。


求大神帮忙 谢谢

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:111634 发表于 2017-4-11 22:12 | 只看该作者
《80C51单片机实用教程——基于Keil C和Proteus》高等教育出版社ISBN 978-7-04-044532-9, 用于学习51单片机原理,双解c和汇编程序
回复

使用道具 举报

板凳
ID:187614 发表于 2017-4-12 07:27 | 只看该作者
自己动手吧,否则永远学不好,用汇编写两三个程序,什么都清楚了
回复

使用道具 举报

地板
ID:188604 发表于 2017-4-12 17:40 | 只看该作者
51Lovers 发表于 2017-4-12 07:27
自己动手吧,否则永远学不好,用汇编写两三个程序,什么都清楚了

会分开写第一个和第二个  不会第三个 也不会一起写 能不能帮帮忙
  谢谢
回复

使用道具 举报

5#
ID:47286 发表于 2017-4-12 20:23 | 只看该作者
sbit led0=P1^0;                //定义led0
sbit led1=P1^1;                //定义led1
sbit ledg=P2;                //定义led组 ledg=led group

uchar num50a=0,num50b=0,num50c=0;        //3个50ms计数变量

void led_ctrl()                //灯控
{
        if(num50a==10)        //如果 计数器50a值为10 500ms
        {
                num50a=0;                //计数器50a清零
                led0=~led0;                //led0取反
        }

        if(num50b==30)        //如果 计数器50b值为30 1500ms 1.5s
        {
                num50b=0;                //计数器50b清零
                led1=~led1;                //led1取反
        }

        if(num50c==20)        //如果 计数器50c值为20 1000ms 1s
        {
                num50c=0;                //计数器50c清零

                if(P2==0x80)        //如果 P2值为0x80 1000 0000
                {
                        P2=0x04;                //赋值 P2值为0x04 0000 0100
                }

                P2<<1;                        //P2值左移1位
        }
}

void Server_Time0() interrupt 1        //计时器服务程序
{
        TH0 = xx;        //重装定时初值 50ms
        TL0 = xx;        //重装定时初值 50ms
       
        num50a++;        //50ms计数器a自加
        num50b++;        //50ms计数器b自加
        nun50c++;                //50ms计数器c自加
}

void main()
{
        init_time();        //初始化计时器 没写 这个是最基本的函数了

        led0=1;                        //开led0
        led1=1;                        //开led1
        p2=0x04;                        //开led2

        while(1)
        {
                led_ctrl();        //调用 led控制函数
        }
}
回复

使用道具 举报

6#
ID:47286 发表于 2017-4-12 20:30 | 只看该作者
dzbj 发表于 2017-4-12 20:23
sbit led0=P1^0;                //定义led0
sbit led1=P1^1;                //定义led1
sbit ledg=P2;                //定义led组 ledg=led group
...

补充 用P2和用ledg是一样的 写乱了 下班回来挺累 写东西不专心 凑合看吧
回复

使用道具 举报

7#
ID:188604 发表于 2017-4-12 20:32 | 只看该作者
有没有汇编语言呀 刚开始学 不太会
回复

使用道具 举报

8#
ID:111634 发表于 2017-4-12 20:49 | 只看该作者
不是已经给你介绍了那本《80C51单片机实用教程——基于Keil C和Proteus》,是双解c和汇编程序,你的问题上面都有,是最简单最基础的,去图书馆或书店翻翻看吧,不会让你失望的!
回复

使用道具 举报

9#
ID:111634 发表于 2017-4-12 20:50 | 只看该作者
Cvilan 发表于 2017-4-12 20:32
有没有汇编语言呀 刚开始学 不太会

不是已经给你介绍了那本《80C51单片机实用教程——基于Keil C和Proteus》,是双解c和汇编程序,你的问题上面都有,是最简单最基础的,去图书馆或书店翻翻看吧,不会让你失望的!
回复

使用道具 举报

10#
ID:188604 发表于 2017-4-12 21:07 | 只看该作者
zl2168 发表于 2017-4-12 20:50
不是已经给你介绍了那本《80C51单片机实用教程——基于Keil C和Proteus》,是双解c和汇编程序,你的问题 ...

是最近要做这个实验了  但是书还没买到  不能先教一下么?
回复

使用道具 举报

11#
ID:188604 发表于 2017-4-12 21:13 | 只看该作者
dzbj 发表于 2017-4-12 20:23
sbit led0=P1^0;                //定义led0
sbit led1=P1^1;                //定义led1
sbit ledg=P2;                //定义led组 ledg=led group
...

有没有汇编语言的呢?
回复

使用道具 举报

12#
ID:188246 发表于 2017-4-13 13:13 来自手机 | 只看该作者
Cvilan 发表于 2017-4-12 17:40
会分开写第一个和第二个  不会第三个 也不会一起写 能不能帮帮忙
  谢谢

我给一个我的思路,第一,第二段你都能自己写了,第三断段,指令里有一个位移指令,可以直接实现跑马灯,0.5秒的延时可以用中断完成。中断里可以对累加器A分别赋值,用来记录1秒和1.5秒的延时标志,也可以在中断外完成这个操作。
回复

使用道具 举报

13#
ID:155507 发表于 2017-4-13 19:48 | 只看该作者
  1. /*
  2. 1)用P1.0控制发光二极管LED0,使其以0.5s的周期闪烁;
  3. 2)用P1.1控制发光二极管LED1,使其以1.5s的周期闪烁;
  4. 3)用P2口控制发光二极管LED2——LED7,每个LED亮 1s,做跑马灯。
  5. 要求程序中使用定时计数器和中断。

  6. */

  7. #include<reg52.h>
  8. #define uchar unsigned char
  9. #define uint unsigned int

  10. sbit led0=P1^0;       //定义led0
  11. sbit led1=P1^1;       //定义led1
  12. sbit ledg=P2;         //定义led组 ledg=led group

  13. uchar num50a=0,num50b=0,num50c=0;        //3个50ms计数变量

  14. void led_ctrl()                //灯控
  15. {
  16.         if(num50a==10)        //如果 计数器50a值为10 500ms
  17.         {
  18.                 num50a=0;           //计数器50a清零
  19.                 led0=~led0;         //led0取反
  20.         }

  21.         if(num50b==30)        //如果 计数器50b值为30 1500ms 1.5s
  22.         {
  23.                 num50b=0;                //计数器50b清零
  24.                 led1=~led1;                //led1取反
  25.         }

  26.         if(num50c==20)        //如果 计数器50c值为20 1000ms 1s
  27.         {
  28.                 num50c=0;           //计数器50c清零

  29.                 if(P2==0x80)        //如果 P2值为0x80 1000 0000
  30.                 {
  31.                         P2=0x04;          //赋值 P2值为0x04 0000 0100
  32.                 }

  33.                 P2<<=1;             //P2值左移1位
  34.         }
  35. }

  36. init_time()
  37. {
  38.         TMOD = 0x01; //打开定时器0,并设定其工作方式为16位定时模式。
  39.         TH0=(65536-50000)/ 256;
  40.         TL0=(65536-50000)% 256;   //设定定时器的初值,使得没10ms中断一次
  41.         EA = 1;   //允许总中断
  42.         ET0 = 1;   //允许定时器0终端
  43.         TR0 = 1;  //启动定时器0
  44. }

  45. void Server_Time0() interrupt 1  //计时器服务程序
  46. {
  47.         TH0 = (65536-50000)/ 256;   //重装定时初值 50ms
  48.         TL0 = (65536-50000)% 256;   //设定定时器的初值,使得没50ms中断一次  //重装定时初值 50ms
  49.        
  50.         num50a++;        //50ms计数器a自加
  51.         num50b++;        //50ms计数器b自加
  52.         num50c++;        //50ms计数器c自加
  53. }

  54. void main()
  55. {
  56.         init_time();        //初始化计时器 没写 这个是最基本的函数了

  57.         led0=1;             //开led0
  58.         led1=1;             //开led1
  59.         P2=0x04;            //开led2

  60.         while(1)
  61.         {
  62.                 led_ctrl();        //调用 led控制函数
  63.         }
  64. }


复制代码





  1. led0 BIT P1.0                ;定义led0
  2. led1 BIT P1.1                ;定义led1

  3. ORG 00H
  4. JMP START
  5. ORG 0BH
  6. JMP TIM0
  7. led_ctrl:
  8.                 ; FUNCTION led_ctrl (BEGIN)
  9.                 MOV     A,R5
  10.                 CJNE    A,#0AH,LC0001 ;如果 计数器50a值为10 500ms
  11.                 CLR     A                                ;计数器50a清零
  12.                 MOV     R5,A
  13.                 CPL     led0                        ;led0取反
  14. LC0001:
  15.                 MOV     A,R6
  16.                 CJNE    A,#01EH,LC0002 ;如果 计数器50b值为30 1500ms 1.5s
  17.                 CLR     A                                ;计数器50b清零
  18.                 MOV     R6,A
  19.                 CPL     led1                        ;led1取反
  20. LC0002:
  21.                 MOV     A,R7                ;如果 计数器50c值为20 1000ms 1s
  22.                 CJNE    A,#014H,LC0005
  23.                 CLR     A                                ;计数器50c清零
  24.                 MOV     R7,A
  25.                 MOV     A,P2                        ;
  26.                 CJNE    A,#080H,LC0004        ;如果 P2值为0x80 1000 0000
  27.                 MOV     P2,#04H                        ;赋值 P2值为0x04 0000 0100
  28. LC0004:
  29.                 MOV     A,P2                        ; P2值左移1位
  30.                 ADD     A,ACC                        ;
  31.                 MOV     P2,A                        ;
  32. LC0005:
  33.                 RET     
  34.                 ; FUNCTION led_ctrl (END)
  35. init_time:
  36.                 ; FUNCTION init_time (BEGIN)
  37.                 MOV     TMOD,#01H                ;打开定时器0,并设定其工作方式为16位定时模式。
  38.                 MOV     TH0,#03CH                ;(65536-50000)/ 256 设定定时器的初值,使得没50ms中断一次
  39.                 MOV     TL0,#0B0H                ;(65536-50000)% 256
  40.                 SETB    EA                                ;允许总中断
  41.                 SETB    ET0                                ;允许定时器0终端
  42.                 SETB    TR0                                ;启动定时器0
  43.                 RET     
  44.                 ; FUNCTION init_time (END)
  45. TIM0:
  46.                 ; FUNCTION Server_Time0 (BEGIN)
  47.                 MOV     TH0,#03CH                ;重装定时初值 50ms
  48.                 MOV     TL0,#0B0H                ;重装定时初值 50ms
  49.                 INC     R5                        ;50ms计数器a自加
  50.                 INC     R6                        ;50ms计数器b自加
  51.                 INC     R7                        ;50ms计数器c自加
  52.                 RETI   
  53.                 ; FUNCTION Server_Time0 (END)
  54. START:
  55.                 ; FUNCTION main (BEGIN)
  56.                 LCALL   init_time                 ;初始化计时器 这个是最基本的函数了
  57.                 SETB    led0                        ;开led0
  58.                 SETB    led1                        ;开led1
  59.                 MOV     P2,#04H                        ;开led2
  60. LC0008:
  61.                 LCALL   led_ctrl                ;调用 led控制函数
  62.                 SJMP    LC0008
  63.                 ; FUNCTION main (END)


  64. end


复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表