精华内容
下载资源
问答
  • OLED示波器,数组data[128]表示,数组长度为128,也就是OLED有128列,每一列一个数值,数值大小就是纵坐标,0~63,借用队列实现示波器的话: (1)传感器有新的数据了,队列满的就删除队列头,然后向队列尾插入新...

    OLED显示屏刷新速度考虑,肯定用硬件SPI驱动OLED屏幕。

    OLED示波器,数组data[128]表示,数组长度为128,也就是OLED有128列,每一列一个数值,数值大小就是纵坐标,0~63,借用队列实现示波器的话:
    (1)传感器有新的数据了,队列满的就删除队列头,然后向队列尾插入新数据。
    (2)OLED刷新就是遍历队列所有元素。

    考虑到心率显示效果,传感器采样速度虽然很快,但向队列插入新数据的时间点需要控制,比如10ms向队列写入新数据,那整个屏幕周期是1270ms。

    这样的话依旧是一次移动一个数据,心率刷新效果未可知。如果想心率显示整段往前平移,比如有了新的五个数据点后,刷新一次屏幕。这样显示效果又会不同。这样的话,新建队列的时候就得依照移动条件。

    借助于以上的想法和https://blog.csdn.net/song_hui_xiang/article/details/47146503这个实现,去完成这个设计。

    Signal 是ADC采集0到4095,用pulsesensor,采集的数值一般是800以上,3000以下,良好归一化到取件0到63:temp = 64 - ((Signal - 800) / (2200 / 62));
    新数据有ECG_move个后则满足(data_count == ECG_move) 就刷新显示。

    
    #pragma vector = ADC12_VECTOR
    __interrupt void ADC10(void)
    {
        Signal = ADC12MEM0;
    }
    
    #pragma vector=TIMER1_A0_VECTOR
    __interrupt void TIMER1_A0_ISR(void)
    {
        unsigned char temp;
        static char data_count = 0;
    
        if (Signal > 800)
        {
            temp = 64 - ((Signal - 800) / (2200 / 62));
            if (temp < 64)
            {
                AddQ(q, temp);                     //添加新数据
                data_count++;
            }
        }
    
        if (data_count == ECG_move)
        {
            data_count = 0;
            PrintQueue_len128(q);                     //刷新显示
        }
    }
    
    

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    同样,使用ADS1292R采集的数据依照时间将数据添加到队列显示即可。

    本来我做这个是做着玩,但是好像大家对这个都挺感兴趣的现在我给大家指几条道路。
    这个肯定是用430单片机更容易在评委心里加分!

    我介绍一下源码:
    写的是读取pulsesensor的代码,不是读取ADS1292R的代码。
    pulsesensor是一种光能转电压的传感器,能读取手指的心电变化。
    ADC读取pulsesensor即可,读取后在OLED屏幕上打点。
    单片机的SPI寄存器控制SPI的OLED,这样速度才跟得上,基本上是秒出图像,这也可以用于别的事情。
    可以通过片选CS选择,CS选择OLED就读取OLED,CS选择ADS1292R就读取ADS1292R,
    但鉴于在电脑端看到的波形都那么丑,我就没做下一步了。
    OLED的SPI寄存器设置和ADS1292R的并不是一样的。
    Msp430f5529单片机有UCA0模块和UCB0模块,UCA0可以支持SPI、UART,UCB0可以支持SPI、IIC,为了把串口留出来,所以不能用UCA0。源码里面我OLED用的是UCB0的SPI,只要通过片选CS就能够让很多器件都接在单片机的SPI口,单片机并不需要那么多SPI模块。

    有人用模拟器出来的波形很漂亮:
    在这里插入图片描述
    这个波形确实很漂亮,和pulsesensor差不多的波形了。

    [一个建议,点我]

    像上面这个链接里面的所展示的这样,比较器或许能简化计算心率。

    但是,也可以完全依靠原来数据计算心率,就需要下面这个压缩包里的东西了,里面就是用pulsesensor原数据计算心率的代码~
    在这里插入图片描述

    展开全文
  • 单片机原理及接口技术试验,以C语言示波器代码及仿真。
  • 该程序为自己编写,且经过调试成功,对于不同型号的单片机自己稍作修改即可使用,对需要的波形能够用液晶显示出来
  • 使用stc12内部AD实现的示波器程序,采用12864竖屏显示波形的思想,极大提高了刷屏速度、反应速度。
  • 边理论边实践学一样会一样基本实验:LED流水灯,数码管显示,键盘控制,音乐播放,继电控制I2C通信实验,串口通信实验,红外线遥控信号解码实验等单片机的定义分类和内部组成1单片机就是中央处理CPU,随机...

    希望对大家有帮助!!!

    入门有针对性的解决一些简单的实际问题,边理论边实践学一样会一样

    基本实验:LED流水灯,数码管显示,键盘控制,音乐播放,继电器控制I2C通信实验,串口通信实验,红外线遥控信号解码实验等

    单片机的定义分类和内部组成

    1单片机就是中央处理器CPU,随机存储器RAM。只读存储器ROM。定时、计数器和各种输入输出接口I/o接口电路等部件集成在一块电路芯片上的微型计算机。

    2,1分类按制造工艺分:HMOS和CHMOS   CHMOS包括80c51等中间加了C功耗要小

    适合便携式手提式和野外作业。

    2分类按不同容量的存储器配置分:51子系列和52子系列

    51表示单片机最后一位数字为1作为标志。片内带有4KbROM或EPROM(Erasable Programmable ROM,可擦除可编程ROM,128BRAM,两个16位定时器/计数器和5个中段器52系列是增强型各项指标都高。

    AT89S51是AT89C51的升级版支持ISP在线更新程序ISP(Internet Service Provider

    内部集成看门狗计时器等。

    3.1串行接口就是接口数据传送

    3.2中断控制系统接收中断请求如定时时间到,需要鸣笛报警类似stop to do停下来去执行ROM中特定的每段程序,执行完后再继续执行先前中断的程序

    时钟电路控制节拍工作。

    一个典型的单片机应用系统包括输入电路,单片机,输出电路

    把他想象成电脑。

    单片机的应用:

    p5

    十六进制A10B11C12D13E14F15

    记A10和D13点得13点F15不是F16

    十六进制加H

    逻辑数据的运算

    逻辑与。。。两个输入一个输出中间加一个恒定5v电压

    有0为0,全1出1

    逻辑或有1为1,全0出0;

    字长通常与计算机内部的寄存器和运算器数据总线的宽度一致

    实例1功能感受protues仿真单片机播放《渴望》主题曲

    运用protues打开仿真原理图。

    对单片机进行处理编辑edit component,选取目标文件hex

    Clock frequency 时钟频率

    Ok

    原理图编辑窗口没有滚动条,可通过预览窗口该表原理图的可视范围。

    Protues双击右键删除

    先单击鼠标右键,可通过鼠标左键可以编辑元器件的属性

    鼠标右键来删除画错的连线

    中键缩放原理图

    新建即保存新建设计文件

    Junction dot mode连接点

    Subcircuit mode 子电路 lab用总线时会用到

    Terminals mode 终端接口,有VCC地输出输入等接口

    Device pins mode 器件引脚用于绘制各种引脚。

    Graph mode 仿真图表,用于各种分析,如noise analysis

    Tape recorder  mode录音机

    Generator mode 信号发生器

    Voltage probe mode 电压探针仿真图表用

    Current probe mode 电流探针仿真图表用

    Virtual instruments mode虚拟仪表有示波器可显示工作波形

    Resistors 电阻

    Capacitors电容

    Crystal晶振

    Radianl electrolytic圆柱形电解电容

    Keywords输入resistors 470r或功率先选择元器件后放元器件

    Led+yellow

    Drag object 拖动对象

    Editi properties 编辑属性

    Rotate clockwise 顺时针旋转90°

    Rotate anti-clockwise 逆时针旋转90°

    X-mirror 水平翻转

    Y-mirror 垂直翻转

    删可以右键双击

    双击鼠标左键编辑label

    放置电源和地必须编辑正确的label如VCC地GND

    各元器件引脚通过总线的连接并不表示真正意义上的电气连接,需要添加网络标号。

    要运行双击单片机

    基本

    电源5V

    振荡电路:单片机是一种时序电路,必须施加脉冲信号才能工作。在它的内部有一个时钟产生电路,只要接上两个电容和一个晶振即可正常工作。P30

    复位电路;启动后让单片机从初始状态开始执行程序。

    EA一横:接正电源端,表示使用内部程序存储器。

    注意:观察仿真效果时,晶振电路,复位电路和EA引脚和电路的连接可以省略。

    Keil软件源程序后缀。C必须手工输入,表示为c语言程序,让keilc51采用对应的c语言的方式来编译源程序。

    #include包含51单片机寄存器定义的头文件

    将新建的源程序文件加载到项目管理器右击source group文件add c文件

    单片机不能处理c,必须将c转换成二进制或十六进制代码,汇编或编译。

    用鼠标右键点击target 进入options fortarget确认output选项中create hex

    file:///Z:\TEMP\msohtmlclip1\01\clip_image002.jpg重新构造所有目标

    程序烧录器及烧录软件的使用

    单片机软硬件系统仿真成功后,要真正投入实际应用,必须将程序烧写入单片机芯片,A51程序烧录器和

    先将COM接口(用作数据通信)与计算机的COM接口(RS-232)连接好,然后将单片机安插在烧录器的插座中,再用一根USB线将USB接口与计算机的USB接口连接,让计算机通过这根USB线向烧录器提供+5V电源

    使用烧录器前,手动设置一些,参数标签页,根据COM口,设置好串口,波特率设置为28800;

    点击自动擦除器件命令,点击打开文件命令选择单片机文件十六进制文件hex 再点击打开点击自动写器件。

    实例4用单片机控制一个灯闪烁

    Led灯亮存在电压差和正向偏置

    延迟函数

    Void main(void)//    两个void分别表示无须返回值和没有参数传递

    {

    Unsignedint i;//  定义无符号整数,最大65535

    For(i=0;i<20000;i++)

    ;    只有一个分号表示什么都不做,等待一个机器周期

    }

    0x中的0是数字0,而不是字母O

    郁闷一编写keil时,

    文档第一行必须是#include

    虚拟仪表

    示波器oscilloscope

    Protues示波器面板?及使用

    单片机需要一个时钟信号送给内部个电路,才能使他们有节拍的工作,时钟信号的频率由外部振荡电路的晶振频率决定,51系列单片机的机器周期是由12个振荡周期组成。

    指令周期:单片机执行一条指令的时间。

    时钟频率越低,延时的时间就越长,灯闪烁的速度就越慢。

    实例5将p1口状态送入p0口p2口p3口

    利用单片机工作速度快的特点,无限循环可以让单片机不停地把p1口的电平状态送到p0口p2口和p3口。

    引脚接地低电平被输入到p口

    实例6使用p3口流水点亮8位led

    记忆,0xfe 11111110  0xfd11111101  0xfb 11111011 0xf7 11110111

    0xef 111011110xdf 11011111    0xbf10111111 0x7f 01111111实例7通过对p3口地址的操作流水点亮8位led

    单片机都有固定的地址,记忆:张三在教室的第2排第5列

    老师可以说清张三回答问题也可以说请第2排第5列的同学答题。

    Sfr x=0xb0;通过关键字sfr将x定义为p2的地址0xb0

    定义后,程序中对x的操作就相当于对地址0xb0即p3的操作

    类似于指针

    P3口的固定地址是BOH

    MCS-51单片机存储器的基本结构

    它有两种1即程序存储器和2数据存储器

    从物理MSC-51有4个存储地址空间,即片内程序存储器和片外程序存储器

    程序存储器受EA一横外接电平的控制。

    1当EA一横接地时,单片机只能使用外部程序存储器

    2当EA一横接+5v是单片机先使用内部程序存储器,容量不够时自动使用外部程序存储器。

    特殊功能寄存器

    ACC 累加器

    标识符名称地址

    ACC累加器E0H

    Bb寄存器F0H

    PSW程序状态字D0H

    SP堆栈指针81H

    DRTR数据指针83H 82H

    P080H

    P190H

    P2A0H

    P3B0H

    IP中断优先级控制B8H

    IE允许中断控制A8H

    TMOD定计方式控制89H

    TCON定计控制88H

    TH0定计0高位字节8CH

    TL0定计0低位字节8AH

    TH1定计1高位字节8DH

    TL1定计1低位字节8BH

    SCON串行控制98H

    SBUF串行数据缓冲器99H

    PCON电源控制87H

    单片机的复位电路

    P54页???

    单片机C语言开发基础

    #include

    C注释

    1种采用/*。。。*/可以注释多行内容

    2种采用//但只能注释一行

    ANSI标准定义的关键字

    P57记忆思考

    P58跳过

    数据类型表p59页

    指针型数据

    位类型数据

    空类型数据

    延时函数不需要返回值。

    X++先用x的值,再让x加1

    逻辑与&&逻辑或||逻辑非!

    按位与& 25&77=9

    按位或|  25|77=93

    按位异或^ 相异为1,相同出0

    按位取反~  有0出1,有1出0

    左移运算符<

    >>低位丢弃,高位补0

    赋值运算符

    逗号运算符

    条件运算符

    强制转换运算符???

    实例8用不同数据类型的数据控制led的闪烁

    使用无符号整型数据和无符号字符数据来设计延时函数。

    由于整型数据占两个字节,而无符号字符型数据仅占一个字节,因此对无符号整型数据进行操作花费的时间就要长一些,整型数据要实现100次循环,消耗的时间约800个机器周期。无符号100占300个。为了提高运行效率,尽可能用无符号字符型数据。

    实例9用p0口和p1口分别显示加法和减法运算结果

    其实就是利用二进制的单位数值进行亮1不亮0的表示

    乘法除法就是利用二进制转化为十进制再进行处理

    实例12用自增运算控制p0口8位ked的闪烁花样

    只要送到p0口的数值发生变化,p0口8位led点亮的状态就会发生变化。可以先将变量的初值送到p0口延迟一段时间,再利用自增运算使变量加1,然后将新的变量值送到p0口并延时一段时间,即可使8位led的闪烁花样不断变化,

    Unsigned char I;定义无符号字符型变量,其值不超过255

    运用变量的值变化和将变量的值送到p口用来变化。

    For(i=0;i<255;i++)

    实例13用p0口显示逻辑与的运算

    P0=(4>0)&&(9>0xab)=1&&0=0;将运算结果送到p0口

    实例14用p0口显示条件运算的结果

    P0=(8>4)?8:4;   P0=8=00001000B

    实例15;用p0口显示按位异或运算结果

    异或相异出1,相同出0;记忆异性才能很火热的做出子女

    P0=0xa2^0x3c 异或要做必须上顶^很公平应用

    实例16用p0口显示左移的运算结果

    实例17万能逻辑电路

    F=EY+Z逻辑函数p77图

    1专门设计数字电路,实现逻辑功能

    2通过单片机编程来实现逻辑功能软件即硬件

    //实例17:"万能逻辑电路"实验

    #include  //包含单片机寄存器的头文件

    sbit F=P1^4;       //将F位定义为 P1.4

    sbit X=P1^5;       //将X位定义为 P1.5

    sbit Y=P1^6;       //将Y位定义为 P1.6

    sbit Z=P1^7;       //将Z位定义为 P1.7

    void main(void)

    {

    while(1)

    {

    F=((~X)&Y)|Z; //将逻辑运算结果赋给F

    ;

    }

    }

    实例18用右移实现流水灯

    前提设p口为0xff八次右移一位高位丢弃低位补0

    延迟用的变量因为要取大数所以必须用int

    后面因为要快所以取char型变量

    因为单片机运行快。所以led灯闪后要延迟。

    C语言语句

    If(S1==0)

    P1=0x00;如果按键s按下接地(相应位为低电平),

    Swich 整型 break 三者紧密

    While语句花括号运用和  一般情况下,在循环体中应该有让循环停止的语句。??

    Do while 语句注意;

    Do和while连用  while后面的分号不能丢,它表示整个循环语句的结束

    Do循环语句 while(循环式)

    尽量避免使用goto语句

    P87页的程序软件即硬件

    实例21用for语句实现鸣笛报警

    T=1/f,所以要让蜂鸣器发出频率f的声音,只要让单片机输送周期为t的脉冲方波电平即可,让单片机没半个周期取反一次。半周期可通过延时来实现。可以通过循环的方式来实现延时,

    P90一重循环消耗的机器数近似N=3*n

    二重循环消耗的机器数近似N=3*n*m

    例子,如果单片机的晶振频率为11.0592MHz,则机器的周期为1.085μs,要发出1600Hz的声音,就让单片机每半个周期312μs将输出电平取反一次,而延时312μs需要消耗机器周期数N=312/1.085≈286可以取300循环次数300/3=100次

    Void delay(void)

    {

    Unsigned char I;

    For(i=0;i<100;i++)

    }形成1600Hz的音频

    相对应800Hz的音频可以i取200

    Sbit sound=P1^5;

    Sound=0; 即可执行

    Unsigned char i;

    While(1)

    i=0;??

    数组是同类型的一组变量?

    Unsigned char code tab[]

    应用却是tab【】??

    字符型数组中的个字符数据在单片机中是以字符的ASCII 存放的,

    正确的使用指针,可以有效地表示复杂的数据类型,动态分配内存,方便的使用字符串,有效地使用数组。

    指针本身就具有地址还存在一个地址,

    Unsigned char*p;

    Unsigned char a;

    P=&a;

    指针数组

    Unsigned chara[]={0,1,2,3};

    Unsigned char*a[]={&a[0],&a[1],&a[2],&a[3]};

    数组的指针

    Unsigned chara[]={0,1,2,3};

    Unsignde *p;

    P=&a[0];

    P[ i]+j  为P[ i][j]

    实例26未细看

    返回值是通过return语句获得的。

    如果函数无返回值,需要用void来声明。

    数组作为函数参数

    一个数组的名字表示该数组的首地址,所以用数组名作为函数的参数时。被传递的数组的首地址,被调用函数的参数的形式须是定义为指针型变量。

    用数组名作为函数的参数时,应该在主调函数和被调函数中都进行数组定义。定义的数组类型必须一致。编译器不检查形参数组的长度p109函数??

    函数型指针

    一个函数在编译时,就分配了一个入口地址,这个入口地址就是函数的指针,

    类型说明符 (*指针变量名)(形参列表)

    Int (*p)(int a,int b)

    (*p)(a,b)

    这些需要思考p110页

    P1=z/256;取得z的高八位

    P2=z/256;取得z的低八位????

    While(1)

    ;无限循环防止程序跑飞。

    实例30用有参函数控制p0口8位流水灯的流水速度

    P113实例31不实用??、

    实例32实例33是不错的c语言程序函数调用。练习c语言p115p116

    实例34不错c语言程序p118

    指针数组适合用来指向若干个字符串,尤其是各列字符串长度不一致的情形,这对于字符的液晶显示等很有意义。

    实际运用液晶等显示器显示字符时,如果液晶的接口通过P0口和单片机连接,将各字符串送入p0口,实际上就是送入液晶显示器。

    实例35

    #include

    P0=isalpha(’_’)?0xf0:0x0f;

    内部函数文件instrins.h中有_crol_()函数

    实例36;应用内部函数文件instrins.h中有_crol_()函数来点亮P3口8位流水灯

    _crol_(15,2)

    的返回值为00111100B=0x3c思考他的应用

    实例37实例38感觉像是介绍函数以后????c语言应用程序卡那可可能看看

    C语言编译预处理

    宏定义c语言允许一个标示符来表示一个字符串,称为宏。

    P125宏定义不是c语句,所以不需加分号。

    可以用#undef命令来终止宏定义的作用域。即对#undef后面的无用。为防止歧义应加括号及时

    带参数的函数宏和函数不同,函数是先求出实参表达式的值,然后代入形参,而带参数的宏只是进行简单的字符替换。

    实例40文件包含应用举例

    使用头文件为#include中有关特殊功能寄存器的定义

    已将P3_0定义为P3.0引脚,直接应用P3_0就可以对P3口进行操作了。

    实例41条件编译应用举例

    常用的条件编译是根据某常量表达式的值的是否为真来控制编译

    即#if   常量表达式

    程序段1

    #else

    程序段2

    #endif??思考好的应用

    第五章单片机的定时器计数器

    当加在

    定时器计数器T0或T1用作计数器时,对外接晶振产生的振荡信号经12分频后,提供给计数器,作为计数器的脉冲输入,计数器以12分频后的脉冲周期为基本计数单位,对输入的脉冲进行计数,直至产生溢出。???

    P136页到p140页有点不懂。工作方式

    图p135T0或T1引脚上的外部脉冲信号出现一个由1到0的负跳变时,计数器加1,直至计数器溢出。

    CPU是按顺序进行工作的。

    实例42用计时器T0查询方式控制P2口的8位LED闪烁

    T0工作于方式1,LED灯的闪烁周期为100ms,即亮50ms,熄灭50ms;

    12分频即频率被12等分,周期即12除频率

    定时器的初值设定需要进行计算,总而言之,就是定时器必须达到顶值即65536.

    初值需要T0的高八位寄存器TH0和低八位寄存器TL0分别存储

    存储方法及

    TH0=   /256;

    TL0=   %256;

    溢出标志位是否为1若为1表示时间已到,否则,等待。

    //实例42:用定时器T0查询方式P2口8位控制LED闪烁

    #include        // 包含51单片机寄存器定义的头文件

    /**************************************************************

    函数功能:主函数

    **************************************************************/

    void main(void)

    {

    // EA=1;                  //开总中断

    //    ET0=1;                 //定时器T0中断允许

    TMOD=0x01;            //使用定时器T0的模式1

    TH0=(65536-46083)/256; //定时器T0的高8位赋初值

    TL0=(65536-46083)%256; //定时器T0的高8位赋初值

    TR0=1;                //启动定时器T0

    TF0=0;

    P2=0xff;

    while(1)//无限循环等待查询

    {

    while(TF0==0)//查询标志位是否溢出

    ;

    TF0=0;

    P2=~P2;按位取反,实现led灯的闪烁

    TH0=(65536-46083)/256;  //定时器T0的高8位赋初值

    TL0=(65536-46083)%256;  //定时器T0的高8位赋初值

    }

    }

    TFO 记忆flow溢出

    TRO  记忆trigger引起启动

    THO 记忆high高八位

    TMOD 记忆mode 方式

    实例43,用定时器t1查询方式控制单片机发出1kHz音频

    //实例43:用定时器T1查询方式控制单片机发出1KHz音频

    #include        // 包含51单片机寄存器定义的头文件

    sbit sound=P3^7;   //将sound位定义为P3.7引脚

    /**************************************************************

    函数功能:主函数

    **************************************************************/

    void main(void)

    {

    // EA=1;                  //开总中断

    //    ET0=1;                 //定时器T0中断允许

    TMOD=0x10;            //使用定时器T1的模式1

    TH1=(65536-921)/256;  //定时器T1的高8位赋初值

    TL1=(65536-921)%256;  //定时器T1的高8位赋初值

    TR1=1;                //启动定时器T1

    TF1=0;

    while(1)//无限循环等待查询

    {

    while(TF1==0)

    ;

    TF1=0;

    sound=~sound;  //将P3.7引脚输出电平取反

    TH1=(65536-921)/256;  //定时器T0的高8位赋初值

    TL1=(65536-921)%256;  //定时器T0的高8位赋初值

    }

    }

    //实例44:将计数器T0计数的结果送P1口8位LED显示

    #include        // 包含51单片机寄存器定义的头文件

    sbit S=P3^4;   //将S位定义为P3.4引脚

    /**************************************************************

    函数功能:主函数

    **************************************************************/

    void main(void)

    {

    // EA=1;                  //开总中断

    //    ET0=1;                 //定时器T0中断允许

    TMOD=0x02;            //使用定时器T0的模式2

    TH0=256-156;  //定时器T0的高8位赋初值

    TL0=256-156;  //定时器T0的高8位赋初值

    TR0=1;                //启动定时器T0

    while(1)//无限循环等待查询

    {

    while(TF0==0)  //如果未计满就等待

    {

    if(S==0)  //按键S按下接地,电平为0

    P1=TL0; //计数器TL0加1后送P1口显示

    }

    TF0=0;  //计数器溢出后,将TF0清0

    }

    }

    第六章单片机的中断系统

    中断系统

    类似写作业

    定时器计时器实际上就是中断源。

    MCS51单片机提供5个中断源。

    外部中断INT0一横   编号0    由P3.2引脚输入

    定时器T0     编号1

    外部中断INT1一横    编号2    由P3.3引脚输入

    定时器T1      编号3

    串行口通信中断RI或TI    编号4

    自然优先级从上到下逐级递减。

    P150  p151页未看

    void Time(void) interrupt1 using 0

    {

    }

    //实例46:用定时器T0的中断实现长时间定时

    #include  //  包含51单片机寄存器定义的头文件

    sbit D1=P2^0;  //将D1位定义为P2.0引脚

    unsigned char Countor; //设置全局变量,储存定时器T0中断次数

    /**************************************************************

    函数功能:主函数

    **************************************************************/

    void main(void)

    {

    EA=1;                  //开总中断

    ET0=1;                 //定时器T0中断允许

    TMOD=0x01;             //使用定时器T0的模式2

    TH0=(65536-46083)/256; //定时器T0的高8位赋初值

    TL0=(65536-46083)%256; //定时器T0的高8位赋初值

    TR0=1;                 //启动定时器T0

    Countor=0;            //从0开始累计中断次数

    while(1)//无限循环等待中断

    ;

    }

    /**************************************************************

    函数功能:定时器T0的中断服务程序

    **************************************************************/

    void Time0(void)interrupt 1 using 0 //“interrupt”声明函数为中断服务函数

    //其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器

    {

    Countor++;  //中断次数自加1

    if(Countor==20)  //若累计满20次,即计时满1s

    {

    D1=~D1;     //按位取反操作,将P2.0引脚输出电平取反

    Countor=0;  //将Countor清0,重新从0开始计数

    }

    TH0=(65536-46083)/256;//定时器T0的高8位重新赋初值

    TL0=(65536-46083)%256; //定时器T0的高8位重新赋初值

    }

    定时器T0工作于方式1时,最大可计脉冲数次数为65536,对于11。0592MHz的时钟频率。一个脉冲的宽度为1.085μs,则最大计时长度只有1.085×65536=71107μs即大约71ms,

    要想计时更长时间,采用  软件计时的方法

    设置一个变量counter 来存储定时器T0的中断次数,即每产生一次中断,使变量counter自加1,如果T0每50ms中断一次,那当counter自加20次时,所及时间为1s。

    中断一次就要重新赋值一次

    控制两个LED灯以不同的周期闪烁,第一个LED亮灭时间为100ms,第二个LED亮灭时间为400ms,所以需要设置两个变量counter1 和counter2来分别统计中断次数,且都为最小的整数倍。

    //实例47:用定时器T1中断控制两个LED以不同周期闪烁

    #include  //  包含51单片机寄存器定义的头文件

    sbit D1=P2^0;  //将D1位定义为P2.0引脚

    sbit D2=P2^1;  //将D2位定义为P2.1引脚

    unsigned char Countor1;//设置全局变量,储存定时器T1中断次数

    unsigned char Countor2;//设置全局变量,储存定时器T1中断次数

    /**************************************************************

    函数功能:主函数

    **************************************************************/

    void main(void)

    {

    EA=1;                  //开总中断

    ET1=1;                 //定时器T1中断允许

    TMOD=0x10;             //使用定时器T1的模式1

    TH1=(65536-46083)/256; //定时器T1的高8位赋初值

    TL1=(65536-46083)%256; //定时器T1的高8位赋初值

    TR1=1;                 //启动定时器T1

    Countor1=0;            //从0开始累计中断次数

    Countor2=0;            //从0开始累计中断次数

    while(1)//无限循环等待中断

    ;

    }

    /**************************************************************

    函数功能:定时器T1的中断服务程序

    **************************************************************/

    void Time1(void)interrupt 3 using 0 //“interrupt”声明函数为中断服务函数

    //其后的3为定时器T1的中断编号;0表示使用第0组工作寄存器

    7

    Countor1++;  //Countor1自加1

    Countor2++;   //Countor2自加1

    if(Countor1==2)  //若累计满2次,即计时满100ms

    {

    D1=~D1;     //按位取反操作,将P2.0引脚输出电平取反

    Countor1=0; //将Countor1清0,重新从0开始计数

    }

    if(Countor2==8)  //若累计满8次,即计时满400ms

    {

    D2=~D2;     //按位取反操作,将P2.1引脚输出电平取反

    Countor2=0; //将Countor1清0,重新从0开始计数

    }

    TH1=(65536-46083)/256;//定时器T1的高8位重新赋初值

    TL1=(65536-46083)%256; //定时器T1的高8位重新赋初值

    }

    实现方法

    先开总中断EA 分支中断ET?,选择方式,赋初值 ,启动定时器T?,声明

    音调与频率的关系

    音调低1低2低3低4低5低6低7

    频率262294330349392440494

    音调中1中2中3中4中5中6中7

    频率523587659698784880988

    音调高1高2高3高4高5高6高7

    频率1046117513181397156817601967

    由于单片机的输入输出口只有高电平1和低电平0,因此向蜂鸣器输送的电平信号实际是就是该音频的方波。例如中音频率523Hz,他的周期为1÷523秒,即1。93ms只要向蜂鸣器输送周期为1.91ms的脉冲方波电平信号就能发出523Hz的音调,该方波的半周期为1.91÷2=0.995ms。为此,需要利用定时器的中断,让输送给蜂鸣器的电平信号每0。955ms取反一次即可,由于本书使用的单片机晶振为11.0952mhz,他的机器周期为12×(1÷11。0592)=1.085μs。因此需要的机器周期总数为

    995μs÷1.085μs=880

    定时器的定时常数为880

    C=10^6μs除2f÷1.085μs=460830÷频率

    THO=(8192-C)÷32???

    每分钟为72节拍,每节拍1000×60ms÷72=833ms

    //实例49:用定时器T0的中断实现"渴望"主题曲的播放

    #include   //包含51单片机寄存器定义的头文件

    sbit sound=P3^7;    //将sound位定义为P3.7

    unsigned int C;     //储存定时器的定时常数

    //以下是C调低音的音频宏定义

    #define l_dao 262   //将“l_dao”宏定义为低音“1”的频率262Hz

    #define l_re 286    //将“l_re”宏定义为低音“2”的频率286Hz

    #define l_mi 311    //将“l_mi”宏定义为低音“3”的频率311Hz

    #define l_fa 349    //将“l_fa”宏定义为低音“4”的频率349Hz

    #define l_sao 392   //将“l_sao”宏定义为低音“5”的频率392Hz

    #define l_la 440    //将“l_a”宏定义为低音“6”的频率440Hz

    #define l_xi 494    //将“l_xi”宏定义为低音“7”的频率494Hz

    //以下是C调中音的音频宏定义

    #define dao 523     //将“dao”宏定义为中音“1”的频率523Hz

    #define re 587      //将“re”宏定义为中音“2”的频率587Hz

    #define mi 659      //将“mi”宏定义为中音“3”的频率659Hz

    #define fa 698      //将“fa”宏定义为中音“4”的频率698Hz

    #define sao 784     //将“sao”宏定义为中音“5”的频率784Hz

    #define la 880      //将“la”宏定义为中音“6”的频率880Hz

    #define xi 987      //将“xi”宏定义为中音“7”的频率523H

    //以下是C调高音的音频宏定义

    #define h_dao 1046     //将“h_dao”宏定义为高音“1”的频率1046Hz

    #define h_re 1174      //将“h_re”宏定义为高音“2”的频率1174Hz

    #define h_mi 1318      //将“h_mi”宏定义为高音“3”的频率1318Hz

    #define h_fa 1396     //将“h_fa”宏定义为高音“4”的频率1396Hz

    #define h_sao 1567    //将“h_sao”宏定义为高音“5”的频率1567Hz

    #define h_la 1760     //将“h_la”宏定义为高音“6”的频率1760Hz

    #define h_xi 1975     //将“h_xi”宏定义为高音“7”的频率1975Hz

    /*******************************************

    函数功能:1个延时单位,延时200ms

    ******************************************/

    void delay()

    {

    unsigned char i,j;

    for(i=0;i<250;i++)

    for(j=0;j<250;j++)

    ;

    }

    /*******************************************

    函数功能:主函数

    ******************************************/

    void main(void)

    {

    unsigned char i,j;

    //以下是《渴望》片头曲的一段简谱

    unsigned  int code f[]={re,mi,re,dao,l_la,dao,l_la,   //每行对应一小节音符

    l_sao,l_mi,l_sao,l_la,dao,

    l_la,dao,sao,la,mi,sao,

    re,

    mi,re,mi,sao,mi,

    l_sao,l_mi,l_sao,l_la,dao,

    l_la,l_la,dao,l_la,l_sao,l_re,l_mi,

    l_sao,

    re,re,sao,la,sao,

    fa,mi,sao,mi,

    la,sao,mi,re,mi,l_la,dao,

    re,

    mi,re,mi,sao,mi,

    l_sao,l_mi,l_sao,l_la,dao,

    l_la,dao,re,l_la,dao,re,mi,

    re,

    l_la,dao,re,l_la,dao,re,mi,

    re,

    0xff}; //以0xff作为音符的结束标志

    //以下是简谱中每个音符的节拍

    //"4"对应4个延时单位,"2"对应2个延时单位,"1"对应1个延时单位

    unsigned char code JP[]={4,1,1,4,1,1,2,

    2,2,2,2,8,

    4,2,3,1,2,2,

    10,

    4,2,2,4,4,

    2,2,2,2,4,

    2,2,2,2,2,2,2,

    10,

    4,4,4,2,2,

    4,2,4,4,

    4,2,2,2,2,2,2,

    10,

    4,2,2,4,4,

    2,2,2,2,6,

    4,2,2,4,1,1,4,

    10,

    4,2,2,4,1,1,4,

    10

    };

    EA=1;         //开总中断

    ET0=1;        //定时器T0中断允许

    TMOD=0x00;    // 使用定时器T0的模式1(13位计数器)

    while(1)       //无限循环

    {

    i=0;   //从第1个音符f[0]开始播放

    while(f[ i]!=0xff)            //只要没有读到结束标志就继续播放

    {

    C=460830/f[ i];

    TH0=(8192-C)/32;   //可证明这是13位计数器TH0高8位的赋初值方法

    TL0=(8192-C)%32;   //可证明这是13位计数器TL0低5位的赋初值方法

    TR0=1;             //启动定时器T0

    for(j=0;j

    delay();          //延时1个节拍单位

    TR0=0;                  //关闭定时器T0

    i++;                 //播放下一个音符

    }

    }

    }

    /***********************************************************

    函数功能:定时器T0的中断服务子程序,使P3.7引脚输出音频的方波

    ************************************************************/

    void Time0(void ) interrupt 1 using 1

    {

    sound=!sound;      //将P3.7引脚输出电平取反,形成方波

    TH0=(8192-C)/32;   //可证明这是13位计数器TH0高8位的赋初值方法

    TL0=(8192-C)%32;   //可证明这是13位计数器TL0低5位的赋初值方法

    }

    实例51

    本例用单片机U1从P1。4引脚输出正脉宽为250μs的方波,再利用单片机U2的into引脚检测,验证方波的正脉冲宽度,有点没看懂

    //实例51-2:定时器T0的模式2测量正脉冲宽度

    #include   //包含51单片机寄存器定义的头文件

    sbitui=P3^2;  //将ui位定义为P3.0(INT0)引脚,表示输入电压

    /*******************************************

    函数功能:主函数

    ******************************************/

    void main(void)

    {

    TMOD=0x0a;   // TMOD=0000 1010B,使用定时器T0的模式2,GATE置1

    EA=1;         //开总中断

    ET0=0;       //不使用定时器T0的中断

    TR0=1;       //启动T0

    TH0=0;       //计数器T0高8位赋初值

    TL0=0;       //计数器T0低8位赋初值

    while(1)      //无限循环,不停地将TL0计数结果送P1口

    {

    while(ui==0)  //INT0为低电平,T0不能启动

    ;

    TL0=0;      //INT0为高电平,启动T0计时,所以将TL0清0

    while(ui==1) //在INT0高电平期间,等待,计时

    ;

    P1=TL0;    //将计时结果送P1口显示

    }

    }

    //实例51-1:输出正脉宽为250微秒的方波

    #include   //包含51单片机寄存器定义的头文件

    sbit u=P1^4;    //将u位定义为P1.4

    /*******************************************

    函数功能:主函数

    ******************************************/

    void main(void)

    {

    TMOD=0x02;            //TMOD=0000 0010B,使用定时器T0的模式2

    EA=1;                    //开总中断

    ET0=1;                 //定时器T0中断允许

    TH0=256-250;   //定时器T0的高8位赋初值

    TL0=256-250;  //定时器T0的高8位赋初值

    TR0=1;                 //启动定时器T0

    while(1)               //无限循环,等待中断

    ;

    }

    /**************************************************************

    函数功能:定时器T0的中断服务程序

    **************************************************************/

    void Time0(void)interrupt 1 using 0 //"interrupt"声明函数为中断服务函数

    {

    u=~u; //将P1.4引脚输出电平取反,产生方波

    }

    第7章

    MCS51单片机串行4中工作方式??、

    为了能够在计算机端看到单片机发出的数据,较好的方法是借助于调试软件“串口调试助手”

    第8章

    P197页图

    第9章

    I^2C总线是Inter Integrated Circuit Bus内部集成电路总线

    千万不要认为只要程序对了,单片机就可以永远正确运行,实际工作环境的各种干扰会导致单片机死机。

    X5045

    具有上电复位和降压管理的功能,还具有看门狗定时器和具有块保护功能的串行EEPROM。

    上电复位;上电就产生复位信号,

    看门狗;规定时间没有电平信号就产生复位信号,利用该功能可以让单片机死机后自动重新复位

    第10章

    A/D转换器;逐次逼近(常用)双积分牛但慢并行

    红外信号接收

    红外发射部分包括键盘矩阵,编码调制LED红外发送器接收器包括光电转换放大器

    解调电路解码电路

    中断定时器程序其实隐藏了调用。

    定时中断一次还需重新赋值一次。

    void Time0(void)interrupt 1 using 1每个字符都要空格

    LED0=!LED0;  //P3.0引脚取反

    While(1)前面赋值确定原先的状态

    判断端口是否是低电平应该这样if(S1==0)

    而不是if(S1=0)

    函数功能:键盘扫描子程序

    **************************************************/

    void key_scan(void)

    {

    if((P1&0xf0)!=0xf0)         //第一次检测到有键按下

    {

    delay30ms();   //延时20ms再去检测

    if(S1==0)      //按键S1被按下

    keyval=1;

    if(S2==0)      //按键S2被按下

    keyval=2;

    if(S3==0)      //按键S3被按下

    keyval=3;

    if(S4==0)     //按键S4被按下

    keyval=4;

    sbit S1=P1^4;        //将S1位定义为P1.4引脚

    sbit S2=P1^5;        //将S2位定义为P1.5引脚

    sbit S3=P1^6;        //将S3位定义为P1.6引脚

    sbit S4=P1^7;        //将S4位定义为P1.7引脚

    有零则与逻辑与一起必然为零            }

    完整的Word格式文档51黑下载地址:

    7269ff8fd7142ea0f1528660ab33985d.gif

    51单片机c语言总结.doc

    (143.5 KB, 下载次数: 33)

    2018-9-25 08:58 上传

    点击文件名下载附件

    下载积分: 黑币 -5

    展开全文
  • 传的就是我现在在用的程序,KL26mcu,C语言,从16年开始造到18年的代码。
  • 0x05,0x00,0x02,0x00, // 0x00,0x20,0x20,0x20,0x10,0x20,0x13,0xFE,0x82,0x22,0x42,0x24,0x4A,0x20,0x0B,0xFC, 0x12,0x84,0x12,0x88,0xE2,0x48,0x22,0x50,0x22,0x20,0x24,0x50,0x24,0x88,0x09,0x06, // 0x00,...

    #include

    #include

    //12864控制引脚定义

    sbit DI = P2 ^ 2; //数据\指令选择引脚

    sbit RW = P2 ^ 1; //读\写选择引脚

    sbit E= P2 ^ 0;   //读\写使能引脚

    sbit CS1 = P2 ^ 4;    //片选1引脚

    sbit CS2 = P2 ^ 3;    //片选2引脚

    sbit BUSY= P1 ^ 7;    //忙标志位

    //按键控制定义

    sbit Y1 = P3 ^ 0;

    sbit Y2 = P3 ^ 1;

    sbit X1 = P3 ^ 3;

    sbit X2 = P3 ^ 7;

    //ADC0832控制引脚

    sbit START=P3^4;

    sbit OE=P3^6;

    sbit EOC=P3^5;

    unsigned int ADdata;    //AD采集值

    unsigned int Ldata;

    unsigned char ye,lei,shu;

    unsigned char ADViewdata[91]; //AD显示数据存储区

    char code FrameData[]={                     //提示字符存储区

    0x00,0x00,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x01,0x00,

    0x01,0x00,0x11,0x10,0x11,0x08,0x21,0x04,0x41,0x02,0x81,0x02,0x05,0x00,0x02,0x00,    //示

    0x00,0x20,0x20,0x20,0x10,0x20,0x13,0xFE,0x82,0x22,0x42,0x24,0x4A,0x20,0x0B,0xFC,

    0x12,0x84,0x12,0x88,0xE2,0x48,0x22,0x50,0x22,0x20,0x24,0x50,0x24,0x88,0x09,0x06,                //波

    0x00,0x00,0x3E,0x7C,0x22,0x44,0x22,0x44,0x3E,0x7C,0x01,0x20,0x01,0x10,0xFF,0xFE,

    0x02,0x80,0x0C,0x60,0x30,0x18,0xC0,0x06,0x3E,0x7C,0x22,0x44,0x22,0x44,0x3E,0x7C,    //器

    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,    //" "

    };

    //AD转换软件

    void ADCChage()

    {

    START=1;

    START=0;

    while(EOC==0)  //等待转换完成

    {

    OE=1;

    }

    ADdata = P0;   //读取AD数据

    OE=0;

    }

    //检查12864液晶状态

    void CheckState()

    {

    DI=0;

    RW=1;

    do

    {

    E=1;

    E=0;

    //仅当第7位为0时才可操作(判别busy信号)

    }while(BUSY==1);

    }

    //向12864写入一个字节的命令

    void WriteCommand(unsigned char cmd)

    {

    CheckState();         //检查当前的12864状态

    DI = 0;

    RW = 0;

    P1 = cmd;             //送出相应的命令

    E = 1;

    E = 0;

    }

    //向12864写入一个字节的数据

    void WriteData(unsigned char dat)

    {

    CheckState();   //检查当前的12864状态

    DI = 1;

    RW = 0;

    P1 = dat;       //送出相应的数据

    E = 1;

    E = 0;

    }

    //12864液晶的选择控制引脚

    void LCMCSControl(unsigned int csl)

    {

    if(csl==1)    //根据参数不同判断当前的12864控制引脚状态

    {

    CS1=0,

    CS2=1;

    }

    if(csl==2)

    {

    CS1=1,

    CS2=0;

    }

    if(csl==3)

    {

    CS1=0,

    CS2=0;

    }

    }

    //12864显示函数

    void LCMView()

    {

    LCMCSControl(Ldata);     //先发送控制命令

    WriteCommand(ye);

    WriteCommand(lei);

    WriteData(shu);         //然后发送数据

    }

    //12864的清屏函数

    void CleanScreen()

    {

    unsigned char page,i;

    LCMCSControl(3);

    for(page=0xb8;page<=0xbf;page++)

    {

    WriteCommand(page);

    WriteCommand(0x40);

    for(i=0;i<64;i++)

    {

    WriteData(0x00);

    }

    }

    LCMCSControl(1);

    lei=0x40;

    for(ye=0xb8;ye<0xbf;ye++)

    {

    shu=0xff;

    LCMView();

    }

    ye=0xb8;

    for(lei=0x40;lei<=0x7f;lei++)

    {

    shu=0x80;

    LCMView();

    }

    ye=0xbf;

    for(lei=0x40;lei<=0x7f;lei++)

    {

    shu=0x01;

    LCMView();

    }

    LCMCSControl(2);

    ye=0xb8;

    for(lei=0x40;lei<=0x5b;lei++)

    {

    shu=0x80;

    LCMView();

    }

    ye=0xbf;

    for(lei=0x40;lei<=0x5b;lei++)

    {

    shu=0x01;

    LCMView();

    }

    lei=0x5b;

    for(ye=0xb9;ye<=0xbe;ye++)

    {

    shu=0xff;

    LCMView();

    }

    }

    //12864的初始化函数

    void InitLCM(void)

    {

    WriteCommand(0xc0);

    WriteCommand(0x3f);

    }

    //50us的延时函数

    void Delay50us(unsigned int t)

    {

    unsigned char j;

    for(;t>0;t--)

    for(j=19;j>0;j--);

    }

    //刷新12864液晶

    void RefreshLCM()

    {

    unsigned char i;

    for(i=0xb9;i<=0xbe;i++)

    {

    ye=i;

    shu=0x00;

    LCMView();

    }

    }

    //主函数

    void main()

    {

    unsigned int r,j,q,k;

    unsigned int Xaxis =0;

    unsigned int Yaxis = 1;

    unsigned char l;

    unsigned char d1,d2,d3,d4,d5;

    CleanScreen();

    InitLCM();

    LCMCSControl(2);

    l=0xb8;

    for(k=0;k<4;k++,l=l+0x02)         //首先显示右侧的提示

    {

    ye=l;

    lei=0x70;

    for(r=0;r<16;r++)

    {

    shu=FrameData[2*r+1+32*k];

    LCMView();

    lei++;

    }

    ye=l+0x01;

    lei=0x70;

    for(r=0;r<16;r++)

    {

    shu=FrameData[2*r+32*k];

    LCMView();

    lei++;

    }

    }

    while(1)

    {

    while(X2==0)      //调节X轴

    {

    while(X2==0);

    Xaxis = Xaxis + 1;

    }

    while(X1==0)

    {

    while(X1==0);

    if(Xaxis!=0)

    {

    Xaxis = Xaxis - 1;

    }

    }

    while(Y1==0)     //调节Y轴

    {

    while(Y1==0);

    Yaxis = Yaxis + 1;

    }

    while(Y2==0)

    {

    while(Y2==0);

    if(Yaxis!=1)

    {

    Yaxis=Yaxis-1;

    }

    }

    for(j=0;j<90;j++) //AD采样最大值

    {

    ADCChage();

    ADViewdata[j]=ADdata;

    if(ADViewdata[j]>ADViewdata[91])

    {

    ADViewdata[91]=ADViewdata[j];

    }

    Delay50us(Xaxis);

    }

    while(ADdata!=ADViewdata[91])    //如果采集值不相等,则继续

    {

    ADCChage();

    }

    for(j=0;j<90;j++)      //连续采样90次

    {

    ADCChage();

    ADViewdata[j]=ADdata;

    Delay50us(Xaxis);

    }

    lei=0x41;

    for(r=0,j=0;r<90;r++,j++)

    {

    if(j<63)

    {

    Ldata=1;

    }

    if(j==63)

    {

    lei=0x40;

    }

    if(j>=63)

    {

    Ldata=2;

    }

    RefreshLCM();     //刷新当前显示

    if(ADViewdata[j>=127])//正电压

    {

    ADdata=(ADViewdata[j]-127)*0.196/Yaxis;  //计算电压值

    if(ADdata<=7)

    {

    ye=0xbb;

    shu=(0x80>>ADdata);

    }

    else if(ADdata<=15)

    {

    ye=0xba;

    shu=(0x80>>(ADdata-8));

    }

    else if(ADdata<=23)

    {

    ye=0xb9;

    shu=(0x80>>(ADdata-16));

    }

    else if(ADdata<=31)

    {

    ye=0xb9;

    shu=(0x80>>(ADdata-24));

    }

    }

    if(ADViewdata[j]<127)     //负电压

    {

    ADdata=(127-ADViewdata[j])*0.196/Yaxis;    //计算电压值

    if(ADdata<=7)

    {

    ye=0xbc;

    shu=(0x01<

    }

    else if(ADdata<=15)

    {

    ye=0xbd;

    shu=(0x01<

    }

    else if(ADdata<=23)

    {

    ye=0xbe;

    shu=(0x01<

    }

    else if(ADdata<=31)

    {

    ye=0xbe;

    shu=(0x01<

    }

    }

    if(r==0)//判断正负

    {

    d1=shu;

    d2=ye;

    }

    if(r!=0)

    {

    d3=shu;

    d4=ye;

    if(ye==d2)  //如果相等,则判断是否显示完成

    {

    if(shu>d1)

    {

    d5=shu;

    d5=d5>>1;

    while(d5!=d1)

    {

    d5=d5>>1;

    shu=shu|(shu>>1);

    }

    }

    if(shu

    {

    d5=shu;

    d5=d5<<1;

    while(d5!=d1)

    {

    d5=d5<<1;

    shu=shu|(shu<<1);

    }

    }

    }

    if(ye

    {

    for(q=0;q<7;q++)

    {

    shu=shu|(shu<<1);

    }

    LCMView();

    ye++;

    while(ye

    {

    shu=0xff;

    LCMView();

    ye++;

    }

    if(ye==d2)

    {

    shu=0x01;

    if(shu

    {

    d5=shu;

    d5=d5<<1;

    while(d5!=d1)

    {

    d5=d5<<1;

    shu=shu|(shu<<1);

    }

    }

    }

    }

    if(ye>d2)

    {

    for(q=0;q<7;q++)

    {

    shu=shu|(shu>>1);

    }

    LCMView();

    ye--;

    while(ye>d2) {shu=0xff,LCMView(),ye--;}

    if(ye==d2)

    {

    shu=0x80;

    if(shu>d1)

    {

    d5=shu;

    d5=d5>>1;

    while(d5!=d1)

    {

    d5=d5>>1;

    shu=shu|(shu>>1);

    }

    }

    }

    }

    }

    if(r!=0)

    {

    d1=d3;

    d2=d4;

    }

    LCMView();

    if(lei!=0x7f)

    {

    lei++;

    }

    }

    }

    }

    展开全文
  • 示波器C语言程序设计

    2010-01-05 18:19:10
    采用单片机为主控制,利用C语言进行编程,能够检测幅度、频率,用液晶显示,实验已经通过!
  • Tiva单片机——简易示波器(UART串口屏)主程序代码
  • AVR单片机程序源代码
  • 第一章 AT89S51 单片机实验及实践系统板简介AT89S51单片机实验及实践系统板(以后简介系统板)集成多个硬件资源模块,每个模块各自可以成为独立的单元,也可以相互组合,因此,可以为不同阶层的单片机爱好者及单片机...

    第一章 AT89S51 单片机实验及实践系统板简介

    AT89S51单片机实验及实践系统板(以后简介系统板)集成多个硬件资源模块,每个模块各自可以成

    为独立的单元,也可以相互组合,因此,可以为不同阶层的单片机爱好者及单片机开发者提供不同的开发

    环境。

    每个硬件模块介绍如下:

    1.继电器控制模块

    系统板上提供了2路继电器控制模块,分布在系统板的最左上端区域中,输入信号由Realy in 1 和

    Realy in 2端口输入分别控制两路继电器,继电器控制的信号分别由最上端的两个插针输入和输出。分别

    称为“com1 open1 short1”,“com2 open2 short2”,由于这个两个继电器是单刀单掷控制,当继

    电器不吸合时,“com1”和“short1”相通,“com2”和“short2”相通;当继电器吸合时,“com1”和

    “open1”相通,“com2”和“open2”相通。其电路原理图1.1所示:

    2.参考电压源模块

    在系统板上写有“参考电压源”区域中,是由TL431来完成参考电压的调节,调节范围在0-2.50V

    之间;主要为是系统板上需要参考电压芯片或是为外部设备提供参考电压,由Var Vref Out端口输出。其

    电路原理图如图1.2所示:

    图1.2

    3.三路可调电压模块

    此模块主要是用于提供0-5V之间的可变的模拟电

    压值,即可以作为参考电压源也可以作为模拟电压信号。这

    1

    三路是相互独立的。分别对应着由VR1,VR2,VR3端口输出。具体的电路原理图如图1.3所示:

    图 1.3

    4.电源模块

    电源模块为系统板上其它模块提供+5V电源,电源输入有两种方式,一种为交直流电源从电源插座输

    入,输入的电压要求,直流输入应大于7.5V,交流输入应大于5V,通过 7805三端稳压器得到5V的直流电

    源供给系统其它模块工作,另一种为从USB接口获取+5V电源,只要用相应配套的USB线从电脑主机获取

    +5V直流电源,在电源模块中加有保护电路,即电路中有短路,不会对7805三端稳压器及电脑主机电源

    有损害!其电路原理图如图1.4所示:

    5.程序下载模块

    该模块完成源程序代码下载到 AT89S51 或者是 AT89S52 芯片中,它需要和微机上的 ISP 下载器软件配合使

    用来完成这样的功能。具体的电路原理图如图 1.5 所示:

    2

    6.232 电平转换模块

    232电平转换采用MAX232芯片把TTL电平转换成RS-232 电平格式,可以用于单片机与微机通信,以及单

    片机与单片机之间的通信,在该系统板上提供了两个DB9的接口,其中一个用ISP下载器模块的程序下载

    接口,称为“ISP Interface”,另一个接口为单片机与其它具有RS232接口的通信端口,称为“Common Port”。

    具体的电路原理图如图1.6 所示:

    7.频率产生器模块

    该模块采用555芯片产生一些连续频率的方波信号,由“WAVE GND”端口输出,其稳定可调的频率

    范围在5KHz-100KHz之间变化。电路原理图如图

    展开全文
  • PAGE中国计量学院现代科技学院本科毕业设计(论文)基于单片机的方频率检测和倍频系统设计Design Based on SCM Square Wave Frequency Detection and Times Frequency System学生姓名 学号 0830111214学生专业 自动...
  • 多功能串口虚拟示波器DataScope支持同时刷新多达10个通道的单精度浮点型数据,DataScope支持多种格式的通道数据导入、导出及回放,支持图表数据统计、测量及缩放,还支持蓝牙适配器、支持各通道独立刷新、支持3D轨迹...
  • AVR单片机程序源代码
  • 示波器51和52

    2013-03-12 12:11:00
    51单片机 C语言代码 示波器 数字
  • 单片机的外部结构:本文引用地址:http://www.eepw.com.cn/article/80154.htm1、 DIP40双列直插;2、 P0,P1,P2,P3四个8位准双向I/O引脚;(作为I/O输入时,要先输出高电平)3、 电源VCC(PIN40)和地线GND(PIN20);4...
  • 51单片机C语言程序100例

    万次阅读 多人点赞 2018-04-13 13:08:30
    :用单片机控制一个灯闪烁:认识单片机的工作频率 .................................4 实例 5 :将 P1 口状态分别送入 P0 、 P2 、 P3 口:认识 I/O 口的引脚功能 ............ 5 实例 6 :使用 P3 口流水点亮 8 位...
  • 武彦飞,童峥嵘,邢文华,王俊峰(天津理工大学 计算机与通信工程学院,天津 300384)摘要:设计了一种以STC单片机为核心的双电源自动转换开关控制,具有自动检测、诊断和控制的功能。系统电源出现故障时,短时间内...
  • 描述目前,SPWM信号主要有3种生成方式:1)使用比较、振荡等模拟电路产生三角和方进行比较,产生SPWM,但是此种...3)利用单片机等微处理产生SPWM,此方法控制电路简单,调节灵活,硬件成本低。本文介绍...
  • 单片机开发】STM32简易示波器开发

    千次阅读 2021-04-10 09:45:24
    还记得之前因为个人需要,又不太想花钱买示波器,实现了一个简易的示波器。 这个示波器非常明显存在以下几个非常尴尬的问题: 1.对于ADC数据的处理方式还是基于查询模式 2.最高采样率无法控制,而且最高采样率可能...
  • 为了满足上述功能需求,限速的核心本设计选用具有强大功能的MSP430F169单片机,其内置有高速的12位ADC和DAC,能单片实现限速的功能,无须再扩展外部模块,即可提高系统运行的可靠性,降低系统成本,非常符合限速...
  • 51示波器升级.zip

    2021-02-06 20:01:33
    本文介绍了一种单通道简易数字示波器的设计方案,采用STC12C5A60S2单片机为核心控制元件,与键盘、TFT可触液晶等模块组成核心主控制模块,将软硬件结合,使得该系统可以实现任意波形的显示,以及频率、幅值的实际...
  • LCD160128+ADC0832的测量波形显示51单片机C语言代码,包含Proteus仿真电路
  • 若此时小车行驶在白色的路面上,置于车底的红外发射管发出的红外线会被反射回来,接收管一旦接收到红外信号,那么就会导通光敏三极管,从而输出低电平,经过电压比较后送往单片机控制。若小车一旦开始位于黑色胶带...
  • 一个中断控制;(IE,IP) 针对 AT89C52 单片机,头文件 AT89x52.h 给出了 SFR 特殊功能寄存器所有端口的定义。 C 语言编程基础: 1. 2. 3. 4. 十六进制表示字节 0x5a:二进制为 01011010B;0x6E 为 01101110。 ...
  • 使用单片机强大的可编程和可扩展能力,可以设计新一代的智能化仪表,如各种数字万用表、示波器等。 ·自动测控系统。在自动控制和测量领域,可以采用单片机设计各种数据采集系统、自适应控制系统等。例如,温度的...
  • 图18.5 YL51开发板带的继电实物图 18.3.3 继电的控制电路 由于单片机I/O口输出电流不足以驱动继电,因此需接入放大电路,图18.6所为典型的继电驱动电路图。电路中的二极管(D1)用于吸收继电断电时...
  • 图21.14 示波器示波器探头 示波器可分为两大类:模拟示波器和数字示波器。模拟示波器是将被测信号以连续方式在屏幕上显示出来。而数字示波器首先将被测信号抽样和量化,变为二进制信号存储起来,再从存储器中...
  • 直流电机使用达林顿反向驱动ULN2003中的一路进行驱动,直流电机的一端接+5 V电源,另一端连接到ULN2003的OUT7引脚,ULN2003的IN7引脚与单片机的P0.0引脚相连(需用跳线帽把J01接线端的P00与PWM接通),通过控制...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,559
精华内容 623
关键字:

单片机c语言示波器

c语言 订阅