单片机C语言编程学习

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机C 语言编程学习
一、概述
在一个集成电路芯片上集成微处理器、存储器、I/0接口电路,从而构成了单片机。

Intel公司推出了MCS-51系列单片机:集成8位CPU、4K字节ROM、128字节的RAM、4个8位并口、一个全双工串行口、2个16位定时器/计数器。

寻址范围64K,并有控制功能较强的布尔处理器。

二、预备知识
<一>、电平特性
1、数字电路中只有两种电平:高和低
(本课程中)定义单片机为TTL电平:
高+5V 低0V
2、RS232电平:计算机的串口
(-9V~15V) 高-12V 低+12V (+3V~+15V)
所以计算机与单片机之间通讯时需要加电平转换芯片max232。

<二>、二进制与十六进制的表示及转换
1、二进制:
数字电路中的两种电平特性决定了它:
0 0 6 110 12 1100
1 1 7 111 13 1101
2 10 8 1000 14 1110
3 11 9 1001 15 1111
4 100 10 1010 16 10000
5 101 11 1011
2、十六进:
是二进制的简短表示形式。

十进制中的0-15分别表示为十六进制的0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F
3、熟练掌握二进制与十六进制之间的转换。

规律:一般把四个二进制数放在一起转换成一个十六进制数,转换时先把二进制数转换成十进制数,再把十进制数转换成十六进制数。

如:0001B -> 1 -> 1H
B表示为二进制,H为十六进制
1001B -> 9 -> 9H
1010B -> 10 -> AH
0010 1100 -> 44 -> 2CH
4、二进制各种对制关系:
<三>、二进制数的逻辑运算
1. “与”运算
“与”运算是实现“必须都有,否则就没有”这种逻辑关系的一种运算。

运算符为“· ”, 其运算规则如下:
0·0=0, 0·1=1·0=0, 1·1=1
2. “或”运算
“或”运算是实现“只要其中之一有,就有”这种逻辑关系的一种运算, 其运算符为“+”。

“或”运算规则如下:
0+0=0, 0+1=1+0=1, 1+1=1
3. “非”运算
“非”运算是实现“求反”这种逻辑的一种运算,如变量A的“非”运算记作。

其运算规则如下:
=
1=
1
0,0
4. “异或”运算
“异或”运算是实现“必须不同, 否则就没有”这种逻辑的一种运算, 运算符为“ ”。

其运算规则是:
三、8051单片机介绍
80C51是MCS-51系列中的一个典型品种;其它厂商以8051为基核开发出的CMOS工艺单片机产品统称为80C51系列。

当前常用的80C51系列单片机主要产品有:Intel的:80C31、80C51、87C51,80C32、80C52、87C52等;
ATMEL的:89C51、89C52、89C2051等;
Philips、华邦、Dallas 、STC
Siemens(Infineon)等公司的许多产品。

1、80C51的引脚封装
总线型非总线型
2、P3第二功能各引脚功能定义:
P3.0:RXD串行口输入
P3.1:TXD串行口输出
P3.2:INT0外部中断0输入
P3.3:INT1
外部中断1输入P3.4:T0定时器0外部输入P3.5:T1定时器1外部输入P3.6:WR外部写控制
P3.7:RD外部读控制0
1
1,1
1,1
1
0,0
0=

=

=

=

P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
RST/V PD P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0
P3.5/T1
P3.6/WR
P3.7/RD
XTAL2
XTAL1
V SS V CC
P0.0
P0.1
P0.2
P0.3
P0.4
P0.5
P0.6
P0.7
EA/V PP
ALE/PROG
PSEN
P2.7
P2.6
P2.5
P2.4
P2.3
P2.2
P2.1
P2.0
RST
P3.0/RXD
P3.1/TXD
XTAL2
XTAL1
P3.2/INT0
P3.3/INT1
P3.4/T0
P3.5/T1
GND
V CC
P1.7
P1.6
P1.5
P1.4
P1.3
P1.2
P1.1/AIN1
P1.0/AIN0
P3.7
注:类似的还有Philips公司的
87LPC64,20引脚
8XC748/750/(751),24引脚
8X749(752),28引脚
8XC754,28引脚
等等
型号介绍:
STC 89C52(51、54、56、58、516) RC
40C-----PDIP(BGA) 07ICV4336……
释:
STC:公司名称 89C52:为89系列52为储存空间(2*4=8KB)40C:最大支持晶振的频率为40MHZ C:适用类型
C:为商业型,工作温度(0摄氏度~85摄氏度)
I:为工业型,工作温度(-40摄氏度~125摄氏度)
军用级:工作温度(-55摄氏度~160摄氏度)
PDIP:封装格式此为双列直插式
07ICV4336……:为生产日期
AT89S51:为串形下载TSP编程式AT89C51(52、54、55)
AT89LV51:为低电压工作(+3V)STCE52:也是低电压工作
C52AD:芯片为自带A/D转换功能
3、总线(BUS)是计算机各部件之间传送信息的公共通道。

微机中有内部总线和外部总线两类。

内部总线是CPU内部之间的连线。

外部总线是指CPU与其它部件之间的连线。

外部总线有三种: 数据总线DB(Data Bus), 地址总线AB(Address Bus)和控制总线CBControl Bus)。

CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器;RAM:用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;ROM:用以存放程序、一些原始数据和表格;
I/O口:四个8位并行I/O口,既可用作输入,也可用作输出;
T/C:两个定时/记数器,既可以工作在定时模式,也可以工作在记数模式;
4、五个中断源的中断控制系统;
一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信;
片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。

最高振荡频率取决于单片机型号及性能。

数据的类型:
如:
实型:有字符型float为浮点型,就是有小数点功能
释:
-3.4e-38=3.4*10的38次方
单片机中每个字节为8位。

单片机中常用的字符型char型和int型两种
四、C51知识
1、C-51的数据类型扩充定义
sfr:特殊功能寄存器声明
sfr16:sfr的16位数据声明
sbit:特殊功能位声明
bit:位变量声明
例:sfr SCON = 0X98;
sfr16 T2 = 0xCC;
sbit OV = PSW^2;
2、C-51数据的存储类型
例:
数据类型变量名
char var1;
bit flags;
unsigned char vextor[10];
int wwww;
注意:变量名不能用C语言中的关键字表示。

3、C-51的包含的头文件
通常有:reg51.h reg52.h math.h ctype.h stdio.h stdlib.h absacc.h
常用有:reg51.h reg52.h
(定义特殊功能寄存器和位寄存器);
math.h (定义常用数学运算);
4、C-51的运算符
与C语言基本相同:
+ - * /(加减乘除)
> >= < <= (大于大于等于小于小于等于)
== != (测试等于测试不等于)
&& || ! (逻辑与逻辑或逻辑非)
>> << (位右移位左移)
& | (按位与按位或)
^ ~ (按位异或按位取反) 〈二〉、C-51的基本语句
if 选择语言
while 循环语言
for 循环语言
switch/case 多分支选择语言
do-while 循环语言
中断服务程序\
函数名()interrupt n using m
{
函数内部实现….
}
〈三〉、I/O口定义
sbit beep=P2^3;
五、单片机主要掌握以下几点
最小系统能够运行起来的必要条件。

1.电源
2.晶振
3.复位电路
对单片机任意IO口的随意操作
1.输出控制电平高低
2.输出检测电平高低。

定时器:重点掌握最常用的方式2
中断:外部中断、定时器中断、串口中断
串口通信:单片机之间、单片机与计算机间通讯
Main 函数
格式:void main()
特点:无返回值,无参。

任何一个C程序有且仅有一个main函数,它是整个程序开始执行的入口。

