单片机左右流水灯与数码管动态显示C程序

合集下载

数码管动态显示c语言程序

数码管动态显示c语言程序

//这是一个,四位数码管动态显示c语言程序,每隔一秒加一,直至加到9999为止#include <reg52.h>unsigned char code LED[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; unsigned char LEDbuff[]={0xff,0xff,0xff,0xff};//定义数码管的位选段sbit SEG_bit_1 = P0^1;sbit SEG_bit_2 = P0^2;sbit SEG_bit_3 = P0^3;sbit SEG_bit_4 = P0^4;unsigned int cnt=0;unsigned int sec =0;unsigned char i=0;void main(){TMOD=0x01; /*设置定时器*/TH0=0xfc;TL0=0x18;TR0=1;EA=1; /*设置中断*/ET0=1;while(1){if(0==TF0){if(cnt>=1000){cnt=0;sec++;LEDbuff[0]=LED[sec%10]; /*设置数码管显示位*/LEDbuff[1]=LED[sec/10%10];LEDbuff[2]=LED[sec/100%10];LEDbuff[3]=LED[sec/1000%10];}}}}void interrupttimer0() interrupt 1 /*设置中断函数*/{TH0=0xfc;TL0=0x18;cnt++;P1=0xff;switch(i){case 0: SEG_bit_1 = 1;SEG_bit_4 = 0;P1=LEDbuff[0];i++;break;case 1: SEG_bit_4 = 1;SEG_bit_3 = 0;P1=LEDbuff[1];i++;break;case 2: SEG_bit_3 = 1;SEG_bit_2 = 0;P1=LEDbuff[2];i++;break;case 3: SEG_bit_2 = 1;SEG_bit_1 = 0;P1=LEDbuff[3];i=0;break;default:break;}}教你如何用WORD文档(2012-06-27 192246)转载▼标签:杂谈1. 问:WORD 里边怎样设置每页不同的页眉?如何使不同的章节显示的页眉不同?答:分节,每节可以设置不同的页眉。

单片机c语言版数码管动态显示实验报告

单片机c语言版数码管动态显示实验报告

数码管动态显示实验一、实验要求1.在Proteus软件中画好51单片机最小核心电路,包括复位电路和晶振电路2.在电路中增加四个7段数码管(共阳/共阴自选),将P1口作数据输出口与7段数码管数据引脚相连,P2.0~P2.3引脚输出选控制信号3.在Keil软件中编写程序,采用动态显示法,实现数码管显示变量unsigned intshow_value的值(show_value的值范围为0000~9999),即把show_value的千百十个位的值用数码管显示出来。

二、实验目的1.巩固Proteus软件和Keil软件的使用方法2.学习端口输入输出的高级应用3.掌握7段数码管的连接方式和动态显示法4.掌握查表程序和延时等子程序的设计三.实验说明(条理清晰,含程序的一些功能分析计算)如下图(五)所示,由P1口将要显示的数字输给七段数码管;再由P2第四位输给数码管的公共端,作为扫描输入信号;用外部中断P3.2和P3.3分别接PB1与PB2,实现数字的增减。

所要实现的功能是,开始运行电路功能图时,四个数码管分别显示0000,按下PB1增1,直到9999回到0000,相反按下PB2减1,直到0000回到9999。

在算相关数据时,由于要显示个十百千的不同数字,要调用disp函数,disp[0]=show/1000; //显示千位的值 disp[1]=show%1000/100; //显示百位的值disp[2]=show%100/10; //显示十位的值 disp[3]=show%10; //显示个位的值本实验需要用到IE寄存器与TCON寄存器。

四、硬件原理图及程序设计(一)硬件原理图设计图(五)开始运行proteus,四个数码管显示0000,按下PB1数码管增1,按下PB2数码管减1。

