微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于AVR单片机的CD纹机的自动控制程序

基于AVR单片机的CD纹机的自动控制程序

时间:12-01 来源:互联网 点击:

首先要感谢 反省(网名),给我提供的思路。否则我那个停止按钮估计弄到今年年底都搞不定了。
再要感谢 天狼星 提供的视屏教程,向你的无私奉献致敬。以下是源代码,欢迎各位高手拍砖。另外还有一个修改版本功能更完善大家可以参考一下 :http://www.51hei.com/mcu/2721.html

//环境:编译为ICC AVR6.25A
//硬件:ATMEGA16芯片
//日期:2013年10月20日
//功能:CD纹机控制器
//作者:李亚新
//晶振:内部RC震荡,主频1M
//备注:适合用于 CD纹机的自动控制

#include
#include
#define uchar unsigned char
#define uint unsigned int
///////以下是宏定义液晶控制线和继电器所用到的IO口////////////
#define rs_L PORTD&=~BIT(0)
#define rs_H PORTD|=BIT(0)
#define rs_out DDRD|=BIT(0)
#define rw_L PORTD&=~BIT(1)
#define rw_H PORTD|=BIT(1)
#define rw_out DDRD|=BIT(1)
#define en_L PORTD&=~BIT(2)
#define en_H PORTD|=BIT(2)
#define en_out DDRD|=BIT(2)
#define s0L PORTD&=~BIT(4)
#define s0H PORTD|=BIT(4)
#define s0out DDRD|=BIT(4)
#define s1L PORTD&=~BIT(5)
#define s1H PORTD|=BIT(5)
#define s1out DDRD|=BIT(5)
#define s2L PORTD&=~BIT(6)
#define s2H PORTD|=BIT(6)
#define s2out DDRD|=BIT(6)
#define s3L PORTD&=~BIT(7)
#define s3H PORTD|=BIT(7)
#define s3out DDRD|=BIT(7)
///////合美特精密五金有限公司的Logo//////////////////////////
uchar table1[]="Himetech v1.0";
////////定义程序中所用到的全局变量///////////////////////////
uchar t1=0,t2=0,t3=0,t4=0,tt1=0,tt2=0,tt3=0,tt4=0;
uchar gg=0,jj=0,xx=0;
uint addata,adc;
/////////延时子程序//////////////////////////////////////////
void delay(uint ms)
{uchar a;uint b;for(a=0;a/////////液晶写指令函数没有读状态/////////////////////////////
void zhilin(uchar zhi)
{
rs_H; rw_H; en_L;
rs_L; rw_L;
PORTB=zhi;
delay(1);
en_H;
delay(1);
en_L;
}
/////////液晶写数据函数没有读状态////////////////////////////
void shujv (uchar shu)
{
rs_L; rw_H; en_L;
rs_H; rw_L;
PORTB=shu;
delay(1);
en_H;
delay(1);
en_L;
}
/////////液晶写指令和写数据函数//////////////////////////////
void dizhishujv(uchar dizhi,uchar shu)
{zhilin(dizhi);shujv(shu);}
///////////////////////////////////////////////////////////////////////////////
void init_lcd (void)
{
uchar e;
rs_out; rw_out; en_out;
DDRB=0xff;
rs_out; en_out;
delay(1);
zhilin(0x38);delay(1);
zhilin(0x38);delay(1);
zhilin(0x38);zhilin(0x38);zhilin(0x08);
zhilin(0x01);zhilin(0x06);zhilin(0x0c);

zhilin(0x80+1);
for(e=0;e<13;e++){shujv (table1[e]);delay(1);}//写Logo
}
//////////////////ADC单次转换子程序带1个参数,1个返回值/////////////////
int Mega16_ad(uchar chl)
{
DDRA&=0Xf0; //转换口设置为输入、无上拉
PORTA&=0XF0;
ADMUX=0; //采用外部参考电压,输出数据右对齐
ADMUX|=chl; //设置指定的通道
ADCSR=0x80; //采用单次转换,查询模式,2分频
ADCSR|=BIT(ADSC); //启动转换
while(!(ADCSR&(BIT(ADIF)))); //等待转换结束
addata=ADCL; //读取低8位数据
addata+=ADCH*256; //读取高2位数据
adc=addata/10.24;
return adc;
}
////////切换ADC通道采集四个电位器的值送液晶显示/////////////////////////
void adc_lcd()
{
uchar shi1=0, ge1=0; //定义2个局部变量
t1=Mega16_ad(0X40); //选择PA0为AD通道,将转换结果赋给t1
shi1=t1/10; //将t1十位取出赋给shi1
ge1=t1%10; //将t1个位取出赋给ge1
dizhishujv((0x80+0x40+2),(0x30+shi1));//显示十位
dizhishujv((0x80+0x40+3),(0x30+ge1));//显示个位
t2=Mega16_ad(0X41);
shi1=t2/10;
ge1=t2%10;
dizhishujv((0x80+0x40+5),(0x30+shi1));
dizhishujv((0x80+0x40+6),(0x30+ge1));
t3=Mega16_ad(0X42);
shi1=t3/10;
ge1=t3%10;
dizhishujv((0x80+0X40+8),(0x30+shi1));
dizhishujv((0x80+0X40+9),(0x30+ge1));
t4=Mega16_ad(0X43);
shi1=t4/10;
ge1=t4%10;
dizhishujv((0x80+0X40+11),(0x30+shi1));
dizhishujv((0x80+0X40+12),(0x30+ge1));
}
///////////定时器1初始化子程序/////////////////////////////////////
void init_timer1()
{
TCCR1B|=0x04;//256分频
TCNT1H=0xff;//高8位初值
TCNT1L=0x03;//低8位初值
TIMSK|=BIT(2);//定时器1的中断使能
}
////////////定时器0初始化子程序/////////////////////////////////////////
void init_timer0()
{
TCCR0|=0x04;//256分频
TCNT0=0x00;//初值
TIMSK|=BIT(0);//定时器0的中断使能
}
//////////以下为主程序////////////////////////////////////////////////
void main()
{
tt1=0;tt2=0; //
tt3=0;tt4=0; //初始化各变量
gg=0;jj=0;xx=0; //

init_lcd(); //初始化液晶
init_timer0(); //初始化定时器0
init_timer1(); //初始化定时器1
SREG|=BIT(7); //打开总中断

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top