利用单片机取得随机数
单片机创新设计

密码防盗键盘指导老师:张儒姓名:肖均强学号:200710330223 班级:07电子(2)班时间:2010-6-16目录一、目的、用途、功能 (3)1.1 目的 (3)1.2用途与功能 (3)二、硬件设计 (3)2.1 硬件设计思想 (3)2.2 部分硬件方案论述 (4)2.3 硬件电路图 (5)2.4 硬件单元 (6)三、软件 (7)3.1 软件基本思想 (7)3.2 程序框图 (8)3.3 程序简述 (8)3.4 程序代码 (8)四、总结 (13)4.1 基本成果 (13)4.2 技术特色与创新 (13)4.3 应用拓展 (13)4.4 与同类课题研究的比对和优势 (13)五、心得体会 (14)六、附录 (15)5.1 所需资源列表 (15)5.2 作品照片 (15)5.3 参考文献 (15)密码防盗键盘机电学院电子专业2007级肖均强摘要:本实验是基于A VR mega16 单片机所设计的,可以实现键位与数字动态显示的一种新型密码防盗键盘。
通过单片机内部产生随机数,使用LED数码七段数码管予以显示,每一个数码管对应一个键位。
单片机对各个键位进行扫描,确定键位的输入。
关键词:mega16七段数码管ULN2003 密码防盗一、目的、用途、功能1.1 目的:设计一种投资少,简单易行,仅仅只是在现在的设备的基础之上稍加改造,又能从根本上解决摄像头拍摄盗取密码的设备。
1.2用途与功能:我们就设想让键上的10个数字位置分布可变。
10个键上的数字是由七段数码管显示。
每次取款时,键盘上数字的分布都会随机变化。
因而知道了键的位置并不能绝对判断出键上的数字是多少。
因此会给犯罪分子获得提款人的密码造成麻烦,从而解决摄像头盗取密码的难题。
二、硬件设计2.1 硬件设计思想键盘的数字和键位关系不固定,而且通过单片机内部产生随机数,通过LED数码管显示出来,每一个数码管对应一个键位。
基本设备是基于AVR单片机,外围设备采用的是12个七段数码管,2个ULN2003芯片,11个七段数码管, 1个74LS248芯片,若干电阻,电源电池。
单片机随机数

首先头文件写上:#include "stdlib.h"然后在后边就可调用rand()这个函数了.给你再具体说下吧,这里边还有些细节问题.实际上,随机函数有两个,srand和rand.要实现你说的功能得配合使用.函数一:int rand(void);从srand (seed)中指定的seed开始,返回一个[seed, RAND_MAX(0x7fff))间的随机整数。
函数二:void srand(unsigned seed);参数seed是rand()的种子,用来初始化rand()的起始值。
rand()在每次被调用的时候,它会查看:1)如果用户在此之前调用过srand(seed),给seed指定了一个值,那么它会自动调用srand(seed)一次来初始化它的起始值。
2)如果用户在此之前没有调用过srand(seed),它会自动调用srand(1)一次。
总结一下,也就是说:1)如果希望rand()在每次程序运行时产生的值都不一样,必须给srand(seed)中的seed 一个变值,这个变值必须在每次程序运行时都不一样(比如到目前为止流逝的时间)。
2)否则,如果给seed指定的是一个定值,那么每次程序运行时rand()产生的值都会一样,虽然这个值会是[seed, RAND_MAX(0x7fff))之间的一个随机取得所以,对于你来说,要想让每次的随机值不同,必需先调用srand函数,即:srand(i),而且要保证每次的i不同,这样才能使得种子不同,每次调用rand后才后有不同的返回值.一般来说,要使这个i不同,如果你的系统带时钟功能的话,可以把当前时间赋给i,这样每次的i就不同,如果单片机带AD的话也可以把AD引脚悬浮,读取一下AD转换值,因为最末位的数据很不稳定,也可以作为随机数的种子另外你所说的time.h是不行的,因为这个头文件是针对PC来说,可以读取系统时间,对于单片机一般没有时钟芯片,也无法读取时间.程序:简易程序,部分引脚及函数定义网友自己添加。
用单片机产生随机数的两种方法