例:void main()
{
总程序从这里开始执行;
其他语句;
}
补充:
Math.h可求值,它里面有写的程序,要用时直接调用就OK!
花样流水灯--C程序
嵌入式单片机
#include<reg52.h>
#define uint unsigned int //宏定义
#define uchar unsigned char
sbit beep=P2^3; //蜂鸣器
sbit wela=P2^7; //定义数码管的锁存端
sbit dula=P2^6;
uchar code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //从0--7
uchar code table2[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //从7--0
uchar code table3[]={0x7e,0xbd,0xdb,0xe7,0xe7,0xdb,0xbd,0x7e}; //从两端开始uchar code table4[]={0xe7,0xdb,0xbd,0x7e,0x7e,0xbd,0xdb,0xe7}; //从中间开始uchar code table5[]={0xff,0x00,0xff,0x00,0xaa,0x55,0xaa,0x55}; //全闪烁和间隔闪uchar code table6[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00}; //从7--0
uchar code table7[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00}; //从0--7
void delay(uint z) //延时
{
uint x,y;
for(x=z;x>0;x--)
for(y=121;y>0;y--);
}
void main(void)
{
uchar num;
wela=0; //关闭数码管,以防供电不足
dula=0;
while(1)
{
for(num=0;num<8;num++) //第一组
{P1=table1[num];
delay(200);
beep=!beep;
}
for(num=0;num<8;num++) //第二组
{P1=table2[num];
delay(200);
beep=!beep;
}
for(num=0;num<8;num++) //第三组
{P1=table3[num];
delay(200);
beep=!beep;
}
for(num=0;num<8;num++) //第四组
{P1=table4[num];
delay(200);
beep=!beep;
}
for(num=0;num<8;num++) //第五组
{P1=table5[num];
delay(200);
beep=!beep;
}
for(num=0;num<8;num++) //第六组
{P1=table6[num];
delay(200);
beep=!beep;
}
for(num=0;num<8;num++) //第七组
{P1=table7[num];
delay(200);
beep=!beep;
}
}
}
随心所欲流水灯
org 0000h
ajmp start
start: mov dptr,#table ;数据表地址送入dptr
mov 30h,#8 ;30单元作为循环计数器
lop: mov a,#0 ;acc清零
movc a,@a+dptr ;查数据表中的值并送入a
mov p1,a ;查表结果送和P1口
lcall delay100ms ;延时100ms
inc dptr ;数据指针加1
djnz 30h,lop ;未到8次继续查表取值
ajmp start ;到了则重新循环
delay100ms: mov r5,#195 ;1+(1+2*255)*195+2*195=100.036ms@12M temp: mov r6,#255 ;1+2*255
djnz r6,$
djnz r5,temp
ret
table: db 07eh, 0bdh, 0dbh, 0e7h, 0e7h, 0dbh, 0bdh, 07eh
end
;************************************************************************** #include <reg51.h>
#define uchar unsigned char
uchar state[8] = {0xe7, 0xdb, 0xbd, 0x7e, //状态表
0x7e, 0xbd, 0xdb, 0xe7};
v oid delay_ms(uchar ms); // 延时毫秒@12M,ms最大值255
void main()
{
uchar i; // 循环控制变量,还起变址作用
while(1)
{
for(i = 0; i < 8; i++)
{
P1 = state[i]; // 查表并将结果送入P1口
delay_ms(100); // 延时100ms
}
}
}
void delay_ms(uchar ms)
{
uchar i;
while(ms--)
for(i = 0; i < 124; i++);
}
流水灯C语言程序流水灯C语言程序
#include<reg51.h>
#include <intrins.h>
void delayms(unsigned char ms)
// 延时子程序
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}
main()
{
unsigned char LED;
LED = 0xfe;
P0 = LED;
while(1)
{
delayms(250);
LED = _crol_(LED,1); //循环右移1位,点亮下一个LED P0 = LED;
}
}。

相关文档
最新文档