历史上的今天
今天是:2025年10月20日(星期一)
2022年10月20日 | STC89C52单片机 流水灯
2022-10-20 来源:csdn
流水灯
宏定义
用define 进行宏定义的典型用法
#define uchar unsigned char
注意宏定义后面不能加分号,它是预处理指令不是语句。
其中用“uchar”直接替换了unsigned char
此时我们可以用uchar去定义变量类型如:uchar i ;等价于 unsigned char i ;
对于上面的宏定义我们是用来给已有数据类型取别名。
对已有数据类型取别名一般还有使用关键字typedef,
定义方法如下:
typedef 已有数据类型 新的数据类型;(要加分号)
函数的定义
函数就是将多条语句集合在一起,来完成一种特定功能。
函数分为标准函数库,和用户自定义函数。
标准函数库:keil 编译器提供的,不需要用户进行定义。
自定义函数:用户根据自己需要编写的函数,它必须在使用前定义。
自定义函数一般格式为:
函数类型 函数名(形式参数表)
{
局部变量定义
函数体语句
}
延时函数
自定义函数: 延时函数 delay(毫秒级)
void delay(unsigned int z){
unsigned int x, y;
for (x = z; x > 0; x--){
for (y = 114; y > 0; y--);
}
}
给形参z赋值,如延时100 毫秒:delay(100);
标准库函数中的循环移位函数
标准库函数:intrins.h
内部函数:
字符型循环左移:_crol_(unsigned char, unsigned char)
字符型循环右移:_cror_(unsigned char, unsigned char)
#include void test_crol (void){ unsigned char a; unsigned char b; a = 0xFE; // 1111 1110 b = _crol_(a, 1); // b now is 0xFD 二进制为 1111 1101 } _crol_(unsigned char, unsigned char):第一个参数 参与运算的数值,第二个参数,如果是1循环左移一位,如果是2循环左移2位… _cror_(unsigned char, unsigned char):第一个参数 参与运算的数值,第二个参数,如果是1循环右移一位,如果是2循环右移2位… 循环移位函数与左移和右移运算符的区别 使用字符型循环左移: #include void test_crol (void) { unsigned char a; unsigned char b; a = 0xFE; // 1111 1110 b = _crol_(a, 1); // b now is 0xFD 二进制为 1111 1101 } 使用左移运算符 a = 0xFE; //1111 1110 b = a<<1; // b now is 0xFC 二进制为 1111 1100 区别:循环左移是把最高位移到最低位上,左移运算符是把最高位移除最低位补0 1. 流水灯实现左移 #include #include #define uint unsigned int #define uchar unsigned char uchar temp; // LED灯相关变量 void delay(unsigned int z){ // 毫秒级延时函数定义 unsigned int x, y; for (x = z; x > 0; x--){ for (y = 114; y > 0; y--){ } } } // 实现左移 void main(){ // main函数自身会循环 temp = 0xfe; P1 = temp; // 1111 1110 delay(100); while(1){ temp = _crol_(temp, 1); P1 = temp; delay(100); // 延时 100毫秒 通过增加延时的时间或减少延时的时间,来控制流水灯的速度 } } 2.流水灯实现右移 #include #include #define uint unsigned int #define uchar unsigned char uchar temp; // LED灯相关变量 void delay(unsigned int z){ // 毫秒级延时函数定义 unsigned int x, y; for (x = z; x > 0; x--){ for (y = 114; y > 0; y--){ } } } // 实现右移 void main(){ // main函数自身会循环 temp = 0xfe; P1 = temp; // 1111 1110 delay(100); while(1){ temp = _cror_(temp, 1); P1 = temp; delay(500); // 延时 100毫秒 } } 3.每四个流水灯实现左移: #include #include #define uint unsigned int #define uchar unsigned char uchar temp; // LED灯相关变量 /*==================================== 函数 : delay(uint z) 参数 :z 延时毫秒设定,取值范围0-65535 返回值 :无 描述 :12T/Fosc11.0592M毫秒级延时 ====================================*/ void delay(unsigned int z){ // 毫秒级延时函数定义 unsigned int x, y; for (x = z; x > 0; x--){ for (y = 114; y > 0; y--){ } } } // 实现左移 void main(){ // main函数自身会循环 temp = 0xf0; // 每4个灯进行流水闪烁 P1 = temp; // 1111 1110 delay(100); while(1){ temp = _crol_(temp, 1); P1 = temp; delay(100); // 延时 100毫秒 通过增加延时的时间或减少延时的时间,来控制流水灯的速度 } } keil中Debug的用法 需要修改晶振频率为:11.0592 如果要看LED灯的高低电频的情况,通过菜单栏的Peripherals选项,中的 I/O-Ports → Port 1 开启Debug的界面 单片机小精灵的使用 选择 晶振频率为:11.0592 MHz 12T 时钟周期 可以同过该程序定义生成延时函数 注:在使用晶振频率精准的同时也要保证串口波特率和晶振对应,减小串口波特率的误差,所以选择 晶振频率为:11.0592 ![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-teVzCnNY-1604149519040)(img/Options.png?imageView2/2/w/550)]](https://8.eewimg.cn/news/uploadfile/2022/1020/20221020102955150.png?imageView2/2/w/550)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W5adFF17-1604149519044)(img/Peripherals.png?imageView2/2/w/550)]](https://8.eewimg.cn/news/uploadfile/2022/1020/20221020102955675.png?imageView2/2/w/550)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kk6Kt5DL-1604149519049)(img/menu.png?imageView2/2/w/550)]](https://8.eewimg.cn/news/uploadfile/2022/1020/20221020102955436.png?imageView2/2/w/550)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2ZLsKwXq-1604149519054)(img/elf.png?imageView2/2/w/550)]](https://8.eewimg.cn/news/uploadfile/2022/1020/20221020102955302.png?imageView2/2/w/550)
上一篇:STC89C52单片机 蜂鸣器
史海拾趣
|
降低成本 ADI发布WiMAX终端RF收发器 美国模拟器件公司(Analog Devices, Inc.,纽约证券交易所代码: ADI),全球领先的高性能信号处理解决方案供应商,10月10~12日在美国波士顿WiMAX世界峰会上展示了两款用于全 ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 09:19 编辑 电子爱好者请加QQ:273605686!经过这将近四天的奋战和赛前的准备和培训,确实学到了很多东西。 … 查看全部问答> |
|
大约从20世纪80年代起,就有许多业内专家宣称模拟电路已走进死胡同,而数字应用将在电子世界中大放异彩,包括用在通信上的集成电路(integrated circuits,ICs)。在现实中,当然,现代化的通信系统同时需要将模拟及数字功能复杂地融合在一起。 ...… 查看全部问答> |
|
奥特曼Zigbee读书日记(四)-- 设备“对话”专题(2) 原贴地址:http://www.feibit.com/bbs/viewthread.php?tid=86&extra=page%3D1 心理学专家告诉我们,一个贴子不能写得太长,否则会让读者有疲劳感。。。(背景音:哪个专家说的?--自己百度去,肯定不是奥特曼~~~)按照专家的指点,我们 ...… 查看全部问答> |
|
小弟最近在忙毕业设计,想做一个基于51单片机的电脑遥控器,想法是这样的,做一个类似U盘的红外接收端,能实现遥控关机的功能就行了。这是最基本的,至于开机,貌似通过USB接口实现开机是有难度的。所以只想做一个能实现关机功能的就差不多了,我查 ...… 查看全部问答> |
|
430的单片机之前只是耳闻,还没用过,我51,EMC单片机会用,还有ARM9,ARM11会用。 现在要用这430还需要哪些工具和软件?? [ 本帖最后由 青叶漂零 于 2011-11-16 11:35 编辑 ]… 查看全部问答> |
|
南华大学黄智伟 备战2013 有关 “高频无线电类”赛题的一些问题 本帖最后由 paulhyde 于 2014-9-15 03:07 编辑 南华大学黄智伟 备战2013 有关 “高频无线电类”赛题的一些问题 … 查看全部问答> |
|
Xilinx PCIe Endpoint Master DMA设计实现 基于PCI Express的数据采集卡 PCIe数据采集卡 PCI Express数据采集卡 本人在北京工作6年以上,从事FPGA外围接口设计,非常熟悉PCI Express协议,设计调试了多个基于PCI Express接口的数据采集卡. 本人非常熟悉Virtex-5/Virtex-6/7 Series FPGA PCI ...… 查看全部问答> |
|
以下是我程序中的SCI相关代码,我用中断方式接收,查询方式发送,但是不知为什么我用串口调试助手发送字符后不能接收到CPU发送回来的数据? void sInitSCI(void) { EALLOW; GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0; // Enable pullup on GPIO28 ...… 查看全部问答> |




