首页 > 程序 > 51单片机第三天
作者:ghostry 发布时间:2016-07-29 浏览: 6632
转载注明出处: 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单片机第四天
您好,请问您的VHC 文件是自己编写的还是 软件自带的? 最近在做学校的项目, 想找到或写出 蜂鸣器的VHC文件
软件带的。