(二)程序流程图设计三)程序设源代码#include<reg51.h> //定义8051寄存器头文件#define SEG7P P1 // 定义数码管输入信号接P1 #define SCANP P2 //定义数码管扫描信号接P2 char code TAB[10]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, //数字0~4 0x92, 0x83, 0xf8, 0x80, 0x98 };//数字5~~9 char disp[4]={0,0,0,0}; //显示数组void delay_ms(int x); //声明延迟函数char scan[4]={0xfe,0xfd,0xfb,0xf7}; //声明输入扫描信号char i,j; //声明变量void display(); //显示数组diso的内容int show=0000; //定义初始值void get_disp(); //声明返回diap main() //主程序开始{IE=0X85; //开IE寄存器,允许INT0和INT1中断TCON=0X05; //开INT0,INT1while(1) //无穷循环{get_disp();display();}void delay_ms(int x) //声明延迟函数{ int i,j; //定义变量for (i=0;i<x;i++) //开始计数,计数x次for (j=0;j<120;j++); //计数120次,延迟1ms }void display() //声明显示函数{for(i=0;i<4;i++) //开始计数,计数4次{ j=disp[3-i]; //diap的值附到变量j SCANP=scan[i]; //显示扫描信号SEG7P=TAB[j]; //显示数字到数码管delay_ms(4); //延迟4ms}}void INT0_ISR(void) interrupt 0 //INT0中断子程序开始 {if(show<9999) //如果显示数值小于9999show++; //显示数值自增1else show=0; //否则显示数值0}void_INT1_ISR(void) interrupt 2 //INT1中断子程序开始{if(show>0) //如果显示数值大于0show--; //显示数值自减1else show=9999; //否则显示数值9999}void get_disp (){disp[0]=show/1000; //显示千位的值disp[1]=show%1000/100; //显示百位的值disp[2]=show%100/10; //显示十位的disp[3]=show%10; //显示个位的值}五.实验总结实验过程中遇到的问题及解决方法、体会问题1:运行电路原理图时,数码管都不亮。

C语言程序——数码管流水灯结合

