用C语言编写程序实现通过按键使LED灯周期闪烁
51单片机技术应用教程(C语言版)项目一 1个LED的闪烁设计与制作
4.十进制整数转换为十六进制数可用除16取余法。
即用16不断地去除待转换的十进制数,直至商等于0为止。 将所得的各次余数,依倒序排列,即可得到所转换的十 六进制数。如下式所示:
即 38947 =9823H
16 38947
3
16 2434
2
16 152
8
16 9
9
0
1.1.2 符号数的表示法
1. 机器数与真值 (1)机器数:在计算机中,常用数的符号和数值部分一起编码的方法表示符号数, 较常用的有原码、反码和补码表示法。这几种表示法都将数的符号数码化。机器中 编码表示的数,正号用“0”表示,负号用“1”表示 (2)真值:数值连同符号“+”或“-”称为机器数的真值。一般书写中的数。
技能要求
1.会识别MCS-51单片机; 2.市场调研单片机系列产品,了解单 片机市场行;
3.会搭建单片机最小应用系统; 4.会检测1个LED灯基本电路; 5.会简单使用Keil u Vision与Proteus软 件设计与仿真调试程序并进行硬件 设计。
6.会ISP在线下载。
51单片机技术应用活页式教程(C语言版)
3.请根据资料用Proteus设计“简易指示灯设计”硬件图,下载其程序的机器代码到 AT89C51单片机芯片中,查看仿真结果,并分析仿真结果。请您将硬件图所需元器 件与仿真分析结果写在下面的方框中。
51单片机技术应用活页式教程(C语言版)
项目一:1个LED灯闪烁设计与制作
知识 链接
1.1计算机中的数和编码
51单片机技术应用活页式教程(C语言版)
项目一:1个LED灯闪烁设计与制作
【引导学习2】
我们已经学习了解了AT89C51单片机的引脚,在1个LED的闪烁设计与制作之前,我们要先学习 单片机的基础知识。下面请运用信息查找等方法请完成如下问答题: 1.将下列十六进制无符号数转换为十进制数。 2CH,4FEH,378H,100H,CADH
使用按键自动控制LED闪烁及蜂鸣器鸣叫—while语句、自增自减语句
4、关系有以下几种: (1)==:等等于。测试是否相等。如2==3,测试2等等于3,结果不等,假关系值为0. (2)!=:不等于。如,2!=3,成立,结果为1(真)。 (3)〉:大于。如,a〉10,假设a的值为5,则为假关系;若a的值为11,则为真关系。 (4)<:小于。如,i〈k+100,真假取决于I,k的值。 (5)>=:大于或等于。如,2>=2,3>=2,都为真。 (6)〈=:小于或等于。如,2<=2,为真;3<=2,为假。
while
假
条件表 达式
真
语句组 真
调到后面
While执行流程
4、While循环有以下几种形式
(I)while(条件);
//只有条件,没有语句,常用来等待一个“信号”
(2)while(条件)语句; //只有一条语句,省略花括号。
(3)while (条件)
{
语句1;
语句2;
……ain(){
08 unsigned char kCount=0;
//按键计次数变量
09 LED1=on;LED2=LED3=LED4=off; //开机LED1点亮
10 delay(55550);delay(55550); //延时1S左右
11 while(1){
12
/*按键处理部分/
13 if(k==0){
14
delay(200);
//按键延时消抖
15
if(k==0){
16
kCount=(kCount+1)%6; //循环加1
17
while(k==0); //等待按键释放
18
}
19 }
20 /*灯控制功能部分*/ 21 if(kCount==0){LED1=LED2=LED3=LED4=off}; //初始 及第6次全熄灭 22 else if(kCount==1){LED1=on;LED2=LED3=LED4=off};//按 第一次,LED1点亮 23 else if(kCount==2){LED1=LED2=on;LED3=LED4=off};//按 第二次点亮LED1、LED2 24 else if(kCount==3){LED1=LED3=on;LED2=LED4=off};//按 第三次点亮LED1、LED3 25 else if(kCount==4){LED1=LED4=on;LED2=LED3=off};//按 第四次点亮LED1、LED4 26 else if(kCount==5){LED1=LED2=LED3=LED4=on}; //按 第五次,点亮全部
msp430Led按键控制灯亮程序
1.Led灯控制程序#include "msp430g2553.h"void main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD; //关闭看门狗//P1DIR = 0x41;//P1OUT = 0x41; //程序点亮led1//P1DIR |=BIT0+BIT6;//P1OUT |=BIT0+BIT6; //程序点亮led2P1DIR |=BIT0;P1OUT |=BIT0;P1DIR |=BIT6;P1OUT &=~BIT6;while(1){P1OUT ^=BIT0;P1OUT ^=BIT6;__delay_cycles(1000000);} //led交替亮,持续1s2.Led按键控制灯亮#include "msp430g2553.h"void main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;//关闭看门狗P1DIR &=~BIT3;P1DIR |=BIT0;P1IES |=BIT3;P1IE |=BIT3;_EINT();_BIS_SR(LPM0_bits+GIE);}#pragma vector=PORT1_VECTOR__interrupt void PORT1_ISR(void){int i;char pushkey;pushkey=P1IFG&BIT3;//第三位中断标志位for(i=0;i<1000;i++)//短暂延时软件去抖if((P1IN&pushkey)==pushkey){P1IFG=0;//中断标志清零return;}if(P1IFG&BIT3)//判断按键是否按下{P1OUT^=BIT0;}P1IFG=0;return;}3.矩阵键盘和数码管程序#include <msp430g2553.h>#include"Key&Display.h"//unsigned char Receive(void);void main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;Init_4lines_Mode();//初始化4线工作模式Send_Command(CH452_RESET);//CH452芯片内部复位Send_Command(KeyDisplay_ON);//允许显示驱动并启动键盘扫描//开中断,P2.0接CH452的DOUT引脚,当有键按下时,DOUT上产生由高到低的脉冲// P2SEL &= ~(BIT6+BIT7);P2IE|=BIT0;P2IES|=BIT0;P2IFG&=~BIT0;_EINT();while(1){}}//中断处理函数#pragma vector = PORT2_VECTOR//中断处理程序,接收到DOUT脉冲信号时,运行之__interrupt void Port2(void){unsigned char Keyvalue;Send_Command(CH452_GET_KEY);//单片机向CH452发送读取按键代码命令Keyvalue=Key_Read();// Keyvalue=Receive();switch(Keyvalue){case 0x40://按键K0按下{Send_Command( NDis1); //第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis00);//第0位数码管显示0break;}case 0x41://按键K1按下{Send_Command( NDis1); //第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis01);//第0位数码管显示1break;}case 0x42://按键K2按下{Send_Command( NDis1); //第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis02);//第0位数码管显示2break;}case 0x43://按键K3按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis03);//第0位数码管显示3break;}case 0x48://按键K4按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis04);//第0位数码管显示4break;}case 0x49://按键K5按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis05);//第0位数码管显示5break;}case 0x4A://按键K6按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis06);//第0位数码管显示6break;}case 0x4B://按键K7按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis07);//第0位数码管显示7break;}case 0x50://按键K8按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis08);//第0位数码管显示8break;}case 0x51://按键K9按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis09);//第0位数码管显示9break;}case 0x52://按键K10按下{Send_Command(Dis00);//第0个数码管显示字符"0"Send_Command(Dis11);//第1个数码管显示字符"1"break;}case 0x53://按键K11按下{Send_Command(Dis01);//第0个数码管显示字符"1"Send_Command(Dis11);//第1个数码管显示字符"1"break;}case 0x58://按键K12按下{Send_Command(Dis02);//第0个数码管显示字符"2"Send_Command(Dis11);//第1个数码管显示字符"1"break;}case 0x59://按键K13按下{Send_Command(Dis03);//第0个数码管显示字符"3"Send_Command(Dis11);//第1个数码管显示字符"1"break;}case 0x5A://按键K14按下{Send_Command(Dis04);//第0个数码管显示字符"4"Send_Command(Dis11);//第1个数码管显示字符"1"break;}case 0x5B://按键K15按下{Send_Command(Dis05);//第0个数码管显示字符"5"Send_Command(Dis11);//第1个数码管显示字符"1"break;}default:break;}P2IFG&=~BIT0;}4.红灯0.2秒闪一次,绿灯0.8秒闪一次#include <msp430g2553.h>void main(void){WDTCTL = WDTPW + WDTHOLD; // Stop WDT BCSCTL1 &=~XTS; //配置时钟BCSCTL3 |=LFXT1S_2;IFG1 &=OFIFG;P1DIR |=BIT0+BIT6; // P1.0,P1.6 output P1OUT &=~BIT0; // P1.0,P1.6置0 P1OUT &=~BIT6;TACCR0 = 12000-1; //1秒定时,产生中断TACCR1 = 2400; //频率0.2*12000,定时0.2秒TACCR2 = 9600; //定时0.8秒TACTL = TASSEL_1 + MC_1+TAIE; // ACLK, 增计数模式TACCTL1 |=CCIE; // TACCR1中断使能TACCTL2 |=CCIE; // TACCR1中断使能_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt}// Timer_A3 Interrupt Vector (TA0IV) handler#pragma vector=TIMER0_A1_VECTOR__interrupt void Timer_A(void){switch( TA0IV ){case 2: P1OUT ^= BIT0; // 捕获/比较寄存器TACCR1break;case 4: P1OUT ^= BIT6;break; // 捕获/比较寄存器TACCR2case 10: break; // 未使用,计数达到TACCRO时执行中断,即1秒执行一次}}5.PMW波控制led灯亮度#include "msp430g2553.h"void main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;P1DIR |=BIT6; //方向寄存器P1SEL |=BIT6; //功能寄存器TACTL=TASSEL_2+MC_1+ID_0; //定时器A控制寄存器选择增计数模式TACCTL1 |=OUTMOD_3; //捕获/比较控制寄存器TACCR0=1000-1;TACCR1=10;_BIS_SR(CPUOFF);}。
使用按键自动控制LED闪烁及蜂鸣器鸣叫—函数的封装及调用
单片机技术及应用
评价等级 完成任务最终评价等级
(评价参考:自评20%、组评30%、师评50%)
8
任务小结
•学生小结:总结自己收获; •教师小结:强调程序的核心思想,编 程的要点,以及程序错误查找方法。
9
课后任务
•利用所学知识实现同时控制两个LED灯 循环点亮。学生利用课余时间完成任务, 并将程序拍照传给教师QQ。
函数定义举例如下:
①
delay
//无参数无返回值函数定义
{
}
②
delay( unsigned int i) //有参数无返回值函数定义
{
}
③
unsigned int sum(unsigned char a,unsigned char b)//有参数有返回值函数定义
{
unsigned int k;
//用于存放返回值的变量
评价内容
1.安全用电
2.设备及器材的安全
3.记录整理完整准确 4. 符合6S管理理念 1、函数的概念及作用 2、函数的定义 3、函数的参数 4、函数的返回值 5、函数的调用
自评
小组评价 教师评价
优☆ 良△ 中√ 差×
汇报展示
1.作品展示(可以为实物作品展 示、PPT汇报、简报、作业等形 式)
2. 语言流畅,思路清晰
……
return k;
//返回值
}
四、函数的参数
C51语言的函数采用参数传递方式, 使一个函数可以对不同的变量数据 进行功能相同处理,在调用函数时 实际参数被传入到被调用函数的形 式参数中,在执行完函数后使用 return语句将一个和函数类型相同 的返回值返回给调用语句。 函数定义好以后,要被其他函数调 用才能被执行。定义函数时在函数 名称后面的括号里列举的变量名称 为“形式参数”;调用函数时,函数 名称后面的括号里的变量称为"实 际参数"。
C语言使用定时器的方法控制LED灯以1S的速度闪亮
C语言使用定时器的方法控制LED灯以1S的速度闪亮最近因为赶不上提高班的进度,老师给的教程总是断断续续的,所以我打算跟11月1号通过考试的网友们一起学习,呵呵,这也是我一教训来着,在三维里学习要坚持一步一个脚印,坚持必有奇迹,但也要跟得上大家,以后再忙也要努力实现计划了,不能再像这次一样,因为所谓的考试落下了好几堂课,不过也没有关系,能够吸取点教训总是好的。
我可以先给自己点时间多学些其它的基础知识。
今天开始学单片机的计数器了,呵呵,可能是一直因为用C语言编程序我定时老是定不准的原因,当得知学会定时/计数器后可以让单片机C语言定时准确后,我感觉学它真的很有动力,虽然编一个简单的程序也花了我好长时间,但编出来的感觉却是那么的爽快,我觉得要学会定时/计数器,关键是要学会编程控制 TCOM,TMOD,及TH和TL吧。
主要是TH和TL的准确运算。
还有就是完时以后怎么样让其跟循环语句配合使用。
今天所编的程序是利用单片机定时器控制LED灯以1S 的速度闪烁,我的晶振是12MHZ的,首先是让计时器0.02S进行一次溢出,使TF1=1,其次是利用I++循环50次,加起来为1S。
程序如下: #include;sbit LED = P1^2;void main(){unsigned char i;TMOD |= 0x10;TMOD &= 0xdf;TH1 = 0xb1;TL1 = 0xdf;TCON |= 0x40;while(1){if(TF1==1){TF1 = 0;TH1 = 0xb1;TL1 = 0xdf;i++;if(i==50){i=0;LED=~LED;}}}}。
用C语言编写程序实现通过按键使LED灯周期闪烁
用C语言编写程序实现通过按键使LED灯周期闪烁(2010-02-24 21:12:44)标签:循环闪烁周期led灯按键杂谈一、设计题目二、程序功能:开机复位后,LED0到LED7全部点亮,所有LEDPort持续2S后熄灭,然后等待按键,按0键LED7以0.8S周期闪烁,按1键LEDPort以1S周期闪烁。
三、总体设计思想用中断方式实现定时器的定时,然后通过键盘中断程序实现通过对按键的操作来实现相应的周期闪烁。
在我编写的实验程序中我用到了定时器中断和外部中断。
程序共分为两个模块,一个为定时器模块,一个为键盘中断程序模块,在主函数中,首先实现所有LEDPort点亮,然后通过中断方式实现定时2S,在定时器num==20时,设定全局变量为标志位flag=1,然后再主函数中设定条件,通过标志位的变化实现所有LEDPort持续2S后熄灭。
然后进入循环,等待按键,在按键中断服务程序中使用switch语句实现通过改变num1的值来实现LED7的闪烁周期。
设定标志位b=0,在主函数中使用if语句通过判断b的值来改变LED7的亮灭情况,同时相应的b值会取反。
四、程序具体实现实验要求开机复位后,LED0到LED7全部点亮2S后熄灭。
在主函数中使用LEDPort=0x00;这条语句实现所有灯都亮,使用中断方式实现定时器定时2S,因为实验要求20ms溢出,所以设定num=100,在定时器中断服务程序中使用if语句判断条件,当num加到100,也就是说2S时间到时,执行flag=1;语句(先设定全局变量flag=0)。
然后在主函数中使用while语句规定只有在flag=0时才执行所有LEDPort点亮的操作。
2S时间到后,所有灯熄灭。
然后进入while循环,等待用户按键。
用户按键后,通过使用switch语句,实验按0键,num1=20,按1键,num1=50,。
而在主函数中,当按下0键或者1键时,num1就有了固定的值,通过if语句判断是否到达所要求的时间后,执行相应操作。
stm32 编程题
stm32 编程题以下是一个简单的STM32编程题,要求实现一个LED闪烁程序:1. 硬件连接:将一个LED灯连接到STM32的GPIO端口上,例如GPIO_PIN_0。
2. 编写程序:使用C语言编写一个简单的STM32程序,实现LED灯的闪烁功能。
具体要求如下:a. 初始化GPIO端口,设置GPIO_PIN_0为输出模式。
b. 循环使LED灯闪烁,每次闪烁时间间隔为1秒。
c. 在程序中添加延时函数,以便控制LED灯的闪烁频率。
以下是一个简单的示例代码:```cinclude ""include "stm32f10x_"include "stm32f10x_"include "stm32f10x_"void delay(uint32_t ms) {TIM3->CNT = 0;TIM3->ARR = ms;TIM3->CR1 = TIM_CR1_CEN;while (TIM3->CNT < ms);}int main(void) {// 初始化GPIO端口和时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStructure;GPIO__Pin = GPIO_Pin_0;GPIO__Mode = GPIO_Mode_Out_PP;GPIO__Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);while (1) {// 点亮LED灯GPIOA->BSRR = GPIO_Pin_0;delay(500); // 延时500毫秒// 熄灭LED灯GPIOA->BSRR = (uint16_t) ~GPIO_Pin_0;delay(500); // 延时500毫秒}}```在这个示例代码中,我们使用TIM3定时器实现了一个简单的延时函数`delay()`,该函数接受一个参数ms,表示需要延时的毫秒数。
c51闪烁一个led灯的程序
/*-----------------------------------------------
内容:点亮P1口的1个LED灯闪烁
该程序是单片机学习中最简单最基础的,
通过程序了解如何控制端口的高低电平
------------------------------------------------*/
//用于改变闪烁频率
L1=1; //将P0.0口赋值1,对外输出高电平
Delay(10000);
//主循环中添加其他需要一直工作的程序
}
}
/*------------------------------------------------
延时函数,含有输入参数unsigned int t,无返回值
unsigned int是定义无符号整形变量,其值的范围是
0~65535பைடு நூலகம்
------------------------------------------------*/
void Delay(unsigned int t)
{
while(--t);
}
#include<reg52.h> //包含头文件,一般情况不需要改动,
//头文件包含特殊功能寄存器的定义
sbit L1=P1^0;//用sbit关键字定义L1到P1.0端口,
//LED是自己任意定义且容易记忆的符号
void Delay(unsigned int t); //函数声明
/*------------------------------------------------
单片机C语言LED灯点亮程序完全版
1例子1第二个灯亮#include<reg52.h>void main(){P1=0xfd;}#include<reg52.h>Sbit D1=P1^0;Void main(){D1=0}注意:稍微改程序时需重新hex化例子2第一个灯亮#include<reg52.h> //52单片机头文件sbit led1=P1^0; //单片机管脚位声明void main() //主函数{led1=0; //将单片机P1.0口清零while(1); //程序停止在这里,在后面会讲到为什么这样写。
}例子3第一个灯亮#include<reg52.h> //52单片机头文件void main() //主函数{P1=0xfe; //将单片机P1口的8个口由高到低分别赋值为11111110 while(1); //程序停止在这里,在后面会讲到为什么这样写。
}2例子1第三个灯闪烁fir循环#include<reg52.h>sbit D2=P1^2;unsigned int a;void main(){D2=0;for(a=0;a<=10000;a++){};D2=1;for(a=0;a<=10000;a++){};}例子2第三个闪烁while循环#include<reg52.h>sbit D2=P1^2;unsigned int a;void main(){a=5000;D2=0;while(a--);a=5000;D2=1;while(a--);}2.#include<reg52.h> //52单片机头文件sbit led1=P1^0; //单片机管脚位声明void main() //主函数{unsigned int i; //定义一个int型变量while(1){i=50000; //变量赋初值为50000led1=0; //点亮灯while(i--); //延时i=50000;led1=1; //熄灭灯while(i--);}}3例子1 3 5 7灯同时亮#include<reg52.h> //52单片机头文件sbit led1=P1^0; //单片机管脚位声明sbit led3=P1^2; //单片机管脚位声明sbit led5=P1^4; //单片机管脚位声明sbit led7=P1^6; //单片机管脚位声明void main() //主函数{led1=0; //将单片机P1.0口清零led3=0; //将单片机P1.2口清零led5=0; //将单片机P1.4口清零led7=0; //将单片机P1.6口清零while(1); //程序停止在这里,在后面会讲到为什么这样写。
汇编按键控制led灯亮灭编写程序 概述
汇编按键控制led灯亮灭编写程序概述1. 引言1.1 概述本文旨在介绍使用汇编语言编写程序,以实现按键控制LED灯亮灭的功能。
通过该实验,我们可以深入了解汇编语言的基本原理和操作方法,并学会将其应用于具体的电路控制中。
1.2 文章结构本文主要分为四个部分,分别是引言、汇编按键控制LED灯亮灭编写程序、程序测试与调试过程及结果分析以及总结和展望。
在引言部分,我们将简要介绍文章的背景和目的,为读者提供整个实验的概览。
接下来的部分将逐步介绍硬件准备工作、程序设计思路、关键代码解读与实现步骤等内容。
随后,我们将介绍测试环境搭建、测试过程记录以及结果分析与优化方案等内容。
最后,在总结和展望部分,我们将对整个实验进行总结,并提出改进方向和未来发展方向。
1.3 目的本文的目的是帮助读者了解如何使用汇编语言编写按键控制LED灯亮灭的程序,通过这一示例项目引导读者熟悉汇编语言的基础知识,并培养其分析和解决问题的能力。
通过实验过程,读者可以了解硬件准备工作、程序设计思路以及测试调试过程,并能够根据实际需求进行结果分析和优化方案的提出。
此外,本文还展望了未来发展方向,希望读者能够在此基础上进一步探索和应用汇编语言的相关知识。
以上是文章“1. 引言”部分的内容,旨在概述本文的背景、结构和目的。
如果需要更加详细的内容,请继续阅读后续章节。
2. 汇编按键控制LED灯亮灭编写程序:2.1 完成硬件准备工作:在开始编写汇编程序之前,首先需要进行硬件准备工作。
我们将使用一个单片机来控制LED灯的亮灭,并通过按键来触发控制操作。
为此,我们需要将LED与单片机的输出引脚连接,并将按键与单片机的输入引脚连接。
确保电路连接正确无误后,我们可以开始进行程序设计。
2.2 程序设计思路:在本部分中,我们将介绍如何使用汇编语言设计一个按键控制LED灯亮灭的程序。
该程序的基本原理是通过检测按键状态来改变LED的亮度状态,即当按键被按下时,LED亮起;当按键未被按下时,LED熄灭。
单片机C语言程序设计实训100例--基于
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//延时
void DelayMS(uint x)
{
uchar i;
while(x--;);
}
}
//主程序
void main()
0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff,
0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,
0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,
0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
单片机 C语言闪烁灯
Void delay() { Unsigned int i,j;
for(i=0;i<1000;i++) for(j=0;j<115;j++); }
总结
For、while循环使用
1s的延时程序
仿真实验
程序的完整性
作业
1
编写C语言程序实 现一个发光二极管 以600ms的时间间 隔闪烁。
2
编写C语言程序实 现一个发光二极管 以1s亮,500ms灭 循环闪烁。
把程序补充完整仿真得到实验结果
#include<reg52.h> void delay( ); sbit led1=P1^0; void main( ) { while(1) { led1=0; Delay( ); led1=1; Delay( ); }
编写编写cc语言程序实现一个发语言程序实现一个发光二极管以光二极管以1s1s的时间间隔闪的时间间隔闪1s的时间控制1s1000ms1ms循环115次指令周期for循环指令周期while循环1ms循环115次cpu处理一条指令的时间for循环ccwhile循环分小组分别用分小组分别用forfor和和whilewhile实现实现115115次次循环空语句的程序循环空语句的程序分小组分别用分小组分别用forfor和和whilewhile实现实现10001000次循环次循环1ms1ms程序语句的程序程序语句的程序1ms循环115次1ms循环115次1s1000msfor循环1ms1mswhile循环voiddelayintvoiddelayinti115
3
仿真得到实验结果
课堂评价
按键控制灯亮灭程序代码
Zigbee模块之间的互相通讯:#include "ZComDef.h"#include "OSAL.h"#include "OSAL_Nv.h"#include "OnBoard.h"#include "ZMAC.h"/* Hal */#include "hal_lcd.h"#include "hal_led.h"#include "hal_adc.h"#include "hal_drivers.h"#include "hal_assert.h"#include "hal_flash.h"// 初始化一些配置/********************************************************************* * MACROS//宏指令*//********************************************************************* * CONSTANTS//常量*/// Maximun number of Vdd samples checked before go on#define MAX_VDD_SAMPLES 3#define ZMAIN_VDD_LIMIT HAL_ADC_VDD_LIMIT_4//工作电压限制/********************************************************************* * TYPEDEFS//典型定义*//********************************************************************* * GLOBAL V ARIABLES//全局变量*//********************************************************************* * EXTERNAL V ARIABLES//外部变量*//********************************************************************* * EXTERNAL FUNCTIONS//外部函数*/extern bool HalAdcCheckVdd (uint8 limit);//外部转换器工作电压检查/********************************************************************* * LOCAL V ARIABLES//局部变量*//********************************************************************* * LOCAL FUNCTIONS//局部函数*/static void zmain_dev_info( void );static void zmain_ext_addr( void );static void zmain_vdd_check( void );#ifdef LCD_SUPPORTEDstatic void zmain_lcd_init( void );#endif/********************************************************************* * @fn main* @brief* @return don't care*/int main( void ){// 关闭中断osal_int_disable( INTS_ALL );// 参数为INTS_ALL则关闭所有中断,否则关闭相应中断// Initialization for board related stuff such as LEDs// 处理器运行时钟,LED IO口设置HAL_BOARD_INIT();// 初始化板子硬件部分// Make sure supply voltage is high enough to run// 确保电源电压足够高来运行zmain_vdd_check();// Initialize board I/O// 初始化I / OInitBoard( OB_COLD );// Initialze HAL drivers// 硬件驱动HalDriverInit();// Initialize NV System // nv系统初始化osal_nv_init( NULL );// Initialize the MAC // 初始化计算机系统ZMacInit();// Determine the extended address// 确定扩展地址zmain_ext_addr();// Initialize basic NV items // 初始化虚拟条目zgInit();#ifndef NONWK// Since the AF isn't a task, call it's initialization routine// 初始化程序afInit();#endif// Initialize the operating system// 初始化操作系统osal_init_system();// Allow interrupts// 允许中断osal_int_enable( INTS_ALL );// Final board initialization// 最终的硬件初始化InitBoard( OB_READY );// Display information about this device// 显示关于这个设备的信息zmain_dev_info();/* Display the device info on the LCD *// 在液晶屏上显示设备信息#ifdef LCD_SUPPORTEDzmain_lcd_init();#endif#ifdef WDT_IN_PM1//如果监视器被占用,这个位置可以启用WatchDogEnable( WDTIMX );#endifosal_start_system();// 操作系统初始化// No Return from here此处无返回return 0; // Shouldn't get here.// 禁止到达这里} // main()/********************************************************************* * @fn zmain_vdd_check * @brief Check if the Vdd is OK to run the processor.* @return Return if Vdd is ok; otherwise, flash LED, then reset*********************************************************************/static void zmain_vdd_check( void )// 确认VDD是否达到运行处理器的要求,如果没有达到就会闪烁LED{uint8 vdd_passed_count = 0;bool toggle = 0;// Repeat getting the sample until number of failures or successes hits MAX// 重复检测VDD的状态,直到成功检测的次数达到规定过的要求为止,估计是等电源稳定// then based on the count value, determine if the device is ready or not// 然后根据计算值,确定设备是否准备好while ( vdd_passed_count < MAX_VDD_SAMPLES )//工作电压最大值校验{if ( HalAdcCheckVdd (ZMAIN_VDD_LIMIT) )//转换器电压{vdd_passed_count++; // Keep track # times Vdd passes in a row计算通过的电压MicroWait (10000); // 延时10毫秒else{vdd_passed_count = 0; //重置通过的电压MicroWait (50000); / / 延时50毫秒MicroWait (50000); // 50毫秒后再次尝试//HalAdcCheckVdd ()【hal_adc.c】函数用来检查VDD是否大于或等于最小的要求./* toggle LED1 and LED2 *// 切换LED1、LED2if (vdd_passed_count == 0){if ((toggle = !(toggle)))HAL_TOGGLE_LED1();elseHAL_TOGGLE_LED2();}}/* turn off LED1 关闭LED1HAL_TURN_OFF_LED1();HAL_TURN_OFF_LED2();}/********************************************************************** ***************************** @fn zmain_ext_addr** @brief Execute a prioritized search for a valid extended address and write the results* into the OSAL NV system for use by the system. Temporary address not saved to NV.** input parameters** None.** output parameters** None.** @return None.*************************************************************************** */static void zmain_ext_addr(void)//静态的外部地址扩展{uint8 nullAddr[Z_EXTADDR_LEN] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};uint8 writeNV = TRUE;//将8位数位写入虚拟化层// First check whether a non-erased extended address exists in the OSAL NV.// 检查非扩展地址是否存在于操作虚拟化层if ((SUCCESS != osal_nv_item_init(ZCD_NV_EXTADDR, Z_EXTADDR_LEN, NULL)) ||(SUCCESS != osal_nv_read(ZCD_NV_EXTADDR, 0, Z_EXTADDR_LEN, aExtendedAddress)) ||(osal_memcmp(aExtendedAddress, nullAddr, Z_EXTADDR_LEN))) {// 尝试阅读扩展地址的位置锁位页面// 确定编程工具位置HalFlashRead(HAL_FLASH_IEEE_PAGE, HAL_FLASH_IEEE_OSET, aExtendedAddress, Z_EXTADDR_LEN);if (osal_memcmp(aExtendedAddress, nullAddr, Z_EXTADDR_LEN)){// 尝试阅读扩展地址从指定的位置信息页面if (!osal_memcmp((uint8 *)(P_INFOPAGE+HAL_INFOP_IEEE_OSET), nullAddr, Z_EXTADDR_LEN)){osal_memcpy(aExtendedAddress, (uint8 *)(P_INFOPAGE+HAL_INFOP_IEEE_OSET), Z_EXTADDR_LEN);}else // No valid extended address was found.// 没有发现有效的扩展地址{uint8 idx; // 8位的变址寻址#if !defined ( NV_RESTORE )writeNV = FALSE; // 如果写入错误,使用临时的地址#endif/* Attempt to create a sufficiently random extended address for expediency.// 尝试创建一个完全随机扩展地址* Note: this is only valid/legal in a test environment and* must never be used for a commercial product.// 有效的地址永远不会被占用*/for (idx = 0; idx < (Z_EXTADDR_LEN - 2);){uint16 randy = osal_rand();aExtendedAddress[idx++] = LO_UINT16(randy); // 16位的振荡寻址aExtendedAddress[idx++] = HI_UINT16(randy);}// 接下来建立无线局域网#if defined ZDO_COORDINATORaExtendedAddress[idx++] = 0x10;#elif defined RTR_NWKaExtendedAddress[idx++] = 0x20;#elseaExtendedAddress[idx++] = 0x30;#endif// MSB has historical signficance.aExtendedAddress[idx] = 0xF8;}}if (writeNV){(void)osal_nv_write(ZCD_NV_EXTADDR, 0, Z_EXTADDR_LEN, aExtendedAddress);}}// 定义16进制的地址位,根据上面结果设置扩展后的地址(void)ZMacSetReq(MAC_EXTENDED_ADDRESS, aExtendedAddress);}/********************************************************************** * @fn zmain_dev_info** @brief This displays the IEEE (MSB to LSB) on the LCD.** input parameters** None.** output parameters** None.** @return None.*************************************************************************** */static void zmain_dev_info(void){#ifdef LCD_SUPPORTEDuint8 i;uint8 *xad;uint8 lcd_buf[Z_EXTADDR_LEN*2+1];// Display the extended address.// 显示扩展地址xad = aExtendedAddress + Z_EXTADDR_LEN - 1;for (i = 0; i < Z_EXTADDR_LEN*2; xad--){uint8 ch;ch = (*xad >> 4) & 0x0F;lcd_buf[i++] = ch + (( ch < 10 ) ? '0' : '7');ch = *xad & 0x0F;lcd_buf[i++] = ch + (( ch < 10 ) ? '0' : '7');}lcd_buf[Z_EXTADDR_LEN*2] = '\0';HalLcdWriteString( "IEEE: ", HAL_LCD_LINE_1 );HalLcdWriteString( (char*)lcd_buf, HAL_LCD_LINE_2 );#endif}#ifdef LCD_SUPPORTED/********************************************************************* * @fn zmain_lcd_init* @brief Initialize LCD at start up.* @return none*********************************************************************/ static void zmain_lcd_init ( void ){#ifdef SERIAL_DEBUG_SUPPORTED{HalLcdWriteString( "TexasInstruments", HAL_LCD_LINE_1 );#if defined( MT_MAC_FUNC )#if defined( ZDO_COORDINATOR )HalLcdWriteString( "MAC-MT Coord", HAL_LCD_LINE_2 );#elseHalLcdWriteString( "MAC-MT Device", HAL_LCD_LINE_2 );#endif // 设备对象#elif defined( MT_NWK_FUNC )#if defined( ZDO_COORDINATOR ) //协调HalLcdWriteString( "NWK Coordinator", HAL_LCD_LINE_2 ); //网络层协调#elseHalLcdWriteString( "NWK Device", HAL_LCD_LINE_2 );#endif // ZDO#endif // MT_FUNC}#endif // SERIAL_DEBUG_SUPPORTED// 序列号调试}#endif/********************************************************************* *********************************************************************/仅供个人用于学习、研究;不得用于商业用途。
使用按键自动控制LED闪烁及蜂鸣器鸣叫—LED闪烁与蜂鸣器鸣叫程序编写
本次任务与前面所使用的按键控制LED灯亮灭有什么区别?
2 工作任务
(1)第一次按下按钮,LED灯持续闪亮,蜂鸣器鸣叫 (2)第二次按下按钮,LED灯熄灭,蜂鸣器停止鸣叫; (3)以后根据按键次数一直重复步骤1和2的现象。
3 知识准备: 蜂鸣器
1、作用:蜂鸣器是一种一体化结构的电子讯响器,广泛 应用于计算机、打印机、复印机、报警器、电话机等电 子产品中作发声器件
int main()
{int num=0;
//按键次数记录(初值赋0)
while ( 1 )
{if( k==0)
{delay(1000);
//延时重新判断按键是否按下,
延时消除抖动
if( k==0)
{num++;
if(num==1) flasher ();
buzzer();
if(num==2)num=0;
#define uint unsigned int
#define uchar unsigned char
sbit k=P1^1;
//定义P1.1引脚名为独立按键k
sbit led=P1^0;
//定义P1.0引脚名led
sbit buzzer=P2^0;
//定义P2.0引脚名为buzzer
/*延时函数*/
5
编写程序
(1)任务分析
① 程序流程图
说明:因为按一次为奇 数次点亮和鸣叫,按第 二次为偶数次熄灭和停 止鸣叫,以后一直循环, 所以可以通过判断按键 次数是奇数还是偶数来 控制LED灯和蜂鸣器
② 端口分配
单片机端口
驱动模块端口
P1.0
LED1
LED灯闪烁程序
的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,
即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0
端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。
5.程序框图
如图4.1.2所示
movr72482224849820djnzr7个机器周期?2248498djnzr6d1个机器周期?2204010002?因此上面的延时?程序时间为?10002ms?r610r7248时延时5msr620r7248延时10ms以此为基本?的计时单位?
1.闪烁灯程序
MOV R6,#20 2个机器周期2
}
void main(void)
{
while(1)
{
L1=0;
delay02s();
4
L1=1;
delay02s();
}
}
D1: MOV R7,#248 2个机器周期2 2+2×248=498 20×
DJNZ R7,$ 2个机器周期2×248 498
DJNZ R6,D1 2个机器周期10.002ms。
由以上可知,当R6=10、R7=248时,延时5ms,R6=20、R7=248时,
延时10ms,以此为基本的计时单位。如本实验要求0.2秒=200ms,
10ms×R5=200ms,则R5=20,延时子程序如下:
DELAY: MOV R5,#20
D1: MOV R6,#20
D2: MOV R7,#248
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
(2).输出控制
单片机C语言LED灯点亮程序完全版
1例子1第二个灯亮之答禄夫天创作#include<reg52.h>void main(){P1=0xfd;}#include<reg52.h>Sbit D1=P1^0;Void main(){D1=0}注意:稍微改法式时需重新hex化例子2第一个灯亮#include<reg52.h> //52单片机头文件sbit led1=P1^0; //单片机管脚位声明void main() //主函数{led1=0;//将单片机P1.0口清零while(1); //法式停止在这里,在后面会讲到为什么这样写.}例子3第一个灯亮#include<reg52.h> //52单片机头文件void main() //主函数{P1=0xfe; //将单片机P1口的8个口由高到低分别赋值为11111110while(1); //法式停止在这里,在后面会讲到为什么这样写.}2例子1第三个灯闪烁fir循环#include<reg52.h>sbit D2=P1^2;unsigned int a;void main(){D2=0;for(a=0;a<=10000;a++){};D2=1;for(a=0;a<=10000;a++){};}例子2第三个闪烁while循环#include<reg52.h>sbit D2=P1^2;unsigned int a;void main(){a=5000;D2=0;while(a--);a=5000;D2=1;while(a--);}2.#include<reg52.h> //52单片机头文件sbit led1=P1^0; //单片机管脚位声明void main() //主函数{unsigned int i; //界说一个int型变量while(1){i=50000; //变量赋初值为50000led1=0;//点亮灯while(i--); //延时i=50000;led1=1; //熄灭灯while(i--);}}3例子1 3 5 7灯同时亮#include<reg52.h> //52单片机头文件sbit led1=P1^0; //单片机管脚位声明sbit led3=P1^2; //单片机管脚位声明sbit led5=P1^4; //单片机管脚位声明sbit led7=P1^6; //单片机管脚位声明void main() //主函数{led1=0;//将单片机P1.0口清零led3=0;//将单片机P1.2口清零led5=0;//将单片机P1.4口清零led7=0;//将单片机P1.6口清零while(1); //法式停止在这里,在后面会讲到为什么这样写.}例子2 1 3 5 7同时亮#include<reg52.h> //52单片机头文件void main() //主函数{P1=0xaa; //将单片机P1口的8个口由高到低分别赋值为10101010while(1); //法式停止在这里,在后面会讲到为什么这样写.}例子3流水灯一个一个接着亮不循环#include<reg52.h> //52单片机头文件void main() //主函数{unsigned int i; //界说一个int型变量while(1){i=50000; //变量赋初值为50000P1=0xfe;//点亮第一个灯while(i--); //延时i=50000; //变量赋初值为50000P1=0xfd;//点亮第二个灯while(i--); //延时i=50000; //变量赋初值为50000P1=0xfb;//点亮第三个灯while(i--); //延时i=50000; //变量赋初值为50000 P1=0xf7;//点亮第四个灯while(i--); //延时i=50000; //变量赋初值为50000 P1=0xef;//点亮第五个灯while(i--); //延时i=50000; //变量赋初值为50000 P1=0xdf;//点亮第六个灯while(i--); //延时i=50000; //变量赋初值为50000 P1=0xbf;//点亮第七个灯while(i--); //延时i=50000; //变量赋初值为50000 P1=0x7f;//点亮第八个灯while(i--); //延时}}例子4#include<reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char uchar temp,num,num1;sbit beep=P2^3;void delay(uint);void main(){temp=0xfe;while(1){for(num1=0;num1<3;num1++){for(num=0;num<8;num++){P1=temp;beep=0;delay(100);temp=_crol_(temp,1);P1=0xff;beep=1;delay(100);}}for(num1=0;num1<3;num1++) {for(num=0;num<8;num++){P1=temp;beep=0;delay(100);temp=_cror_(temp,1);P1=0xff;beep=1;delay(100);}}while(1);}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}4延时子法式void delay(){uint x;for(x=100;x>0;x--){};}For的嵌套void delay(){uint x,y; %局部变量for(x=100;x>0;x--) %小括号后不加分号for(y=600;y>0;y--); %小括号后的分号暗示该语句是上一条语句的,分号将该句与下句隔开(或者{for(y=600;y>0;y--);})#include<reg52.h>例子1#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit D1=P1^0;void delay(); %注意分号不能少void main(){while(1){D1=0;delay();D1=1;delay();}}void delay(){uint x,y;for(x=100;x>0;x--)for(y=600;y>0;y--);}带参数的比不带参数的要方便例子2无参和有参的比较#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit D1=P1^0;//void delay();void delay(uint);%带一个参数的,参数类型必需要写,参数可不写.比如可以写成uint z.也可以带多个参数void main()while(1){D1=0;delay(1200);%亮2秒D1=1;delay(1200);}}/*void delay(){uint x,y;for(x=100;x>0;x--) for(y=600;y>0;y--); }*/void delay(uint z) {uint x;uchar y;for(x=z;x>0;x--)for(y=20;y>0;y--);例子3#include<reg52.h>#define uint unsigned int #define uchar unsigned char sbit D1=P1^0;void delay(uint);void main(){while(1){D1=0;delay(1200);D1=1;delay(1200);}}void delay(uint z){uint x;uchar y;for(x=z;x>0;x--)for(y=20;y>0;y--);5循环左移三位如10100101(a5)-00101101(2d)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
熟悉ARM程序开发的一般流程,掌握编译器和链接器的选项设置,以及观察在编译链接后,程序中各种符号,子程序和段所在的ARM内存空间中的地址,最终使程序能够从起始的汇编代码跳到C程序的main()函数中去运行。
开发工具:
ADS
1.2
源代码:
分两个文件,init.s和Main.c,具体在文后列出。
while(!key);
switch(keynumber){case 0:num1=20;break;
case 1:num1=50;break;
default:
break;}}
void main(void){b=0;
Init();
Time0_Init();
EA=1;
while(!flag)
{ LEDPort=0x00; }
出现的问题和解决办法:
1、刚开始编译不通过,后来发现在汇编语句中,delay标号没有顶格书写。
2、程序下载进RAM后大多数情况下无法正常运行(偶尔也能成功),总是跳进SWI异常处理中去,而且在Debug Log窗口中提示“Can't set more breakpoint”,刚开始以为真的是断点设多了,虽然我自己并没有设置断点,但以为是AXD自动设置的,于是在AXD的Configure Processor选项卡中,去掉了所有的勾勾,可问题依然存在;后来又以为是没有定义ARM中断跳转和其他模式下的堆栈的缘故,但加进了相关语句后还是没有解决问题!为了这个问题我抓掉了好几根头发,终于在崩溃之前找到了原因所在,原来是在开发板上把ARM设置成了从NANDFLASH启动!其实这本来也没什么错,但问题是我的开发板上已经预装了Win CE系统,于是乎,冲突就这样发生了!解决办法有两个,一是擦除Win CE系统,二是拨动板子上的一个开关,使ARM从NOR FLASH启动。我当然选择后者。
while
(1) /*不断的循环*/{if((rGPFDAT&0x0002)==0) /*检测按键S4是否按下*/{rGPBDAT=0xfc; /*使GPB0输出高电平,GPB1输出低电平,LED3灯会灭,LED4灯会亮*/
delay(0xff); /*调用汇编延迟函数*/
rGPBDAT=0x03; /*使GPB0输出低电平,GPB1输出高电平LED3灯会亮,LED4灯会灭*/
;下面是延迟子程序
EXPORT delay
delay
sub r0,r0,#1 ;r0=r0-1
cmp r0,#0x0 ;将r0的值与0相比较
bne delay ;比较的结果不为0(r0不为0),继续调用delay,否则执行下一条语句
mov pc,lr ;返回
END ;程序结束符
************************************************************************************
extern int delay(int time); /*声明汇编函数*/
void Main(){rGPFCON=0x0; /*设置I/O口的GPF1为输入*/
rGPFUP=0xff; /*禁止GPF端口的上拉*/
rGPBCON=0x0005; /*设置I/O口GPB0,GPB1为输出属性*/
rGPBUP=0xff; /*禁止GPB端口的上拉*/
/*PORT F寄存器预定义*/
#define rGPFCON (*(volatile unsigned *)0x560050)
#define rGPFDAT (*(volatile unsigned *)0x560054)
#define rGPFUP (*(volatile unsigned *)0x560058)
选项设置:
在ARM Assembler和ARM C Complier中的Architecture orProcessor选择ARM920T;在ARM Linker的Output选项卡,RO base设置成0x31000,RWbase可以为空(这个选项在仿真调试阶段可以空着,但若要烧入FLASH中运行,则必须设置);另外为了观察程序中各种符号,子程序和段所链接的地址,又在ARMLinker的Listings选项卡中,勾上了Image Map和Symbols
sbit ad_busy = P3^2;
sbit key=P3^3;
uchar num;
uchar num1;
bit b;
uchar flag=0;
uchar keynumber;
#define LEDPort XBYTE[0x9000] //
void Init(void){IE|=0x04;
TCON=0x01;}void Time0_Init(void)端口地址{TMOD|=0x01;
TH0=0xB8;
TL0=0x00;
ET0=1;
TR0=1;}void Time0(void) interrupt 1{TH0=0xB8;
TL0=0x00;
num++;
if(num==100)
flag=1;}void ISR_INT1(void) interrupt 2
{ keynumber=Read7279();
LEDPort=0xff;
num=0;
while
(1){if(num==num1)
{ if(b)
{LEDPort=0x7f;b=0;}
else
{ LEDPort=0xff;b=1;}}} num=0;}LED和按键控制实验在我刚买ARM开发板时,曾经一共做过4次实验,写过4个程序(距今似乎快要一年了),具体为:
以上这些程序都是用ADS
1.2编译链接的,其实说穿了就是把ARM当成单片机在用!现在公布其中一个实验:
按键控制实验。
对于LED实验,就不再单独叙述了,因为实在太简单了,而且现在这个程序已经完全包含了LED实验所涉及到的一切东东!
实验说明:
用按键S4控制LED3和LED4的亮灭:
按下S4不动时,LED3和LED4同时闪烁点亮,放开S4后,LED3和LED4同时熄灭。
四、程序具体实现
实验要求开机复位后,LED0到LED7全部点亮2S后熄灭。在主函数中使用LEDPort=0x00;这条语句实现所有灯都亮,使用中断方式实现定时器定时2S,因为实验要求20ms溢出,所以设定num=100,在定时器中断服务程序中使用if语句判断条件,当num加到100,也就是说2S时间到时,执行flag=1;语句(先设定全局变量flag=0)。然后在主函数中使用while语句规定只有在flag=0时才执行所有LEDPort点亮的操作。2S时间到后,所有灯熄灭。然后进入while循环,等待用户按键。用户按键后,通过使用switch语句,实验按0键,num1=20,按1键,num1=50,。而在主函数中,当按下0键或者1键时,num1就有了固定的值,通过if语句判断是否到达所要求的时间后,执行相应操作。在本实验中,要求实现LED7的周期闪烁,我先设定一个标志位b=0;默认LED7灭,;然后在主函数中在定时时间到达
后,通过判断和改变b的值来实现LED7的亮灭情况。然后使num=0;使定时器继续从新定时,不停循环实现LED7的周期闪烁。
程序附录:
#include<reg
52.h>
#include<absacc.h>
#include"
7279.h"
#define uchar unsigned char
#define uint unsigned int
用
(2010-02-24 21:12:44)标签:
循环闪烁周期led灯按键杂谈
一、设计题目
二、程序功能:
开机复位后,LED0到LED7全部点亮,所有LEDPort持续2S后熄灭,然后等待按键,按0键LED7以
0.8S周期闪烁,按1键LEDPort以1S周期闪烁。
三、总体设计思想
用中断方式实现定时器的定时,然后通过键盘中断程序实现通过对按键的操作来实现相应的周期闪烁。
init.s:
AREA Init,CODE,READONLY ;该伪指令定义了一个代码段,段名为Init,属性只读
ENTRY ;程序的入口点标识
EXPORT __ENTRY
__ENTRY
ResetEntry
mov sp,#0x0c7000 ;定义堆栈指针
IMPORT Main ;声明主函数Main
BL Main ;调用主函数
Main.c:
/*C语言函数
*/
/*PORT B寄存器预定义*/
#define rGPBCON (*(volatile unsigned *)0x560010)
#define rGPBDAT (*(volatile unsigned *)0x560014)
#define rGPBUP (*(volatile unsigned *)0x560018)
实验总结:
为了上面所说的第二个问题,花了我不少时间,但也正是因为这个问题的出现,使得我对ADS的很多“冷门”的选项设置,也彻底研究了一遍,另外还迫使我去看了ADS
1.2自带的文档Build Tools-Warning and Errors,为以后快速地定位和解决程序中的错误打下了基础。
程序代码如下:
delay(0xff); /*调用汇编延迟函数*/}else{rGPBDAT=0xff;}}}
1、LED控制实验:
使开发板上的LED3和LED4交替着亮灭
2、按键控制实验:
用按键控制开发板xxLED的亮灭
3、串口UABiblioteka T通信实验:用ARM的串口与PC机进行通信,包括发送和接收
4、LCD显示实验: