AVR单片机电子抽奖完整项目仿真+源码设计

发布者:感恩的7号最新更新时间:2019-10-24 来源: 51hei关键字:AVR  单片机  电子抽奖 手机看文章 扫描二维码
随时随地手机看文章

电子抽奖完整项目,基于AVR单片机ATMEG128,包含原理图,源代码及仿真


仿真原理图如下

.

单片机源程序如下:

//ICC-AVR application builder

// Target : M128

// Crystal: 8.0000Mhz


#include

#include

#include



#define  bit_read(var,bitno) ((var)<<(7-(bitno))>>7)

#define TRUE 0xFF

#define FALSE 0x00



unsigned int randdata = 0;

unsigned char wdata,qdata,baidata,sdata,gdata;

unsigned char temp2,temp3,temp4,temp5,temp6;


unsigned char TimerFlg = FALSE;

unsigned char T3Flg = FALSE;

unsigned char SEGtable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};



void delay(int i)

{

        unsigned char j;

        for(;i>0;i--)

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

}

//统计为1的个数

unsigned char count(unsigned char n)

{    

  int sum=0;    

  while(n)    

{        

  sum+=n&0x01;       

  n>>=1;    

  }    

  return sum;

}


void initrand(void)

{

           unsigned char counter=0;

        unsigned char temp = 0;

        PORTC = 0xFF;

        temp = PINC; //读取拨码开关状态

        counter = count(temp);

    srand(counter);       //初始化种子

}


void port_init(void)

{

PORTA = 0x00;

DDRA  = 0x00;

PORTB = 0x00;

DDRB  = 0xff;

PORTC = 0x00; //m103 output only

DDRC  = 0x00;

PORTD = 0x00;

DDRD  = 0x00;

PORTE = 0x00;

DDRE  = 0xFF;

PORTF = 0x00;

DDRF  = 0xFF;

PORTG = 0x00;

DDRG  = 0x00;

}


//TIMER3 initialize - prescale:256

// WGM: 0) Normal, TOP=0xFFFF

// desired value: 100mSec

// actual value: 100.000mSec (0.0%)

void timer3_init(void)

{

TCCR3B = 0x00; //stop

TCNT3H = 0xF3; //setup

TCNT3L = 0xCB;

OCR3AH = 0x0C;

OCR3AL = 0x35;

OCR3BH = 0x0C;

OCR3BL = 0x35;

OCR3CH = 0x0C;

OCR3CL = 0x35;

ICR3H  = 0x0C;

ICR3L  = 0x35;

TCCR3A = 0x00;

TCCR3B = 0x00; 

T3Flg = FALSE;

}


#pragma interrupt_handler timer3_ovf_isr:iv_TIM3_OVF

void timer3_ovf_isr(void)

{

//TIMER3 has overflowed

TCNT3H = 0xF3; //reload counter high value

TCNT3L = 0xCB; //reload counter low value

TimerFlg = TRUE;                 //修改标志位

PORTB^=BIT(0); 

}


#pragma interrupt_handler int0_isr:iv_INT0

void int0_isr(void)

{

  if(T3Flg == TRUE)                       //判断当前定时计数器的状态

  {

    TCCR3B = 0x00;

        T3Flg = FALSE;

        PORTB= 0xff;

  }

  else

  {

    initrand();   //初始化种子

        T3Flg = TRUE;

        TCCR3B = 0x04;

        PORTC = 0x00;

  }

}


//call this routine to initialize all peripherals

void init_devices(void)

{

//stop errant interrupts until set up

CLI(); //disable all interrupts

XDIV  = 0x00; //xtal divider

XMCRA = 0x00; //external memory

port_init();

timer3_init();


MCUCR = 0x00;

EICRA = 0x00; //extended ext ints

EICRB = 0x00; //extended ext ints

EIMSK = 0x01;

TIMSK = 0x00; //timer interrupt sources

ETIMSK = 0x04; //extended timer interrupt sources

SEI(); //re-enable interrupts

//all peripherals are now initialized

}


void WR5952(unsigned char data)

{

         //PE0-SHCP,PE1-DS,PE2-STCP

        unsigned char j;

        /*SPI发送开始*/

        PORTE&=~(1<        delay(1);

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

        {        

                PORTE&=~(1<                delay(1);

                if(bit_read(data,j)) 

                {

                 PORTE|=1<                }

                else 

                {

                 PORTE&=~(1<                }

                delay(1);

                PORTE=1<                delay(1);

        }

        PORTE&=~(1<        delay(1);

        PORTE|=1<        delay(1);

}        


void WR5953(unsigned char data)

{

         //PE3-SHCP,PE4-DS,PE5-STCP

        unsigned char j;

        /*SPI发送开始*/

        PORTE&=~(1<        delay(1);

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

        {        

                PORTE&=~(1<                delay(1);

                if(bit_read(data,j)) 

                {

                 PORTE|=1<                }

                else 

                {

                 PORTE&=~(1<                }

                delay(1);

                PORTE=1<                delay(1);

        }

        PORTE&=~(1<        delay(1);

        PORTE|=1<        delay(1);

}        


void WR5954(unsigned char data)

{

         //PE6-SHCP,PE7-DS,PF0-STCP

        unsigned char j;

        /*SPI发送开始*/

        PORTF&=~(1<        delay(1);

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

        {        

                PORTE&=~(1<                delay(1);

                if(bit_read(data,j)) 

                {

                 PORTE|=1<                }

                else 

                {

                 PORTE&=~(1<                }

                delay(1);

                PORTE=1<                delay(1);

        }

        PORTE&=~(1<        delay(1);

        PORTF|=1<        delay(1);

}        


void WR5955(unsigned char data)

{

         //PF1-SHCP,PF2-DS,PF3-STCP

        unsigned char j;

        /*SPI发送开始*/

        PORTF&=~(1<        delay(1);

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

        {        

                PORTF&=~(1<                delay(1);

                if(bit_read(data,j)) 

                {

                 PORTF|=1<                }

                else 

                {

                 PORTF&=~(1<                }

                delay(1);

                PORTF=1<                delay(1);

        }

        PORTF&=~(1<        delay(1);

        PORTF|=1<        delay(1);

}        


void WR5956(unsigned char data)

{

         //PF4-SHCP,PF5-DS,PF6-STCP

        unsigned char j;

        /*SPI发送开始*/

        PORTF&=~(1<        delay(1);

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

        {        

                PORTF&=~(1<                delay(1);

[1] [2]
关键字:AVR  单片机  电子抽奖 引用地址:AVR单片机电子抽奖完整项目仿真+源码设计

上一篇:ATMEGA48利用按键控制时钟proteus仿真
下一篇:ATMEGA168+L298控制电机正反转的代码与Proteus仿真

推荐阅读最新更新时间:2024-11-08 12:53

单片机c语言教程第十六章--C51指针的使用
指针就是指变量或数据所在的存储区地址。如一个字符型的变量 STR 存放在内存单元DATA 区的 51H 这个地址中,那么 DATA 区的 51H 地址就是变量 STR 的指针。在 C 语言中 指针是一个很重要的概念,正确有效的使用指针类型的数据,能更有效的表达复杂的数据 结构,能更有效的使用数组或变量,能方便直接的处理内存或其它存储区。指针之所以 能这么有效的操作数据,是因为无论程序的指令、常量、变量或特殊寄存器都要存放在内 存单元或相应的存储区中,这些存储区是按字节来划分的,每一个存储单元都能用唯一的 编号去读或写数据,这个编号就是常说的存储单元的地址,而读写这个编号的动作就叫做寻 址,通过寻址就能访问到存储区中的任一个能访问的
[单片机]
<font color='red'>单片机</font>c语言教程第十六章--C51指针的使用
基于单片机的高速信号测试接口板的实现
  在数字电路设计和调试中,对设计单元电路的性能进行实时测试是必不可少的环节。很多情况下,需要通过计算机的比较和分析,来测试设计的电路的性能是否达到要求。这就需要设计一个测试接口板,将计算机产生的测试数据送入单元电路,再将单元电路的输出结果送回计算机。 在电路测试接口板的设计过程中,常常会遇到总线时钟频率较高(如40 MHz以上)、总线宽度较宽(如36 b)、要求测试的数据量较大(几Mb/s)的单元电路。这时实时地进行数据的双向传输比较困难,因为不论采用总线频率较高的PCI数据总线或USB总线[1],都达不到系统要求的数据传输速率,所以必须进行数据的缓存。考虑到PCI总线和USB总线的接口电路复杂、开发周期长,本文介绍一种采用单片
[测试测量]
MCS-51单片机系统程序的设计
  微控制器MCS-51单片机具有64K程序存储器和64K数据存储器的寻址能力。其数据存储器和I/O设备统一编址均在64K的范围内。其复位后的程序指针为0000H,因此在设计系统的硬件时必须将程序存储器的地址安排在0000H开始的存储器,使其与系统复位后的程序指针保持一致。同时在设计系统程序时,也必须将程序的起始地址安排在0000H开始的单元中。   INTEL MCS-51单片机采用了5个中断,即外部中断0、定时器T0中断、外部中断1、定时器T1中断和串行口中断,这5个中断的中断服务程序入口地址分别为0003H、000BH、0013H、001BH和0023H。这样在地址0000H到0003H之间只有3个字节,因此在启动地址通常只能
[单片机]
如何学习51单片机/心得/KEIL4/DXP
什么是单片机 学习使用单片机就是理解单片机硬件结构,以及内部资源的应用,在汇编或C语言中学会各种功能的初始化设置,以及实现各种功能的程序编制。 有人觉得要先学汇编。不过我个人觉得,学习51单片机,还是从C语言入手,一来方便,二来容易上手,仁者见仁,智者见智吧。 关于学习51单片机的书籍,市场上有很多,大家可以择优选取。 那么,如何用程序控制单片机的呢? 我开始学单片机的时候也曾有过这样的困惑啊,ok,下面帮大家整理一下思路。 怎么在Keil里写程序?keil怎么安装破解? 用过VC6.0的同学都知道,VC6.0是一个编译环境。什么是编译环境?简单地说,就是你写代码的地方。 那么,同理,单片机的编译环境就是Ke
[单片机]
如何学习51<font color='red'>单片机</font>/心得/KEIL4/DXP
基于51单片机的定时顺序控制器
求代码,作用是单片机控制继电器用于自动操作键盘。 要求: P01 导通三分钟,然后断开; P02 导通 10 秒后断开; P03 导通 0.5 秒后断开; P04 导通 0.2 秒后断开; P05 导通 0.5 秒后断开; P06 导通 0.2 秒后断开。 断开 P06 之后,循环所有。 单片机 89C52RC。 如下程序。 //-------------------------------------------------- #include #define uchar unsigned char #define uint unsigned int sbit P0_1 = P0^1; sbit P0_2 = P0^2; s
[单片机]
自制单片机之五(2)……LCD1602的驱动
具体电路的制作是很简单的,就接了两个电阻,一个是10欧姆的背光限流电阻,另一个是2K的LCD极板电压调节电阻。这两个电阻的阻值怎么定呢?背光比较简单,它就相当于在后面接了几个发光二极管,任何时候你只要在15、16脚串上个100欧的电位器接上电源,调节电位器,觉得亮度合适。此时的阻值便可。LCD液晶极板驱动电压调节电阻的确定就稍微麻烦一点。在各数据线,控制线接好关通上电源的前提下在第3脚(VEE)和地之间接一个10K的电位器。调节电位器。当3脚电压高时为全亮,电压为0时为全暗(液晶全显示为黑块)。你用电位器把屏幕从全暗刚好调到变亮。这时便可调试程序。待屏幕能正确显示后再细调电位器,使对比度合适。这时的阻值便可确定,然后换成等值的固定电
[单片机]
自制<font color='red'>单片机</font>之五(2)……LCD1602的驱动
关于单片机EMC的一些建议
此文虽然写在10年前,不过有很多很现实的参考意义。另外别的IC厂商也有很多的参考文档,如果大家有兴趣可以参考一下。题外话,写这个话题主要是去剖析模块内部主要的干扰源和敏感器件,通过这些主要的东西的设计来慢慢体会模块的EMC设计,不过难免有些一鳞半爪之嫌,积累多了可能未来在设计电路的时候在前期就很容易把问题考虑周到和细致。 1.单片机的工作频率 1.1单片机的设计应根据客户的需求来选择较低的工作频率 首先介绍一下这样做的优点:采用低的晶振和总线频率使得我们可以选择较小的单片机满足时序的要求,这样单片机的工作电流可以变得更低,最重要的是VDD到VSS的电流峰值会更小。 当然我们这里需要做一个妥协,因为客户的要求可能是兼容的和平
[单片机]
PIC32单片机harmony开发环境 - uart例程和代码分析
开发环境:mplab 3.45 harmony 1.09 xc32 1.42 源代码下载:http://download.csdn.net/detail/zn2857/9712707 源代码分析: void APP_Tasks ( void ) { /* Check the application's current state. */ switch ( appData.state ) { /* Application's initial state. */ case APP_STATE_INIT: { bool appInitialized = tr
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved