C51单片机程序

作者&投稿:傅泼 (若有异议请与网页底部的电邮联系)
c51单片机程序实例~

#include#define uchar unsigned charuchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //0到9uchar num,cnt,disn;uchar keyval,disk;uchar led[]={1,2,3,4};void dealdat(uchar a){led[0]=0;led[1]=0;led[2]=0;led[3]=0;led[a]=disk;}void delay(unsigned int a){unsigned int i,j;for(i=0;i100){cnt=0;disn++;disn%=4;dealdat(disn);}}uchar kbscan(void){unsigned char sccode,recode;P3=0x0f; //发0扫描,列线输入if ((P3 & 0x0f) != 0x0f) //有键按下{//delay(20); //延时去抖动if ((P3&0x0f)!= 0x0f){sccode = 0xef; //逐行扫描初值while((sccode&0x01)!=0){ P3=sccode;if((P3&0x0f)!=0x0f){ recode=(P3&0x0f)|0xf0;return((~sccode)+(~recode)); } elsesccode=(sccode<<1)|0x01;}}}return 0; //无键按下,返回0}void getkey(void){unsigned char key;key=kbscan();if(key==0){keyval=0xff;return;}switch(key){case 0x11:keyval=7;break;case 0x12:keyval=4;break;case 0x14:keyval=1;break;case 0x18:keyval=10;break;case 0x21:keyval=8;break;case 0x22:keyval=5;break;case 0x24:keyval=2;break;case 0x28:keyval=0;break;case 0x41:keyval=9;break;case 0x42:keyval=6;break;case 0x44:keyval=3;break;case 0x48:keyval=11;break;case 0x81:keyval=12;break;case 0x82:keyval=13;break;case 0x84:keyval=14;break;case 0x88:keyval=15;break;default:keyval=0xff;break;}}main(){TMOD=0x11;TH0=(65536-5000)/256;TL0=(65536-5000)%256;TR0=1;ET0=1;EA=1;while(1){getkey();if(keyval!=0xff)disk=keyval;delay(10);}}

如果不是“天祥”的板子,这程序是不行的。
-------------
如果是“天祥”的,那么可以试试下面的显示程序,我增加了两行消隐的语句,经过实验,可以正常显示“按一下键,数字递增”的效果。

void display(a, b)
{
num = t;
a = num / 10;
b = num % 10;

dula = 1; P0 = table[a]; dula = 0;
wela = 1; P0 = 0xfe; wela = 0;
delay(10);
wela = 1; P0 = 0xff; wela = 0; //关闭显示.

dula = 1; P0 = table[b]; dula = 0;
wela = 1; P0 = 0xfd; wela = 0;
delay(10);
wela = 1; P0 = 0xff; wela = 0; //关闭显示.
}

TH0 = 0xf6;

TL0 = 0xff;

上两行是定时器/计数器T0的初值,因为T0是16位的,所以用TH0表示高八位,TL0表示低八位

TH1 = 0xfd;

TL1 = 0xfd;

T1初值

TMOD = 0x21;

定时器/计数器模式控制寄存器  如图

GATE=1时,由外部中断引脚INT0、INT1来启动定时器T0、T1

GATE=0时,仅由TR0,TR1置位分别启动定时器T0、T1。

C/T=0时为定时功能,C/T=1时为计数功能

M0、M1——方式选择功能

M1M0 工作方式 计数器模式 TMOD(设置定时器模式)

  0 0 方式0 13位计数器 TMOD=0x00

  0 1 方式1 16位计数器 TMOD=0x01

  1 0 方式2 自动重装8位计数器 TMOD=0x02

  1 1 方式3 T0分为2个8位独立计数器,T1为无中断重装8位计数器 TMOD=0x03

PCON = 0x00;

PCON主要是为CHMOS型单片机的电源控制而设置的专用寄存器

WDCON = 0x00;清狗

SCON =  0x50;

SCON1 = 0x40;

串口控制寄存器



TH0 = 0xf6; //T0定时器初值 -2303
TL0 = 0xff;
TH1 = 0xfd; //波特率9600
TL1 = 0xfd;
TMOD = 0x21; //定时器0位模式1,定时器2位模式2
PCON = 0x00; //波特率不加倍
WDCON = 0x00; //清狗
SCON = 0x50; //串口0工作与模式1,启动接收
SCON1 = 0x40; //串口1工作与模式1,用于发送

这些是单片机寄存器的初始化 ,要学习,必须根据每个寄存器每一位代表什么具体意思来判断,TH0 TL0 是定时器0 的高8位 和低8位,其他的同理,至于为什么要那么写,是要看整个程序要实现什么具体的功能来判断,需要用到单片机的什么资源,就必须得线初始化,慢慢学把,51系列单片机还是挺简单的。

定时/计数器,TH高八位,TL低八位,T0是计时,T1是串口通讯


51单片机如何编写程序?
1、51为内核的单片机有很多的品牌,首先要确定是哪种品牌的单片机,不同品牌的单片机编写程序会有一些差别,主要的差别在头文件和寄存器上,在逻辑实现上是没有差别的;2、使用一款合适的编程软件,目前比较主流的编程软件是keil;3、编写程序的步骤:(1)引入头文件;(2)宏定义;(3)函数初始化定义...

给51单片机下程序接哪几个引脚
1. 对于STC芯片,程序下载是通过串口进行的,具体连接到51单片机的P3.0和P3.1引脚。2. 对于AT芯片,使用ISP下载方式,连接到单片机的P1.5、P1.6、P1.7引脚以及复位引脚。3. 当使用USB下载器时,连接过程简化。下载器的VCC引脚连接到单片机的VCC,下载器的GND引脚连接到单片机的GND,下载器的RXD...

如何在51单片机开发板上烧写程序?
1.在电脑中找到【STC-ISP】程序烧写软件,有不同版本,但用法基本一致。双击打开会出现下图中界面。2.然后点击下图中箭头所指处,找到单片机型号STC89C52。然后,将51单片机开发板与电脑连接起来,初次连接时,会自动给电脑装一个驱动。3.单片机与电脑连接成功后,点击下图中【扫描】按钮,扫描出单片机与电...

C51单片机程序
TH0 = 0xf6;TL0 = 0xff;上两行是定时器\/计数器T0的初值,因为T0是16位的,所以用TH0表示高八位,TL0表示低八位 TH1 = 0xfd;TL1 = 0xfd;T1初值 TMOD = 0x21;定时器\/计数器模式控制寄存器 如图 GATE=1时,由外部中断引脚INT0、INT1来启动定时器T0、T1 GATE=0时,仅由TR0,TR1置位分...

51单片机控制指令详解
RET指令: 从子程序返回主程序,清除返回地址。CLR指令: 清零寄存器或内存中的特定位或标志,如 CLR A 或 CLR P。3. 深度掌握与应用 理解并熟练运用这些指令,可以让你在实际项目中实现高效控制,如精确延时、高效中断处理和灵活的端口操作。在编写51单片机程序时,务必理解指令的精确功能和使用方法,以...

怎么用c语言编程51单片机读写程序?
编程代码如下:ORG 0000H MOV DPTR,#1000H ;给源数据块地址指针DPTR赋初值 MOV P2, #20H ;给目的数据块地址指针P2和R0赋初值 MOV RO,#00H LOOP: MOVX A, @DPTR .MOVX @RO, A .INC DPTR INC RO CJNE RO,#64H, LOOP SJMP

51单片机流水灯程序
程序如下:include <reg52.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 main(){ int i,j;\/\/点亮第一个灯 led1 = 1;led2 = 0;led3 = 0;led4 = ...

请给我翻译一下这个单片机51的程序(加注释)
MAIN: ;主程序 MOV SP,#60h ;设栈底60H mov TCON,#00000001b ;mov IE,#10000011b ;开中断 START: ;开始 mov A,#0fh ;送0F到A clr c ;清进位 MOV R2,#08H ;送08到R2 LOOP: RLC A ;A带进位左环移 MOV P1,A ;A输出至P0 LCALL DELAY ;延时0.2秒 DJNZ R2,LOOP ;环移R2次 ...

简单51单片机串口程序
TR1 = 1;EA = 1;ES = 1;TI = 1;while(1) { if(i == 6) { i = 0;TI = 1;} } } void uart() interrupt 4 { if(RI == 1) RI = 0;if(TI == 1) {SBUF = txt[i++]; TI = 0;} } 本程序,可以用串口助手接收。收到的是:hellohellohellohellohello......

51单片机执行程序的过程
开机时,程序计算器PC变为0000H。然后单片机在时序电路作用下自动进入执行程序过程。执行过程实际上就是取出指令(取 出存储器中事先存放的指令阶段)和执行指令(分析和执行指令)的循环过程。例如执行指令:MOV A,#0E0H,其机器码为“74H E0H”,该指令的功能是把操作数E0H送入累加器,0000H单元中...

祁县19376284963: C51单片机编程
后林美罗: 用C 编一个算了,汇编麻烦一点.如要汇编再向我要吧. #include<reg52.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit key=P3^2; //**********************************函数声明********************************************/...

祁县19376284963: C51单片机的程序 -
后林美罗: 加一个while循环就可以了. while(1){.............. 检测到有效输入置标志flag=1; if(flag==1)break; }

祁县19376284963: C51单片机简单程序 -
后林美罗: 应该是你上面定义的是unit,下边使用的是uint#include<reg52.h>#define unit unsigned int sbit led1=P1^0; void delay1s(); unit i,j; void main() { while(1) { led1=0; delay1s(); led1=1; delay1s(); } } void delay1s() { unit i,j; for(i=500;i>0;i--) for(j=110;j>0;j--); }

祁县19376284963: C51单片机程序编写 -
后林美罗: #include <reg51.h> // 包含51单片机寄存器定义的头文件 #include <intrins.h> //包含_nop_()函数定义的头文件 #define OP_READ 0xa1 // 器件地址以及读取操作,0xa1即为1010 0001B#define OP_WRITE 0xa0 // 器件地址以及写入操作,0xa1...

祁县19376284963: 一个单片机C51程序,急用. -
后林美罗: #include<REG51.H>#define uchar unsigned char uchar code XS_W[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; sbit P20=P2^4; sbit P21=P2^5; sbit P22=P2^6; sbit P23=P2^7; sbit NB_R=P1^0;//南北_红 sbit NB_G=P1^1;//南北...

祁县19376284963: 谁给个C51单片机的程序 -
后林美罗: 光敏电阻 部分要加一些外围电路,在反相器那读取值来控制电机转动/*-----本程序用于测试4相步进电机常规驱动 按键可以控制正反转 --------*/ #include <reg52.h> unsigned char Flag;//定义正反转和停止标志位 sbit KEY = P3^3; unsigned char ...

祁县19376284963: C51 单片机汇编程序制作时钟
后林美罗: 包含小时,可直接注释掉小时显示部分. ORG 0000H SJMP MAIN ORG 000BH AJMP TIMER0 ORG 0030H MAIN: MOV DPTR,#TABLE MOV P0,#0ffh MOV R0,#0 MOV R1,#0 MOV R2,#200 MOV R3,#50 MOV R4,#0 MOV R5,#0 MOV R6,#0 ...

祁县19376284963: 谁能帮帮忙 一简单c51单片机程序 -
后林美罗: 汇编我也是刚学一楼写的感觉是对的,对于8086在这个问题上应该是一样的吧我自己理解的,楼住仔细斟酌..

祁县19376284963: C51单片机实验程序 -
后林美罗: 用中断模块和定时模块,当然还要加主程序和头文件,输出口定义等,看你的硬件连接方式,下面是延时子程序和一个中断程序,可类别编程. /*延时子程序*/ void delay( tm_N ) { unsigned char i,j; //无符号字符 for(i=tm_N;i>0;i--) for(j=248;j>0;...

祁县19376284963: c51单片机流水灯显示花式程序,作业求详细 -
后林美罗: 都11点多了看到你的帖子,没有问回答这个作业很简单,我给你花5分钟时间写一个例子,我是用单片机P0口8位LED,具体程序如下: #include "REG52.H"// 显示花样流水灯编码 const unsigned char Expetr_ROM[] = { 0xFE, 0xFD, 0xFB, 0...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网