基于单片机C#串口通信
单片机c语言的特征
单片机c语言的特征
单片机C语言是基于C语言的一种编程语言,用于开发单片机应用程序。
它具有以下特征:
1.简洁、紧凑:单片机C语言的语法简洁、紧凑,易于学习和使用。
2.高效、快速:单片机C语言的代码运行效率高、速度快,适合用于资源有限
的单片机。
3.灵活、强大:单片机C语言功能丰富、灵活,可以满足各种单片机应用的需
求。
以下是单片机C语言的一些具体特点:
●支持直接访问硬件:单片机C语言可以直接访问单片机的硬件资源,例如I/O
口、计数器、定时器等。
●支持位操作:单片机C语言支持位操作,可以有效提高程序的运行效率。
●支持中断:单片机C语言支持中断,可以实现实时性要求高的应用。
●支持模块化编程:单片机C语言支持模块化编程,可以提高程序的可维护性。
基于C51单片机的数字时钟课程设计(C语言,带闹钟).
单片机技术课程设计数字电子钟学院:班级:姓名:学号:教师:摘要电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。
所以设计一个简易数字电子钟很有必要。
本电子钟采用AT89C52单片机为核心,使用12MHz 晶振与单片机AT89C52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。
该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEY5键,进行相应的操作就可实现校时、定时、复位功能。
具有时间显示、整点报时、校正等功能。
走时准确、显示直观、运行稳定等优点。
具有极高的推广应用价值。
关键词:电子钟 AT89C52 硬件设计软件设计目录一、数字电子钟设计任务、功能要求说明及方案介绍 (4)1.1 设计课题设计任务 (4)1.2 设计课题的功能要求说明 (4)1.3 设计课的设计总体方案介绍及工作原理说明 (4)二、设计课题的硬件系统的设计 (5)2.1硬件系统各模块功能简要介绍 (5)2.1.1 AT89C52简介 (5)2.1.2 按键电路 (6)三、设计课题的软件系统的设计 (6)3.1 使用单片机资源的情况 (6)3.2 软件系统个模块功能简要介绍 (7)3.3 软件系统程序流程框图 (7)3.4 软件系统程序清单 (7)四、设计课题的设计结论、仿真结果、误差分析 (9)4.1 设计结论及使用说明 (9)4.2 仿真结果 (10)结束语 (12)参考文献 (12)附录 (13)附录A:程序清单 (13)一、数字电子钟设计任务、功能要求说明及方案介绍1.1 设计课题设计任务设计一个具有特定功能的电子钟。
具有时间显示,并有时间设定,时间调整功能。
1.2 设计课题的功能要求说明设计一个具有特定功能的电子钟。
该电子钟上电或按键复位后能自动显示系统提示符“d.1004-22”,进入时钟准备状态;第一次按电子钟启动/调整键,电子钟从12时59分0秒开始运行,进入时钟运行状态;按电子钟S5键,则电子钟进入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按S5键再次进入时钟运行状态。
基于AT89C52单片机的交通灯C语言程序
_nop_(); _nop_(); delay(1); _nop_(); _nop_(); _nop_(); delay(1); } void shu5() { d0=0; d1=0;
d2=0; delay(1); d0=0; d1=1; d2=0; delay(1); d0=1; d1=1; d2=0; delay(1); d0=1; d1=0; d2=1;
d2=0; delay(1); d0=1; d1=0; d2=0; delay(1); d0=0; d1=1; d2=0; delay(1); d0=1; d1=1;
d2=0; delay(1); d0=0; d1=1; d2=1; delay(1); _nop_(); _nop_(); _nop_(); delay(1); _nop_(); _nop_(); _nop_();
基于 AT89C52 单片机的交通灯 C 语言程序
如图,简易交通灯 。 有四个状态 0,1,2,3 数码管为 2 位 7 段共阳数码管,可以通过修改 i,j 的值进而修改倒计时的长 短。 不当地方,敬请批评指正! 图一:十字路口交通灯 图二:状态 0 绿灯:0x42 红灯:0xbd
_nop_(); delay(1); _nop_(); _nop_(); _nop_(); delay(1); _nop_(); _nop_(); _nop_(); delay(1); _nop_(); _nop_();
_nop_(); delay(1); } void shu2() { d0=0; d1=0; d2=0; delay(1); d0=1; d1=0; d2=0; delay(1);
图三:状态 1 绿灯:0x25 红灯:0xda 图四:状态 2 绿灯:0x90 红灯:0x6f 图五:状态 3 绿灯:0x2c 红灯:0xd3
基于STC12C5A60S2单片机测电压的c代码
//------------------------------------------------------------------------------
void display(void)
{ char i,scan;
char times=20;
whlie(--time>=0)
serial_init(); //串口初始化
while(1)
{
unsigned char i;
for(i=0;i<8;i++) //循环发送P1.0-P1.7的转换数值
{
TI=1; //使用printf函数前须先将发送标志位TI置1
printf("The P1.%bd voltage is %f\n",i,AD_work(i));
void dataproc(unsigned char);
void display();
void delay1ms(char);
void AD_init();
void serial_init();
void delay(unsigned int a);
float AD_work(unsigned char channel);
#include"stc12c5a.h" //头文件在STC公司主页上下载
#include"stdio.h"
#include"intrins.h"
#include<reg51.h>
char code TAB[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x83,0xf8,0x80,0x98};
基于msp430单片机的智能台灯设计(C语言)
桂林理工大学信息学院实习报告实习名称:电子系统设计创新与实践设计题目:基于单片机的智能台灯设计专业班级:姓名:学号:组员:指导老师:实习时间:目录1概述 (3)1.1 题目名 (3)1.2 功能和技术指标要求 (3)1.3 国内外相关情况概述 (3)1.4 调光技术的选择 (4)2. 技术方案 (5)2.1 光照强度检测传感器的基本原理介绍 (5)2.2 总体技术方案 (5)3 硬件设计 (6)3.1 总体电路原理图 (6)3.2 各模块分别介绍 (7)3.2.1 MSP430G2553单片机模块 (7)3.2.2 BISS0001 人体红外感应模块热释电传感器 (8)3.2.3光敏电阻控制模块 (11)3.2.4 光敏电阻的应用 (12)3.3 灯光控制模块 (12)3.4 PWM调光说明 (13)3.5 硬件调试 (13)3.5.1 调试方法 (13)3.5.2 调试步骤 (14)4. 软件设计 (15)4.1 软件功能说明 (15)4.2 软件总流程 (15)4.3 软件测试 (15)5. 性能测试 (16)5.1 测试方法 (16)5.2 给出相应记录 (16)5.3 对实验数据进行分析以及提出相应的改进办法 (17)6.总结 (17)附录(程序清单):................................................. 错误!未定义书签。
参考文献: (18)1概述1.1 题目名基于单片机的智能台灯设计1.2 功能和技术指标要求本项目针对台灯的节电和使用的方便性进行创新设计与研究,以单片机为核心,综合运用热释电红外、光检测等技术,设计制作出智能型多功能LED台灯。
该台灯具有自动开、关,自动调光等功能,实现了LED的亮度随周围光照强度的变化而变化。
本设计一智能台灯控制器,实现照明控制系统的人性化,即当亮度足够时灯光关闭,在亮度不足时,有人走近自动点亮,并根据周围环境的亮度自动调节灯泡的功率的节能环保的智能型LED台灯的设计理念。
基于msp430单片机的智能台灯设计(C语言)综述
桂林理工大学信息学院实习报告实习名称:电子系统设计创新与实践设计题目:基于单片机的智能台灯设计专业班级:姓名:学号:组员:指导老师:实习时间:目录1概述 (3)1.1 题目名 (3)1.2 功能和技术指标要求 (3)1.3 国内外相关情况概述 (3)1.4 调光技术的选择 (4)2. 技术方案 (5)2.1 光照强度检测传感器的基本原理介绍 (5)2.2 总体技术方案 (5)3 硬件设计 (6)3.1 总体电路原理图 (6)3.2 各模块分别介绍 (7)3.2.1 MSP430G2553单片机模块 (7)3.2.2 BISS0001 人体红外感应模块热释电传感器 (8)3.2.3光敏电阻控制模块 (11)3.2.4 光敏电阻的应用 (12)3.3 灯光控制模块 (12)3.4 PWM调光说明 (13)3.5 硬件调试 (13)3.5.1 调试方法 (13)3.5.2 调试步骤 (14)4. 软件设计 (15)4.1 软件功能说明 (15)4.2 软件总流程 (15)4.3 软件测试 (15)5. 性能测试 (16)5.1 测试方法 (16)5.2 给出相应记录 (16)5.3 对实验数据进行分析以及提出相应的改进办法 (17)6.总结 (17)附录(程序清单):................................................. 错误!未定义书签。
参考文献: (18)1概述1.1 题目名基于单片机的智能台灯设计1.2 功能和技术指标要求本项目针对台灯的节电和使用的方便性进行创新设计与研究,以单片机为核心,综合运用热释电红外、光检测等技术,设计制作出智能型多功能LED台灯。
该台灯具有自动开、关,自动调光等功能,实现了LED的亮度随周围光照强度的变化而变化。
本设计一智能台灯控制器,实现照明控制系统的人性化,即当亮度足够时灯光关闭,在亮度不足时,有人走近自动点亮,并根据周围环境的亮度自动调节灯泡的功率的节能环保的智能型LED台灯的设计理念。
基于51单片机的C语言流水灯程序
基于51单片机的C语言流水灯程序#include //51系列单片机定义文件#define uchar unsigned char //定义无符号字符#define uint unsigned int //定义无符号整数void delay(uint); //声明延时函数void main(){uint i;uchar temp;while(1){temp=0x01;for(i=0;i<8;i++) //8个流水灯逐个闪动{P2=~temp;delay(500); //调用延时函数temp<<=1;}temp=0x80;for(i=0;i<8;i++) //8个流水灯反向逐个闪动{P2=~temp;delay(500); //调用延时函数temp>>=1;}temp=0xFE;for(i=0;i<8;i++) //8个流水灯依次全部点亮{P2=temp;delay(500); //调用延时函数temp<<=1;}temp=0x7F;for(i=0;i<8;i++) //8个流水灯依次反向全部点亮{P2=temp;delay(500); //调用延时函数temp>>=1;}}}void delay(uint a) //延时函数,毫秒级别{uint i;while(--a!=0) //执行空操作循环,其中a为形参,由调用该函数的函数语句提供值{for(i=0;i<125;i++);//执行当0加到125时,大约会用掉1ms 的时间}}。
基于51单片机的温度检测系统_单片机C语言课题设计报告
单片机C语言课题设计报告设计题目:温度检测电气系2011级通信技术一班级通信技术一班通才达识,信手拈来通才达识,信手拈来1摘要本课题以51单片机为核心实现智能化温度测量。
利用18B20温度传感器获取温度信号,将需要测量的温度信号自动转化为数字信号,利用单总线和单片机交换数据,最终单片机将信号转换成LCD 可以识别的信息显示输出。
基于STC90C516RD+STC90C516RD+的单片机的智能温度检测系统,的单片机的智能温度检测系统,设计采用18B20温度传感器,其分辨率可编程设计。
本课题设计应用于温度变化缓慢的空间,综合考虑,以降低灵敏度来提高显示精度。
设计使用12位分辨率,因其最高4位代表温度极性,故实际使用为11位半,位半,而温度测量范围为而温度测量范围为而温度测量范围为-55-55-55℃~℃~℃~+125+125+125℃,℃,则其分辨力为0.06250.0625℃。
℃。
设计使用LCD1602显示器,可显示16*2个英文字符,显示器显示实时温度和过温警告信息,和过温警告信息,传感器异常信息设。
传感器异常信息设。
传感器异常信息设。
计使用蜂鸣器做警报发生器,计使用蜂鸣器做警报发生器,计使用蜂鸣器做警报发生器,当温度超过当温度超过设定值时播放《卡农》,当传感器异常时播放嘟嘟音。
单片机C 语言课题设计报告语言课题设计报告电动世界,气定乾坤2目录一、设计功能一、设计功能................................. ................................. 3 二、系统设计二、系统设计................................. .................................3 三、器件选择三、器件选择................................. .................................3 3.1温度信号采集模块 (3)3.1.1 DS18B20 3.1.1 DS18B20 数字式温度传感器数字式温度传感器..................... 4 3.1.2 DS18B20特性 .................................. 4 3.1.3 DS18B20结构 .................................. 5 3.1.4 DS18B20测温原理 .............................. 6 3.1.5 DS18B20的读写功能 ............................ 6 3.2 3.2 液晶显示器液晶显示器1602LCD................................. 9 3.2.1引脚功能说明 ................................. 10 3.2.2 1602LCD 的指令说明及时序 ..................... 10 3.2.3 1602LCD 的一般初始化过程 (10)四、软件设计四、软件设计................................ ................................11 4.1 1602LCD 程序设计流程图 ........................... 11 4.2 DS18B20程序设计流程图 ............................ 12 4.3 4.3 主程序设计流程图主程序设计流程图................................. 13 五、设计总结五、设计总结................................. ................................. 2 六、参考文献六、参考文献................................. ................................. 2 七、硬件原理图及仿真七、硬件原理图及仿真......................... .........................3 7.1系统硬件原理图 ..................................... 3 7.2开机滚动显示界面 ................................... 4 7.3临界温度设置界面 ................................... 4 7.4传感器异常警告界面 (4)电气系2011级通信技术一班级通信技术一班通才达识,信手拈来通才达识,信手拈来3温度温度DS18B20 LCD 显示显示过温函数功能模块能模块传感器异常函数功能模块数功能模块D0D1D2D3D4D5D6D7XT XTAL2AL218XT XTAL1AL119ALE 30EA31PSEN29RST 9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD 10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR 16P3.5/T115U180C51X1CRYST CRYSTAL ALC122pFC222pFGNDR110kC31uFVCCGND234567891RP1RESPACK-8VCC0.0DQ 2VCC 3GND 1U2DS18B20R24.7K LCD1LM016LLS2SOUNDERMUC八、程序清单八、程序清单................................. .................................5 一、设计功能·由单片机、温度传感器以及液晶显示器等构成高精度温度监测系统。
基于C51单片机的数字时钟课程设计(C语言带闹钟)
单片机技术课程设计数字电子钟学院:班级:姓名:学号:教师:摘要电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。
所以设计一个简易数字电子钟很有必要。
本电子钟采用AT89C52单片机为核心,使用12MHz 晶振与单片机AT89C52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。
该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEY5键,进行相应的操作就可实现校时、定时、复位功能。
具有时间显示、整点报时、校正等功能。
走时准确、显示直观、运行稳定等优点。
具有极高的推广应用价值。
关键词:电子钟 AT89C52 硬件设计软件设计目录NO TABLE OF CONTENTS ENTRIES FOUND.一、数字电子钟设计任务、功能要求说明及方案介绍1.1 设计课题设计任务设计一个具有特定功能的电子钟。
具有时间显示,并有时间设定,时间调整功能。
1.2 设计课题的功能要求说明设计一个具有特定功能的电子钟。
该电子钟上电或按键复位后能自动显示系统提示符“d.1004-22”,进入时钟准备状态;第一次按电子钟启动/调整键,电子钟从12时59分0秒开始运行,进入时钟运行状态;按电子钟S5键,则电子钟进入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按S5键再次进入时钟运行状态。
1.3 设计课的设计总体方案介绍及工作原理说明本电子钟主要由单片机、键盘、显示接口电路和复位电路构成,设计课题的总体方案如图1所示:图1-1总体设计方案图本电子钟的所有的软件、参数均存放在AT89C52的Flash ROM和内部RAM 中,减少了芯片的使用数量简化了整体电路也降低了整机的工作电流。
键盘采用动态扫描方式。
利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据,同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。
《单片机C语言》课件
结构体
结构体是一种用于存储不同类型数据的结构,可以将多个相关的变量组合成一个整体。 在单片机C语言中,结构体常用于描述硬件设备的寄存器和状态信息。
单片机C语言的文件操作与动态内存分配
文件操作
文件操作是指对外部存储设备中的文件进行读写操作的一系列函数。在单片机 C语言中,文件操作可以用于保存和读取程序运行过程中的数据和配置信息。
数组
数组是一种用于存储相同类型数据的结构,可以通过索引快速访问数组中的元素。在单片机C语言中 ,数组常用于存储程序中需要重复使用的数据。
单片机C语言的函数与结构体
函数
函数是C语言中用于实现特定功能的代码块,可以将复杂的程序逻辑拆分成多个函数, 提高代码的可读性和可维护性。在单片机C语言中,函数可以用于实现各种硬件操作和
基于单片机的智能小车设计
总结词
实现智能导航和自动控制
VS
详细描述
基于单片机的智能小车设计集成了传感器 、电机、无线通信等技术,可以实现自主 导航、避障、路径规划等功能。通过单片 机编程,智能小车能够按照预设指令或自 主决策进行移动,完成一系列复杂的任务 。
基于单片机的电机控制系统
总结词
实现电机的精确控制和调速
动态内存分配
动态内存分配是指在程序运行过程中根据需要动态分配和释放内存空间的函数 。在单片机C语言中,由于内存资源有限,合理使用动态内存分配可以有效地提 高内存利用率,避免内存溢出等问题。
05
单片机C语言实际应用案例
基于单片机的温度控制系统
总结词
实现温度的实时监测和控制
详细描述
基于单片机的温度控制系统能够实时监测环境温度,并通过控制加热或制冷设备 来调节温度,保持恒温状态。该系统通常采用温度传感器采集温度数据,通过单 片机处理后控制执行机构,实现温度的自动调节。
基于C语言编程MCS-51单片机原理与应用教学设计
基于C语言编程MCS-51单片机原理与应用教学设计一、背景MCS-51单片机是英特尔公司的一款基于哈佛架构的单片机,其具有体积小、功耗低、性能出色的特点,广泛应用于嵌入式系统中。
作为计算机科学与技术专业中重要的一门课程,MCS-51单片机原理与应用课程的教学对于学生的专业能力培养至关重要。
在教学中,基于C语言编程是必要的一环。
因此,本文旨在设计一套基于C语言编程MCS-51单片机的教学方案,并进行实践验证。
二、教学目标1.掌握MCS-51单片机的硬件结构和工作原理。
2.掌握C语言的基本语法和数据类型。
3.掌握C语言在MCS-51单片机上的应用,能够通过C语言编程控制单片机的各种外设实现功能。
4.能够独立设计和实现小规模嵌入式系统。
三、教学内容3.1 硬件实验1.MCS-51单片机硬件介绍:引脚功能、位定义、存储器等。
2.串口通信实验:通过串口收发数据,并对数据进行处理。
3.LED闪烁实验:利用MCS-51单片机控制LED进行闪烁。
4.液晶显示实验:掌握液晶显示器的初始化和控制方法。
5.电机控制实验:通过MCS-51单片机控制电机运动。
3.2 软件实验1.C语言基础实验:变量定义、数据类型、运算符等基础语法练习。
2.数据结构实验:线性表、栈、队列等数据结构的C语言实现练习。
3.嵌入式系统设计实验:按照要求,设计并实现小规模嵌入式系统。
四、教学方法1.讲授理论课,重点讲解MCS-51单片机的硬件结构和工作原理,以及C语言在MCS-51单片机上的应用。
2.硬件实验课:手动进行电路搭建和测试,让学生亲身去体验硬件实验的过程,并解决实验中的问题。
3.软件实验课:提供教学资料与软件,并设立必要的实验任务,让学生通过编写C语言程序进行软件实验。
五、教学评估通过学生完成的实验报告、理论考试成绩、综合评价等方式对学生的教学效果进行评估。
六、教学简史本教学方案已在计算机科学与技术专业中数次实践,结合学生的反馈不断进行完善。
单片机C语言编程实例
单片机C语言编程实例前言INTEL公司的MCS-51单片机是目前在我国应用得最广泛的单片机之一.随着单片机应用技术的不断发展,许多公司纷纷以51单片机为内核,开发出与其兼容的多种芯片,从而扩充和扩展了其品种和应用领域.C语言已成为当前举世公认的高效简洁而又贴近硬件的编程语言之—。
将C语言向单片机上的移植,始于20世纪80年代的中后期。
经过十几年的努力,C语言终于成为专业化单片机上的实用高级语言。
用C语言编写的8051单片机的软件,可以大大缩短开发周期,且明显地增加软件的可读性,便于改进和扩充,从而研制出规模更大、性能更完善的系统。
因此,不管是对于新进入这一领域的开发者来说,还是对于有多年单片机开发经验的人来说,学习单片机的C语言编程技术都是十分必要的..C语言是具有结构化.模块化编译的通用计算机语言,是国际上应用最广。
最多的计算语言之一。
C51是在通用C语言的基础上开发出的专门用于51系列单片机编程的C语言。
与汇编语言相比,C51在功能上.结构上以及可读性。
可移植性。
可维护性等方面都有非常明显的优势.目前最先进、功能最强大、国内用户最多的C51编译器是Keil Soft ware公司推出的KeilC51.第一章单片机C语言入门1。
1建立您的第一个C项目使用C语言肯定要使用到C编译器,以便把写好的C程序编译为机器码,这样单片机才能执行编写好的程序。
KEIL uVISION2是众多单片机应用开发软件中优秀的软件之一,它支持众多不同公司的MCS51架构的芯片,它集编辑,编译,仿真等于一体,同时还支持PLM、汇编和C语言的程序设计,它的界面和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能.因此很多开发51应用的工程师或普通的单片机爱好者,都对它十分喜欢。
以上简单介绍了KEIL51软件,要使用KEIL51软件,必需先要安装它。
KEIL51是一个商业的软件,对于我们这些普通爱好者可以到KEIL中国代理周立功公司的网站上下载一份能编译2K的DEMO版软件,基本可以满足一般的个人学习和小型应用的开发。
基于单片机出租车计价器课题研究设计(c语言编写)
完成日期:2010年12月28日系:电子信息工程系专业:通信工程班级:071班设计题目:出租车计价器学生姓名:谢明七王勉指导教师:董玉华、许爽目录一、设计任务和性能指标 (3)1.1设计任务 (3)1.2性能指标 (3)二、设计方案 (4)2.1任务分析 (4)2.2系统设计 (4)三系统硬件设计 (6)3.1电源电路 (6)3.2单片机的最小系统 (6)3.3 DS1302时钟电路 (7)3.4显示电路的设计 (7)3.5按键控制的设计 (8)3.7复位电路 (9)四、系统软件设计 (11)4.1主程序设计 (11)4.2 子程序设计 (12)4.2.1 DS1302子程序 (12)4.2.1 DS1302子程序流程图 (12)4.2.2 显示子程序 (14)4.2.2 显示子程序流程图 (15)4.3 修改时间子程序 (17)五、调试及性能分析 (18)5.1调试步骤 (18)5.1.1硬件调试 (18)5.1.2软件调试: (18)5.2性能分析 (18)六、心得体会 (20)七、参考文献 (20)八、附录 (21)附录1、程序清单 (21)附录2 系统硬件电路图 (31)一、设计任务和性能指标1.1设计任务出租车计价器是乘客与司机双方的交易准则,它是出租车行业发展的重要标志,是出租车中最重要的工具。
它关系着交易双方的利益。
具有良好性能的计价器无论是对广大出租车司机朋友还是乘客来说都是很必要的。
出租车计价器的主要功能是计价显示、时钟显示、根据白天、黑夜、途中等待来调节营运参数、计量数据查询等。
要求用Protel 画出系统的电路原理图(要求以最少组件,实现系统设计所要求的功能),印刷电路板(要求布局合理,线路清晰),绘出程序流程图,并给出程序清单(要求思路清晰,尽量简洁,主程序和子程序分开,使程序有较强的可读性)。
1.2性能指标1.不同情况具有不同收费标准:白天、晚上、途中等待(>10min开始收费);2.数据输出:单价输出、路程输出、总金额输出;3.按键:启动计时开关、数据显示切换、白天/晚上切换、复位;4.能手动进行修改单价,但单价设定需密码进入。
单片机C语言程序设计实训100例--基于
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//延时
void DelayMS(uint x)
{
uchar i;
while(x--;);
}
}
//主程序
void main()
0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff,
0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,
0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,
0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
基于51单片机的C语言程序设计
基于51单片机的C语言程序设计实训100例第 01 篇基础程序设计01 闪烁的LED/* 名称:闪烁的LED说明:LED按设定的时间间隔闪烁*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit LED=P1^0;//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){while(1){LED=~LED;DelayMS(150);}}02 从左到右的流水灯/* 名称:从左到右的流水灯说明:接在P0口的8个LED从左到右循环依次点亮,产生走马灯效果*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intvoid DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){P0=0xfe;while(1){P0=_crol_(P0,1); //P0的值向左循环移动DelayMS(150);}}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){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){uchar i;P2=0x01;while(1){{P2=_crol_(P2,1); //P2的值向左循环移动DelayMS(150);}for(i=0;i<7;i++){P2=_cror_(P2,1); //P2的值向右循环移动DelayMS(150);}}}04 花样流水灯/* 名称:花样流水灯说明:16只LED分两组按预设的多种花样变换显示*/#include<reg51.h>#define uchar unsignedchar#define uint unsigned intuchar code Pattern_P0[]={0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff, 0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f, 0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff, 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe, 0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe, 0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff};uchar code Pattern_P2[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0xff, 0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff, 0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f, 0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f, 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00, 0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 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口显示for(i=0;i<136;i++){P0=Pattern_P0[i];P2=Pattern_P2[i];DelayMS(100);}}}05 LED模拟交通灯/* 名称:LED模拟交通灯说明:东西向绿灯亮若干秒,黄灯闪烁5次后红灯亮,红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁5此后变红灯,东西向变绿灯,如此重复。
基于单片机的交通灯设计c语言程序
基于单片机的交通灯设计c语言程序交通信号灯是城市交通中非常常见的设施之一,起到了引导和控制车辆、行人通行的重要作用。
基于单片机的交通信号灯设计是一个非常典型的实际应用案例,通过编写C语言程序,可以实现对交通信号灯状态的控制和调节。
首先,我们需要了解交通信号灯的基本原理和工作流程。
一般而言,交通信号灯包括红灯、黄灯和绿灯三种状态,分别对应停止、准备和通行的指示。
交通信号灯会按照一定的时间间隔,循环地在这三个状态之间切换,以控制车辆和行人的通行。
在基于单片机的交通信号灯设计中,我们可以借助定时器和IO口来实现状态的切换和指示灯的亮灭。
下面是一个简单的C语言程序示例:```c#include <reg52.h>sbit red = P1^0; //红灯控制引脚sbit yellow = P1^1; //黄灯控制引脚sbit green = P1^2; //绿灯控制引脚void delay(unsigned int xms) //延时函数{unsigned int i, j;for(i=xms; i>0; i--){for(j=110; j>0; j--);}}void main(){while(1){red = 1; //红灯亮yellow = 0; //黄灯灭green = 0; //绿灯灭delay(3000); //延时3秒red = 0; //红灯灭yellow = 1; //黄灯亮green = 0; //绿灯灭delay(2000); //延时2秒red = 0; //红灯灭yellow = 0; //黄灯灭green = 1; //绿灯亮delay(5000); //延时5秒}}```上述程序通过P1口的不同引脚控制红灯、黄灯和绿灯的亮灭。
通过循环的方式,定时器每隔一段时间就切换交通信号灯的状态,从而实现交通信号灯的正常工作。
这只是一个简单的交通信号灯设计示例,实际的交通信号灯设计还可能涉及到更多的状态和控制逻辑。
无线模块NRF24L01基于C51单片机-双向通讯C语言程序(中文详解)
#include <reg52.h>#include <intrins.h>/******************************************************************************** *******//* NRF24L01 的管脚定义,以及在本程序中的应用,VCC接3.3V电源,可以通过5V用电压转换芯片/*得到,NC 管脚可以接可以不接,暂时没用途。
本程序应用于51或者52单片机,是两个模块进行通讯/*成功的简单指示,现象是:模块1的 KEY1 对应模块1的LED1 和模块2的LED3 ,模块1的 KEY2 对应模/*块1的LED2 和模块2的LED4,发过来也对应。
/******************************************************************************** *******/typedef unsigned char uchar;typedef unsigned char uint;/************************************NRF24L01端口定义***********************************/sbit NC =P2^0; //没用,不接也可sbit MISO =P2^5; //数字输出(从 SPI 数据输出脚)sbit MOSI =P2^4; //数字输入(从 SPI 数据输入脚)sbit SCK =P1^7; //数字输入(SPI 时钟)sbit CE =P2^1; //数字输入(RX 或 TX 模式选择)sbit CSN =P2^2; //数字输入(SPI片选信号)sbit IRQ =P2^6; //数字输入(可屏蔽中断)/************************************按键***********************************************/sbit KEY1=P3^3;//按键S1sbit KEY2=P3^2;//按键S2/************************************数码管位选******************************************/sbit led1=P1^0; //LED0sbit led2=P1^1; //LED1sbit led3 =P1^2; //LED2sbit led4 =P1^3; //LED3sbit led5 =P1^4; //LED4/*********************************************NRF24L01*************************** ********/#define TX_ADR_WIDTH 5 // 5 uints TX address width 发送地址宽度#define RX_ADR_WIDTH 5 // 5 uints RX address width 接收地址宽度#define TX_PLOAD_WIDTH 20 // 20 uints TX payload 有效载荷装载货物#define RX_PLOAD_WIDTH 20 // 20 uints TX payloaduint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址/***************************************NRF24L01寄存器指令*******************************/#define READ_REG 0x00 // 读寄存器指令#define WRITE_REG 0x20 // 写寄存器指令#define RD_RX_PLOAD 0x61 // 读取接收数据指令#define WR_TX_PLOAD 0xA0 // 写待发数据指令#define FLUSH_TX 0xE1 // 冲洗发送 FIFO指令#define FLUSH_RX 0xE2 // 冲洗接收 FIFO指令#define REUSE_TX_PL 0xE3 // 定义重复装载数据指令#define NOP 0xFF // 保留/*************************************SPI(nRF24L01)寄存器地址***********************/#define CONFIG 0x00 // 配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA 0x01 // 自动应答功能设置#define EN_RXADDR 0x02 // 可用信道设置#define SETUP_AW 0x03 // 收发地址宽度设置#define SETUP_RETR 0x04 // 自动重发功能设置#define RF_CH 0x05 // 工作频率设置#define RF_SETUP 0x06 // 发射速率、功耗功能设置#define STATUS 0x07 // 状态寄存器#define OBSERVE_TX 0x08 // 发送监测功能#define CD 0x09 // 地址检测#define RX_ADDR_P0 0x0A // 频道0接收数据地址#define RX_ADDR_P1 0x0B // 频道1接收数据地址#define RX_ADDR_P2 0x0C // 频道2接收数据地址#define RX_ADDR_P3 0x0D // 频道3接收数据地址#define RX_ADDR_P4 0x0E // 频道4接收数据地址#define RX_ADDR_P5 0x0F // 频道5接收数据地址#define TX_ADDR 0x10 // 发送地址寄存器#define RX_PW_P0 0x11 // 接收频道0接收数据长度#define RX_PW_P1 0x12 // 接收频道0接收数据长度#define RX_PW_P2 0x13 // 接收频道0接收数据长度#define RX_PW_P3 0x14 // 接收频道0接收数据长度#define RX_PW_P4 0x15 // 接收频道0接收数据长度#define RX_PW_P5 0x16 // 接收频道0接收数据长度#define FIFO_STATUS 0x17 // FIFO栈入栈出状态寄存器设置/*************************************函数声明****************************************/void Delay(unsigned int s); //大延时void inerDelay_us(unsigned char n); //小延时void init_NRF24L01(void); //NRF24L01 初始化uint SPI_RW(uint dat); //根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01读出一字节uchar SPI_Read(uchar reg); //从reg寄存器读一字节void SetRX_Mode(void); //数据接收配置uint SPI_RW_Reg(uchar reg, uchar value); //写数据value到reg寄存器uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars); //从reg寄存器读出bytes 个字节,通常用来读取接收通道数据或接收/发送地址uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars); //把pBuf缓存中的数据写入到nRF24L01,通常用来写入发射通道数据或接收/发送地址unsigned char nRF24L01_RxPacket(unsigned char* rx_buf); //数据读取后放入rx_buf接收缓冲区中void nRF24L01_TxPacket(unsigned char * tx_buf); //发送 tx_buf中数据/*****************************************长延时*****************************************/void Delay(unsigned int s){unsigned int i;for(i=0; i<s; i++);for(i=0; i<s; i++);}/******************************************************************************** **********/uint bdata sta; //状态标志sbit RX_DR =sta^6; //RX_DR 为 sta 的第六位sbit TX_DS =sta^5; //TX_DS 为 sta 的第五位sbit MAX_RT =sta^4; //MAX_RT 为 sta 的第四位/******************************************************************************** **********//*延时函数/******************************************************************************** **********/void inerDelay_us(unsigned char n) //延时,us 级{for(;n>0;n--)_nop_();}/******************************************************************************** ********//*NRF24L01初始化/******************************************************************************** *******/void init_NRF24L01(void){inerDelay_us(100);CE=0; // 芯片使能CSN=1; // 禁止 SPISCK=0; // SPI时钟置低SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写本地地址SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 频道0自动ACK应答允许SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允许接收地址只有频道0,如果需要多频道可以参考Page21SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 设置信道工作为2.4GHZ,收发必须一致SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为1MHZ,发射功率为最大值0dB}/******************************************************************************** ********************//*函数:uint SPI_RW(uint uchar)/*功能:NRF24L01的SPI写时序-----根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01 读出一字节/******************************************************************************** ********************/uint SPI_RW(uint dat){uint i;for(i=0;i<8;i++) // 循环8次{MOSI = (dat & 0x80); // dat的最高位输出到MOSI MSB to MOSIdat = (dat << 1); // 从右向左进一位shift next bit into MSB..SCK = 1; // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据Set SCK high..dat |= MISO; //读MISO到 dat 最低位 capture current MISO bitSCK = 0; // SCK置低..then set SCK low again}return(dat); //返回读出的一字节 return read dat}/******************************************************************************** ********************/*函数:uchar SPI_Read(uchar reg)/*功能:NRF24L01的SPI时序-----------从reg寄存器读一字节/******************************************************************************** ********************/uchar SPI_Read(uchar reg){uchar reg_val;CSN = 0; //CSN置低,开始传输数据CSN low, initialize SPI communication...SPI_RW(reg); //选择寄存器 Select register to read from..reg_val = SPI_RW(0); //然后从该寄存器读数据 ..then read registervalueCSN = 1; //CSN拉高,结束数据传输CSN high, terminate SPI communicationreturn(reg_val); //返回寄存器数据 return register value}/******************************************************************************** ********************//*功能:NRF24L01读写寄存器函数/*描述:写数据value到reg寄存器/******************************************************************************** ********************/uint SPI_RW_Reg(uchar reg, uchar value){uchar status;CSN = 0; // CSN置低,开始传输数据CSN low, init SPI transactionstatus = SPI_RW(reg); // 选择寄存器,同时返回状态字 select registerSPI_RW(value); // 然后写数据到该寄存器 ..and write value to it..CSN = 1; // CSN拉高,结束数据传输CSN high againreturn(status); // 返回状态寄存器 returnnRF24L01 status uchar}/******************************************************************************** ********************//*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数/*描述: 从reg寄存器读出bytes个字节,通常用来读取接收通道数据或接收/发送地址/******************************************************************************** ********************/uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars){uint status,i;CSN = 0; //CSN置低,开始传输数据 Set CSN low, init SPI tranactionstatus = SPI_RW(reg); //选择寄存器,同时返回状态字 Select register to write to and read status ucharfor(i=0;i<uchars;i++)pBuf[i] = SPI_RW(0); //逐个字节从nRF24L01读出CSN = 1; //CSN拉高,结束数据传输return(status); //返回状态寄存器return nRF24L01 status uchar}/******************************************************************************** *************************/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数/*描述:把pBuf缓存中的数据写入到nRF24L01,通常用来写入发射通道数据或接收/发送地址/******************************************************************************** *************************/uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars){uint status,i;CSN = 0; //CSN置低,开始传输数据status = SPI_RW(reg); //选择寄存器,同时返回状态字inerDelay_us(10);for(i=0; i<uchars; i++)SPI_RW(*pBuf++); //逐个字节写入nRF24L01CSN = 1; //CSN拉高,结束数据传输return(status); //返回状态寄存器}/******************************************************************************** ********************//*函数:void SetRX_Mode(void)/*功能:数据接收配置/******************************************************************************** ********************/void SetRX_Mode(void){CE=0;SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);//CRC使能,16位CRC校验,上电,接收模式CE = 1; // 拉高CE启动接收设备inerDelay_us(130);}/******************************************************************************** **********************//*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)/*功能:数据读取后放入rx_buf接收缓冲区中/******************************************************************************** **********************/unsigned char nRF24L01_RxPacket(unsigned char* rx_buf){unsigned char revale=0;sta=SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况if(RX_DR) // 判断是否接收到数据{CE = 0; //SPI使能SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO bufferrevale =1; //读取数据完成标志}SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志return revale;}/******************************************************************************** ***************************/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)/*功能:发送 tx_buf中数据/******************************************************************************** **************************/void nRF24L01_TxPacket(unsigned char * tx_buf){CE=0; //StandBy I模式SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 装载数据SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送CE=1; //置高CE,激发数据发送inerDelay_us(10);}/************************************主函数************************************************************/void main(void){unsigned char tf =0;unsigned char TxBuf[20]={0}; // 要发送的数组unsigned char RxBuf[20]={0}; // 接收的数据数组init_NRF24L01() ; //模块初始化led1=1;led2=1;led3 =1;led4 =1; //led 灯关闭Delay(1000);while(1){if(KEY1 ==0 ) //按键 1 按下{TxBuf[1] = 1 ; //赋值tf = 1 ;led1=0; //本地led 灯闪烁Delay(200);led1=1;Delay(200);}if(KEY2 ==0 ) //按键 2 按下{TxBuf[2] =1 ; //赋值tf = 1 ;led2=0; //本地led 灯闪烁Delay(200);led2=1;Delay(200);}if (tf==1) //有键按下{nRF24L01_TxPacket(TxBuf); //发送数据 Transmit Tx buffer dataTxBuf[1] = 0x00; //清零TxBuf[2] = 0x00;tf=0;Delay(1000);}SetRX_Mode(); //设置成接受模式RxBuf[1] = 0x00; //接收的数组相应位清零RxBuf[2] = 0x00;Delay(1000);nRF24L01_RxPacket(RxBuf); //接收数据if(RxBuf[1]|RxBuf[2]){if( RxBuf[1]==1){led3=RxBuf[0];}if( RxBuf[2]==1){led4=RxBuf[4];}Delay(3000); //old is '1000'}RxBuf[1] = 0x00; //清零RxBuf[2] = 0x00;led3=1; //关灯led4=1;}}本程序存在的问题:反应不够灵敏,当在按键1和按键2之间切换的时候,对方的灯闪烁会有一定的延时,另外本程序没有消除按键的抖动。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于C#与单片机串口通信的投票器李浩东20093101004 周守悦20093101012一.作品的设计概述我们知道每年每个班都需要班委换届,有很多同学积极参加竞选,然而每一次竞选投票都是大家拿出一张纸,然后再纸上写上自己心目中班委的名字,然后交给监票读票记票,这个过程不仅大大浪费了大家的宝贵时间,还有可能出现漏票等情况,体现不了公平公正公开。
本设计是通过按钮给班委竞选人投票,每个候选人都对应一个按钮,投票人如果想投票给某个人可以按下其对应按钮,每按下一次改竞选人的票数就会自动增加1,每个人只能按下一次,电脑显示屏将通过柱形图动态的呈现每个候选人获得票数竞争的情况以及通过框图显示总票数,不仅使得投票结果更加公开公正,而且也大大节省了大家的时间。
本设计的创新点是通过柱形图动态显示整个投票过程,而不是直接显示到最后投票结果,更加体现公正公开。
二.作品的设计与分析1.主要功能与分析主要使用单片机和PC机之间的串口通信,在单片机硬件上设置七个按键,其中四个键是用来给A,B,C,D四个人投票的,这四个按键每按下一次就自动增1,记录这四个按键按下的总次数num1,num2,num3,num4,并把四个数按顺序不断循环通过串口发给PC机,PC 机通过串口把这些数据存储下来,并读出来,通过C#编程,把这四个人所获得的总票数在picturebox控件上面的柱形图动态呈现出来,通过time控件,不断更新这个人所获得的票数,让投票人通过柱形图更加形象直观的看出每个被投票人的竞争情况,同时在柱形图下方有着这四个人获得总票数的真实数目。
还有一个按键是票数清零,如果这次投票已经完成或者无效可以按下这个按键,此时A,B,C,D四个人的总票数将变成零。
还有一个按键作用是停止投票,如果需要停止这次投票可以按下此键,这时候那四个投票的按键将不可用。
最后一个按键的作用是继续投票,如需继续投票,可按此键。
其系统设计图如下:2.串口通信规则单片机与PC机为了可以进行通信,必须要遵守一定的通信规则,这个共同的规则就是通信端口的初始化。
通信端口的初始化有以下几项必须设置:(1)数据的传输速率传输双方通过传输线的电压改变来交换数据,但传输线的电压改变的速度必须和接收端的接收速度保持一致,RS-232通常用于异步传输,即双方并没有一个可参考的同步时钟作为基准。
由于没有一个参考时钟,双方所发送的高低电位到底代表几个位就不得而知了,要使得双方的数据读取正常,就要考虑到传输速率——波特率,其所代表的意义是每秒钟所能产生的最大电压状态改变率,或者说是每秒钟可以振荡的次数。
原始信号经过不同的波特率取样后,所得的结果完全不一样。
取样速度只有原来的一半时,信号被跳着取样,数据因此产生错误。
因此通信双方获得相同的通信速度是首先要做的事情。
(2)数据的发送单位一般串行通信端口所发送的数据是字符类型的,若用来传输文件,则会使用二进制的数据类型。
当使用字符类型时,通常使用ASCII码,ASCII码中8个位形成一个字符。
以实际的RS-232传输来看,由于大多数应用只是发送文字码,因此只要7个位就可以将ASCII 码的0-127号字符表达出来,所有的可见字符都在这个范围内,所以只要7个数据位就足够了。
不同的情况下,会使用到不同的发送单位,但使用多少个位合成一个字节必须先行确定。
(3)起始位及停止位由于异步串行通信中并没有使用同步脉冲作为基准,故接收端完全不知道发送端何时将进行数据的发送,而当发送端准备要开始发送数据时,发送端会在所送出的字符前后分别加上高电位的起始位(逻辑0)及低电位的停止位(逻辑1),它们分别是所谓的起始位和停止位。
当发送端要开始发送数据时,便将传输在线的电位由低电位提升至高电位,而当发送结束后,再将电位降至低电位。
接收端会因起始位的触发(因电压由低电位升至高电位)而开始接收数据,并因停止位的通知(因电压维持在低电位)而确切数据的字符信号已经结束。
(4)校验位的检查为了预防错误的产生,因此使用校验位作为检查的机制;校验位是用来检查所发送数据正确性的一种核对码,其中又分成奇校验位和偶校验位两种方式,分别是检查字符码中I 的数目是奇数或偶数。
以偶校验位为例,A的ASCII码01100001 (二进制),其中1的数目是三个,因此校验位便是1,使1的数目保持偶数。
同理,校验位是奇校验位时,A的校验位便是0,使1的数目保持奇数。
3.串口通信协议由于本设计主要从单片机串口发送数据,所以因此有关串口通信的原理的介绍都是围绕单片机讲解的。
(1)80C51串行口的控制寄存器(1.1)特殊功能寄存器SCONSCON 是一个特殊功能寄存器,用以设定串行口的工作方式、接收/发送控制以及设置状态表3-1 SCON寄存器SM0和SM1为工作方式选择位,可选择四种工作方式,如表3-2所示。
表3-2 串口通信4种工作方式SM2为多机通信控制位,主要用于方式2和方式3。
当接收机的SM2=1时可以利用收到的RB8来控制是否激活RI(RB8=0时不激活RI,收到的信息丢弃;RB8=1时收到的数据进入SBUF,并激活RI,进而在中断服务中将数据从SBUF读走)。
当SM2=0时,不论收到的RB8为0和1,均可以使收到的数据进入SBUF,并激活RI(即此时RB8不具有控制RI激活的功能)。
通过控制SM2,可以实现多机通信。
在方式0时,SM2必须是0。
在方式1时,若SM2=1,则只有接收到有效停止位时,RI才置1。
REN为允许串行接收位。
由软件置REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收。
TB8用在方式2或方式3中,是发送数据的第九位,可以用软件规定其作用。
可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位(在方式0和方式1中,该位未用) 。
RB8用在方式2或方式3中,是接收到数据的第九位,作为奇偶校验位或地址帧/数据帧的标志位。
在方式1时,若SM2=0,则RB8是接收到的停止位。
TI,发送中断标志位。
在方式0时,当串行发送第8位数据结束时,或在其它方式,串行发送停止位的开始时,由内部硬件使TI置1,向CPU发中断申请。
在中断服务程序中,必须用软件将其清0,取消此中断申请。
RI,接收中断标志位。
在方式0时,当串行接收第8位数据结束时,或在其它方式,串行接收停止位的中间时,由内部硬件使RI置1,向CPU发中断申请。
也必须在中断服务程序中,用软件将其清0,取消此中断申请[7]。
(1.2)特殊功能寄存器PCONPCON的字节地址为87H,它的第7位SMOD是与串口通信波特率的设置有关的选择位。
SMOD(PCON.7)为波特率倍增位。
在串行口方式1、方式2、方式3时,波特率与SMOD有关,当SMOD=1时,波特率提高一倍。
复位时,SMOD=0。
(2)80C51单片机串行口的工作方式(2.1)方式0设置SCON寄存器的SM0、SM1=0 0时,串行口工作于方式0。
此时,串行口为同步移位寄存器的输入输出方式。
主要用于扩展并行输入或输出口。
数据由RXD(P3.0)引脚输入或输出,同步移位脉冲由TXD(P3.1)引脚输出。
发送和接收均为8位数据,低位在先,高位在后。
波特率固定为fosc/12。
其中fosc为时钟频率。
(2.2)方式1设置SCON寄存器的SM0、SM1=0 1时,串行口工作于方式1。
方式1是10位数据的异步通信口。
TXD为数据发送引脚,RXD为数据接收引脚,传送一帧数据的格式如图所示。
其中1位起始位,8位数据位,1位停止位。
用软件置REN 为1时,接收器以所选择波特率的16倍速率采样RXD 引脚电平,检测到RXD 引脚输入电平发生负跳变时,则说明起始位有效,将其移入输入移位寄存器,并开始接收这一帧信息的其余位。
接收过程中,数据从输入移位寄存器右边移入,起始位移至输入移位寄存器最左边时,控制电路进行最后一次移位。
当RI=0,且SM2=0(或接收到的停止位为1)时,将接收到的9位数据的前8位数据装入接收SBUF ,第9位(停止位)进入RB8,并置RI=1,向CPU 请求中断。
方式一的输入输出图如图3-8、3-9所示。
D0D1D2D3D4D5D6D7写入SBUF 停止位TXDTI(中断标志)起始图3-8 方式1输入D0 D1 D2 D3 D4 D5 D6 D7停止位RXD RI(中断标志)起始位采样脉冲图3-9 方式1输出(2.3)方式2和方式3设置SCON 寄存器的SM0、SM1=1 0时,串行口工作于方式2,当SM0、SM1=1 1时,串行口工作于方式3。
方式2或方式3为11位数据的异步通信口。
TXD 为数据发送引脚,RXD 为数据接收引脚 。
方式2和方式3时起始位1位,数据9位(含1位附加的第9位,发送时为SCON 中的TB8,接收时为RB8),停止位1位,一帧数据为11位。
方式2的波特率固定为晶振频率的1/64或1/32,方式3的波特率由定时器T1的溢出率决定。
方式2和方式3输出:发送开始时,先把起始位0输出到TXD 引脚,然后发送移位寄存器的输出位(D0)到TXD 引脚。
每一个移位脉冲都使输出移位寄存器的各位右移一位,并由TXD 引脚输出。
第一次移位时,停止位“1”移入输出移位寄存器的第9位上 ,以后每次移位,左边都移入0。
当停止位移至输出位时,左边其余位全为0,检测电路检测到这一条件时,使控制电路进行最后一次移位,并置TI=1,向CPU 请求中断。
发送时序图如下图3-10所示。
写入SBUFTI(中断标志)图3-10 方式2或方式3的发送时序图方式2和方式3输入:接收时,数据从右边移入输入移位寄存器,在起始位0移到最左边时,控制电路进行最后一次移位。
当RI=0,且SM2=0(或接收到的第9位数据为1)时,接收到的数据装入接收缓冲器SBUF和RB8(接收数据的第9位),置RI=1,向CPU 请求中断。
如果条件不满足,则数据丢失,且不置位RI,继续搜索RXD引脚的负跳变。
接收时序图如图3-11所示。
位采样脉冲RI(中断标志)图3--11 方式2或方式3的接收时序图(3)波特率的计算在串行通信中,收发双方对发送或接收数据的速率要有约定。
通过软件可对单片机串行口编程为四种工作方式,其中方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可变的,由定时器T1的溢出率来决定。
串行口的四种工作方式对应三种波特率。
由于输入的移位时钟的来源不同,所以,各种方式的波特率计算公式也不相同。
方式0的波特率 = fosc/12方式2的波特率 =(2SMOD/64)· fosc方式1的波特率 =(2SMOD/32)·(T1溢出率)方式3的波特率 =(2SMOD/32)·(T1溢出率)当T1作为波特率发生器时,最典型的用法是使T1工作在自动再装入的8位定时器方式(即方式2,且TCON的TR1=1,以启动定时器)。