实例16 用p0口显示左移的运算结果
实例17万能逻辑电路 F=EY+Z逻辑函数p77图
1专门设计数字电路,实现逻辑功能
2通过单片机编程来实现逻辑功能软件即硬件
//实例17:\万能逻辑电路\实验
#include
while(1) {
F=((~X)&Y)|Z; //将逻辑运算结果赋给F ; } }
实例18用右移实现流水灯
前提设p口为0xff八次右移一位高位丢弃低位补0 延迟用的变量因为要取大数所以必须用int 后面因为要快所以取char型变量
因为单片机运行快。所以led灯闪后要延迟。 C语言语句
If(S1==0)
P1=0x00;如果按键s按下接地(相应位为低电平), Swich 整型 break 三者紧密
While语句花括号运用和 一般情况下,在循环体中应该有让循环停止的语句。?? Do while 语句注意;
Do和while连用 while后面的分号不能丢,它表示整个循环语句的结束 Do循环语句 while(循环式) 尽量避免使用goto语句 P87页的程序软件即硬件
实例21用for语句实现鸣笛报警
T=1/f,所以要让蜂鸣器发出频率f的声音,只要让单片机输送周期为t的脉冲方波电平即可,让单片机没半个周期取反一次。半周期可通过延时来实现。可以通过循环的方式来实现延时,
P90一重循环消耗的机器数近似N=3*n 二重循环消耗的机器数近似N=3*n*m
例子,如果单片机的晶振频率为11.0592MHz,则机器的周期为1.085μs,要发出1600Hz的声音,就让单片机每半个周期312μs将输出电平取反一次,而延时312μs需要消耗机器周期数N=312/1.085≈286可以取300循环次数300/3=100次 Void delay(void) {
Unsigned char I;
For(i=0;i<100;i++) ;
}形成1600Hz的音频
相对应800Hz的音频可以i取200 Sbit sound=P1^5; Sound=0; 即可执行 Unsigned char i; While(1) i=0;??
数组是同类型的一组变量? Unsigned char code tab[] 应用却是tab【】??
字符型数组中的个字符数据在单片机中是以字符的ASCII 存放的,
正确的使用指针,可以有效地表示复杂的数据类型,动态分配内存,方便的使用字符串,有效地使用数组。
指针本身就具有地址还存在一个地址, Unsigned char*p; Unsigned char a; P=&a; 指针数组
Unsigned char a[]={0,1,2,3};
Unsigned char *a[]={&a[0],&a[1],&a[2],&a[3]}; 数组的指针
Unsigned char a[]={0,1,2,3}; Unsignde *p; P=&a[0];
P[i]+j 为P[i][j] 实例26未细看
返回值是通过return语句获得的。
如果函数无返回值,需要用void来声明。 数组作为函数参数
一个数组的名字表示该数组的首地址,所以用数组名作为函数的参数时。被传递的数
组的首地址,被调用函数的参数的形式须是定义为指针型变量。
用数组名作为函数的参数时,应该在主调函数和被调函数中都进行数组定义。定义的数组类型必须一致。编译器不检查形参数组的长度p109函数?? 函数型指针
一个函数在编译时,就分配了一个入口地址,这个入口地址就是函数的指针, 类型说明符 (*指针变量名)(形参列表) Int (*p)(int a,int b) (*p)(a,b)
这些需要思考p110页 。
P1=z/256;取得z的高八位
P2=z/256;取得z的低八位???? While(1)
;无限循环防止程序跑飞。
实例30用有参函数控制p0口8位流水灯的流水速度 P113实例31不实用??、
实例32 实例33是不错的c语言程序函数调用。练习c语言p115p116
实例34不错c语言程序p118
指针数组适合用来指向若干个字符串,尤其是各列字符串长度不一致的情形,这对于字符的液晶显示等很有意义。
实际运用液晶等显示器显示字符时,如果液晶的接口通过P0口和单片机连接,将各字符串送入p0口,实际上就是送入液晶显示器。 实例35
#include
P0=isalpha(’_’)?0xf0:0x0f;
内部函数文件instrins.h中有_crol_()函数
实例36;应用内部函数文件instrins.h中有_crol_()函数来点亮P3口8位流水灯 _crol_(15,2)
的返回值为00111100B=0x3c思考他的应用
实例37实例38感觉像是介绍函数以后????c语言应用程序卡那可可能看看
C语言编译预处理
宏定义c语言允许一个标示符来表示一个字符串,称为宏。 P125宏定义不是c语句,所以不需加分号。
可以用#undef命令来终止宏定义的作用域。即对#undef后面的无用。为防止歧义应加括号及时
带参数的函数宏和函数不同,函数是先求出实参表达式的值,然后代入形参,而带参数的宏只是进行简单的字符替换。 实例40文件包含应用举例
使用头文件为#include
已将P3_0定义为P3.0引脚,直接应用P3_0就可以对P3口进行操作了。 实例41条件编译应用举例
常用的条件编译是根据某常量表达式的值的是否为真来控制编译
即#if 常量表达式 程序段1 #else
程序段2
#endif??思考好的应用
第五章单片机的定时器计数器 当加在
定时器计数器T0或T1用作计数器时,对外接晶振产生的振荡信号经12分频后,提供给计数器,作为计数器的脉冲输入,计数器以12分频后的脉冲周期为基本计数单位,对输入的脉冲进行计数,直至产生溢出。??? P136页到p140页有点不懂。工作方式
图p135T0或T1引脚上的外部脉冲信号出现一个由1到0的负跳变时,计数器加1,直至计数器溢出。
CPU是按顺序进行工作的。
实例42用计时器T0查询方式控制P2口的8位LED闪烁
T0工作于方式1,LED灯的闪烁周期为100ms,即亮50ms,熄灭50ms; 12分频即频率被12等分,周期即12除频率
定时器的初值设定需要进行计算,总而言之,就是定时器必须达到顶值即65536. 初值需要T0的高八位寄存器TH0和低八位寄存器TL0分别存储 存储方法及 TH0= /256; TL0= %6;
溢出标志位是否为1若为1表示时间已到,否则,等待。 //实例42:用定时器T0查询方式P2口8位控制LED闪烁
#include
**************************************************************/ void main(void) {
// EA=1; //开总中断
// ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式1 TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%6; //定时器T0的高8位赋初值 TR0=1; //启动定时器T0 TF0=0; P2=0xff;
while(1)//无限循环等待查询 { while(TF0==0)//查询标志位是否溢出 ; TF0=0;
P2=~P2;按位取反,实现led灯的闪烁
TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%6; //定时器T0的高8位赋初值 } }
TFO 记忆flow溢出
TRO 记忆trigger引起启动 THO 记忆high高八位 TMOD 记忆mode 方式
实例43,用定时器t1查询方式控制单片机发出1kHz音频 //实例43:用定时器T1查询方式控制单片机发出1KHz音频
#include
/************************************************************** 函数功能:主函数
**************************************************************/ void main(void) {
// EA=1; //开总中断
// ET0=1; //定时器T0中断允许 TMOD=0x10; //使用定时器T1的模式1 TH1=(65536-921)/256; //定时器T1的高8位赋初值 TL1=(65536-921)%6; //定时器T1的高8位赋初值 TR1=1; //启动定时器T1 TF1=0; while(1)//无限循环等待查询 { while(TF1==0) ; TF1=0; sound=~sound; //将P3.7引脚输出电平取反
TH1=(65536-921)/256; //定时器T0的高8位赋初值 TL1=(65536-921)%6; //定时器T0的高8位赋初值 } }
//实例44:将计数器T0计数的结果送P1口8位LED显示
#include
/************************************************************** 函数功能:主函数
**************************************************************/ void main(void) {
// EA=1; //开总中断