image.png
自制定时亮灯装置。单片机程序如下。
// 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);        
  •         
  • }
  • 复制代码