自制定时亮灯装置。单片机程序如下。
// Target : M16// Crystal: 12.000Mhz #include <iom16v.h> #include <macros.h> #define uchar unsigned char #define uint unsigned int #define mclk 1000000 //12000000 //8000000 #pragma interrupt_handler uart_rx:12 #define key_port PORTD #define key_port_ddr DDRD #define key_port_pin PIND uchar WENZI1[]="JIESHOUDAOD: ...."; //WENZI1 uchar WENZI2[]="receiving ... ..."; //WENZI2 uint FASONGSHUZU[10]; //SHUJU1 uint x=9; uchar temn,count; uchar temtab; long int i,w,e; long int jd,k,sz; int g,s; uchar rdata,flag=0;//baocun jieshoudao d shuju void delay (uint ms) { uint i,j; for(i=0;i<ms;i++) { for (j=0;j<1141;j++); } } void DelaymS (uint i) { uint j; for(;i!=0;i--) { for (j=20;j!=0;j--); } } void uart_init(uint baud) { PORTA = 0x00; DDRA = 0x01; UCSRB=0X00; UCSRA=0X00;// UCSRC=(1<<URSEL)|(0<<UPM0)|(3<<UCSZ0);//选择UCSRC,异步模式,禁止校验,1位停止位,8为数据位。 baud=mclk/16/baud-1; UBRRL=baud; UBRRH=baud>>8; UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);//接收、发送使能,接收中断使能。 SREG=BIT(7); DDRD = 0x3F;//portd6输入,其他输出,显示程序//pd7shuru DDRB = 0XFF; //输出,显示程序 //DDRD|=0X02;//配置pd1,TXD为输出,通信 DDRC = 0xFF;//配置C为输出,通信 } void uart_rx() { UCSRB&=~BIT(RXCIE);//jieshou zhongduan guanbi , rdata=UDR; flag=1; UCSRB|=BIT(RXCIE);//DAKAI JIESHOU ZHOGNDUAN HANSHU } void uart_sendB(uchar data) { while(!(UCSRA&(BIT(UDRE))));//di5wei=1;DENGDAI JICUNQI WEIKONG UDR=data; while(!UCSRA&(BIT(TXC)));//fasong jieshu UCSRA|=BIT(TXC); } void write_com(uchar com) { PORTD &= ~BIT(4); PORTD &= ~BIT(5); //KONGZHIKOU,PD4,5,3 为RS,R/W,EA。数据位为PB口 PORTB = com; //SHUJUKOU PORTD |= BIT(3); // delay(1); PORTD &= ~BIT(3); // } void write_data(uchar data) { PORTD |= BIT(4); PORTD &= ~BIT(5); PORTB = data; PORTD |= BIT(3); // delay(1); PORTD &= ~BIT(3);// } void shujuchuli(long int count) { uint i,j1,j2,j3,j4,j5,j6; count=count%100000; j1=count/100000; j2=count/10000;count=count%10000; //小数点后第一位 + '0' j3=count/1000;count=count%1000; //小数点后第一位 + '0' j4=count/100;count=count%100; j5=count/10;count=count%10; j6=count; FASONGSHUZU[0]=j1+0x30; FASONGSHUZU[1]=j2+0x30; FASONGSHUZU[2]=j3+0x30; FASONGSHUZU[3]=j4+0x30; FASONGSHUZU[4]=j5+0x30; FASONGSHUZU[5]=j6+0x30; } void xianshi1(uchar tab) { uint i; write_com(0X38); delay(5); write_com(0X01); delay(5); write_com(0X0C); delay(5); write_com(0X06); delay(5); write_com(0X80+0); delay(5); for(i=0;i<16;i++) { write_data(WENZI1[i]); delay(5); } } void DISSHUJU(uint num) { uint i; write_com(0X80+0X40); delay(5); for(i=0;i<6;i++) { write_data(FASONGSHUZU[i]); delay(5); } } void xianshi2(uchar tab) { uint i; write_com(0X38); delay(5); write_com(0X01); delay(5); write_com(0X0C); delay(5); write_com(0X06); delay(5); write_com(0X80+0); delay(5); for(i=0;i<16;i++) { write_data(WENZI2[i]); delay(5); } } void YANSHIMIN(uint i) { uint j; for(;i!=0;i--) { for (j=60;j!=0;j--) { DelaymS (5000); DelaymS (5000); } } } //************************main*********************** void main (void) //程序主函数 { uint k,i=8; uint j=20; unsigned char tem; uart_init(1200);//初始化端口。同时打开串口。可接收串口数据。 //uart_sendB(i); //delay(10); //uart_sendB(j); //delay(10); DelaymS (5000); PORTA=0X00;//DENGMIE DelaymS (5000); PORTA=0XFF;//DENGMIE //以下,接收按键调整延时时间 PORTD=PORTD|0X80;//ZHI 1,pd7 for(j;j!=0;j--) { tem=key_port_pin&0x80; if( tem==0x00) i=i++; DelaymS (5000); } //以下,显示,延时 xianshi1(WENZI1[i]); for(i;i!=0;i--) { PORTA=0XFF;//DENGMIE xianshi2(WENZI2[i]); shujuchuli(i); xianshi1(WENZI1[i]); DISSHUJU(FASONGSHUZU[i]); DelaymS (5000); YANSHIMIN(60); } PORTA=0X00;// DelaymS (5000); }
复制代码