‘壹’ c51单片机是什么
单片机,是典型的嵌入式微控制器,一般用在工业控制上,现在用的c51大都是AT89c51.
‘贰’ 求单片机C51代码
用两个变量来控制就可以了,一个PWM控制占空比,一个T控制频率。
一个计数变量cnt来计数。
cnt<PWM 输出高电平
cnt>=PWM && cnt<T 输出低电平。
用按键来调节PWM和T就可以改变占空比和频率。
‘叁’ C51单片机分类
你的提问是C51单片机的分类,就是说,特指MCS-51系列,那么MCS-51系列的单片机基本上没什么区别的,至少内核都是一模一样的。就是功能模块可能稍有不一样。比如说:
有些具有AD/DA模块,有些不具有;
有些有EEPROM(STC89C52),有些没有(AT89S52);
有些ROM有8K(AT89S52),有些只有2K;
有些RAM有256B,而有些只有128BIT;
有些40个管脚(AT89C51、89C52、89S52),有些20个管脚(AT89C2051、89C4051);
有些有内部晶振,有些没有;
但这些都是稍微一点点的区别,基本都还是算一样的。
单片机是一个很大的类,这个类下面有很多子类,C51是单片机其中一个子集,其它的子类还有PIC、AVR、Cortex、STM等。
至于楼上说的ARM,其实ARM已经有点偏离单片机的定义了,更趋向于处理器,ARM9经常用在强大的智能手机中,各种硬件资源和运算速度都不是普通单片机可以相比的,而且编程与电路方面的设计也跟单片机不太一样。ARM7类似,但现在已经基本不用ARM7了。
还有最后一个PLC,看到PLC就知道他不是专业,可能是复制来的。PLC我们现在正在学,其实是一种工控设备,外形就是一个大大的盒子,里面装的也是单片机,可能是PIC的,也可能是ST的,也可能是其它的,还有一些外围电路。总之,我不敢说ARM不属于单片机,但PLC绝对不是单片机!!!
如果楼主要学,一般从40管脚的89C52或89S52开始学,也可以学STC的,STC的跟AT非常非常像,你可以简单的认为,STC是仿AT的,型号也一一对应,但STC的往往会加入一些AT没有的模块。
‘肆’ 单片机c51有哪些变量,谢谢!
下面仅对C51在变量定义中注意的问题以及与80C51存储资源有关的问题作说明,其余遵循C语言的规定。
1.变量声明
在变量的声明中,可以包括存储类型和signed或unsigned等属性。如:
(1)char data var1;
定义字符型变量var1,被分配在内部RAM低128B,编译后,通过直接寻址方式访问。
(2)char code text[ ] = “ENTER PARAMETER”;
定义字符数组text[ ],将其分配到程序存储区,并赋初始值“ENTER PARAMETER”。编译后,通过MOVC A, @A+DPTR访问。
(3)unsigned long xdata array[100];
定义无符号长整型数组array[100],将其分配到外RAM中,编译后,通过MOVX A, @DPTR访问。
(4)float idata x,y,z;
定义浮点类型变量x,y,z,将其分配到内RAM中,编译后,通过间接寻址方式访问。
(5)unsigned int pdata dimension;
定义无符号整型变量dimension,将其分配到外RAM中,编译后,通过MOVX A, @Ri指令采用分页的形式访问。
(6)unsigned char xdata vector[10][4][4];
定义无符号字符型数组vector[10][4][4],将其分配到外RAM中,编译后,通过MOVX A,@DPTR访问。
(7)char bdata flags;
定义字符型变量flags,将其分配到可位寻址的内部数据存储器中,可以以字节方式访问,也可以以位方式访问。
‘伍’ 单片机C51
你把“STARTUP.A51”,从项目中删除,就好了。
‘陆’ 编写一个完整的单片机C51程序
#include<reg51.h>
sbit led=P1^0; //单片机管脚位声明
void main()
{
TMOD=0x01; //定时器TO工作在方式1
TH0=(65536-5000)/256; //装初值,12M晶振 1为1us; 5000为5000us=5ms;
TL0=(65536-5000)%256;
EA =1; //开总中断
ET0=1; //开定时器TO中断
TR0=1; //启动定时器
P1=0; //初始化P1口
while(1) ; //程序在这里等待中断发生
}
void T0_time() interrupt 1
{
unsigned char num;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
num++;
if(num==100) //0.5S (1s闪烁1次==0.5S亮0.5S灭)
{
num=0;
led=~led; //led状态取反
}
}
‘柒’ c51单片机程序实例
#include<reg51.h>
#defineucharunsignedchar
uchartab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//0到9
ucharnum,cnt,disn;
ucharkeyval,disk;
ucharled[]={1,2,3,4};
voiddealdat(uchara)
{
led[0]=0;
led[1]=0;
led[2]=0;
led[3]=0;
led[a]=disk;
}
voiddelay(unsignedinta)
{
unsignedinti,j;
for(i=0;i<a;i++)
for(j=0;j<1000;j++);
}
voidt0isr()interrupt1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
switch(num)
{
case0:P2=0x01;break;
case1:P2=0x02;break;
case2:P2=0x04;break;
case3:P2=0x08;break;
default:break;
}
P0=~tab[led[num]];
num++;
num&=0x03;
cnt++;
if(cnt>100)
{
cnt=0;
disn++;
disn%=4;
dealdat(disn);
}
}
ucharkbscan(void)
{
unsignedcharsccode,recode;
P3=0x0f;//发0扫描,列线输入
if((P3&0x0f)!=0x0f)//有键按下
{
// delay(20);//延时去抖动
if((P3&0x0f)!=0x0f)
{
sccode=0xef;//逐行扫描初值
while((sccode&0x01)!=0)
{
P3=sccode;
if((P3&0x0f)!=0x0f)
{
recode=(P3&0x0f)|0xf0;
return((~sccode)+(~recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
}
return0;//无键按下,返回0
}
voidgetkey(void)
{
unsignedcharkey;
key=kbscan();
if(key==0){keyval=0xff;return;}
switch(key)
{
case0x11:keyval=7;break;
case0x12:keyval=4;break;
case0x14:keyval=1;break;
case0x18:keyval=10;break;
case0x21:keyval=8;break;
case0x22:keyval=5;break;
case0x24:keyval=2;break;
case0x28:keyval=0;break;
case0x41:keyval=9;break;
case0x42:keyval=6;break;
case0x44:keyval=3;break;
case0x48:keyval=11;break;
case0x81:keyval=12;break;
case0x82:keyval=13;break;
case0x84:keyval=14;break;
case0x88:keyval=15;break;
default:keyval=0xff;break;
}
}
main()
{
TMOD=0x11;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
getkey();
if(keyval!=0xff)disk=keyval;
delay(10);
}
}
‘捌’ 单片机C51错误
在之前加#define unsigned int uint
uint是为了方便才把unsigned int宏定义成uint
‘玖’ 请问单片机C语言编程与单片机C51编程的区别是什么
没什么区别。C51单片机可以用汇编语言编程,也可以用C语言编程!
‘拾’ 单片机 C51 union 的用法
这个应该是c51的c语言编程吧?->的意思是info这个指向结构体的指针所指的结构中取名叫irqsource的成员变量。也可以写成(*info).irqsource=0x00;
效果是一样的。