用单片机产生随机数的两种方法在单片机中产生随机数是非常重要且常见的需求。
随机数在许多应用中起着重要作用,例如密码生成、游戏开发、模拟实验等。
单片机中的随机数通常用于实现伪随机数序列。
下面将介绍两种常见的方法来产生随机数。
一、基于时间的随机数生成在单片机中,可以使用芯片计时器以及芯片内置的实时时钟来产生基于时间的随机数。
具体步骤如下:1.初始化计时器和实时时钟。
2.确定需要生成的随机数的范围。
3.使用计时器或实时时钟的当前值来作为随机数的种子。
4.通过其中一种算法(例如线性同余法)将种子转化为随机数。
5.将产生的随机数存储在指定的变量中。
这种方法的优点是简单易用,而且可以通过调整计时器和实时时钟的初始化设置来增加随机性。
但是缺点是随机数的质量可能不如其他方法,因为在一些情况下,计时器和实时时钟的值是可预测的。
二、基于模拟信号的随机数生成这种方法是通过模拟信号产生随机数。
具体步骤如下:1.选择一个可变的模拟信号(例如光敏电阻传感器、温度传感器等)。
2.初始化模拟信号,使其处于一个初始状态。
3.读取模拟信号的值。
4.使用其中一种算法(例如移位寄存器)对模拟信号的值进行处理,得到随机数。
5.将产生的随机数存储在指定的变量中。
这种方法的优点是产生的随机数质量较高,因为它们是基于真实的物理过程产生的。
然而,与基于时间的方法相比,基于模拟信号的方法更复杂一些,因为需要选择合适的模拟信号和算法。
总结:产生随机数是单片机中常见的需求之一、基于时间的随机数生成方法简单易用,但随机数质量可能不如其他方法。
基于模拟信号的随机数生成方法可以产生质量较高的随机数,但比较复杂。
根据具体需求选择适合的方法来产生随机数是很重要的。
单片机数据加密算法

单片机数据加密算法
1. 对称加密算法,对称加密算法使用相同的密钥来加密和解密数据。
常见的对称加密算法包括AES(高级加密标准)、DES(数据加密标准)和3DES。
这些算法在单片机上通常具有较高的执行效率和较小的存储需求。
2. 非对称加密算法,非对称加密算法使用公钥和私钥来加密和解密数据。
常见的非对称加密算法包括RSA、ECC(椭圆曲线加密)和DSA(数字签名算法)。
这些算法通常比对称加密算法更复杂,因此在单片机上的实现可能需要更多的计算资源。
3. 哈希函数,哈希函数用于将任意长度的数据映射为固定长度的哈希值。
常见的哈希函数包括SHA-1、SHA-256和MD5。
在单片机上,哈希函数通常用于验证数据的完整性和生成消息摘要。
4. 随机数生成器,随机数生成器用于生成加密过程中需要的随机数。
在单片机上,通常使用伪随机数生成器来产生随机数序列。
在选择单片机数据加密算法时,需要综合考虑安全性、执行效率和存储需求。
合适的加密算法可以保护数据安全,同时不会对单
片机的性能造成过大的影响。
同时,还需要注意算法的实现细节,以防止可能的侧信道攻击和其他安全风险。
最终选择的加密算法应该能够满足具体应用场景的安全需求。
真随机数产生方法

ATmega1 28单片机的真随机数发生矗时间:2009-12-16 15:39:00 来源:单片机与嵌入式系统作者:刘晓旭,曹林,董秀成西华大学ATmega1 28单片机的真随机数发生矗时间:2009-12-16 15:39:00 来源:单片机与嵌入式系统作者:刘晓旭,曹林,董秀成西华大学引言随机数已广泛地应用于仿真、抽样、数值分析、计算机程序设计、决策、美学和娱乐之中。
常见的随机数发生器有两种:使用数学算法的伪随机数发生器和以物理随机量作为发生源的真随机数发生器。
要获取真正随机的真随机数,常使用硬件随机数发生器的方法来获取。
这些真随机数都是使基于特定的真随机数发生源(如热噪声、电流噪声等),每次获取的真随机数都是不可测的,具有很好的随机性。
真随机数因其随机性强,在数据加密、信息辅助、智能决策和初始化向量方面有着广泛应用,构建一种基于硬件真随机数发生源,具有广泛的应用价值。
但目前硬件真随机数发生源均较复杂,而且很少有基于单片机的真随机数发生器。
本文利用RC充放电的低稳定度,根据AVR单片机的特点设计了一种性价比极高的真随机数发生器。
该随机数发生器使用元件很少,稳定性高,对一些价格敏感的特殊场合,如金融、通信、娱乐设备等有较大的应用意义。
1 基本原理和方法1.1 基本原理串联的RC充放电电路由于受到漏电流、电阻热噪声、电阻过剩噪声、电容极化噪声等诸多不确定性因素的影响,其充放电稳定度一般只能达到10-3。
利用这种RC充放电的低稳定度特性实现廉价的真随机数发生源。
Atmel公司AVR单片机ATmega 128以其速度快、功能强、性价比高等优点广泛应用于各种嵌入式计算场合。
利用AVR单片机引脚配置灵活多样的特点,使用Amnega128两个I /O口作为真随机数的电气接口。
其原理如图1所示。
主要原理是利用串联RC电路的不确定性产生真随机数源,收集数据,通过AVR单片机ATmega128和主时钟电路量化RC电路的充放电时问,获得不确定的2位二进制数据,再利用程序将每4次采集的数据综合,最后产生1个8位的真随机数。
单片机技术与应用11_CC2530随机数生成器应用

