TM1636的C语言源程序STC51

合集下载

51单片机C语言头文件及其使用

51单片机C语言头文件及其使用

51单片机C语言头文件及其使用2007-05-29 16:33很多初学单片机者往往对C51的头文件感到很神秘,而为什么要那样写,甚至有的初学者喜欢问,P1口的P为什么要大写,不大写行不行呢?其实这样的问题,看过本文后,就会明白。

其实这个是在头文件中用sfr定义的,现在定义好了的是这样的sfr P1 = 0x90;,也就是说,到底大写,还是小写,就是在这里面决定的。

这就说明,如果你要用小写,就得在头文件中改为小写。

其实它都是为了编程序方便才这样写的,在程序编译时,就会变成相应的地址(如P1就变成了0x90)。

还有一点就是,现在有很多改进型的单片机,它们有很多新增的特殊功能寄存器在标准的reg51.h或reg52.h中没有定义,这就需要自己加进头文件(相关厂家已经把它们定义好了),当然也可以直接在程序中定义。

下面是一个标准的C51头文件:(此文件一般在C:\KEIL\C51\INC下,INC文件夹根目录里有不少头文件,并且里面还有很多以公司分类的文件夹,里面也都是相关产品的头文件。

如果我们要使用自己写的头文件,使用的时候只需把对应头文件拷贝到INC文件夹里就可以了。

)/* BYTE Registers */sfr P0 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sfr PSW = 0xD0;sfr ACC = 0xE0;sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82;sfr DPH = 0x83;sfr PCON = 0x87;sfr TCON = 0x88;sfr TMOD = 0x89;sfr TL0 = 0x8A;sfr TL1 = 0x8B;sfr TH0 = 0x8C;sfr TH1 = 0x8D;sfr IE = 0xA8;sfr IP = 0xB8;sfr SCON = 0x98;sfr SBUF = 0x99;/* 8052 Extensions */sfr T2CON = 0xC8;sfr RCAP2L = 0xCA;sfr RCAP2H = 0xCB;sfr TL2 = 0xCC;/* BIT Registers */ /* PSW */sbit CY = PSW^7;sbit AC = PSW^6;sbit F0 = PSW^5;sbit RS1 = PSW^4;sbit RS0 = PSW^3;sbit OV = PSW^2;sbit P = PSW^0; //8052 only/* TCON */sbit TF1 = TCON^7;sbit TR1 = TCON^6;sbit TF0 = TCON^5;sbit TR0 = TCON^4;sbit IE1 = TCON^3;sbit IT1 = TCON^2;sbit IE0 = TCON^1;sbit IT0 = TCON^0;/* IE */sbit EA = IE^7;sbit ET2 = IE^5; //8052 onlysbit ES = IE^4;sbit ET1 = IE^3;sbit EX1 = IE^2;sbit ET0 = IE^1;sbit EX0 = IE^0;/* IP */sbit PT2 = IP^5;sbit PS = IP^4;sbit PT1 = IP^3;sbit PX1 = IP^2;sbit PT0 = IP^1;sbit PX0 = IP^0;/* P3 */sbit RD = P3^7;sbit WR = P3^6;sbit T1 = P3^5;sbit INT1 = P3^3;sbit INT0 = P3^2;sbit TXD = P3^1;sbit RXD = P3^0;/* SCON */sbit SM0 = SCON^7;sbit SM1 = SCON^6;sbit SM2 = SCON^5;sbit REN = SCON^4;sbit TB8 = SCON^3;sbit RB8 = SCON^2;sbit TI = SCON^1;sbit RI = SCON^0;/* P1 */sbit T2EX = P1^1; // 8052 onlysbit T2 = P1^0; // 8052 only/* T2CON */sbit TF2 = T2CON^7;sbit EXF2 = T2CON^6;sbit RCLK = T2CON^5;sbit TCLK = T2CON^4;sbit EXEN2 = T2CON^3;sbit TR2 = T2CON^2;sbit C_T2 = T2CON^1;sbit CP_RL2 = T2CON^0;还有一点就是,现在有很多改进型的单片机,它们有很多新增的特殊功能寄存器在标准的reg51.h或reg52.h中没有定义,这就需要自己加进头文件(相关厂家已经把它们定义好了),当然也可以直接在程序中定义。

51单片机的基本外围电路设计以及相关C语言程序(免积分)

51单片机的基本外围电路设计以及相关C语言程序(免积分)

主要学习51单片机的外部引脚和内部结构等,叙述一下。

本书任务驱动教学,引入案例有浅变深,循序渐进,给读者留下思考和发挥空间。

3.1 利用单片机的I/O口驱动LED3.1.1利用单片机的P0.0 端口驱动1只LED闪烁编程的目的是利用C语言控制单片机I/O端口按要求输出矩形波脉冲信号,信号的周期由延时函数决定。

一、电路原理STC-89C51单片机的P0口采用为OD门输出,不存在拉出电流,因此利用P0驱动负载时有两种接法:一种是加上拉电阻R2,见图3-1-1,既用1K 电阻接电源正极,此时P0口输出高电平时LED亮;另一种电路为P0.7低电平驱动有效,在P0.7输出低电平时,STC-89C51端口灌入电流达20mA,可直接驱动小负载。

图3-3-1中的R3为限流电阻,限制LED2的工作电流。

图3-1-1 驱动LED电路原理单片机的最小系统包括晶体振荡电路,加电复位电路,同时要求单片机的31引脚EA接高电平。

时钟频率主要由晶体CY决定,C1、C2为独石电容,用于微小调整单片机时钟的振荡频率;R1和C3组成加电复位电路,C3为电解电容器;整个电路由+5V电压供电。