C语言程序——数码管流水灯结合
void timer0();
void fun(num)
{
int m;
for(m=0;m<8;m++)
{
clk=0;
AB=num&0x01;
num=num>>1;
clk=1;
}
}
void delay(z)
{
int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
com2=1;
com3=1;
com4=0;
fun(table[9-qian]);
delay(5);
}
}
void timer0()
{
TF0=0;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
{ int i=0,ge,shi,bai,qian,num,k;
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
// EA=1;
// ET0=1;
TR0=1;
P1=0xfe;
while(1)
{
if(TF0==1)
{
timer0();
num++;
c语言程序——数码管流水灯结合 #include unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd}; #define uchar unsigned char #define uint unsigned int sbit beef=p3^1; sbit clk=p2^0; sbit ab=p2^1; sbit com1=p2^2; sbit com2=p2^3; sbit com3=p2^4; sbit com4=p2^5; void timer0(); void fun(num) { int m; for(m=0;m<8;m++) { clk=0; ab=num&amp;0x01; num=num>>1; clk=1; } } void delay(z) { int x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void main() {int i=0,ge,shi,bai,qian,num,k; tmod=0x01; th0=(65536-50000)/256; tl0=(65536-50000)%256; // ea=1; // et0=1; tr0=1; p1=0xfe; while(1) { if(tf0==1) { timer0(); num++; if(num==20) { num=0; if(k==14) k=0; p1=table1[k++]; i++; if(i==99) { i=0; beef=0; delay(1000); beef=1; } } } ge=i%10; shi=i/10%10; bai=i%10; qian=i/10%10; com1=0; com2=1; com3=1; com4=1; fun(table[ge]); delay(5); com1=1; com2=0; com3=1; com4=1; fun(table[shi]); delay(5); com1=1; com2=1; com3=0;

C51实验程序(流水灯、矩阵键盘、动态显示、串行口、1602液晶)

C51实验程序(流水灯、矩阵键盘、动态显示、串行口、1602液晶)
{RI=0;
switch(SBUF)//根据收到的数据决定模式
{ case 'A':LED1=~LED1,LED2=1;break;
case 'B':LED2=~LED2,LED1=1;break;
case 'C': LED1=~LED1,LED2=~LED2;break;
}
}
else
LED1=LED2=1;
TMOD=0x20;
PCON=0x00;
TH1=0xfd;
TL1=0xfd;
TI=0;
TR1=1;
while(1)
{ if(K1==0)
{ while(K1==0);
Operation_NO=(Operation_NO+1)%4; //计按键次数决定模式
}
switch(Operation_NO)
{ case 0:LED1=LED2=1;break;
{uchar t;
while(ms--)
{
for(t=0;t<120;t++);
}
}
void main()//主函数
{SCON=0x50;//以下为串行口初始化
TMOD=0x20;
PCON=0x00;
TH1=0xfd;
TL1=0xfd;
RI=0;
TR1=1;
LED1=LED2=1;
while(1)
{ if(RI)
DelayMS(10);
}}
#include<reg52.h>(LCD1602)
#define uint unsigned int
#define uchar unsigned char

单片机发光管闪烁和流水灯的操作

单片机发光管闪烁和流水灯的操作

单片机发光管闪烁和流水灯的操作1、闪烁:尝试让第一个发光管闪烁程序如下:#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--);}}2、流水灯程序如下:#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; //变量赋初值为50000P1=0xf7; //点亮第四个灯while(i--); //延时i=50000; //变量赋初值为50000P1=0xef; //点亮第五个灯while(i--); //延时i=50000; //变量赋初值为50000P1=0xdf; //点亮第六个灯while(i--); //延时i=50000; //变量赋初值为50000P1=0xbf; //点亮第七个灯while(i--); //延时i=50000; //变量赋初值为50000P1=0x7f; //点亮第八个灯while(i--); //延时}}。

单片机左右流水灯与数码管动态显示C程序

单片机左右流水灯与数码管动态显示C程序

单片机左右流水灯与数码管动态显示C程序本程序所用的原理图下载:点这里,单片机芯片使用的stc89c52;找到相应部分即可.这是一整个单片机开发板的电路图其他的忽略.以下是通过测试的源代码:/**功能:用定时器0 实现定时200 毫秒流水灯,* 同时用定时器1 实现动态显示654321,* 且蜂鸣器发声;*日期:2014-03-24*作者:徐冉*注意事项:若打开两个定时器时,必须使用两个定时器,* 否则两个定时器都不工作!!!**//**********AT89C52-RC 51hei 单片机实验板**************//*************51hei-开发板*********************/#includetypedef unsigned int uint;typedef unsigned char uchar;sbit wela = P2;//数码管位声明sbit dula = P2;//数码管段选声明sbit FM = P2;//蜂鸣器声明uchar counter = 0, counter1 = 0, j = 0, flag = 0, flag1 = 0;uchar num = 6, num1 = 0;//数码管段选编码uchar code table_du [] = { 0x3F, //”0” 0x06, //”1” 0x5B, //”2” 0x4F, //”3” 0x66, //”4”0x6D, //”5” 0x7D, //”6” 0x07, //”7” 0x7F, //”8” 0x6F, //”9” 0x77, //”A” 0x7C, //”B”0x39, //”C” 0x5E, //”D” 0x79, //”E” 0x71, //”F” 0x76, //”H” 0x38, //”L” 0x37, //”n”0x3E, //”u” 0x73, //”P” 0x5C, //”o” 0x40, //”-” 0x00, //熄灭0x00 //自定义};//数码管位选编码uchar code table_we[] = { 0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf };void init(); void display();void main(){init();while(1){ if(counter1 == 30) { counter1 = 0; display(); num--; num1++; if(num == 0) { num = 6; } if(num1 == 6) { num1 = 0; } } if(counter == 200)//定时到4 秒后,流水灯向右流动{ counter = 0;//counter 清零,//关闭定时器0 TR0 = 0; //ET0 = 0; flag = 1; //标志变量置1 后,定时器重新初始化TH0 = 0xB8; //定时器0 定时20 毫秒TL0 = 0x00; TR0 = 1; //重新打开定时器0 //ET0 = 1; j = 0; }}}tips:感谢大家的阅读,本文由我司收集整编。

几种流水灯程序

几种流水灯程序

51单片机P1口控制8个LED灯要从P1.0到P1.7然后从P1.7到P1.0这样让LED灯来回流动ORG 00HSTART:MOV A, #0FFHCLR CMOV R1, #8LEFT: ;向左流动RLC AMOV P1, ACALL DELAYDJNZ R1, LEFTMOV R2, #7RIGHT: ;向右流动RRC AMOV P1, ACALL DELAYDJNZ R2, RIGHTJMP STARTDELAY: ;延时200毫秒MOV R3, #20D1:MOV R4, #20D2:MOV R5, #248DJNZ R5, $DJNZ R4, D2DJNZ R3, D1RETEND或ORG 0000HLJMP MAINORG 0030HMAIN: MOV A,#0FEH ;左移时(P1.0--P1.7)P1.0=0,低电平点亮MOV R3,#07H ;移位次数LED_L: MOV P1,A ;将移位结果赋给P1RL A ;左移LCALL DELAYDJNZ R3,LED_L ;R3=0? 不为0循环,否则顺序执行MOV R3,#07H ;为下次循环次数重新赋值;以下为右移代码,注释同上MOV A,#7FHMOV R4,#07HLED_R: MOV P1,ARR ALCALL DELAYDJNZ R4,LED_R;MOV R4,#07HSJMP LED_R//延时子程序12M晶振1SDELAY: MOV R0,#100DEL2: MOV R1,#10DEL1: MOV R2,#124NOPDEL0: NOPNOPDJNZ R2,DEL0DJNZ R1,DEL1DJNZ R0,DEL2RETENDP1口控制8个LED灯要从P1.0到P1.7然后从P1.7到P1.0这样让LED灯来回流动5只LED为共阳极连接,即单片机输出端为低电平时即可点亮LED。

;用最直接的方式实现流水灯ORG 0000HSTART:MOV P1,#01111111B ;最下面的LED点亮LCALL DELAY ;延时60秒LCALL DELAY ;延时60秒MOV P1,#10111111B ;最下面第二个的LED点亮LCALL DELAY ;延时60秒LCALL DELAY ;延时60秒MOV P1,#11011111B ;最下面第三个的LED点亮(以下省略)LCALL DELAYLCALL DELAY ;延时60秒MOV P1,#11101111BLCALL DELAYLCALL DELAY ;延时60秒MOV P1,#11110111BLCALL DELAYLCALL DELAY ;延时60秒MOV P1,#11111011BLCALL DELAY ;延时60秒LCALL DELAY ;延时60秒LCALL DELAY ;延时60秒LCALL DELAY ;延时60秒LCALL DELAY ;完成第一次循环点亮,延时约0.25秒AJMP START ;反复循环;延时子程序,12M晶振延时约250毫秒DELAY: ;大约值:2us*256*256*2=260ms,也可以认为为250msPUSH PSW ;现场保护指令(有时可以不加)MOV R4,#240L3: MOV R2 ,#00HL1: MOV R3 ,#00HL2: DJNZ R3 ,L2 ;最内层循环:(256次)2个周期指令(R3减一,如果比1大,则转向L2)DJNZ R2 ,L1 ; 中层循环:256次DJNZ R4 ,L3 ;外层循环:240次POP PSWRETEND随便改了一个1357亮。

动态数码管单片机编程

动态数码管单片机编程

动态数码管单片机编程动态数码管是一种常见的显示器件,广泛应用于各种计时、计数以及显示等场合。

而在单片机编程中,控制动态数码管的显示则是一项常见的任务。

本文将以动态数码管单片机编程为主题,探讨其原理和应用,并介绍如何编写代码实现动态数码管的显示。

一、动态数码管的原理动态数码管是由多个LED组成的,通过控制LED的亮灭状态来实现数字的显示。

在动态数码管中,每一个时间段只有一个数码管被点亮,然后迅速切换到下一个数码管,通过高频率的切换,给人眼产生了连续的效果。

这种切换速度一般在几十毫秒到几毫秒之间,一般人眼无法察觉到这种切换。

二、动态数码管的编程实现在单片机编程中,动态数码管的显示是通过控制数码管的引脚来实现的。

首先,需要定义数码管的引脚连接方式,比如使用IO口、SPI、I2C等方式连接数码管。

然后,根据具体的引脚连接方式,编写相应的代码来控制数码管的显示。

在编程中,首先需要通过引脚控制数码管的开关,使其在一个时间段内只有一个数码管被点亮。

这可以通过设置引脚的高低电平来实现。

然后,需要通过编写循环来实现数码管的切换,使其可以显示多个数字。

这可以通过在循环中逐个点亮不同的数码管来实现。

三、动态数码管的应用动态数码管广泛应用于各种计时、计数以及显示等场合。

比如,在计时器中,可以使用动态数码管来显示计时结果;在计数器中,可以使用动态数码管来显示计数值;在温度计中,可以使用动态数码管来显示温度值等。

动态数码管不仅可以显示数字,还可以显示一些字母和符号,通过合理的编程可以实现更多的显示效果。

在进行动态数码管单片机编程时,需要注意以下几点:1. 确保引脚的连接正确,避免引脚接错或短路等问题;2. 确保编写的代码逻辑正确,避免出现死循环或逻辑错误等问题;3. 确保数码管的显示效果清晰,避免出现闪烁或显示不完整等问题;4. 确保编写的代码简洁高效,避免占用过多的处理器资源。

五、总结动态数码管单片机编程是一项常见的任务,通过控制数码管的引脚来实现数字的显示。

单片机C语言代码手册_含100多个经典C程序

单片机C语言代码手册_含100多个经典C程序
void delay(unsigned int i)
{
unsigned int j;
for(i;i>0;i--)
for(j=110;j>0;j--);
}
void main()
{
LED=0;
delay(60);
LED=1;
delay(10);
}
2.数码管
0-9显示
#include<reg51.h>
void delay2ms(unsigned int delaytime)
{
unsigned int cnt;
for(cnt=0;cnt<delaytime*50;cnt++);
}
unsigned char num[10]=
delay2ms(2500);
}
}
95显示
#include<reg51.h>
void delay2ms(unsigned int delaytime)
{
unsigned int cnt;
for(cnt=0;cnt<delaytime*50;cnt++);
while(i--)
{
for(j=0;j<120;j++);
}
}
void main()
{
unsigned char LED;
LED = 0xfe; //0xfe = 1111 1110
while(1)
{
LED = 0xfe; // 0xfe = 1111 1110

流水灯C语言程序

流水灯C语言程序

流水灯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`表示每一个灯亮起的延迟时间,单位为毫秒。

在程序的主循环中,通过不断改变灯的状态和输出屏幕,实现了流水灯的效果。

首先,灯往右挪移,即将前一个灯的状态赋值给后一个灯,最后一个灯的状态设置为亮。

单片机控制LED灯点亮(C语言)

单片机控制LED灯点亮(C语言)

将0xfe赋给P1口,然后使用移位函数来改变P1口的值,达到流水灯的效果 移位函数: _crol_,_cror_:将char型变量循环向左(右)移动指定位数后返回 。 _crol_,_cror_: c51中的intrins.h库函数
程序如下:
随后会弹出一个对话框,要求选择单片机的型号。在该对话框中显示了Vision2的器件数据库,从中可以根据使用的单片机来选择。
PART ONE
AT89S52
8051 based Full Static CMOS controller with Three-Level Program Memory Lock, 32 I/O lines, 3 Timers/Counters, 8 Interrupts Sources, Watchdog Timer, 2 DPTRs(DATA POINTER REGISTERS ), 8K Flash Memory, 256 Bytes On-chip RAM 基于8051全静态CMOS控制器、 三级加密程序存储器 、 32个I/O口 、三个定时器/计数器 、八个中断源 、看门狗定时器、2 个数据指针 寄存器、8k字节Flash,256字节片内RAM
十六进制整常数
十六进制整常数的前缀为0X或0x。其数码取值为0~9,A~F或a~f。 以下各数是合法的十六进制整常数: 0X2A(十进制为42) 0XA0 (十进制为160) 0XFFFF (十进制为65535) 以下各数不是合法的十六进制整常数: 5A (无前缀0X) 0X3H (含有非十六进制数码)
各种进位制的对应关系
十进制
二进制
十六进制
十进制
二进制
十六进制
0
0
0
9
1001

单片机流水灯c语言实现

单片机流水灯c语言实现
//使数字0--9循环显示
//------------------------------------------------
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code DSY_CODE []=
red_a=1;yellow_a=1;green_a=0;
red_b=0;yellow_b=1;green_b=1;
delayMs(2000);
Operation_Type=2;
break;
case 2://东西向黄灯开始闪烁,绿灯关闭
delayMs(300);
yellow_a=!yellow_a; green_a=1;
while(x--)
{
for(i=0;i<120;i++);
}
}
//---------------------------------------------
//交通灯切换子程序
void Traffic_Light()
{
switch (Operation_Type)
{
case 1://东西向绿灯亮与南北向红灯亮
{
uchar i;
P2=0x01;//P2端口初始化
while(1)//死循环
{
for(i=0;i<7;i++)//i自加1,当i=7时执行第二个for语句
{
P2=_crol_(P2,1);//P2端口循环左移1位
delayMs(150);
}
for(i=0;i<7;i++)

单片机-流水灯的程序

单片机-流水灯的程序
程序分析:
#include<reg51.h> sbit led1=P2^0; sbit led2=P2^1; sbit led3=P2^2; sbit led4=P2^3; sbit led5=P2^4; sbit led6=P2^5; sbit led7=P2^6; sbit led8=P2^7; void delay (unsigned char x);
其中void表示这 个函数执行完后 不返回任何数据。 ()内无任何东西, 所以这是个无参 数的函数。 Delayms是函数名。
1
2
3
4
5
6
2)带参数函数的用位定义实现流水灯(8位二极管循环点亮)
编程思路: a) 先点亮第一盏灯,延时点亮第二盏, 依次延时8盏灯全部点亮。 b) 当8盏灯全部点亮时,熄灭8盏灯。 c) 进入循环。
循环移动
循环左移 最高位移入最低位,其它依次向左移动一位。C语言中 没有专门的指令,通过移位指令和简单逻辑运算来实现循环左移,或直接利用C51库中自带的函数-crol-实现。
循环右移 最低位移入最高位,其它位依次向右移一位,C语言中没有专门的指令,通过移位指令与简单的逻辑运算可以实现循环右移,或专门利用C51库中自带函数-cror-实现
方法二:利用总线控制实现流水灯(8位二极管循环点亮)
相关知识 二进制和十六进制之间的相互转换
二进制
十六进制
二进制
十六进制
0000
0
0100
4
0001
1
0101
5
0010
2
0110
6
0011
3
0111
7
二进制
十六进制
二进制

单片机C语言程序(数码管动态静态显示)

单片机C语言程序(数码管动态静态显示)

0123动‎态显示:‎#incl‎u de<r‎e g52.‎h>#d‎e fine‎ucha‎r uns‎i gned‎char‎#def‎i ne u‎i nt u‎n sign‎e d in‎tuin‎t num‎,numd‎u,num‎w e;u‎c har ‎c ode ‎t able‎d u[]=‎{0x3‎f,0x0‎6,0x5‎b,0x4‎f,0x‎66,0x‎6d,0x‎7d,0x‎07,0‎x7f,0‎x6f,0‎x77,0‎x7c,‎0x39,‎0x5e,‎0x79,‎0x71}‎;uch‎a r co‎d e ta‎b lewe‎[]={‎0xfe,‎0xfd,‎0xfb,‎0xf7}‎;sbi‎t dul‎a=P2^‎6;sb‎i t we‎l a=P2‎^7;v‎o id d‎i spla‎y();‎v oid ‎m ain(‎){‎E A=1;‎ET1‎=1;‎T MOD=‎0x10;‎TH1‎=(655‎36-50‎0)/25‎6;T‎H0=(6‎5536-‎500)%‎256;‎TR1=‎1;n‎u m=0;‎whi‎l e(1)‎{‎if(n‎u m==2‎0)‎{‎n um=0‎;‎i f(nu‎m du==‎4)‎numd‎u=0;‎if‎(numw‎e==4)‎n‎u mwe=‎0;‎disp‎l ay()‎;‎n umdu‎++;‎num‎w e++;‎}‎}}‎v oid ‎t ime1‎() in‎t erru‎p t 3‎{TH‎1=(65‎536-5‎00)/2‎56;‎T H0=(‎65536‎-500)‎%256;‎num‎++;}‎void‎disp‎l ay()‎{P‎0=0xf‎f;w‎e la=1‎;we‎l a=0;‎P0=‎t able‎d u[nu‎m du];‎dul‎a=1;‎dula‎=0;‎P0=ta‎b lewe‎[numw‎e];‎w ela=‎1;w‎e la=0‎;}‎0123静‎态显示:‎#incl‎u de<r‎e g52.‎h>#d‎e fine‎ucha‎r uns‎i gned‎char‎#def‎i ne u‎i nt u‎n sign‎e d in‎tuin‎t num‎,numd‎u,num‎w e;u‎c har ‎c ode ‎t able‎d u[]=‎{0x3‎f,0x0‎6,0x5‎b,0x4‎f,0x‎66,0x‎6d,0x‎7d,0x‎07,0‎x7f,0‎x6f,0‎x77,0‎x7c,‎0x39,‎0x5e,‎0x79,‎0x71}‎;uch‎a r co‎d e ta‎b lewe‎[]={‎0xfe,‎0xfd,‎0xfb,‎0xf7}‎;sbi‎t dul‎a=P2^‎6;sb‎i t we‎l a=P2‎^7;v‎o id d‎e lay(‎u char‎);vo‎i d ma‎i n()‎{EA‎=1;‎E T1=1‎;TM‎O D=0x‎10;‎T H1=(‎65536‎-5000‎0)/25‎6;T‎H0=(6‎5536-‎50000‎)%256‎;TR‎1=1;‎whil‎e(1)‎{‎P0=0x‎f f;‎wela‎=1;‎wel‎a=0;‎P0=‎t able‎d u[0]‎;d‎u la=1‎;d‎u la=0‎;P‎0=tab‎l ewe[‎0];‎wela‎=1;‎wela‎=0;‎P0=0‎x ff;‎wel‎a=1; ‎we‎l a=0;‎P0‎=tabl‎e du[1‎];‎d ula=‎1;‎d ula=‎0;‎P0=ta‎b lewe‎[1];‎wel‎a=1;‎wel‎a=0;‎P0=‎0xff;‎we‎l a=1;‎w‎e la=0‎;P‎0=tab‎l edu[‎2];‎dula‎=1;‎dula‎=0;‎P0=t‎a blew‎e[2];‎we‎l a=1;‎we‎l a=0;‎P0‎=0xff‎;w‎e la=1‎;‎w ela=‎0;‎P0=ta‎b ledu‎[3];‎dul‎a=1;‎dul‎a=0;‎P0=‎t able‎w e[3]‎;w‎e la=1‎;w‎e la=0‎;} ‎}0-‎999循环‎跳变#i‎n clud‎e<reg‎52.h>‎#def‎i ne u‎c har ‎u nsig‎n ed c‎h ar#‎d efin‎e uin‎t uns‎i gned‎int‎u int ‎a,b,c‎o unt,‎n um,n‎u mdu,‎n umwe‎; uch‎a r co‎d e ta‎b ledu‎[]={‎0x3f,‎0x06,‎0x5b,‎0x4f,‎0x66‎,0x6d‎,0x7d‎,0x07‎,0x7‎f,0x6‎f,0x7‎7,0x7‎c,0x‎39,0x‎5e,0x‎79,0x‎71};‎u char‎code‎tabl‎e we[]‎={0x‎f e,0x‎f d,0x‎f b,0x‎f7};‎s bit ‎d ula=‎P2^6;‎sbit‎wela‎=P2^7‎;voi‎d del‎a y(uc‎h ar);‎void‎disp‎l ay(u‎c har,‎u char‎,ucha‎r); v‎o id m‎a in()‎{E‎A=1;‎ET1=‎1;T‎M OD=0‎x10;‎TH1=‎(6553‎6-500‎00)/2‎56;‎T H0=(‎65536‎-5000‎0)%25‎6;T‎R1=1;‎cou‎n t=0;‎whi‎l e(1)‎{‎if(n‎u m==2‎0)‎{n‎u m=0;‎if‎(coun‎t==10‎00)‎coun‎t=0;‎‎c ount‎++;‎}‎d ispl‎a y(co‎u nt/1‎00,co‎u nt%1‎00/10‎,coun‎t%10)‎;}‎}voi‎d tim‎e1() ‎i nter‎r upt ‎3{‎T H1=(‎65536‎-5000‎0)/25‎6;T‎H0=(6‎5536-‎50000‎)%256‎;nu‎m++;‎}voi‎d dis‎p lay(‎u char‎bai,‎u char‎shi,‎u char‎ge)‎{P0‎=0xff‎;we‎l a=1;‎wel‎a=0;‎P0=t‎a bled‎u[bai‎];d‎u la=1‎;du‎l a=0;‎P0=‎t able‎w e[1]‎;we‎l a=1;‎wel‎a=0;‎dela‎y(1);‎P0=‎0xff;‎wel‎a=1;‎wela‎=0;‎P0=ta‎b ledu‎[shi]‎;du‎l a=1;‎dul‎a=0;‎P0=t‎a blew‎e[2];‎wel‎a=1;‎wela‎=0;‎d elay‎(1); ‎P0=‎0xff;‎wel‎a=1;‎wela‎=0;‎P0=ta‎b ledu‎[ge];‎dul‎a=1;‎dula‎=0;‎P0=ta‎b lewe‎[3];‎wela‎=1;‎w ela=‎0;d‎e lay(‎1);}‎void‎dela‎y(uch‎a r x)‎{u‎c har ‎a,b;‎for(‎a=x;a‎>0;a-‎-)‎f or(b‎=200;‎b>0;b‎--); ‎}‎。

51单片机数码管的程序代码

51单片机数码管的程序代码
for (x=s;x>0;x--) for (y=100;y>0;y--);
}
3.依次流水作业
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit line= P1^3; //点阵
sbit led= P1^2;
duan=1; P0=table[shi]; _nop_();
//显示十位
_nop_(); _nop_(); duan=0; P0=0xff; wei=1; P0=0xFb; wei=0; delay(3);
duan=1; P0=table[ge]; _nop_(); _nop_(); _nop_(); duan=0; P0=0xff; wei=1; P0=0xF7; wei=0; delay(3);
unsigned char code weisn[]=
{
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uint y,s,a,b;
void delay ( uint);
void main ()
{
P0=0X00;
line=0;//关闭点阵
P0=0xff; led=0;//关闭 led
5,DS18B20 温度计程序代码
#include "reg52.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit ds=P1^4; //18B20 信号端口 sbit duan=P1^0; //数码管段码控制端

单片机c语言编程控制流水灯

单片机c语言编程控制流水灯

说了这么多了,相信你也看了很多资料了,手头应该也有必备的工具了吧!(不要忘了上面讲过几个条件的哦)。

那个单片机究竟有什么功能和作用呢?先不要着急!接下来让我们点亮一个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空转。

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

单片机左右流水灯与数码管动态显示C程

本程序所用的原理图下载: 点这里,单片机芯片使用的stc89c52;找到相应部分即可.这是一整个单片机
开发板的电路图其他的忽略.以下是通过测试的源代码: /*
*功能:用定时器0实现定时200毫秒流水灯,
*
同时用定时器1实现动态显示654321,
*
且蜂鸣器发声;
*日期:2014-03-24
*作者:徐冉
*注意事项:若打开两个定时器时,必须使用两个定时器,*
否则两个定时器都不工作!!!
**/
/**********AT89C52-RC 51hei单片机实验板
**************/
/*************51hei-开发板*********************/
#include ;
typedef unsigned int uint;
typedef unsigned char uchar;
sbit wela = P2^7; //数码管位声明
sbit dula = P2^6; //数码管段选声明
sbit FM = P2^3;//蜂鸣器声明
uchar counter = 0, counter1 = 0, j = 0, flag = 0, flag1 = 0;
uchar num = 6, num1 = 0;
//数码管段选编码
uchar code table_du [] = {
0x3F, //&quot;0&quot;
0x06, //&quot;1&quot;
0x5B, //&quot;2&quot;
0x4F, //&quot;3&quot;
0x66, //&quot;4&quot;
0x6D, //&quot;5&quot; 0x7D, //&quot;6&quot; 0x07, //&quot;7&quot; 0x7F, //&quot;8&quot; 0x6F, //&quot;9&quot; 0x77, //&quot;A&quot; 0x7C, //&quot;B&quot; 0x39, //&quot;C&quot; 0x5E, //&quot;D&quot; 0x79, //&quot;E&quot; 0x71, //&quot;F&quot;
0x76, //&quot;H&quot; 0x38, //&quot;L&quot; 0x37, //&quot;n&quot; 0x3E, //&quot;u&quot; 0x73, //&quot;P&quot; 0x5C, //&quot;o&quot; 0x40, //&quot;-&quot; 0x00, //熄灭
0x00 //自定义
};
//数码管位选编码
uchar code table_we[] = {
0xfe,
0xfd,
0xfb,
0xf7,
0xef,
0xdf
};
void init();
void display();
void main()
{
init();
while(1)
{
if(counter1 == 30)
{
counter1 = 0;
display();
num--;
num1++;
if(num == 0)
{
num = 6;
}
if(num1 == 6)
{
num1 = 0;
}
}
if(counter == 200)//定时到4秒后,流水灯向右流动
{
counter = 0;//counter清零,
//关闭定时器0
TR0 = 0;
//ET0 = 0;
flag = 1; //标志变量置1后,定时器重新初始化 TH0 = 0xB8; //定时器0定时20毫秒
TL0 = 0x00;
TR0 = 1;
//重新打开定时器0
//ET0 = 1;
j = 0;
}
}
}
//定时器初始化程序
void init()
{
//定时器0和定时器1初始化函数
TMOD = 0x11;//定义定时器1和0在工作方式1下
TH0 = 0xB8; //定时器0定时20毫秒
TL0 = 0x00;
TH1 = 0xFC; //定时器1定时20毫秒
TL1 = 0x67;
TR0 = 1;
//打开定时器0
TR1 = 1;
//打开定时器1
EA = 1; //打开总中断
ET0 = 1; //打开定时器0中断ET1 = 1; //打开定时器1中断}
//数码管显示子程序
void display()
{
dula = 1;
P0 = table_du[num];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = table_we[num1];
wela = 0;
dula = 1;
P0 = table_du[num];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = table_we[num1];
wela = 0;
dula = 1;
P0 = table_du[num]; dula = 0;
P0 = 0xff;
wela = 1;
P0 = table_we[num1]; wela = 0;
dula = 1;
P0 = table_du[num]; dula = 0;
P0 = 0xff;
wela = 1;
P0 = table_we[num1]; wela = 0;
dula = 1;
P0 = table_du[num]; dula = 0;
P0 = 0xff;
wela = 1;
P0 = table_we[num1]; wela = 0;
dula = 1;
P0 = table_du[num];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = table_we[num1];
wela = 0;
}
//中断定时器0
void int_time0() interrupt 1
{
TH0 = 0xB8;
TL0 = 0x00;
counter++;
if(flag == 0)
{
if(counter % 10 == 0)//定时200毫秒 {
P1 = ~(1 ;>; j++);
FM = ~FM;
if(j == 8)
j = 0;
}
}
}
//中断定时器1
void int_time1() interrupt 3 {
TH1 = 0xFC;
TL1 = 0x67;
counter1++;
}。

相关文档
最新文档