2、相关寄存器
ADCCON1寄存器中与随机数生成器有关的位
位
名称
复位
3:2 RCTRL[1:0] 00
R/W R/W
描述
控制16位随机数生成器,当写入01时,随机数生成器不展开 运行一次,并在运行完成时自动将此值复位成00。 00:正常运行(13X展开)。 01:运行一次(不展开)。 10:保留。 11:停止,关闭随机数生成器。
本章简介
1、随机数介绍 2、相关寄存器 3、开发实验 4、拓展题
1、随机数介绍
随机数是什么? 随机数就是在一定范围内随机产生的数,并且得到的 这一范围内的每个数的机会一样
随机数的运用? 随机抽样,随机密码,随机调查等等
伪随机数是什么? “伪随机数”:计算机中的随机数是按照一定算法模拟产生的, 其结果是确定的,是可见的,所以用计算机随机函数所产生的 “随机数”并不随机,是伪随机数。
CRC计算结果的低8位。
7:0 RNDL该寄
存器的原有值复制到RNDH寄存器,然后才将次寄存
器的值更新成新的数值。
RNDH寄存器
位 位名称 复位值 操作
描述
7:0 RNDH[7:0]
0xFF
R/W
种子值/随机数高8位数据,在进行CRC16运算时为输 入数据的寄存器,并输出CRC计算结果的高8位。 注意:在向该寄存器写入数据时,会触发CRC校验计 算功能。
4、拓展题
题1:
5、读取高位随机数RNDH 6、读取低位随机数RNDL
如:ADCCON1 |= 0x04 如:while(ADCCON1 & 0x04)
如:rn = RNDH 如:rn = (rn<<8)|RNDL
2、相关寄存器
大学单片机毕业设计课程设计 - 幸运猜奖盘
信息与电子工程学院《单片机技术应用实训》报告题目:幸运猜奖盘班级:12应电03班材料包括仿真图、PCB、软件、制作图片等具体可咨询/“黎明电子STYLE”时间:2014年06月19日目录1设计内容与要求 (3)1.1 设计内容 (3)1.2 设计要求 (3)2芯片说明 (3)2.1 STC12C5A60S2 (3)2.2 74HC595 (4)2.3 74HC573 (5)2.4 SMA41056 (5)3工作原理 (6)3.1 硬件原理 (6)3.2 软件原理 (8)4调试过程 (9)4.1 硬件调试 (11)4.2 软件调试 (12)5总结 (13)参考文献 (14)附录ⅠSTC12C5A60S2芯片的管脚说明 (14)附录Ⅱ端口功能表 (15)附录Ⅱ原理图 (17)附录Ⅲ电路的PCB图 (18)附录Ⅳ电路的实物图 (19)附录Ⅴ物料清单 (20)附录Ⅶ仪器型号 (22)1设计内容与要求1.1 设计内容利用单片机STC12C5A60S2最小系统,综合所学知识添加外围电路实现电路设计功能,设计内容包括数码管显示、寄存器、锁存器、独立键盘按键、定时器、中断等功能。
1.2 设计要求(1)有8个可以选择的对象,选择个数上线为99分。
(2)转盘有16个LED流水灯构成的光电子转盘,利用单片机产生随机数,速度开始时是从慢开始到快,然后从快到慢,到停止,停止时计算猜中的选择对乘于倍率得到得分。
(3)可以拍大小,根据随机数给出的结果做出相应的算法,如果是0到7这是小,如果8到15则是大,猜对了的话将得分乘于2猜错的话将得分清零。
(4)游戏可循环,直到玩家没分或者9999满分结束。
2芯片说明2.1 STC12C5A60S2(1)STC12C5A60S2单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。
内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。
用单片机产生随机数的两种方法
方法一:定时器直接随机取值每按一次按键生成一个随机数,这个随机数实际是把定时器的值给取出来了,并不能算绝对的随机、方法二才是真正意义上的随机。
仿真如下:#include<reg51.h>sbit k1=P1^0;void delay(unsigned int i){unsigned int j,k;for(j=0;j<i;j++)for(k=0;k<120;k++);}unsigned int sum1,sum2;unsigned charled[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0X40}; void init() interrupt 1{TH0=0X00;TL0=0X00;}void display(){P2=led[sum1%10];P3=0xfe;delay(2);P3=0xff;P2=led[sum1/10%10];P3=0xfd;delay(2);P3=0xff;P2=led[sum2%10];P3=0xfb;delay(2);P3=0xff;P2=led[sum2/10%10];P3=0xf7;delay(2);P3=0xff;}void main(){TMOD=0X01;TH0=0X00;TL0=0X00;EA=1;ET0=1;TR0=1;while(1){if(k1==0){while(k1==0);sum1=TL0;sum2=TH0;} display();}}方法二:用定时器加rand()随机函数来实现单片机上电之后通过按键去启动取随机数,若是单片机上电就立即取随机数的话,那每次上电随机的结果都是一样的。
然后是0到9不重复的随机数,程序中用了循环来判断是否和前面取的随机数相同,相同则进入下次取随机数,不同则存入数组。
程序如下:#include<reg52.h>#include<stdlib.h> //包含rand()随机函数的头文件unsigned char t,k,i,j,a,f,n[10];//t是计时变量,k是按键标志,i是数组下标,f是随机数重复标志,n[10]是存放随机数的数组void init() //初始化函数{t=0;i=0;f=0;k=0;TMOD=0x02; //设置定时器0为工作方式2TH0=7; //装初值TL0=7;EA=1; //开总中断ET0=1; //开定时器0中断TR0=1; //启动定时0EX0=1; //开外部中断0,同按键的效果一样IT0=1; //下降沿触发}void main(){init();while(1){while(k) //外部中断0触发循环{if(!i) //i=0时取第一个随机数放入数组n[0] {srand(t); //随机数初始化a=(char)(rand()%10); //取随机数(0~9) n[0]=a; //存入数组i++; //数组下标加1}elsewhile(i<10) //存放剩下的9个随机数{srand(t); //随机数初始化a=(char)(rand()%10); //取随机数for(j=0;j<i;j++) //与前面的随机数比较{if(n[j]==a) //与前面的随机数相同f=1; //标志置1}if(f) //有重复执行{f=0; //标志清0continue; //结束本次循环}n[i]=a; //不同则存入数组中i++; //数组下标加1}}}}void inter0() interrupt 0 //外部中断0{k=1; //按键标志置1,主函数执行取随机数}void time0() interrupt 1 //定时器0中断{t++; //时间加1if(t==100) t=0;}。
在C51下的随机数生成
预定义10位长度的字符数组单片机为8位应该不会超过这个范围了intபைடு நூலகம்es0pos0length0
在 C51 下的随机数生成 #i nclude <stdio.h> #i nclude <stdlib.h> #i nclude <conio.h> #define A 3 int AdvancedLinearCongrutial(int x, int a, int b, int c, in t m, int max);
res = res + (mynums[pos] - 48) * m; pos = pos + 1; } // 定义随机种子 // srand(res); int x = rand(), a = 2, b = 3, c = 5, m = 65536; // 改进的线性同余算法 int i = AdvancedLinearCongrutial(x, a, b, c, 65536, rand()% 100); printf("i = %d", i); printf("\ printf("\tres = %d", res); return i; } // 改进的线性同余算法 AdvancedLinearCongrutial(int int AdvancedLinea rCongrutial(int x, int a, int b, int c, in t m, int max) { for(int i=0; i<max; i++) { a = A; for(int j=0; j<i; j++) { a *= A; } (ax = (a*x + (a-1)*c/b)%m; } return x; }
单片机C语言如何产生随机数
单片机C语言如何产生随机数在单片机C语言编程中,产生随机数有多种方法。
下面将介绍其中两种常见的方法。
方法一:使用时间种子```c#include <stdio.h>int mai//使用当前时间作为种子//生成随机数int random_number = rand(;printf("随机数:%d\n", random_number);return 0;```该方法的缺点是种子的变化速度比较慢,因此可能在短时间内多次运行得到同样的随机数。
方法二:使用ADC模块ADC(模拟数字转换器)模块可以将模拟信号转换为数字信号,因此可以利用ADC模块来获取随机噪声,并将其作为随机数。
使用该方法需要连接一个外部噪声源(例如一个电阻),将其连接到MCU的ADC通道上,并配置ADC通道以读取模拟信号。
```c#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <fcntl.h>#include <stdint.h>#include <linux/ioctl.h>#include <linux/types.h>#define DEVICE_FILE "/dev/myadc"static uint16_t read_adint fd;uint16_t value;fd = open(DEVICE_FILE, O_RDWR , O_NONBLOCK); if (fd < 0)perror("open");exit(1);}read(fd, &value, sizeof(value));close(fd);return value;int maiuint16_t random_value = read_adc(;printf("随机数:%d\n", random_value);return 0;```以上代码通过打开ADC设备文件(/dev/myadc)读取来自ADC的模拟信号,并将其转换为数字形式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
河北工业大学计算机硬件技术基础(MCS-51单片机原理及应用)课程设计报告
学院土木班级交通工程C021班设计人田立全学号 026885
一、设计题目:利用单片机取得随机数
二、问题的提出:
利用单片机的中断和定时器/计数器相结合产生一个6位的二进制随机数(即产生一个0-63之间的一个随机数)。
每当按下按钮之后,在LED显示器上显示这个二进制的随机数。
三、总体设计:
1.所设计题目的功能:
可以利用定时器/计数器进行自动重装载的计数,当触发中断的时候读出定时器/计数器的计数值作为产生的随机数。
整个程序分为两个部分,主程序部分负责定时器/计数器的初始化、中断系统初始化和LED显示三部分功能。
外部中断处理部分的程序负责取定时器/计数器中的随机数,然后取该数的低六位,然后将这个数转化为六个字节的二进制数(例如:将25h转变为:01h,00h,01h,00h,00h,01h)。
然后利用LED显示器显示这6个字节的数据。
2.总体方案设计:
(1)断源的选择
因为定时器/计数器只是在外部中断被触发的时候负责提供数
据,所以虽然我们用到了定时器/计数器,但是它并不是一个中断源,即本系统的中断源只有一个外部中断。
(2)二进制转换的实现
进制转换可以利用除二取余法。
四、 硬件系统设计 硬件电路:
五、
软件系统设计 1. 程序清单
ORG 0000H
AJMP MAIN
;INT0 ENTERENCE
ORG 0003H AJMP INTER0
ORG 0200H
MAIN: MOV SP, #6FH
;SET TIMMER
MOV TMOD, #20H
MOV TH1, #00H
MOV TL1, #00H
SETB TR1
;ENABLE INTERRUPT
SETB EX0
SETB PX0
SETB IT0
SETB EA
AJMP DSPLY
;DISPLAY AND W AIT FOR INTERRUPT
ORG 0300H
DSPL Y: MOV A, #03H
MOV DPTR, #0FF20H
MOVX @DPTR, A
DSPL Y1: MOV R3, #01H
MOV R0, #30H ;RESULT ENTRANCE
MOV A, R3
LD0: MOV DPTR, #0FF21H
MOVX @DPTR, A
MOV A, @R0
MOV DPTR, #DTAB
MOVC A, @A+DPTR
MOV DPTR, #0FF22H
MOVX @DPTR, A
ACALL DELAY
INC R0
MOV A, R3
JB ACC.5, LD1
RL A
MOV R3, A
AJMP LD0
LD1: SJMP DSPLY
;DELAY FOR 1MS
DELAY: MOV R7,#02H
DL1: MOV R6,#0FFH
DL2: DJNZ R6, DL2
DJNZ R7, DL1
RET
ORG 0400H
INTER0: MOV A, TL1 ;READ COUNTER
ANL A, #00111111B
;REQUIRE LAST 6 BITS AND 00111111B
MOV R1, #30H
;RESULT MEM ADDRESS START
MOV R0, #06H ;LOOP FOR 6 TIMES ;CLEAR MEM
MOV 0030H,#00H
MOV 0031H,#00H
MOV 0032H,#00H
MOV 0033H,#00H
MOV 0034H,#00H
MOV 0035H,#00H
;DIV LOOP
LOOPED1: MOV B, #02H
DIV AB
MOV @R1, B
INC R1
DJNZ R0, LOOPED1
RETI
DTAB: DB 0C0H, 0F9H
END
2.流程图。