锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

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

时间:2024-05-06 09:07:09



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

//环境:编译为ICC 6.25A
//硬件:AT16芯片
//日期: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 D|=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
}
//////////////////A单次转换子程序带1个参数,1个返回值/////////////////
int Mega16_ad(uchar chl)
{
DDRA&=0Xf0; //转换口设置为输入、无上拉
PORTA&=0XF0;
AUX=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分频
TC1H=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); //打开总中断

DDRC|=0xff;
PORTC|=0xff; //配置PC口为输入,有上拉
DDRC&=0x00;
t1=Mega16_ad(0X40); //启动一次通道0的AD转换
t2=Mega16_ad(0X41); //启动一次通道1的AD转换
t3=Mega16_ad(0X42); //启动一次通道2的AD转换
t4=Mega16_ad(0X43); //启动一次通道3的AD转换
/////////以下while中为按键扫描程序//////////////////////////////////////////////
while(1)
{
////////////启动按钮/////////////////////////////////////////////////////////////////////////
if(!(PINC&BIT(0)))//qidong
{
delay(10);
if(!(PINC&BIT(0)))//qidong
{
while(!(PINC&BIT(0)));
s0out;s0L;gg=1;
}
}
/////////////停止按钮/////////////////////////////////////////////////////////////////////////////
if(!(PINC&BIT(4)))
{
s0out;s0H;
s1out;s1H;
s2out;s2H;
s3out;s3H;
tt1=0;tt2=0;tt3=0;
tt4=0;gg=0;jj=0;xx=0;
}
/////////工作模式判断///车CD纹///高光/////////////////////////////////////////////
if(t1 {
if(!(PINC&BIT(2))){ gg=0;tt1=0;s0out;s0H;}
else if(!(PINC&BIT(3)))
{
if(!(PINC&BIT(1))) {gg=0;tt1=0;s1out;s1L;}
}
}
///////////////行程开关/////////////////////////////////////////////////////////////////////////////////
if(!((PINC&BIT(5))|(PINC&BIT(1)))) jj=1;
//////////////////////////////////////////////////////////////////////////////////////////////////////////
if(t2 //////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(t3 ////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
}
////////////定时器0的中断程序////刷新AD转换的值和刷新液晶屏用///////////
#pragma interrupt_handler timer0:10
void timer0(void)
{
uint ff;
TCNT0=0X00;
ff++;
if(ff==10000);
{ff=0;adc_lcd();}
}
////////////定时器1的中断程序///给继电器定时用////////////////////////////////////////
#pragma interrupt_handler timer1:9
void timer1(void)
{
TCNT1H=0xff;
TCNT1L=0x03;
if(gg)tt1++;
if(jj)tt2++;
if(xx)tt3++;
}


///完成!!!!!


-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章