电路使用的元件参数见表3.1.1。

表3.1.1 3-1-1电路元件表元件名称序号标称规格(封装,功率电压等参数)作用单片机IC STC89C51 DIP40 核心芯片电容器C1 30PF 独石振荡电容器C2 30PF 独石振荡电容器C3 10μF 点解电容器复位晶振CY 12MHz S型振荡电阻R1 1KΩ1/4W,金属膜电容器C3放电电阻电阻R2 1KΩ1/4W,金属膜端口电位上拉电阻电阻R3 1KΩ1/4W,金属膜限流电阻发光二极管LED1 Φ5 红色高亮显示发光二极管LED2 Φ5 红色高亮显示二、程序设计1.程序设计平台程序设计采用keil C 软件,为了养成一个良好的文件管理习惯,建议:编程前,在计算机的某个硬盘分区下建立一个目录,目录的名字为你编写程序的主题,然后把keil C 产生的所有文件都放在该目录下。

STC单片机C语言程序设计STC单片机C语言编程入门

STC单片机C语言程序设计STC单片机C语言编程入门

STC单片机C语言程序设计STC单片机C语言编程入门STC单片机是一种广泛应用于嵌入式系统和物联网设备中的微控制器。

它具有体积小、功耗低、运算能力强等特点,被广泛应用于各种控制系统中。

本文将介绍STC单片机C语言程序设计的入门知识,以帮助初学者快速上手。

首先,我们需要了解一些基本的概念和术语。

1.单片机:单片机是一种集成电路芯片,其中包含了中央处理器、存储器、输入输出接口等功能模块。

它可以独立完成特定的任务,不需要额外的硬件设备与之配合。

2.C语言:C语言是一种高级编程语言,被广泛应用于嵌入式系统开发中。

它具有简洁、高效的特点,易于理解和学习。

了解了上述基本概念后,接下来我们将介绍一些STC单片机C语言程序设计的入门知识。

