论坛上有人问51获取随机数的问题,个人觉得要求不高的话可以用读取定时器TL值来获取,写了个
简单的程序,经验证是可以用的
/***************************淘宝:http://quanmao.taobao.com/*********************************
程序名: 随机数
编写人: 李全茂
编写时间: 2010年6月10日
硬件支持: WJ4.0 51开发板,晶振12M LCD1602
接口说明: P0口接led
修改日志:
NO.1-
/********************************************************************************************
说明: 获取随机数的演示程序, 通过读取定时器TL的值作为随机数,送到P0口接的LED显示。
/************************技术论坛:http://www.wang1jin.com/bbs/ ****************************/
#include "reg51.h
// [定时/计数器函数]
//
// -----------------------------------------------------------------------------
// M1 M0 方式 说明
// 0 0 0 13位T/C,由TL低5位和TH的8位组成13位计数器
// 0 1 1 16位T/C,TL和TH共16位计数器
// 1 0 2 8位T/C,TL用于计数,当TL溢出时将TH中的值自动写入TL
// 1 1 3 两组8位T/C
// -----------------------------------------------------------------------------
/*********************************************************************************************
函数名:定时/计数器初始化函数
调 用:T_C_init();
参 数:无
返回值:无
结 果:设置SFR中T/C1和(或)T/C0相关参数
备 注:本函数控制T/C1和T/C0,不需要使用的部分可用//屏蔽
/**********************************************************************************************/
void T_C_init (void){
TMOD = 0x20; //高4位控制T/C1 [ GATE,C/T,M1,M0,GATE,C/T,M1,M0 ]
EA = 1; //中断总开关
TH1 = 200; //16位计数寄存器T1高8位(写入初值)
TL1 = 200; //16位计数寄存器T1低8位
ET1 = 1; //T/C1中断开关
TR1 = 1; //T/C1启动开关
//TH0 = 0x3C; //16位计数寄存器T0高8位
//TL0 = 0xB0; //16位计数寄存器T0低8位(0x3CB0 = 50mS延时)
//ET0 = 1; //T/C0中断开关
//TR0 = 1; //T/C0启动开关
}
/*********************************************************************************************
函数名:delay_ms(unsigned int msec)
参 数:msec,int型,以ms为单位,
返回值:无
结 果:
备 注:不精确延时,12M晶振
/********************************************************************************************/
static void delay_ms(unsigned int msec)
{
unsigned char TempCyc;
while (msec--)
{
for (TempCyc=0; TempCyc<114; TempCyc++);
}
}
void main()
{
T_C_init();
P0 = TL1; //先读取一下,这个不是必须的,根据试验每次加电后在这里读到的都是固定值
while(1)
{
delay_ms(TL1); // 通过延时(这里延时的时间也是随机的),防止得到的随机属重复
P0 = TL1; // 将随机数送的P0的显示
}
}
文章评论(0条评论)
登录后参与讨论