任务5:流水灯的控制(3-5 C语言基本数据和运算)
- 格式:doc
- 大小:114.00 KB
- 文档页数:5
说了这么多了,相信你也看了很多资料了,手头应该也有必备的工具了吧!(不要忘了上面讲过几个条件的哦)。
那个单片机究竟有什么功能和作用呢?先不要着急!接下来让我们点亮一个LED(搞电子的应该知道LED是什么吧^_^)我们在单片机最小系统上接个LED,看我们能否点亮它!对了,上面也有好几次提到过单片机最小系统了,所谓单片机最小系统就是在单片机上接上最少的外围电路元件让单片机工作。
一般只须连接晶体、VCC、GND、RST即可,一般情况下,AT89C51的31脚须接高电平。
#include<reg51.h> //头文件定义。
或用#include<at89x51.h>其具体的区别在于:后者定义了更多的地址空间。
//在Keil安装文件夹中,找到相应的文件,比较一下便知!sbit P1_0 = P1 ^ 0; //定义管脚void main (void){while(1){P1_0 = 0;//低电平有效,如果把LED反过来接那么就是高电平有效}}就那么简单,我们就把接在单片机P1_0上的LED点亮了,当然LED是低电平,才能点亮。
因为我们把LED的正通过电阻接至VCC。
P1_0 = 0; 类似与C语言中的赋值语句,即把0 赋给单片机的P1_0引脚,让它输出相应的电平。
那么这样就能达到了我们预先的要求了。
while(1)语句只是让单片机工作在死循环状态,即一直输出低电平。
如果我们要试着点亮其他的LED,也类似上述语句。
这里就不再讲了。
点亮了几个LED后,是不是让我们联想到了繁华的街区上流动的彩灯。
我们是不是也可以让几个LED依次按顺序亮呢?答案是肯定的!其实显示的原理很简单,就是让一个LED灭后,另一个立即亮,依次轮流下去。
假设我们有8个LED分别接在P1口的8个引脚上。
硬件连接,在P1_1--P1_7上再接7个LED即可。
例程如下:#include<reg51.h>sbit P1_0 = P1 ^ 0;sbit P1_1 = P1 ^ 1;sbit P1_2 = P1 ^ 2;sbit P1_3 = P1 ^ 3;sbit P1_4 = P1 ^ 4;sbit P1_5 = P1 ^ 5;sbit P1_6 = P1 ^ 6;sbit P1_7 = P1 ^ 7;void Delay(unsigned char a){unsigned char i;while( --a != 0){for(i = 0; i < 125; i++); //一个; 表示空语句,CPU空转。
五种编程方式实现流水灯的单片机C程序流水灯是一种常见的灯光效果,常用于装饰和展示。
实现流水灯的程序可以使用多种不同的编程方式,包括传统的顺序编程、状态机编程、中断编程、调度器编程和面向对象编程。
下面分别介绍这五种方式实现流水灯的程序。
1.顺序编程方式:顺序编程是最常见的编程方式,也是最直接的方式。
下面是使用顺序编程方式实现流水灯的C程序:```c#include <reg52.h>void delay(unsigned int t)while(t--)for(int i=0; i<50; i++);}void mainunsigned char led = 0x80; // 初始灯光状态while(1)P0 = led; // 输出灯光状态delay(500); // 延时一段时间led >>= 1; // 右移一位,实现流水灯效果if(led == 0) // 到达最右边后重新开始led = 0x80;}}```2.状态机编程方式:状态机编程是一种基于状态的编程方式,通过定义不同的状态和状态转换来实现流水灯效果。
下面是使用状态机编程方式实现流水灯的C程序:```c#include <reg52.h>typedef enumState1,State2,State3,State4,State5} State;void delay(unsigned int t)while(t--)for(int i=0; i<50; i++);}void mainState state = State1; // 初始状态为State1 while(1)switch(state)case State1:P0=0x80;delay(500);state = State2;break;case State2:P0=0x40;delay(500);state = State3;break;case State3:P0=0x20;delay(500);state = State4;break;case State4:P0=0x10;delay(500);state = State5;break;case State5:P0=0x08;delay(500);state = State1;break;}}```3.中断编程方式:中断编程方式是一种基于中断事件的编程方式,通过在特定的中断事件触发时改变灯光状态来实现流水灯效果。
单片机实验报告姓名: 学号:一、 实验实现功能:1:计数器功能2:流水灯二、 具体操作:1、计数器功能数码管的动态显示。
每按一次K2键计数器加1通过数码管显示出来,计数器可以实现从0计数到9999。
2、流水灯当在计数器模式下的时候按下K3键时程序进入跑马灯模式,8个小灯轮流点亮每次只点亮一个,间隔时间为50ms 。
三、 程序流程图开始 定时器T0 设置初值,启动定时器,打开中断复位 Key2按下 中断关闭 计数器模式 计数器加1 Key3按下 流水灯模式 数码管显示数字加1 跑马灯点亮间隔50ms Key1按下中断打开四、程序#include <reg51.h>typedef unsigned char uint8;typedef unsigned int uint16; //类型定义sbit P2_1 = P2^1;sbit P2_2 = P2^2;sbit P2_3 = P2^3;sbit P2_4 = P2^4; //位声明四个数码管开关sbit Key2 = P3^2;sbit Key3 = P3^3; //位声明2个按键K2和K3sbit Ledk = P2^0 ; //LED 开关void delay(uint16 i); //延时函数声明void refresh (); // 数码管刷新函数声明void liushuideng(); //流水灯函数声明uint8 number[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//数码管的真值表uint8 out[4] = {0}; // 数组变量uint16 counter=0; //用作计数器的变量uint16 Time_counter=0; //用作定时器的变量void main() //主函数{TMOD = 0x01; //定时器0,工作方式一TH0 = 0xFC;TL0 = 0x18; //定时器初值使每次循环为1msTR0 = 0; //定时器0开始作ET0 = 0; // 定时器中断关EA = 0; // 关中断while(1) //计数器模式{Ledk =1 ; //led开关关out[0]=number[counter%10]; //取个位out[1]=number[counter%100/10]; //十位out[2]=number[counter%1000/100]; //百位out[3]=number[counter/1000]; //千位if (!Key2) //计数器加1{++counter; //自加out[0]=number[counter%10]; //取个位out[1]=number[counter%100/10]; //十位out[2]=number[counter%1000/100]; //百位out[3]=number[counter/1000]; //千位while(!Key2) //等待键盘抬起refresh(); //刷新数码管}refresh(); //刷新数码管if (!Key3) // 进入跑马灯模式liushuideng();}} //主函数结束/*******************延时*************/void delay(uint16 i){uint8 j; // 定义局部变量for(i;i>0;i--) //循环i*240 次for(j=240;j>0;j--);}/************数码管刷新******************/void refresh (){uint8 j;for (j=0;j<4;j++) //四次循环刷新数码管{switch(j){case 0: P2_1=1;P2_2=1;P2_3=1;P2_4=0;break;case 1: P2_1=1;P2_2=1;P2_3=0;P2_4=1;break;case 2: P2_1=1;P2_2=0;P2_3=1;P2_4=1;break;case 3: P2_1=0;P2_2=1;P2_3=1;P2_4=1;break;//每次循环只选中一个数码管default:break;}P0 = out[j]; // 位选,给数码管送值delay (20); //延时消抖}}/*************定时器的中断服务函数**************/void Timer0_Overflow() interrupt 1 //定时器0溢出中断,这个语句1ms执行一次{TH0 = 0xFC;TL0 = 0x18; //每1ms重新赋定时器初值Time_counter++; //计数,看经过了几个1ms}/***********************流水灯子函数****************************/ void liushuideng(){uint8 j = 0 ; //定义局部变量P0 = 0xff; // 小灯全关TR0 = 1; //定时器1开始计时EA = 1; //中断开放ET0 = 1; //定时器0中断开while(1){Ledk = 0 ; //打开LED开关P2 = P2|0x1E; //关掉数码管if(50 == Time_counter) //50个毫秒{P0=~(1<<j++); //控制小灯Time_counter = 0; //清零开始下一次循环定时}if (8==j) //移完8次再重新移{j=0;}}}。
《电子与控制系统设计》实验报告实验项目名称:LED灯的移动控制指导老师:元泽怀完成时间:2015年9月22日姓名:刘文开班级:12 电气 1班学号:201224122116成绩:电子信息与机电工程学院编制实验项目LED 灯的移动控制验证实验项目类型演示综合设计其他*一、实验目的1.熟悉 IO 接口的设置与应用;2.进一步熟悉编译软件和下载软件的使用;3.熟悉单片机 C 语言中移位、延时、数组等语句的应用;4.熟悉单片机 C 语言开发过程。
二、实验内容1.编写一程序,实现如下功能:每按一次S1 键,8 个发光二极管顺序点亮1 个;同样每按下 S2 键一次, 8 个发光二极管逆序点亮 1 个,实验电路原理图如下图 1所示。
实现发光二极管循环点亮的按键控制。
2. 设计一个完整程序(另建一个project),实现8个led灯的自动顺序(加法)点亮和逆序(减法)点亮。
图 1 实验原理图三、使用仪器设备及材料1、安装 windows xp 操作系统的微型计算机 1 台2、AVR单片机 C语言集成开发环境ICCAVR6.31A3、单片机仿真平台proteus7.54、AVR单片机下载软件progisp5、AVR单片机实验板 1 套(含下载器)四、实验过程原始记录1、硬件仿真电路( 1)在实验室电脑 E 盘“ 12 电气 1 班刘文开”文件夹里新建一个文件名为“ test1 ”的文件夹。
(2)打开 protues 仿真软件,根据图 1 设计出试验仿真图,命名为“test1.DSN ”保存到上述“ test 的文件夹里”。
U19RESET PC0/SCL 22 23PC1/SDA1224XTAL1PC2/TCK1325XTAL2PC3/TMS26PC4/TDO4027PA0/ADC0PC5/TDI3928PA1/ADC1PC6/TOSC13829PA2/ADC2PC7/TOSC237PA3/ADC33614PA4/ADC4PD0/RXD3515PA5/ADC5PD1/TXD3416PA6/ADC6PD2/INT03317 U2PA7/ADC7PD3/INT118PD4/OC1B 120119PB0/T0/XCK PD5/OC1A 219220PB1/T1PD6/ICP1 318321PB2/AIN0/INT2PD7/OC2 4174PB3/AIN1/OC05165PB4/SS6156PB5/MOSI714732PB6/MISO AREF 813830PB7/SCK AVCC9121011ATMEGA16LED-BARGRAPH-RED图 2实验仿真电路图9U122 RESET PC0/SCL23PC1/SDA1224XTAL1PC2/TCK1325XTAL2PC3/TMS26PC4/TDO4027PA0/ADC0PC5/TDI3928PA1/ADC1PC6/TOSC13829PA2/ADC2PC7/TOSC237PA3/ADC33614PA4/ADC4PD0/RXD3515PA5/ADC5PD1/TXD3416PA6/ADC6PD2/INT03317 U2PA7/ADC7PD3/INT118PD4/OC1B 120119PB0/T0/XCK PD5/OC1A 219220PB1/T1PD6/ICP1 318321PB2/AIN0/INT2PD7/OC24174PB3/AIN1/OC05165PB4/SS6156PB5/MOSI714732PB6/MISO AREF 813830PB7/SCK AVCC9121011ATMEGA16LED-BARGRAPH-RED图 3 实验仿真电路图2、程序流程图(1) .LED 控制移动流程图:开始初始化、定义I/O 端口YNS1 按下?Y计数器 counter++Counter>8?Y第一个 LED灯点亮是否有按键按Y下?S2 按下?Y计数器 counter--Counter<0?N Y最后一个下一个 LED灯点亮LED 灯点亮N上一个 LED灯点亮2).LED 自动循环流程图:开始初始化、定义I/O 口i = 0i = i+1Ni<8?YPORTB=~(1<<i)3、软件主要程序及注解(1).移动控制程序:#include <iom16v.h>#define uchar unsigned char#define uint unsigned intuchar temp;//*******延时函数 ********//void delay_ms(uint k){i = i - 1Ni>0?Y PORTB=~(1<<i-1)uint i,j;for(i=0;i<k;i++){for(j=0;j<1140;j++);}}//*****************端口设置函数********************// void port_init(void) {DDRB = 0xFF; //B端口设置为输出PORTD = 0XFF; //输出高电平DDRD = 0x00;//D PORTD = 0XFF; //端口设置为输入输出高电平}//*********主函数 *********//void main(void){char counter=0; // port_init();while(1)计数器//调用端口函数{if((PIND&0x10)==0){if(++counter>8) counter=1; delay_ms(300);}if((PIND&0x20)==0){counter = counter--;if(--counter<1) counter=8; delay_ms(300);}switch(counter){case 1: PORTB=0xfe;break;case 2: PORTB=0xfd;break;case 3: PORTB=0xfb;break;case 4: PORTB=0xf7;break;case 5: PORTB=0xef;break;case 6: PORTB=0xdf;break;case 7: PORTB=0xbf;break;case 8: PORTB=0x7f;break;default:break;}}}(2).自动循环程序:#include <iom16v.h>#define uchar unsigned char#define uint unsigned int//**********延时函数 **********//void delay_ms(uint k){uint i,j;for(i=0;i<k;i++){for(j=0;j<1140;j++);}}//*****************端口设置函数********************// void port_init(void) {DDRB = 0xFF; //B端口设置为输出PORTD = 0XFF; //输出高电平DDRD = 0x00;//D PORTD = 0XFF; //端口设置为输入输出高电平}//*********主函数 *********// void main(void){unsigned char i;char counter=0; // port_init(); //计数器调用端口函数while(1){for(i=0;i<8;i++){PORTB =~(1<<i);delay_ms(200);}for(i=8;i>0;i--){PORTB =~(1<<i-1);delay_ms(200);}}}五、实验结果及分析先使用 ICCAVR编译修改老师的程序,由移动控制到自动循环控制,程序的主旨不改变,大家一起交流,相互改进。
流水灯C语言程序流水灯是一种常见的电子显示效果,通常用于展示灯光的流动效果。
在C语言中,我们可以通过控制单片机的IO口来实现流水灯的效果。
以下是一个标准格式的C语言程序,用于实现流水灯效果。
```c#include <stdio.h>#include <stdlib.h>#include <unistd.h>#define LED_COUNT 8 // 流水灯的数量#define DELAY_MS 500 // 每一个灯亮起的延迟时间(毫秒)int main() {int leds[LED_COUNT] = {0}; // 存储每一个灯的状态,0表示灭,1表示亮 int i, j;while (1) {// 灯往右挪移for (i = LED_COUNT - 1; i > 0; i--) {leds[i] = leds[i - 1];}leds[0] = 1;// 输出灯的状态for (i = 0; i < LED_COUNT; i++) {if (leds[i]) {printf("*"); // 亮的灯用*表示} else {printf(" "); // 灭的灯用空格表示}}printf("\n");// 延迟一段时间usleep(DELAY_MS * 1000);// 清空屏幕system("clear");}return 0;}```上述程序使用了C语言的基本语法和系统函数,实现了一个简单的流水灯效果。
程序中的`LED_COUNT`表示流水灯的数量,可以根据实际需求进行调整。
`DELAY_MS`表示每一个灯亮起的延迟时间,单位为毫秒。
在程序的主循环中,通过不断改变灯的状态和输出屏幕,实现了流水灯的效果。
首先,灯往右挪移,即将前一个灯的状态赋值给后一个灯,最后一个灯的状态设置为亮。