首页 > 程序 > 51单片机第三天

作者:ghostry 发布时间:2016-07-29 浏览: 652

转载注明出处: https://blog.ghostry.cn/program/719.html

今天找到了mcu8051ide的使用方法。

其实就是语法稍有不同。大部分情况是mcu8051ide比keil的关键字多了两个下划线,原因是sdcc的版本已经升级不再支持老版本语法。根据这个说法,keil应该是比较老的软件。
比如keil里写interrupt而sdcc新版写作__interrupt
sdcc的新版中断要求必须先声明。
找到办法以后写了一个复用数码管控制程序。用到了中断,计时器/计数器
代码如下

#include <at89x51.h>
#define uchar unsigned char
#define uint unsigned int
__code uchar  table[]={0b11000000,0b11111001,0b10100100,0b10110000,};
uint num,time1;
void timer0(void) __interrupt 1 ;
void main(){
    EA=1;//开总中断
    TMOD=0x01;//设置定时器0工作模式为1
    TH0=(65536-100)/256;//高位初值
    TL0=(65536-100)%256;//低位初值
    ET0=1;//开定时器
    TR0=1;//启动定时器0
    
    num=0;
    P0=0;
    P1=table[num];//初始显示0
while(1){
    if(time1==8){
        num++;
        if(num>3)
            num=0;
        P1=table[num];
        time1=0;
    }
}
}
void timer0(void) __interrupt 1 {
    TH0=(65536-100)/256;//高位初值
    TL0=(65536-100)%256;//低位初值
    time1++;
}

我在虚拟单片机里用的,开了虚拟硬件
vhc文件如下

# MCU 8051 IDE: Virtual HW component configuration file
# Project: g_1
# Component: Multiplexed LED Display

MultiplexedLedDisplay {{0 1 1 1 2 1 3 1 4 1 T0 0 5 1 T1 0 6 1 T2 0 7 1 T3 0} {0 7 1 6 2 5 3 4 4 3 T0 7 5 2 T1 6 6 1 T2 5 7 0 T3 4} {} {} red 50 1 0}

因为他这个虚拟单片机模拟运行速度超慢,现实过1秒,他才过100多微秒。所以我写的计时器初值非常大。如果写入单片机运行要根据单片机的频率计算(65536-(频率/12/20))=50ms的初值然后循环20次可以得到1秒,要注意初值不能是负的,如果是负的,就不要取50ms而取一个更小的值。

运行就可以看到四个数码管同时在0,1,2,3之间轮转。我比较懒,只写了4个数的码表。而且写的二进制没转成16进制。O(∩_∩)O哈哈~

然后又写了数码管动态扫描,不过由于虚拟设备速度很慢,看着就像流水灯了。。。

#include <at89x51.h>
#define uchar unsigned char
#define uint unsigned int
__code uchar  table[]={0b11000000,0b11111001,0b10100100,0b10110000,};
uchar wei[]={0b11111111,0b11110111,0b11111011,0b11111101,0b11111110};
uint num,time1,weinum,tmp;
void timer0(void) __interrupt 1 ;
void main(){
    EA=1;//开总中断
    TMOD=0x01;//设置定时器0工作模式为1
    TH0=(65536-100)/256;//高位初值
    TL0=(65536-100)%256;//低位初值
    ET0=1;//开定时器
    TR0=1;//启动定时器0
    
    P0=wei[weinum];//初始都不亮
while(1){
    if(time1==8){
        num++;
        if(num>4)
            num=0;
        time1=0;
    }
    weinum++;//位置改变
            P0=wei[weinum];
    switch(weinum){
        case 1:
            if(num>=1) {
                P1=table[num-1];
            }else{
                P1=0xff;//不亮
            }break;
        case 2:
            if(num>=2) {
                P1=table[num-2];
            }else{
                P1=0xff;
            }break;
        case 3:
            if(num>=3) {
                P1=table[num-3];
            }else{
                P1=0xff;
            }break;
        case 4:
            if(num>=4) {
                P1=table[num-4];
            }else{
                P1=0xff;
            }break;
    }
    if(weinum>4)weinum=0;
}
}
void timer0(void) __interrupt 1 {
    TH0=(65536-100)/256;//高位初值
    TL0=(65536-100)%256;//低位初值
    time1++;
}

标签: 51单片机

上一篇: 51单片机第二天
下一篇: 51单片机第四天

添加新评论 »

*
*

欢迎评论!歡迎評論!Comments welcome!komentoj bonvenaj!댓글 오신 것을 환영합니다!
:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: :cold: :cryy: :cute: :shy: :sleep: :struggle: :tea: :yahou: