ATmega128几个常用程序例子

合集下载

ATmega128ADC学习笔记

ATmega128ADC学习笔记

ATmega128 ADC学习笔记ATmega128 ADC 的配置非常简单,仅需三条语句即可实现1、配置I/O口的输入2、配置ADMUX寄存器(选择参考电压,输入通道与增益选择)3、配置ADCSRA寄存器(启动AD转换,使能AD转换,选择分频系数)在下面的程序中实现的是差分输入AD转换,PF0为正输入,PF1为负输入,转换的结果在数码管上显示出来,数码管采用74HC595来驱动,各个部分的子程序可以单独放在其他程序中使用程序经过实测,为本人编写,绝对好用#include<iom128v.h>#include<macros.h>#define uchar unsigned char#define uint unsigned int#define Seg7_Bit0_En() {DDRB|=BIT(4);PORTB|=BIT(4);}#define Seg7_Bit0_Dis() {DDRB|=BIT(4);PORTB&=~BIT(4);}#define Seg7_Bit1_En() {DDRB|=BIT(5);PORTB|=BIT(5);}#define Seg7_Bit1_Dis() {DDRB|=BIT(5);PORTB&=~BIT(5);}#define Seg7_Bit2_En() {DDRB|=BIT(6);PORTB|=BIT(6);}#define Seg7_Bit2_Dis() {DDRB|=BIT(6);PORTB&=~BIT(6);}#define Seg7_Bit3_En() {DDRB|=BIT(7);PORTB|=BIT(7);}#define Seg7_Bit3_Dis() {DDRB|=BIT(7);PORTB&=~BIT(7);}#pragma data:codeconst Data[]={0x3F,0x06,0x5B,0x4F,0x66, //0,1,2,3,4 0x6D,0x7D,0x07,0x7F,0x6F, //5,6,7,8,9 0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};//a,b,c,d,e,f,0x00==关闭数码管uint num;uchar ge,shi,bai,qian;void delay(void){ uint i,j;for(j=0;j<1;j++)for(i=0;i<400;i++);}void spi_init(void){DDRB |= 0x07;//设置MOSI,SCK输出SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);//使能SPI,主机模式}void SPI_MasterTransmit(char Data){/* 启动数据传输 */SPDR = Data;/* 等待传输结束 */while(!(SPSR & (1<<SPIF)));}void HC_595_init(void){DDRB |=0XF0;DDRC |= BIT(7);PORTC &= ~BIT(7);//使能端输出0清空寄存器的数据PORTB |= 0x0F;}void HC_595_OUT(unsigned char data){PORTB &= ~BIT(0); //SPI_MasterTransmit(data);PORTB |= BIT(0); //}void Seg7_Led_Update(void){HC_595_OUT(Data[ge]);Seg7_Bit0_En();delay();Seg7_Bit0_Dis();HC_595_OUT(Data[shi]);Seg7_Bit1_En();delay();Seg7_Bit1_Dis();HC_595_OUT(Data[bai]);Seg7_Bit2_En();delay();Seg7_Bit2_Dis();HC_595_OUT(Data[qian]);Seg7_Bit3_En();delay();Seg7_Bit3_Dis();}void smg_dis(){if(num>9999) //错误处理,超出显示范围则全亮{HC_595_OUT(0xFF);PORTB |= 0X0F;}else if(num>999){qian = num/1000;bai = (num%1000)/100;shi = (num%100)/10;ge = num%10;Seg7_Led_Update();}else if(num>99){qian = 16;bai = (num%1000)/100;shi = (num%100)/10;ge = num%10;Seg7_Led_Update();}else if(num>9){qian = 16;bai = 16;shi = (num%100)/10;ge = num%10;Seg7_Led_Update();}else{qian = 16;bai = 16;shi = 16;ge = num%10;Seg7_Led_Update();}}uint mega128_ad(){uint addata;DDRF &= ~BIT(PF0);PORTA &= ~BIT(PF0);ADMUX = 0X10; // 差分输入,ADC0为正输入 ADC1为负输入 ADCSRA = 0X86; // 启动ADC功能,64分频ADCSRA |= BIT(ADSC); // 开始转换。

mega328的例子程序

mega328的例子程序

mega328的例子程序以下是一个简单的Arduino示例程序,演示了如何使用ATmega328芯片来控制LED灯的闪烁。

该程序使用Arduino IDE编写,并且假定你已经熟悉了Arduino编程环境的基本操作。

c.// 定义LED引脚。

int ledPin = 13;void setup() {。

// 初始化LED引脚为输出。

pinMode(ledPin, OUTPUT);}。

void loop() {。

// 将LED引脚设为高电平,点亮LED.digitalWrite(ledPin, HIGH);// 程序延时1秒。

delay(1000);// 将LED引脚设为低电平,熄灭LED.digitalWrite(ledPin, LOW);// 程序延时1秒。

delay(1000);}。

在这个示例程序中,我们首先定义了一个整型变量`ledPin`,用来存储LED的引脚号。

在`setup()`函数中,我们通过`pinMode()`函数将LED引脚设置为输出模式。

在`loop()`函数中,我们使用`digitalWrite()`函数来控制LED引脚的电平,从而控制LED的亮灭,并通过`delay()`函数来实现延时效果。

这只是一个非常简单的示例程序,演示了如何使用ATmega328芯片来控制外围设备。

实际上,ATmega328芯片具有丰富的功能和强大的性能,可以用于各种嵌入式系统和电子项目中。

通过合理的编程和外围电路设计,ATmega328芯片可以实现复杂的控制和处理任务,包括但不限于传感器数据采集、通信接口、电机控制等。

希望这个简单的示例程序能够帮助你更好地了解如何使用ATmega328芯片进行编程。

如果你有更具体的问题或者需要进一步的帮助,请随时告诉我。

AVR_128_spi串口通信程序

AVR_128_spi串口通信程序

UCSR1B=(1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1);//发送接收使能,接收中断使能
UCSR1C=(1<<UCSZ11)|(1<<UCSZ10);//8位数据,UCSZ12,11,10共同确定
DDRD|=BIT(3); //设置发送口为输出
}
/*串口0单字符发送,查询方式*/
{
UCSR1B = 0x00; //禁止发送和接收
UCSR1A = 0x02; //倍速异步模式 USX0=1
UBRR1L=(Crystal/8/Baud1-1)%256; //根据数据手册的计算法
UBRR1H=(Crystal/8/Baud1-1)/256; //如果不是倍速则(Crystal/16/Baud1-1)
Flag1=1;
UCSR1B|=BIT(RXCIE1);//重开接收中断
}
以下是主机部份 #include <iom128v.h> #include <macros.h> #define uchar unsigned char #define uint unsigned int #include "delay.h" #include "lcd.h" void port_init(void); //SPI initialize // clock rate: 1843199hz void spi_init(void) { SPCR = 0x74; //setup SPI
init_devices(); LCD1602_initial(); LCD1602_sendbyte(iDat,1+0x30 ); // while(1) //{ for(i=0;i<2;i++) {

【2019年整理】基于ATmega128的步进电机控制

【2019年整理】基于ATmega128的步进电机控制

基于ATmega128的步进电机控制----基于proteus仿真设计潜刘方摘要:本文以ATmega12驴片机作为系统的CPU来控制步进电动机。

步进电动机具有性能稳定,广泛应用于实际生活中。

由于做实物不仅要耗费金钱,还要耗费大量的时间用来做板子,焊接元器件。

本系统采用了Proteus仿真,只需要画画电路图就可以做出类似实物的效果。

通过测试,本系统可以实现电机启动、停止、加速、减速、正转、反转等控制。

对于广大初学者售企业来说具有很大的学习价值。

关键字:ATmega128 步进电机Proteus 控制稳定一、背景随着生产过程机械化、电气化和自动化的不断发展,出现了步进电机。

这种电机的工作原理与普通的异步电机和直流电机基本相似,但它们在性能、结构、生产工艺有其特殊性。

随着集成化的发展,AVFO其低功耗,高运算速度在单片机的领域中占有重要位置,ATmegeS列AVF^片机主要有ATmega 8/16/32/64128/128L 等。

二、设计方案:本系统由ATmega128乍为CPl^控制步进电机,LED作为案件按下作为显示,来显示有关方面的显示信息。

其总体设计框图如图1所示:°LED显示Atmega128按键输入Q步进电机控制图1总体框架图二、硬件设计:1、步进电机工作原理步进电机不同丁一般的电动机,它是一步一步转动的。

每输入一个脉冲信号,步进电机就转过一定的角度,因此它是一种把脉冲变成角度位移的执行元件。

驱动芯片:ULN2003是高耐压、大电流达林顿阵列,由7个硅PNP达林顿管组成。

ULN200刎电流可达500mA 并且能够在关态时承受50V 的电压,输出 还可以在高负载电流并行运行。

2、总体硬件电路设计总体硬件电路图如图2所示。

图2总体硬件电路图三、软件设计:步进电机控制关键在丁励磁序歹0的定义, 表1给出了四相步进电机的3种励 磁方式。

表1四相步进电机的三种励磁方式按键检测以及处理程序如图3所示下:图3按键流程图步进电机运行流程图如图4所示.图4电机运行流程图主程序流程图如图5所小图5主程序流程图五、总结以心得体会:通过本次系统的制作及仿真,对步进电机的运行原理有了更深的感触,为以后运用电机打下了坚实的基础。

atmega128实用双串口通讯

atmega128实用双串口通讯

}
tx_data[21] =data;
led_2_0();
//----------------数据校验、处理部分
if( (tx_data[0]==0xfe) && (tx_data[21]==0x16) )

//--------------------------略 }
} //--------uart 1----RX-----中断方式- 同上---------------------ISR(USART1_RX_vect) {
unsigned char status,data; status=UCSR1A; data=UDR1; unsigned char f; //----status &= ~(FRAMING_ERROR1 | PARITY_ERROR1 | DATA_OVERRUN1); //----f=data;
//---------------------------------------------
#define
led_1_1() (PORTE |= bit(3))//--1
#define #define #define #define #define #define #define #define #define
Atmega128 实用串口通讯程序
1、 双串口异步通讯, USART0——发送使能,接收使能 、2400bps/8 位/偶校验/1 停止位
USART1——发送使能、9600bps/8 位/无校验/1 停止位
2、 外围 5 个 LED 指示 共阳极, PE3~PE7
#include <avr/io.h> #include <util/delay.h> #include <stdio.h> #include <avr/interrupt.h> #include <avr/wdt.h>

AVR ATmega128全功能工业控制器设计文档说明书

AVR ATmega128全功能工业控制器设计文档说明书

AVR单片机的全功能工业控制器设计吴焕琅深圳市中天越华自动控制科技有限公司摘要:介绍一款工业级的实用全功能控制器。

该控制器能隔离采集多种输入信号,输出多种控制信号;具有实时时钟、历史数据存储功能,彩色液晶显示界面,带有触摸屏操作和远程通信接口。

核心部分CPU采用AVR ATmega128单片机。

目前已用于批量生产。

关键词:隔离采集控制单片机彩色显示485接口ATmega128DS1642引言在自动控制产品的设计过程中,实现方案的选择常常是很矛盾的。

使用可编程逻辑控制器(PLC)和人机界面(HMI)来实现,开发速度较快,但成本太高,所开发的产品没有市场竞争力;使用单片机开发,成本低但开发周期长、开发量大且通用性不好。

用户需要的是一种成本低、开发周期较短、通用性较好的控制器,因此全功能工业控制器有很大的应用市场。

全功能工业控制器的整个电路分为信号隔离输入部分、控制器输出部分、实时时钟与历史数据存储部分、彩色液晶显示和触摸屏控制部分、通信接口等。

1信号隔离输入电路信号隔离输入电路分为开关量隔离输入、模拟量隔离输入、高速电脉冲隔离输入,电路如图1所示,开关量的隔离输入较为简单,输入信号采用光耦进行隔离后送入单片的普通I/O,单片机用查询方式进行采集。

图1信号隔离输入电路高速电脉冲的采集需要注意的是,所设计的电路必须适应高速信号采集的要求,因此隔离光耦应采用高速光耦(如6N137等)。

采用查询方式采集高速脉冲容易造成采集数据的丢失,高速脉冲应采用中断方式进行采集。

模拟量隔离采集是本控制器的一个重点和难点,笔者之前采用了线性光耦等多种方式进行模拟量的隔离采集实验,均未获满意的效果。

这里采用一种先将模拟量数字化(使用AD7705),然后通过有光耦隔离的数据口送到CPU进行模拟量隔离采集的方式,效果理想。

2控制器输出电路控制器的输出方式有继电器输出、晶体管输出、模拟电压输出,如图2所示。

继电器输出和晶体管输出电路较为简单,这里不作详细的介绍。

Almel ATmega128 ATmega128L 可编程 Flash 说明书

Almel ATmega128 ATmega128L 可编程 Flash 说明书

产品特点•高性能、低功耗的 AVR® 8位微处理器•先进的 RISC 结构–133条指令 – 大多数可以在一个时钟周期内完成–32 x 8 通用工作寄存器 + 外设控制寄存器–全静态工作–工作于16 MHz时性能高达16 MIPS–只需两个时钟周期的硬件乘法器•非易失性的程序和数据存储器–128K 字节的系统内可编程Flash寿命: 10,000次写/擦除周期–具有独立锁定位、可选择的启动代码区通过片内的启动程序实现系统内编程真正的读-修改-写操作–4K字节的EEPROM寿命: 100,000次写/擦除周期–4K 字节的内部SRAM–多达64K字节的优化的外部存储器空间–可以对锁定位进行编程以实现软件加密–可以通过SPI实现系统内编程•JTAG接口(与IEEE 1149.1标准兼容)–遵循JTAG标准的边界扫描功能–支持扩展的片内调试–通过JTAG接口实现对Flash, EEPROM, 熔丝位和锁定位的编程•外设特点–两个具有独立的预分频器和比较器功能的8位定时器/计数器–两个具有预分频器、比较功能和捕捉功能的16位定时器/计数器–具有独立预分频器的实时时钟计数器–两路8位PWM–6路分辨率可编程(2到16位)的PWM–输出比较调制器–8路10位ADC8个单端通道7个差分通道2个具有可编程增益(1x, 10x, 或200x)的差分通道–面向字节的两线接口–两个可编程的串行USART–可工作于主机/从机模式的SPI串行接口–具有独立片内振荡器的可编程看门狗定时器–片内模拟比较器•特殊的处理器特点–上电复位以及可编程的掉电检测–片内经过标定的RC振荡器–片内/片外中断源–6种睡眠模式: 空闲模式、ADC噪声抑制模式、省电模式、掉电模式、Standby模式以及扩展的Standby模式–可以通过软件进行选择的时钟频率–通过熔丝位可以选择ATmega103兼容模式–全局上拉禁止功能•I/O和封装–53个可编程I/O口线–64引脚TQFP与 64引脚 MLF封装•工作电压–2.7 - 5.5V ATmega128L–4.5 - 5.5V ATmega128•速度等级–0 - 8 MHz ATmega128L–0 - 16 MHz ATmega128微处理器,具有128K字节的系统BDTIC /ATMEL2ATmega1282467L–AVR–05/04引脚配置Figure 1. ATmega128的引脚综述ATmega128为基于AVR RISC 结构的8位低功耗CMOS 微处理器。

Atmega128AD转换程序

Atmega128AD转换程序

}
/*******************************************************/
/****** 函数名称: SPI_putchar()
******/
/****** 功 能: SPI 发送数据
**/
/****** 参 数: 无
******/
/****** 返回值 : 无
SPI_putchar((unsigned char)((i&0x003f)<<2));
Set_CS5615;
//释放 TLC5615
delay_nms(2);
//延时
}
for(i=1023;i>0;i--)
//电压逐渐变低
{
Clr_CS5615;
//片选 TLC5615
SPI_putchar((unsigned char)((i&0x03c0)>>6));//发送数据
**/
/****** 参 数: 无
******/
/****** 返回值 : 无
******/
/*******************************************************/
void SPI_Init(void)
{
char i;
DDRB|=0x07;
//MISO(PB3)输入 MOSI(PB2),SCK(PB1),SS(PB0)输出
void main(void)
{
unsigned int i;
DDRG=0x1f;
//设置 PORTG 输出
SPI_Init();
while(1)
{
for(i=0;i<1024;i++)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ATMEGA128相关例程自己学avr单片机已经有相当一段时间了,一开始用的是atmega128,觉得不是很好用。

于是自己去买了一块16L的芯片,觉得还行。

一开始用的是ICC AVR,应为它用起来比较简单,不像winavr那样,要写个Makefie,比较的麻烦,但icc avr的缺点是太过于简陋,调试程序时,感觉不是很好。

后来经同学介绍,用起了winavr,其实也是比较的简单,只不过要加一个makefile而已,其实makefile可以用软件自带的组建自动生成,只需修改几个参数就可以用。

后来又用起了code vision avr,虽然不太习惯,也谈不上不好用.需要注意的是,三个不同的软件所带的同文件不一样。

icc avr 是iom128v.h(姑且以128为例),winavr 是avr/io.h,不过makefile中要设置芯片为atmega128.而cvavr则是mega128.h。

记得一开始的时候,我对这些不同的同文件不是很理解,是从一个学长那里了解到,才弄明白的。

其实前两个软件只需把头文件稍微改一下基本上可以通用。

而最后一个软件的中断的写法似乎不太一样,因而和钱两个软件的兼容性是最差的。

总体说winavr给人的感觉是比较专业自己学习时多总结吧!1、流水灯/*硬件环境:atmega128开发板软件环境:CodeVisionAVR-C*/#include <mega128.h>#define uchar unsigned char#define uint unsigned intuchart;void timer1_init(){TCCR1B=0X00; //先停止定时器1TCNT1H=0XF0; //设定定时器初值TCNT1L=0XBE;TCCR1A=0X00; //启动定时器1TCCR1B=0X05; //使用1024分频}interrupt [TIM1_OVF] void timer1_ovf_isr(void){TCNT1H=0XF0; //重载定时器初值TCNT1L=0XBE;DDRE|=1<<2;PORTE|=1<<2;DDRA=0xff;PORTA=cnt; //输出led的值到端口Bt++;if(cnt==255)t=0;}void main(){//DDRB=0XFF;SREG|=0X80;TIMSK=0X04;timer1_init();while(1){;}}2、AD转换+数码管显示/***************************************************************************//*ADC测试程序 *//*目标器件:ATmega128 */ /*晶振:RC8MHZ *//*编译环境:ICCAVR 7.13A */ /*E-Mail:number007cool163.*//*时间:2010年11月13日*///Aref接AVCC(+5V),采用Aref作参考电压/*用数码管显示AD转换的结果*//***************************************************************************//*********************************包含头文件********************************/#include <iom128v.h>#include <macros.h>/********************************数码管段码表*******************************/extern const unsigned char tab[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};/*********************************全局变量**********************************/unsigned int adc_rel=0;/**************************************************************************** 函数功能:ADC初始化函数入口参数:出口参数:****************************************************************************/ void adc_init(void){DDRF&=0XFE; //PORTF0设置为输入,即作为ADC0口输入模拟电压PORTF&=0XFE; //PORTF0设置为输入低电平ADCSRA=0x00; //关ADCADMUX = 0X00; //采用Aref作为参考电压,ADC0单端输入,右对齐ACSR=(1<<ACD);ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);//ADEN,启动ADC;ADSC,ADC开始转换;ADIE,ADC中断使能;ADPSx,设置分频因子64}/**************************************************************************** 函数功能:ADC中断函数入口参数:出口参数:****************************************************************************/ #pragma interrupt_handler adc_isr:iv_ADCvoid adc_isr(void){//int data_h,data_l;//data_l=ADCL;//data_h=ADCH;ADCSRA = 0x00;ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADIE);adc_rel=ADC;/*if(adc_rel>0x1ff){PORTA|=1<<2;}elsePORTA&=~(1<<2);*/}/**************************************************************************** 函数功能:延时子程序入口参数:出口参数:****************************************************************************/void delay(void){int i;for(i=0;i<1800;i++);}/****************************************************************************函数功能:显示子程序入口参数:k出口参数:****************************************************************************/void display(unsigned int k)//发光二极管显示初始化{DDRE|=1<<2;PORTE|=1<<2;DDRA=0XFF;PORTA=k;}#define SS 0#define SCK 1#define MOSI 2#define MISO 3#define SS_H() PORTB|=(1<<SS)#define SS_L() PORTB&=~(1<<SS)#define led0_en() {DDRB|=1<<4;PORTB|=(1<<4);} //开第一个数码管的位选#define led0_dis() {DDRB|=1<<4;PORTB&=~(1<<4);} //关第一个数码管的位选#define led1_en() {DDRB|=1<<5;PORTB|=(1<<5);}#define led1_dis() {DDRB|=1<<5;PORTB&=~(1<<5);}#define led2_en() {DDRB|=1<<6;PORTB|=(1<<6);}#define led2_dis() {DDRB|=1<<6;PORTB&=~(1<<6);}#define led3_en() {DDRB|=1<<7;PORTB|=(1<<7);}#define led3_dis() {DDRB|=1<<7;PORTB&=~(1<<7);}#define OE 7#define point 3#define dp 7#include <iom128v.h>#include <macros.h>const unsigned char table[]={0x3F,0x06,0x5B,0x4F,0x66, //0,1,2,3,40x6D,0x7D,0x07,0x7F,0x6F, //5,6,7,8,90x77,0x7C,0x39,0x5E,0x79,0x71,0x00};//a,b,c,d,e,fvolatile unsigned char led_buffer[4];void delay_1us(void) //1us延时函数{asm("nop");}void delay_nus(unsigned int n) //N us延时函数 {unsigned int i=0;for (i=0;i<n;i++)delay_1us();}void delay_1ms(void) //1ms延时函数 {unsigned int i;for (i=0;i<1140;i++);}void delay_nms(unsigned int n) //N ms延时函数 {unsigned int i=0;for (i=0;i<n;i++)delay_1ms();}/*完成spi的初始化*/void spi_init(void){DDRB |= (1<<MOSI)|(1<<SCK)|(1<<SS);//设置MOSI,SCK输出SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);//使能SPI,主机模式}/*spi主机传送数据*/void SPI_MasterTransmit(char Data){/* 启动数据传输 */SPDR = Data;/* 等待传输结束 */while(!(SPSR & (1<<SPIF)));}/*完成对HC595的初始化*/void HC_595_init(void){DDRC |= (1<<OE); //设置PORTC7为输出PORTC &= (1<<OE); //输出高电平,使能595PORTB = 0x0F; //同时打开四个数码管的位选spi_init();led_buffer[0]=16; //初始化数码管段码led_buffer[1]=16;led_buffer[2]=16;led_buffer[3]=16;}/*HC595完成传送数据*/void HC_595_OUT(unsigned char data){SS_L();SPI_MasterTransmit(data);SS_H();}void leddis_update(void){/*最低位数码管,第四个数码管*/if(point==0)HC_595_OUT(table[led_buffer[3]]|(1<<dp));elseHC_595_OUT(table[led_buffer[3]]);led0_en();delay_nus(60);led0_dis();if(point==1)HC_595_OUT(table[led_buffer[2]]|(1<<dp));elseHC_595_OUT(table[led_buffer[2]]);led1_en();delay_nus(60);led1_dis();if(point==2)HC_595_OUT(table[led_buffer[1]]|(1<<dp));elseHC_595_OUT(table[led_buffer[1]]);led2_en();delay_nus(60);led2_dis();/*最高位数码管,第一个数码管*/if(point==3)HC_595_OUT(table[led_buffer[0]]|(1<<dp));elseHC_595_OUT(table[led_buffer[0]]);led3_en();delay_nus(60);led3_dis();}void display_led(unsigned int data){if(data>9999){HC_595_OUT(0xFF);//当计数大于9999时,四个数码管同时输出8 PORTB|=((1<<4)|(1<<5)|(1<<6)|(1<<7));}else if(data>999){led_buffer[0]=data/1000;led_buffer[1]=(data%1000)/100;led_buffer[2]=(data%100)/10;led_buffer[3]=data%10;leddis_update();}else if(data>99){led_buffer[0]=data/1000; //关闭最高位的那个数码管 led_buffer[1]=(data%1000)/100;led_buffer[2]=(data%100)/10;led_buffer[3]=data%10;leddis_update();}else if(data>9){led_buffer[0]=data/1000;led_buffer[1]=16;led_buffer[2]=(data%100)/10;led_buffer[3]=data%10;leddis_update();}else{led_buffer[0]=data/1000;led_buffer[1]=16;led_buffer[2]=16;led_buffer[3]=data%10;leddis_update();}}volatile unsigned int countnum=0;void timer1_init(void){TCCR1B = 0x00; //stopTCNT1H = 0x8F; //setupTCNT1L = 0x81;OCR1AH = 0x70;OCR1AL = 0x7F;OCR1BH = 0x70;OCR1BL = 0x7F;OCR1CH = 0x70;OCR1CL = 0x7F;ICR1H = 0x70;ICR1L = 0x7F;TCCR1A = 0x00;TCCR1B = 0x04; //start Timer}#pragma interrupt_handler timer1_ovf_isr:15void timer1_ovf_isr(void){TCNT1H = 0x8F; //reload counter high valueTCNT1L = 0x81; //reload counter low valuecountnum++;if(countnum>9999) countnum=0;}void init_devices(void){CLI(); //disable all interruptstimer1_init();TIMSK = 0x04; //timer interrupt sourcesSEI(); //re-enable interrupts}/**************************************************************************** 函数功能:主程序入口参数:出口参数:****************************************************************************/ void main(void){init_devices();HC_595_init();adc_init();SEI();//开全局中断变量display(0);while(1){delay();display_led(adc_rel/1024.0*5*1000);}}3、对EEPROM进行读写操作/************************************************文件:main.c用途:注意:部8M晶振************************************************/#include "config.h"/*向EEPROM里面写入数据输入量:地址,数据*/void EEPROM_write(unsigned int uiAddress,unsigned char ucData){while(EECR&(1<<EEWE)); //等待上一次写操作结束EEAR = uiAddress; //地址EEDR = ucData; //数据EECR |=(1<<EEMWE); //置位EEMWE,主机写使能EECR |=(1<<EEWE); //置位EEWE,写使能,启动写操作}/*从EEPROM指定的地址里面读出相应的数据*/unsigned char EEPROM_read(unsigned int uiAddress){while(EECR&(1<<EEWE)); //等待上一次写操作结束EEAR = uiAddress; //设置地址寄存器EECR |=(1<<EERE); //读使能return EEDR; //返回读入EEDR里面的数据}void main(void){unsigned char temp=123;unsigned char data;HC_595_init();EEPROM_write(0x01,temp);data=EEPROM_read(0x01);while(1){Seg7_Led_display(data); //调用显示函数将写入的数据又读出来}}4、定时器0(轮循方式)/*定时器0和2(均为八位的定时计数器)有四种工作模式,此例是工作在普通模式。

相关文档
最新文档