2. 程序结构:一个C语言程序通常由多个函数组成,其中一个函数名为main(。

程序从main(函数开始执行,执行完main(函数后程序结束。

3.数据类型:C语言中有多种数据类型,包括整型、浮点型、字符型等。

在使用数据类型时,需要根据需要选择合适的数据类型。

4.变量和常量:在C语言中,可以使用变量和常量来存储数据。

变量是可以改变值的,而常量是固定不变的值。

5. 输入和输出:C语言中使用标准库函数scanf(和printf(来实现输入和输出操作。

通过这两个函数可以从键盘获取输入数据,并将结果输出到屏幕上。

6. 控制语句:在C语言中,可以使用if语句、for循环和while循环等控制语句来控制程序的执行流程。

通过控制语句,可以实现条件判断、循环执行等功能。

7.函数:函数是C语言中的重要概念,它可以将一段代码封装成一个独立的模块,方便重复使用。

在编写程序时,可以自定义函数来实现特定的功能。

8.数组:数组是一种存储相同类型数据的连续内存区域。

在C语言中,可以使用数组来存储一组数据,并对数据进行操作。

9.文件操作:C语言提供了文件操作函数,可以对文件进行读写操作。

通过文件操作,可以实现数据的持久化存储。

51单片机C语言源代码例程附带电路图

51单片机C语言源代码例程附带电路图

闪烁灯[实验要求]点亮与单片机P1.0口相连的发光二极管,延时0.2S,然后熄灭,延时0.2S,再点亮,如此循环下去。

[实验目的]初步了解单片机IO口输出高低电平的作用,延时函数的时间估算。

[硬件电路][源代码]#include<reg51.h>/**********************************************************上面这行是一个"文件包含"处理。

所谓"文件包含"是指一个文件将另外一个文件的内容全部包含进来这里的程序虽然只写了一行,但C编译器在处理的时候却要处理几十或几百行,这里包含reg51.h的目的在于本程序要使用P1这个符号,而P1是在reg51.h这个头文件中定义的。

大家可以在编译器目录下面用记事本打开这个文件看看。

*********************************************************/sbit P1_0=P1^0; //定义IO口这步的目的是让编//译器知道P1_0代表的就是单片机的P1.0口void delay02s(void) //延时0.2秒子程序{unsigned char i,j,k; //定义3个无符号字符型变量。

for(i=20;i>0;i--) //三个FOR循环用来延时,这里为for(j=20;j>0;j--) //什么是0.2S大家可以用WAVE for(k=248;k>0;k--); //高断点仿真一下,就可知道大概 } //是0.2S了。

void main(void) //每一个C语言程序有且只有一个主函数,{while(1) //循环条件永远为真,以下程序一直执行下去。

{P1_0=0; // I/O口P1.0输出低电平,小灯被点亮。

delay02s(); //延时经过0.2秒。

P1_0=1; // I/O口P1.0输出高电平,小灯熄灭。

51单片机C语言程序设计-图文

51单片机C语言程序设计-图文
03 8 只 LED 左右来回点亮
/* 名称:8 只 LED 左右来回点亮 说明:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果
*/ #include<reg51.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int //延时 void DelayMS(uint x) {
case 2: //东西向黄灯闪烁,绿灯关闭 DelayMS(300); YELLOW_A=~YELLOW_A;GREEN_A=1; if(++Flash_Count!=10) return; //闪烁 5 次 Flash_Count=0; Operation_Type=3; break;
case 3: //东西向红灯,南北向绿灯亮 RED_A=0;YELLOW_A=1;GREEN_A=1; RED_B=1;YELLOW_B=1;GREEN_B=0; DelayMS(2000); Operation_Type=4; break;
3 Ykcsh 呈献
0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff }; //延时 void DelayMS(uint x) {
uchar i; while(x--) {
for(i=0;i<120;i++); } } //主程序 void main() { uchar i; while(1) { //从数组中读取数据送至 P0 和 P2 口显示
uchar i; while(x--) {
for(i=0;i<120;i++); } } //主程序 void main() { uchar i; P2=0x01; while(1) {

免费独家原创51、STC单片机C语言通用万能编程模板 V1.0

免费独家原创51、STC单片机C语言通用万能编程模板 V1.0

《8051单片机C语言编程模板》V1.0 *因为本资料未收入主程序中的各种子函数特定驱动程序,所以在使用本资料时请参阅杜洋老师在《爱上单片机》一书的配套光盘中的程序文件,本人水平欠佳,如果有误,还请谅解。

/*********************************************************************************************程序名:编写人:编写时间:20 年月日硬件支持:接口说明:修改日志:NO.1-/*********************************************************************************************说明:/*********************************************************************************************/#include <REG51.h REG52.h STC11Fxx.H STC12C2052AD.H STC12C5A60S2.H> //通用89C51头文件(只留下实际使用的单片机所对应的头文件)#include <assert.h> //设定插入点#include <ctype.h> //字符处理#include <errno.h> //定义错误码#include <float.h> //浮点数处理#include <fstream.h> //文件输入/输出#include <iomanip.h> //参数化输入/输出#include <iostream.h> //数据流输入/输出#include <limits.h> //定义各种数据类型最值常量#include <locale.h> //定义本地化函数#include <math.h> //定义数学函数#include <stdio.h> //定义输入/输出函数#include <stdlib.h> //定义杂项函数及内存分配函数#include <string.h> //字符串处理#include <strstrea.h> //基于数组的输入/输出#include <time.h> //定义关于时间的函数#include <wchar.h> //宽字符处理及输入/输出#include <wctype.h> //宽字符分类#include <intrins.h> //51基本运算(包括_nop_空函数)sfr [自定义名] = [SFR地址] ; //按字节定义SFR中的存储器名。

信号发生器(正弦波,方波,三角波)51单片机C语言代码

信号发生器(正弦波,方波,三角波)51单片机C语言代码

/**************************************//* 信号发生器(正弦波,方波,三角波)*/ /*************************************/#include<reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit cs=P2^0;sbit clk=P2^1;sbit din=P2^2;sbit key1=P1^0;sbit key2=P1^1; uchar keydat;uchar flag;被置零立马停止发信号//tlc5615 片选端口//tlc5615 时钟线//tlc5615 传输端口//按键的单片机接口//波形发生终止信号的标志位一旦uchar m,num; uchar dat=0xff;uchar code tosin[141]={//正弦波的编码0x00,0x01,0x02,0x02,0x03,0x04,0x05,0x06,0x07,0x08, 0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,0x16, 0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b, 0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45, 0x48,0x4c,0x4e,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63, 0x66,0x69,0x6c,0x6f,0x70,0x71,0x72,0x73,0x74,0x75, 0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7e, 0x7f,0x80,0x7f,0x7e,0x7e,0x7d,0x7c,0x7b,0x7a,0x79, 0x78,0x77,0x76,0x75,0x74,0x73,0x72,0x6f,0x6c,0x69, 0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,0x4e,0x4c, 0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30, 0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a, 0x18,0x16,0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a, 0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01, 0x00};uchar flagsqu; 中断控制)// 方波高低电平控制为 (运用定时器 1void delay(uchar z) //延时函数{uchar x,y;for(x=0;x<110;x++)for(y=z;y>0;y--);}void prepare() {cs=1;din=1;clk=0;cs=0; 为低时进? //tlc5615 的初始化//cs 的上升沿和下降沿必须在clk}/* 用中断来产生方波void Squtranslator(){TR1=1;的持续时间占空比//启动定时器 1 控制高低电平do{do{_wave=0;}while((!flagsqu) && flag==1);// 如果一旦终止信号的//产生可以立马退出循环flagsqu=0;do{_wave=1;}while((!flagsqu) && flag==1); flagsqu=0; }while(flag);flag=1;TR1=0;}*/void Squtranslator() //方波函数{uchar j;uchar dat1=0x7f;while(flag){do{}prepare();dat=dat1;for(j=0;j<12;j++) { din=(bit)(dat>>7);clk=1;dat=dat<<1; clk=0;}cs=1;为低时进行delay(200);if(dat1==0)dat1=0x7f;elsedat1=0;}while(flag);}//将数据的最高位赋给din//一位位的传输//cs 的上升沿和下降沿必须在//使高低电平持续一段时间//完成了0和0x7f 之间的替换clkvoid Tratranslator() //锯齿波的发生函数{uchar j;uchar dat1=0x7f;while(flag){do{prepare();dat=dat1;for(j=0;j<12;j++){din=(bit)(dat>>7);clk=1;dat=dat<<1;clk=0;}cs=1;为低时进行delay(2);dat1--;}while(flag && dat1);do{//将数据的最高位赋给din//一位位的传输//cs 的上升沿和下降沿必须在//稍加延时//一旦有终止信号就可以停止clk{uchar i,j;prepare(); dat=dat1; for(j=0;j<12;j++){din=(bit)(dat>>7); //将数据的最高位赋给 dindelay(2); dat1++;}while(flag && (!(dat1==0x7f)));}}void Sintranslator(uchar wave[],uchar num )//正弦波的转换函数clk=1; dat=dat<<1; clk=0;}cs=1;为低时进行//一位位的传输//cs 的上升沿和下降沿必须在clk//稍加延时uchar dat1;do{for(i=0;i<num;i++){prepare();dat1=wave[i]; //打开片选开始工作for(j=0;j<12;j++){din=(bit)(dat1>>7); //将数据的最高位赋给dinclk=1;dat1=dat1<<1; //一位位的传输clk=0;if(flag==0)break;}cs=1; //cs 的上升沿和下降沿必须在clk 为低时进行delay(1); //稍加延时if(flag==0)break;}}while(flag); //等待控制键的暂停}void keyscan() //切换功能按键返回键值函数{uchar i;for(i=0;i<4;i++){if(key1==0){delay(10);if(key1==0){keydat++;do{}while(!key1); //松手检测if(keydat==4)keydat=1;//加满回零处理}}}}void keycountrl() // 切断输出控制函数{if(key2==0){delay(10);{case 1:if(key2==0)flag=0;do{}while(!key2); //松手检测}}}void main (){uchar temp;TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;while(1){do{switch(keydat)//确定定时器的工作方式 //给定时器 0 赋予初值 //开总中断 //开启定时器 0 中断flag=1;do{Sintranslator(tosin,141);}while(flag);break;case 2: flag=1;do{Tratranslator();}while(flag);break;case 3: flag=1;do{Squtranslator();}while(flag);break;default:break;}}while(flag);temp=keydat; // 装载键值while(keydat==temp); // 在这里等待键值的改变}}void Time0() interrupt 1{TH0=(65536-50000)/256; //定时器0 用来扫描按键不断地扫描dTL0=(65536-50000)%256;num++;if(num==4){keyscan();keycountrl();num=0;}}。

使用C语言访问51单片机中存储器的核心代码

使用C语言访问51单片机中存储器的核心代码

使⽤C语⾔访问51单⽚机中存储器的核⼼代码⽬录使⽤C语⾔访问51单⽚机中存储器1.头⽂件2.code data pdata xdata4.CWORD、XWORD、DWORD和PWORD5.参考使⽤C语⾔访问51单⽚机中存储器1.头⽂件在Keil C51⼯程中 #include <absacc.h> ,可以直接使⽤CBYTE, XBYTE, DBYTE, PBYTEabsacc.h 的部分内容如下:#ifndef __ABSACC_H__#define __ABSACC_H__#define CBYTE ((unsigned char volatile code *) 0)#define DBYTE ((unsigned char volatile data *) 0)#if !defined (__CX2__)#define PBYTE ((unsigned char volatile pdata *) 0)#endif#define XBYTE ((unsigned char volatile xdata *) 0)#define CWORD ((unsigned int volatile code *) 0)#define DWORD ((unsigned int volatile data *) 0)#if !defined (__CX2__)#define PWORD ((unsigned int volatile pdata *) 0)#endif#define XWORD ((unsigned int volatile xdata *) 0)code data pdata xdata 均为存储器类型,下节将详叙,此处⽤T替代:unsigned char volatile T * 为指向存储器T中⽆符号整型数的指针类型((unsigned char volatile T * ) 0) 对0做强制类型转换2.code data pdata xdatacode data pdata xdata均为存储器类型code:⽤于存储常数和函数,使⽤16位地址访问,可位于⽚内或⽚外ROMdata:⽤于存储变量,使⽤8位地址,位于⽚内RAMpdata:⽤于存储变量,使⽤8位地址,位于⽚外RAMxdata:⽤于存储变量,使⽤16位地址,位于⽚外RAM3.CBYTE、DBYTE、PBYTE和XBYTE的区别注意:以下存储地址范围均指理论上可访问的最⼤范围,具体操作时需根据存储器⼤⼩调整从存储器类型的区别中可以得出本节四者的区别:CBYTECBYTE 是⽤于访问代码存储器的,即ROM部分。

51单片机C语言程序设计源代码

51单片机C语言程序设计源代码

新概念51单片机C语言教程----入门、提高、开发、拓展全攻略郭天祥编著电子工业出版社例2.2.1编写程序,点亮第一个发光二极管(part2_1.c P27)#include <reg52.h> //52系列单片机头文件sbit led1=P1^0; //声明单片机P1口的第一位void main() //主函数{led1=0; /*点亮第一个发光二极管*/}例2.2.2编写程序,点亮P1口的若干二极管(part2_2.c P39)#include <reg52.h> //52系列单片机头文件void main() //主函数{P1=0xaa;//while(1);}例2.5.1利用for语句延时特性,编写第一个发光二极管以间隔1S亮灭闪动的程序(part2_3.c P42)#include <reg52.h> //52系列单片机头文件#define uint unsigned int //宏定义sbit led1=P1^0; //声明单片机P1口的第一位uint i,j;void main() //主函数{while(1) //大循环{led1=0; /*点亮第一个发光二极管*/for(i=1000;i>0;i--) //延时for(j=110;j>0;j--);led1=1; /*关闭第一个发光二极管*/for(i=1000;i>0;i--) //延时for(j=110;j>0;j--);}}- 2 -例2.6.1编写程序使第一个发光二极管以间隔500ms亮灭闪动。

(part2_4.c P48)#include <reg52.h> //52系列单片机头文件#define uint unsigned int //宏定义sbit led1=P1^0; //声明单片机P1口的第一位void delay1s(); //声明子函数void main() //主函数{while(1) //大循环{led1=0; /*点亮第一个发光二极管*/delay1s(); //调用延时子函数led1=1; /*关闭第一个发光二极管*/delay1s(); //调用延时子函数}}void delay1s() //子函数体{uint i,j;for(i=500;i>0;i--)for(j=110;j>0;j--);}例2.7.1编写程序使第一个二极管以亮200ms、灭800ms的方式闪动。

51单片机 lcd1602测试C程序

51单片机 lcd1602测试C程序

51单片机 lcd1602测试C程序///原创,绝对正版...嘻嘻嘻~~~//********************************************************************** //lcd_1602测试C程序//RS接P2^5,RW接P2^6,E接P2^7,P0口为数据口//如果硬件正常,则在液晶屏幕上显示第一行为"Weclome!",第二行显示"Ilove you!"//**********************************************************************//********************************************************************** #include <reg51.h>sbit rs_1602=P2^5;sbit rw_1602=P2^6;sbit en_1602 =P2^7;#define lcd_data P0 //加上拉//********************************************************************** //1602LCD延时Zms函数//********************************************************************** void delay_1602(int z){ int x,y;for(x=0;x<z;x++)for(y=0;y<=111;y++);}//****************************************************************** **** //1602LCD写地址函数//****************************************************************** **** void adr_write(unsigned char adr){delay_1602(5);en_1602=0;rs_1602=0;rw_1602=0;en_1602=1;lcd_data=adr;en_1602=0;}//****************************************************************** **** //1602LCD写数据函数//****************************************************************** **** void ddr_write(unsigned char ddr){delay_1602(5);en_1602=0;rs_1602=1;rw_1602=0;en_1602=1;lcd_data=ddr;en_1602=0;}//****************************************************************** ****//1602LCD初始化函数//****************************************************************** ****void lcd_init(void){en_1602=0;adr_write(0x38); //两行显示,5*7模式adr_write(0x01);//清显示adr_write(0x0c); //整体显示打开,不显示光标adr_write(0x06);adr_write(0x80);//从第一行的第一个位置开始显示}//****************************************************************** ****//1602LCD显示字符串数据函数//****************************************************************** ****void str_write(unsigned char *str){while(*str!='\0'){ddr_write(*str);str++;}}//****************************************************************** ****//1602LCD显示定位函数//****************************************************************** ****void set_point(unsigned char x,y){if(!x)adr_write(0x80+y);elseadr_write(0x80+0x40+y);}void main(void){lcd_init(); //LCD1602初始化while(1){set_point(0,4);str_write("Welcome!");set_point(1,2);str_write("I love you!!"); }}。

51STC单片机C语言通用万能编程模板

51STC单片机C语言通用万能编程模板

51STC单片机C语言通用万能编程模板以下是一份STC单片机C语言通用万能编程模板,供参考:```c
#include <reg52.h> // 引入头文件
//全局变量定义
//...
//函数声明
//...
//主函数
void mai
//初始化操作
//...
while (1)
//主循环
//代码逻辑
//...
}
//延时函数
unsigned int i, j;
for (j = 10; j > 0; j--); // 延时约1ms,根据实际情况调整
}
//其他函数定义
//...
```
该模板包含了一些常用的部分,如头文件引用、全局变量定义、函数
声明和主函数等。

在主函数中,可以进行各种初始化操作,如引脚设置、定时器设置等。

然后通过一个无限循环,进行主要的代码逻辑操作。

在代码逻辑部分,可以根据具体需求编写相应的代码,如读取传感器
数据、控制外设等。

除了主函数外,还可以定义其他的函数来实现一些特定功能,如延时
函数、中断处理函数等。

使用该模板可以大大节省编写代码的时间,同时也方便后续的维护和
修改工作。

需要注意的是,该模板是基于STC单片机的C语言编程,可能会与其
他型号的单片机有些差异,需根据具体情况进行调整。

同样,在使用时也
需要根据实际需求添加相应的代码。

51单片机驱动16位数码管C语言程序

51单片机驱动16位数码管C语言程序

说明:本程序配合电路为:使用STC89C52、2个74hc138和1个74hc164完成16位数码管的检测任务。

其中74HC164完成数码管段码的输出,2个74HC138完成16个数码管位码的选择。

/*********************************接线关系:P0.0---164(P1、P2) DATP0.1---164(P8) CLKP0.2---138a(P6)GP2.3---138b(P6)G特别说明:本程序位码表所对应74hc138(a、b、c)接线为:P2.2---138(P1) aP2.1---138(P2) bP2.0---138(P3) C*****************************************************/c语言程序如下:#include <reg52.h>#include <absacc.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define ON 0#define OFF 1sbit DAT_164=P0^0;sbit CLK_164=P0^1;sbit G_138a=P0^2;sbit G_138b=P2^3; //数码管显示开关uchar code seg[]={ //七段码表0x3f,0x06,0x5b,0x4f,0x66,0x6d, //0-5 00H-05H0x7d,0x07,0x7f,0x6f,0x77,0x7c, //6-b 06H-0BH0x39,0x5e,0x79,0x71,0x40,0x46, //c- -1 0CH-11H0x76,0x00,0x80,}; //H 全灭 . 12H-16Hunsigned char code wma3[]={0x00,0x04,0x02,0x06,0x01,0x05,0x03,0x07}; //此为位码表对应于138a-P2.2;138b-P2.1;138c-P2.0。

基于51的TM1620C程序

基于51的TM1620C程序

基于51的TM1620C程序基于51的TM1620 C程序#include<REG52.h>#include<stdio.h>#include<intrins.h>//#define tm1620 4//#define icmodel tm1620//#elif icmodel==tm1620//#define seg 8//#define grid 7//#define dismodel 3#define dissetmode 0x03 //显示模式设置#define writedatamode_z 0x40 //自动加一方式显存#define writeledmode_z 0x41 //自动加一方式写LED显存命令#define readkeymode 0x42 //读按键命令#define readswmode 0x43 //读SW命令#define writedatamode_g 0x44 //固定模式#define writeledmote_g 0x45 //固定模式写LED显存命令#define startaddress 0xc0 //起始地址#define disconmode 0x8c //显示控制//#define datacount#define uchar unsigned charuchar a[4]={0x3f,0x06,0x5b,0x4f};unsigned int i;sbit STB =P1^4; //定义端口sbit CLK =P1^7;sbit DIN =P1^5;void delay(int k) //延迟程序{ unsigned char i,j;for(;k>0;k--)for(j=255;j>0;j--)for(i=255;i>0;i--);}void indate(unsigned char p) { unsigned int i;STB=0;for(i=0;i<8;i++){CLK=0;if((p&0x01)!=0){DIN=1;}else{DIN=0;}CLK=1;p=p>>1;}}void display(){DIN=1;CLK=1;STB=1; //初始化indate(writedatamode_z); //自动加1方式STB=1;for(i=0;i<4;i++){indate(startaddress); //传起始地址indate(a[i]); //传数据}STB=1;indate(disconmode); //显示控制命令STB=1;}void main(){DIN=1;CLK=1;STB=1;indate(0x00);STB=1;display();delay(10);}。

STC51入门笔记(郭天祥C语言)---第九节:常见芯片和运放电路介绍

STC51入门笔记(郭天祥C语言)---第九节:常见芯片和运放电路介绍

STC51⼊门笔记(郭天祥C语⾔)---第九节:常见芯⽚和运放电路介绍声明:本篇⽂章只是个⼈知识盲区、知识弱点、重点部分的归纳总结,望各位⼤佬不喜勿喷。

梳理顺序是按照书籍的实际顺序梳理,转载请注明出处。

作者:sumjess⼀、PCF8591锁存器:1、74HC573锁存器介绍:74HC573是拥有⼋路输出的透明锁存器,输出为三态门,是⼀种⾼性能硅栅MOS器件。

器件的输⼊是和标准CMOS输出兼容的,加上拉电阻他们能和LS/ALSTTL输出兼容。

2、74HC573锁存器⼯作原理:如果单⽚机的总线接⼝只作⼀种⽤途,不需要接锁存器;如果单⽚机的总线接⼝要作两种⽤途,就要⽤两个锁存器。

例如:⼀个⼝要控制两个 LED,对第⼀个 LED 送数据时,“打开”第⼀个锁存器⽽“锁住”第⼆个锁存器,使第⼆个 LED 上的数据不变。

对第⼆个 LED 送数据时,“打开”第⼆个锁存器⽽“锁住”第⼀个锁存器,使第⼀个 LED 上的数据不变。

如果单⽚机的⼀个⼝要做三种⽤途,则可⽤三个锁存器,操作过程相似。

然⽽在实际应⽤中,我们并不这样做,只⽤⼀个锁存器就可以了,并⽤⼀根 I/O ⼝线作为对锁存器的控制之⽤(接 74HC573 的L,⽽E可恒接地)。

所以,就这⼀种⽤法⽽⾔,可以把锁存器视为单⽚机的 I/O ⼝的扩展器。

1脚是输出使能11脚是锁存使能D是输⼊Q是输出H是⾼电平,L是低3、74HC573锁存器使⽤⽅法:E是1脚 L是11脚E接低电平,使芯⽚内部数据保持器输出端与芯⽚8位输出端之间连通。

L端的作⽤是通过⾼低电平控制8位输⼊与内部数据保持器输⼊端的连通与断开。

当 L= 0 时,P0端⼝的8位数据线与74HC573内部数据保持器的输⼊端断开。

当 L = 1 时,P0端⼝的8位数据线与74HC573内部数据保持器的输⼊端连通⼆、AT24C02芯⽚:1、I2C简介:I2C 即Inter-Integrated Circuit(集成电路总线),这种总线类型是由飞利浦半导体公司在⼋⼗年代初设计出来的⼀种简单、双向、⼆线制、同步串⾏总线,主要是⽤来连接整体电路(ICS) ,IIC是⼀种多向控制总线,也就是说多个芯⽚可以连接到同⼀总线结构下,同时每个芯⽚都可以作为实时数据传输的控制源。

51单片机串口控制继电器的C源程序

51单片机串口控制继电器的C源程序

51单片机串口控制继电器的C 源程序————————————————————————————————作者:————————————————————————————————日期:51单片机串口控制继电器的C源程序2009—09-29 23:13计算机通过软件来控制单片机继电器。

操作:计算机使用串口调试助手,当然,可以自己编写控制软件(上位机软件).单片机P1.1口连上继电器C源程序为:#include 〈reg52。

h〉sbit RELAY = P1^1; //定义继电器:接P1^1void delay(unsigned int cnt){while(--cnt);}main(){TMOD=0x20; //TH1=0xfd;TL1=0xfd;SM0=0;SM1=1;REN=1; //控制RITR1=1;/*以上为定时器设置和波特率设置,这样的话,通过串口调试助手发送数据(随意数据)通过改变RI(串口接收标志来实现继电器的吸合与打开*/while(1){if(RI==1){RI=0;delay(500);RELAY=!RELAY; //如果吸合则打开,如果己打开则吸合.}}}以上在AT89s52+Keil上编译调试运行OK。

/****************************************************************************//*电子日历,有时间显示、闹铃、日期、秒表及键盘设置功能*//*功能键A: 设置位数字+1 闹钟模式下为闹钟开关秒表模式下为记时开关*//* 功能键B:设置位数字—1 闹钟模式下为闹钟开关*//* 功能键C:设置模式及设置位选择秒表模式下为清零键*//*功能键D:在四种工作模式下切换设置闹钟开关*//****************************************************************************/#include#include/***************这里设置程序初始化时显示的时间****************/#define SET_HOUR 12 /*设置初始化小时*/#define SET_MINUTE 00 /*设置初始化分钟*/#define SET_SECOND 00 /*设置初始化秒数*//*************************系统地址****************************/#define BASE_PORT 0x8000 /*选通基地址*/#define KEY_LINE BASE_PORT+1 /*键盘行线地址*/#define KEY_COLUMN BASE_PORT+2 /*键盘列线地址*/#define LED_SEG BASE_PORT+4 /*数码管段选地址*/#define LED_BIT BASE_PORT+2 /*数码管位选地址*/#define LED_ON(x) XBYTE[LED_BIT]=(0x01〈〈x) style=”line—height: 25px; ”> #define LED_OFF XBYTE[LED_SEG]=0x00 /*LED显示空*/</x) >/**************在设置模式下对秒分时的宏定义*****************/#define SECOND 0 /*对应数码管右边两位*/#define MINUTE 1 /*对应数码管中间两位*/#define HOUR 2 /*对应数码管左边两位*//********************定义四种工作模式***********************/#define CLOCK clockstr /*时钟模式*/#define ALART alartstr /*闹钟模式*/#define DATE datestr /*日期模式*/#define TIMER timerstr /*秒表模式*//****************以下是所有子函数的声明*********************/void sys_init(void); /*系统的初始化程序*/void display(void); /*动态刷新一次数码管子程序*/void clockplus(void); /*时间加1S的子程序*/void update_clockstr(void); /*更新时间显示编码*/void update_alartstr(void);/*更新闹钟时间的显示编码*/void update_datestr(void); /*更新日期显示编码*/void update_timerstr(void);/*更新秒表时间的显示编码*/void deley(int); /*延时子程序*/void update_dispbuf(unsigned char *); /*更新显示缓冲区*/unsigned char getkeycode(void); /*获取键值子程序*/void keyprocess(unsigned char); /*键值处理子程序*/unsigned char getmonthdays(unsigned int,unsigned char);/*计算某月的天数子程序*//*功能键功能子函数*/void Akey(void); /*当前设置位+1 开关闹钟开关秒表*/void Bkey(void);/*当前设置位—1 开关闹钟*/void Ckey(void); /*设置位选择秒表清零*/void Dkey(void);/*切换四种工作模式*//**********************全局变量声明部分*********************/unsigned char led[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};/*从0~9的LED编码*/unsigned char ledchar[3]={0x5c,0x54,0x71};/*o n f*///unsigned char key[24]={ /*键值代码数组对应键位:*/// 0x70,0x71,0x72,0x73,0x74,0x75, /*7 8 9 A TRACE RESET*/// 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5, /* 4 5 6 B STEP MON */// 0xd0,0xd1,0xd2,0xd3,0xd4,0xd5, /* 1 2 3 C HERE LAST */// 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5}; /* 0 F E D EXEC NEXT */struct{ /*时间结构体变量*/unsigned char s;unsigned char m;unsigned char h;}clock={SET_SECOND,SET_MINUTE,SET_HOUR};struct{ /*闹铃时间结构体变量*/unsigned char m;unsigned char h;}alart={SET_MINUTE,SET_HOUR};struct{ /*日期结构体变量*/unsigned int year;unsigned char month;unsigned char day;}date={6,1,1};struct{/*秒表时间结构体变量*/unsigned char ms;unsigned char s;unsigned char m;}timer={0,0,0};unsigned char dispbuf[6]; /*显示缓冲区数组*/unsigned char clockstr[6]; /*时间显示的数码管编码数组*/unsigned char alartstr[6]; /*闹钟显示的数码管编码数组*/unsigned char datestr[6]; /*日期显示的数码管编码数组*/unsigned char timerstr[6];/*秒表显示的数码管编码数组*/unsigned int itime=0,idot; /*定时器0中断计数*/unsigned char itime1=0; /*定时器1中断计数*/sbit P3_1=P3^1; /*外接蜂鸣器的管脚*/bdata bit IsSet=0; /*设置模式标志位0:正常走时1:设置模式*/bdata bit Alart_EN=0; /*闹铃功能允许位0:禁止闹铃1:允许闹铃*/bdata bit IsBeep=0;/*响铃标志位0:未响铃1:正在响铃*/unsigned char SetSelect=0; /*在设置模式IsSet=1时,正在被设置的位,对应上面的宏*/unsigned char *CurrentMode;/*标志当前正设置的功能,如CurrentMode=CLOCK 或CurrentMode=ALART等*/void timerplus(void);/**************************函数部分*************************/void main(void){sys_init();while(1){XBYTE[KEY_COLUMN,0x00]; /*给键盘列线赋全零扫描码,判断是否有键按下*/while((XBYTE[KEY_LINE]&0x0f)==0x0f) /*检测是否有键按下,无则一直进行LED 的刷新显示*/{if(Alart_EN&&(clock.h==alart。

STC51单片机的函数信号发生器(c语言)

STC51单片机的函数信号发生器(c语言)

STC51单片机的函数信号发生器(c语言)————————————————————————————————作者:————————————————————————————————日期:基于51单片机的函数信号发生器设计报告摘要本系统利用单片机AT89C52采用程序设计方法产生锯齿波、三角波、正弦波、方波四种波形,再通过D/A转换器DAC0832将数字信号转换成模拟信号,滤波放大,最终由示波器显示出来,能产生10Hz—10kHz的波形。

通过键盘来控制四种波形的类型选择、拨码开关控制频率的变化,并通过液晶屏1602显示其各自的类型以及数值,系统大致包括信号发生部分、数/模转换部分以及液晶显示部分三部分,其中尤其对数/模转换部分和波形产生和变化部分进行详细论述。

关键词:单片机AT89S52、DAC0832、液晶1602目录1. 系统设计1.1 设计要求1.2方案设计与论证1.2.1 信号发生电路方案论证 1.2.2 单片机的选择论证1.2.3 显示方案论证1.2.4 键盘方案论证1.3 总体系统设计1.4 硬件实现及单元电路设计1.4.1 单片机最小系统的设计1.4.2 波形产生模块设计1.4.3 显示模块的设计1.4.4 键盘模块的设计1.5 软件设计流程1.6 源程序2. 输出波形的种类与频率的测试2.1 测试仪器及测试说明2.2 测试结果3、附录3.1 参考文献3.2 附图1、系统设计经过考虑,我们确定方案如下:利用AT89C52单片机采用程序设计方法产生锯齿波、三角波、正弦波、方波四种波形,再通过D/A转换器DAC0832将数字信号转换成模拟信号,滤波放大,最终由示波器显示出来,通过键盘来控制四种波形的类型选择、频率变化,最终输出显示其各自的类型以及数值。

1.1、设计要求1)、利用单片机采用软件设计方法产生四种波形2)、四种波形可通过键盘选择3)、波形频率可调4)、需显示波形的种类及其频率1.2方案设计与论证1.2.1 信号发生电路方案论证方案一:通过单片机控制D/A,输出四种波形。

51单片机4路抢答器的原理及C语言源程序

51单片机4路抢答器的原理及C语言源程序

51单片机4路抢答器的原理及C语言源程序单片机,当然不只是51,51单片机是一种稍通用型的单片机,通过I/O口的定义,可以实现多种控制功能。

抢答器,原理:如果为四路,当其中任一路控下后,其他几路即失效,结果为第一次按下的,可以用数码管或是LED灯来显示,当然这里只是讲原理与编程,具体可以根据抢答器路数及显示方式更改程序即可。

源程序如下:/*用的是AT89S52开发板,独立按键接口如下,就用这四路。

先按下的用LED灯来显示,对应第一个到第四个LED灯,其他再按无效,如果想再次实现,可手动复位单片机*/#include <reg52.h>sbit key1=P3^0; //定义按键,根据需要连接线路,如独立按键(4路)sbit key2=P3^1;sbit key3=P3^2;sbit key4=P3^3;/*void delay(unsigned int cnt) //如果有抖动或是干扰,可以用个小延时去抖{while(--cnt);}*/void main(){bit Flag;while(!Flag){if(!key1){P1=0xFE;Flag=1;} /*LED灯来显示按下的键,第一个灯,我这里是8位LED灯,即:0111 1111,反过来读数为:1111 1110 即:0xFE *,P1口对应LED灯,给P1赋值/else if(!key2){P1=0xFD;Flag=1;} //第二个灯亮else if(!key3){P1=0xFB;Flag=1;} //第三个灯亮else if(!key4){P1=0xF7;Flag=1;} //第四个灯亮,意味着第四路首先按下}while(Flag); //可以再加个I/O,控制Flag,这样初始化,继续抢答,还可以设计按下时的声音}以上程序测试只能测试一次,如再想测试,只能手动复位单片机。

当然,可以根据此原理,设计出功能强大的抢答器。

51单片机程序代码

51单片机程序代码

51单片机程序代码(江明电子)∙(三十)51单片机程序代码PROFIBUS-DP 现场总线智能节点的设计∙基于NRF401的烟雾检测报警系统∙(二十五)51单片机程序代码流量检测系统∙(二十四)51单片机程序代码自动感应门∙(十三)51单片机程序代码快速温度检测仪∙(八)51单片机程序代码单片机串行通信波特率自动识别系统∙(七)51单片机程序代码锯齿波信号发生器∙(三十二)51单片机程序代码红外线测温∙(二十九)基于CAN总线和单片机的电梯主控器∙(二十六)51单片机程序代码红外便携式抄表器∙(二十七)51单片机程序代码基于IC卡的考勤机∙(十)51单片机程序代码双口RAM的高速数据采集卡∙(五)51单片机程序代码交通灯系统∙(二)51单片机程序代码电子琴∙(三十一)51单片机程序代码单片机接入以太网的实现∙(二十三)RS485总线的远距离水位监控系统∙(二十)51单片机程序代码白光LED路灯照明控制器∙(二十一)51单片机程序代码∙(十七)51单片机程序代码超声波测距仪∙(二十二)51单片机程序代码出入管理控制系统∙(十八)51单片机程序代码数字式倾角测量仪∙(十六)51单片机程序代码手持式高度计∙(十五)51单片机程序代码语音电子开关身份认证∙(十四)51单片机程序代码多功能电子万年历∙(十二)51单片机程序代码电表数据采集器∙(十一)51单片机程序代码铁电存储器的采集与记录∙(八)51单片机程序代码电子广告牌∙(六)51单片机程序代码篮球计时计分器∙(四)51单片机程序代码程控放大气∙(三)51单片机程序代码多路抢答器(一)51单片机程序代码流水灯学习开始。

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